From 7fca785df5a6923cd0dc6ff16b03464193595d73 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20K=C3=BChling?= Date: Tue, 3 Apr 2012 01:46:19 +0200 Subject: [PATCH] new package alfilelsel: graphical file selector dialog for scripts and gmenu2x --- alfilesel/Makefile | 60 ++++++++++ alfilesel/files/alfilesel.c | 225 ++++++++++++++++++++++++++++++++++++ 2 files changed, 285 insertions(+) create mode 100644 alfilesel/Makefile create mode 100644 alfilesel/files/alfilesel.c diff --git a/alfilesel/Makefile b/alfilesel/Makefile new file mode 100644 index 0000000..21357e3 --- /dev/null +++ b/alfilesel/Makefile @@ -0,0 +1,60 @@ +# +# Copyright (C) 2012 David Kuehling +# +# License GPLv2 or later. NO WARRANTY. +# +# OpenWRT package that compile a simple allegro game library file dialog +# helper application. + +include $(TOPDIR)/rules.mk + +PKG_NAME:=alfilesel +PKG_VERSION:=0.1.0 +PKG_RELEASE:=2 +#PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz +#PKG_SOURCE_URL:=@SF/forth-brainless +#PKG_MD5SUM:=ed4a4cbbe23628b17edc5aa01f32f7fb +#PKG_INSTALL:=1 + +include $(INCLUDE_DIR)/package.mk + +define Package/alfilesel + SECTION:=utilities + CATEGORY:=Utilities + CATEGORY:=Games + MAINTAINER:="David Kuehling" + TITLE:=Graphical file selector app to use in shell scripts + DEPENDS:=+liballegro +liballegro-jpeg +liballegro-png +endef + +define Package/alfilesel/description +A graphical file selector dialog using the allegro game library. Use it +to make allow gmenu2x shortcuts start applications that don\'t provide a menu +themselves (such as mplayer). +endef + +define Build/Configure + +endef + +TARGET_LDFLAGS += -ljpgalleg -lloadpng -lalleg -lpng -lz -lm -lpthread -lrt + +define Build/Configure + $(CP) ./files/alfilesel.c $(PKG_BUILD_DIR)/ +endef + +define Build/Compile + $(call Build/Compile/Default, alfilesel) +endef + +define Package/alfilesel/install + $(INSTALL_DIR) $(1)/usr/bin + $(INSTALL_BIN) $(PKG_BUILD_DIR)/alfilesel $(1)/usr/bin/ +endef + +$(eval $(call BuildPackage,alfilesel)) + +# The following comments configure the Emacs editor. Just ignore them. +# Local Variables: +# compile-command: "make -C ~/h/src/qi/openwrt-xburst package/alfilesel/compile -j2 V=99" +# End: diff --git a/alfilesel/files/alfilesel.c b/alfilesel/files/alfilesel.c new file mode 100644 index 0000000..c130636 --- /dev/null +++ b/alfilesel/files/alfilesel.c @@ -0,0 +1,225 @@ +/* Simple liballegro based file selector helper utility. + * + * Copyright (C) 2011 David Kühling + * + * License: GPL3 or later, NO WARRANTY + * + * Created: Apr 2012 + */ + +#include +#include +#include + +#include +#include +#include + + +static int verbose_flag = 0; +static int run_flag = 0; +static int mouse_flag = 0; +static int help_flag = 0; + +char * program_invocation_short_name; + +static void print_help(const char *name) { + const char *help = + "[OPTION]..." + "Options:" + "\t-t --title=STRING\n" + "\t\tSet file selector dialog's title\n" + "\t-w --wallpaper=FILENAME\n" + "\t\tSet file to use as wallpaper (supports jpeg, png, pcx, bmp, tga)\n" + "\t-p --path=PATH\n" + "\t\tSet initial directory and/or filename\n" + "\t-f --filter=STRING\n" + "\t\tFilter files by extension and/or mode bits\n" + "\t\tUse 'png;jpeg' to show only .png and .jpeg files, use '/+x' to\n" + "\t\tonly show executable files etc.\n" + "\t-m --mouse\n" + "\t\tenable mouse (disabled by default)\n"; + + printf ("USAGE: %s %s", program_invocation_short_name, + help); +} + + + +int main (int argc, char *argv[]) +{ + int c; + const int hborder = 32; + const int vborder = 32; + const char *title = "Select file"; + const char *init_path = 0; + const char *filter = 0; + const char *wallpaper = + "/usr/share/gmenu2x/skins/Default/wallpapers/default.png"; + char path[4096]; + char **cmd = NULL; + int num_cmd = 0; + + PALETTE pal; + BITMAP *backbmp; + + while (1) + { + static struct option long_options[] = + { + /* These options set a flag. */ + {"verbose", no_argument, &verbose_flag, 1}, + {"help", no_argument, &help_flag, 1}, + {"mouse", no_argument, &mouse_flag, 1}, + {"run", no_argument, &run_flag, 1}, + /* These options don't set a flag. + We distinguish them by their indices. */ + {"title", required_argument, 0, 't'}, + {"path", required_argument, 0, 'p'}, + {"filter", required_argument, 0, 'f'}, + {"wallpaper", required_argument, 0, 'w'}, + {0, 0, 0, 0} + }; + /* `getopt_long' stores the option index here. */ + int option_index = 0; + + c = getopt_long (argc, argv, "t:p:f:w:mrh", + long_options, &option_index); + + /* Detect the end of the options. */ + if (c == -1) + break; + + switch (c) + { + case 0: + /* If this option set a flag, do nothing else now. */ + if (long_options[option_index].flag != 0) + break; + break; + + case 't': + title = optarg; + break; + + case 'p': + init_path = optarg; + break; + + case 'f': + filter = optarg; + break; + + case 'w': + wallpaper = optarg; + break; + + case '?': + /* `getopt_long' already printed an error message. */ + print_help(); + return 1; + + default: + abort (); + } + } + + if (help_flag) + { + print_help(); + return 0; + } + + + /* Print any remaining command line arguments (not options). */ + if (optind < argc) + { + run_flag = 1; + cmd = &argv[optind]; + num_cmd = argc - optind; + printf ("non-option ARGV-elements: "); + while (optind < argc) + printf ("%s ", argv[optind++]); + putchar ('\n'); + } + + if (allegro_init() != 0) + return 1; + install_keyboard(); + if (mouse_flag) + install_mouse(); + install_timer(); + loadpng_init(); + jpgalleg_init(); + + if (set_gfx_mode(GFX_SAFE, 320, 240, 0, 0) != 0) { + set_gfx_mode(GFX_TEXT, 0, 0, 0, 0); + allegro_message("Unable to set any graphic mode\n%s\n", allegro_error); + return 1; + } + + backbmp = load_bitmap(wallpaper, pal); + if (backbmp) + { + if (bitmap_color_depth(backbmp) == 8) + set_palette(pal); + + /* can't stretch_blit() between color depths, so doing the stretching on + a memory bitmap of matching depth, then blit to the screen */ + BITMAP *buffer = create_bitmap_ex(bitmap_color_depth(backbmp), + SCREEN_W, SCREEN_H); + + if (!buffer) + { + set_gfx_mode(GFX_TEXT, 0, 0, 0, 0); + allegro_message("Unable to allocate bitmap\n%s\n", allegro_error); + return 1; + } + + stretch_blit(backbmp, buffer, 0, 0, backbmp->w, backbmp->h, + 0, 0, SCREEN_W, SCREEN_H); + blit(buffer, screen, 0, 0, 0, 0, SCREEN_W, SCREEN_H); + destroy_bitmap(buffer); + } + else + { + /* couln't load file (maybe default filename not present...?) */ + clear_to_color(screen, makecol(0,0,0)); + } + + set_palette(pal); + + gui_fg_color = makecol(230,210,140); + gui_bg_color = makecol(30,40,50); + gui_mg_color = makecol(140,150,160); + + if (!init_path) + getcwd(path, sizeof(path)); + else + strncpy(path, init_path, sizeof(path)); + + path[sizeof(path)-1] = '\0'; + + + + int ok = file_select_ex( + title, path, filter, sizeof(path), SCREEN_W-2*hborder, SCREEN_H-2*vborder); + path[sizeof(path)-1] = '\0'; + + allegro_exit(); + + if (ok) + { + printf ("%s", path); + return 0; + } + + return 1; +} + + +/* The following comments configure the Emacs editor. Just ignore them. + * Local Variables: + * compile-command: "make -C ~/h/src/qi/openwrt-xburst package/alfilesel/compile -j2 V=99" + * End: + */