From ca5bd829f90aea1192cf152c5ff076d8ecd248fc Mon Sep 17 00:00:00 2001 From: Pierre Pronchery Date: Sat, 17 Feb 2007 12:52:34 +0000 Subject: [PATCH] Initial release --- tools/Makefile | 40 +++++++++ tools/iconlist.c | 208 +++++++++++++++++++++++++++++++++++++++++++++ tools/project.conf | 8 ++ 3 files changed, 256 insertions(+) create mode 100644 tools/Makefile create mode 100644 tools/iconlist.c create mode 100644 tools/project.conf diff --git a/tools/Makefile b/tools/Makefile new file mode 100644 index 0000000..b371973 --- /dev/null +++ b/tools/Makefile @@ -0,0 +1,40 @@ +TARGETS = iconlist +PREFIX = /usr/local +DESTDIR = +BINDIR = $(PREFIX)/bin +INCLUDEDIR= $(PREFIX)/include +CC = cc +CPPFLAGS= +CFLAGSF = -W `pkg-config gtk+-2.0 --cflags` +CFLAGS = -Wall -g -O2 +LDFLAGSF= `pkg-config gtk+-2.0 --libs` +RM = rm -f +MKDIR = mkdir -p +INSTALL = install + + +all: $(TARGETS) + +iconlist_OBJS = iconlist.o +iconlist_CFLAGS = $(CPPFLAGS) $(CFLAGSF) $(CFLAGS) + +iconlist: $(iconlist_OBJS) + $(CC) -o iconlist $(iconlist_OBJS) $(LDFLAGSF) $(LDFLAGS) + +iconlist.o: iconlist.c + $(CC) $(iconlist_CFLAGS) -c iconlist.c + +clean: + $(RM) $(iconlist_OBJS) + +distclean: clean + $(RM) $(TARGETS) + +install: all + $(MKDIR) $(DESTDIR)$(BINDIR) + $(INSTALL) -m 0755 iconlist $(DESTDIR)$(BINDIR)/iconlist + +uninstall: + $(RM) $(DESTDIR)$(BINDIR)/iconlist + +.PHONY: all clean distclean install uninstall diff --git a/tools/iconlist.c b/tools/iconlist.c new file mode 100644 index 0000000..fe36dca --- /dev/null +++ b/tools/iconlist.c @@ -0,0 +1,208 @@ +/* $Id$ */ +/* Copyright (c) 2007 The DeforaOS Project */ + + + +#include +#include +#include +#include + + +/* types */ +typedef struct _Prefs +{ + int flags; + char * theme; +} Prefs; +#define PREFS_l 1 + +enum { COL_NAME = 0, COL_PIXBUF, COL_COUNT }; + + +/* iconlist */ +static int _iconlist_list(char * theme); +static int _iconlist_do(void); + +static int _iconlist(Prefs * prefs) +{ + if(prefs->flags & PREFS_l) + return _iconlist_list(prefs->theme); + return _iconlist_do(); +} + +static int _iconlist_list(char * theme) +{ + GtkIconTheme * icontheme; + GList * list; + GList * p; + gint * sizes; + gint * q; + + if(theme == NULL) + icontheme = gtk_icon_theme_get_default(); + else + { + icontheme = gtk_icon_theme_new(); + gtk_icon_theme_set_custom_theme(icontheme, theme); + } + if((list = gtk_icon_theme_list_icons(icontheme, NULL)) == NULL) + return 1; + for(p = list; p != NULL; p = p->next) + { + printf("%s:", (char*)p->data); + if((sizes = gtk_icon_theme_get_icon_sizes(icontheme, p->data)) + == NULL) + { + puts(" unknown\n"); + continue; + } + for(q = sizes; *q != 0; q++) + printf(" %d", *q); + putc('\n', stdout); + g_free(sizes); + } + g_list_foreach(list, g_free, NULL); + g_free(list); + return 0; +} + +/* iconlist_do */ +/* callbacks */ +static gboolean _on_closex(GtkWidget * widget, GdkEvent * event, gpointer data); +static void _on_theme_activate(GtkWidget * widget, gpointer data); + +static void _do_iconview(GtkWidget * iconview, char * theme); +static int _iconlist_do(void) +{ + GtkWidget * window; + GtkWidget * vbox; + GtkWidget * toolbar; + GtkToolItem * toolitem; + GtkWidget * label; + GtkWidget * entry; + GtkWidget * scrolled; + GtkListStore * store; + GtkWidget * iconview; + + /* window */ + window = gtk_window_new(GTK_WINDOW_TOPLEVEL); + gtk_window_set_title(GTK_WINDOW(window), "Icon list"); + gtk_window_set_default_size(GTK_WINDOW(window), 640, 480); + g_signal_connect(window, "delete_event", G_CALLBACK(_on_closex), NULL); + /* vbox */ + vbox = gtk_vbox_new(FALSE, 0); + /* toolbar */ + toolbar = gtk_toolbar_new(); + toolitem = gtk_tool_item_new(); + label = gtk_label_new("Theme: "); + gtk_container_add(GTK_CONTAINER(toolitem), label); + gtk_toolbar_insert(GTK_TOOLBAR(toolbar), toolitem, -1); + toolitem = gtk_tool_item_new(); + entry = gtk_entry_new(); + gtk_container_add(GTK_CONTAINER(toolitem), entry); + gtk_toolbar_insert(GTK_TOOLBAR(toolbar), toolitem, -1); + gtk_box_pack_start(GTK_BOX(vbox), toolbar, FALSE, TRUE, 0); + /* scrolled window */ + scrolled = gtk_scrolled_window_new(NULL, NULL); + gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled), + GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); + /* icon view */ + store = gtk_list_store_new(COL_COUNT, G_TYPE_STRING, GDK_TYPE_PIXBUF); + iconview = gtk_icon_view_new_with_model(GTK_TREE_MODEL(store)); + g_signal_connect(G_OBJECT(entry), "activate", G_CALLBACK( + _on_theme_activate), iconview); /* late */ + g_object_unref(store); + gtk_icon_view_set_selection_mode(GTK_ICON_VIEW(iconview), + GTK_SELECTION_MULTIPLE); + gtk_icon_view_set_text_column(GTK_ICON_VIEW(iconview), 0); + gtk_icon_view_set_pixbuf_column(GTK_ICON_VIEW(iconview), 1); + _do_iconview(iconview, NULL); + gtk_container_add(GTK_CONTAINER(scrolled), iconview); + gtk_box_pack_start(GTK_BOX(vbox), scrolled, TRUE, TRUE, 0); + gtk_container_add(GTK_CONTAINER(window), vbox); + gtk_widget_show_all(window); + gtk_main(); + return 0; +} + +static gboolean _on_closex(GtkWidget * widget, GdkEvent * event, gpointer data) +{ + gtk_widget_hide(widget); + gtk_main_quit(); + return FALSE; +} + +static void _on_theme_activate(GtkWidget * widget, gpointer data) +{ + GtkWidget * iconview = data; + + _do_iconview(iconview, gtk_entry_get_text(GTK_ENTRY(widget))); +} + +static void _do_iconview(GtkWidget * iconview, char * theme) +{ + GtkIconTheme * icontheme; + GList * list; + GList * p; + GtkListStore * store; + GtkTreeIter iter; + GdkPixbuf * pixbuf; + + if(theme == NULL) + icontheme = gtk_icon_theme_get_default(); + else + { + icontheme = gtk_icon_theme_new(); + gtk_icon_theme_set_custom_theme(icontheme, theme); + } + if((list = gtk_icon_theme_list_icons(icontheme, NULL)) == NULL) + return; + store = GTK_LIST_STORE(gtk_icon_view_get_model(GTK_ICON_VIEW( + iconview))); + gtk_list_store_clear(store); + for(p = list; p != NULL; p = p->next) + { + pixbuf = gtk_icon_theme_load_icon(icontheme, p->data, 48, 0, + NULL); + gtk_list_store_insert_with_values(store, &iter, -1, + COL_NAME, p->data, COL_PIXBUF, pixbuf, -1); + g_free(p->data); + } + g_free(list); +} + + +/* usage */ +static int _usage(void) +{ + fputs("Usage: iconlist\n" +" iconlist -l [-t theme]\n", stderr); + return 1; +} + + +/* main */ +int main(int argc, char * argv[]) +{ + Prefs prefs; + int o; + + memset(&prefs, 0, sizeof(prefs)); + while((o = getopt(argc, argv, "lt:")) != -1) + switch(o) + { + case 'l': + prefs.flags |= PREFS_l; + break; + case 't': + prefs.theme = optarg; + break; + default: + return _usage(); + } + if(optind != argc) + return _usage(); + gtk_init(&argc, &argv); + return _iconlist(&prefs) == 0 ? 0 : 2; +} diff --git a/tools/project.conf b/tools/project.conf new file mode 100644 index 0000000..108f925 --- /dev/null +++ b/tools/project.conf @@ -0,0 +1,8 @@ +targets=iconlist +cflags_force=-W `pkg-config gtk+-2.0 --cflags` +cflags=-Wall -g -O2 +ldflags_force=`pkg-config gtk+-2.0 --libs` + +[iconlist] +type=binary +sources=iconlist.c