diff -Naur xfce4-appfinder-4.4.1/src/main.c xfce4-appfinder-4.4.1.tpg/src/main.c --- xfce4-appfinder-4.4.1/src/main.c 2007-01-25 20:51:09.000000000 +0000 +++ xfce4-appfinder-4.4.1.tpg/src/main.c 2007-09-05 14:56:42.000000000 +0000 @@ -25,6 +25,7 @@ #include <string.h> #include <gtk/gtk.h> +#include <gdk/gdkkeysyms.h> #include <glib.h> #include <glib/gprintf.h> @@ -36,9 +37,16 @@ #include "xfce4-appfinder.h" #define BORDER 8 +static GtkWidget *appfinder; +static GtkWidget *searchEntry; + void callbackExecuteApplication (GtkWidget *widget, gchar *path, gpointer data); + +void callbackExecuteApplicationExit (GtkWidget *widget, + gchar *path, + gpointer data); void callbackRightClickMenu (GtkWidget *widget, gchar *path, @@ -163,6 +171,14 @@ } void +callbackExecuteApplicationExit(GtkWidget *widget, gchar *path, gpointer data) +{ + callbackExecuteApplication(widget, path, data); + g_free (path); + gtk_main_quit(); +} + +void callbackRunMenuActivate (GtkMenuItem *menuitem, gpointer menu) { gchar *path = g_object_get_data (G_OBJECT (menu), "path"); @@ -416,15 +432,31 @@ xfce_appfinder_view_categories(XFCE_APPFINDER(appfinder), gtk_toggle_button_get_active (togglebutton)); } +gboolean +key_pressed(GtkWidget *widget, GdkEventKey *event, gpointer user_data) +{ + gchar *path; + switch (event->keyval) { + case GDK_Escape: + gtk_main_quit(); + return TRUE; + case GDK_Return: + path = xfce_appfinder_application_path(XFCE_APPFINDER(appfinder)); + if (!path) return FALSE; + callbackExecuteApplicationExit(NULL, path, NULL); + return TRUE; + } + return FALSE; +} + gint main (gint argc, gchar **argv) { GtkWidget *afWnd; - GtkWidget *af; GtkWidget *vbox; GtkWidget *searchBox; GtkWidget *searchLabel; - GtkWidget *searchEntry; + GtkWidget *findImage; GtkWidget *categoriesCheck; xfce_textdomain(GETTEXT_PACKAGE, LOCALEDIR, "UTF-8"); @@ -435,6 +467,7 @@ afWnd = gtk_window_new (GTK_WINDOW_TOPLEVEL); g_signal_connect (G_OBJECT(afWnd), "delete_event", G_CALLBACK(gtk_main_quit), NULL); + g_signal_connect (G_OBJECT(afWnd), "key-press-event", G_CALLBACK(key_pressed), NULL); gtk_window_set_title (GTK_WINDOW(afWnd), "Xfce4 Appfinder"); gtk_window_set_icon_name (GTK_WINDOW (afWnd), "xfce4-appfinder"); //gtk_window_set_icon (GTK_WINDOW(afWnd), xfce_inline_icon_at_size (default_icon_data_48_48, 48, 48)); @@ -448,27 +481,28 @@ gtk_container_set_border_width(GTK_CONTAINER(searchBox), 6); gtk_box_pack_start(GTK_BOX(vbox), searchBox, FALSE, TRUE, 0); - af = GTK_WIDGET(xfce_appfinder_new()); - g_signal_connect (G_OBJECT(af), "application-activate", G_CALLBACK(callbackExecuteApplication), NULL); - g_signal_connect (G_OBJECT(af), "application-right-click", G_CALLBACK(callbackRightClickMenu), NULL); - gtk_box_pack_start(GTK_BOX(vbox), af, TRUE, TRUE, 0); + appfinder = GTK_WIDGET(xfce_appfinder_new()); + g_signal_connect (G_OBJECT(appfinder), "application-activate", G_CALLBACK(callbackExecuteApplicationExit), NULL); + g_signal_connect (G_OBJECT(appfinder), "application-right-click", G_CALLBACK(callbackRightClickMenu), NULL); + gtk_box_pack_start(GTK_BOX(vbox), appfinder, TRUE, TRUE, 0); searchLabel = GTK_WIDGET(gtk_label_new(NULL)); gtk_misc_set_alignment(GTK_MISC(searchLabel), 0.0, 0.5); gtk_label_set_markup_with_mnemonic(GTK_LABEL(searchLabel), _("<b>Search:</b>")); gtk_box_pack_start(GTK_BOX(searchBox), searchLabel, FALSE, TRUE, 0); + findImage = gtk_image_new_from_stock(GTK_STOCK_FIND, GTK_ICON_SIZE_BUTTON); + gtk_box_pack_start(GTK_BOX(searchBox), findImage, FALSE, FALSE, 0); searchEntry = GTK_WIDGET(gtk_entry_new()); - g_signal_connect(searchEntry, "activate", G_CALLBACK(callbackSearchApplication), (gpointer) af); + g_signal_connect(searchEntry, "changed", G_CALLBACK(callbackSearchApplication), (gpointer) appfinder); gtk_box_pack_start(GTK_BOX(searchBox), searchEntry, TRUE, TRUE, 0); categoriesCheck = gtk_check_button_new_with_label (_("Show Categories")); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (categoriesCheck), TRUE); - g_signal_connect (G_OBJECT(categoriesCheck), "toggled", G_CALLBACK (callbackCategoriesCheck), (gpointer) af); + g_signal_connect (G_OBJECT(categoriesCheck), "toggled", G_CALLBACK (callbackCategoriesCheck), (gpointer) appfinder); gtk_box_pack_start(GTK_BOX(searchBox), categoriesCheck, FALSE, TRUE, 0); gtk_widget_show_all (afWnd); gtk_main(); return 0; - } diff -Naur xfce4-appfinder-4.4.1/src/xfce4-appfinder.c xfce4-appfinder-4.4.1.tpg/src/xfce4-appfinder.c --- xfce4-appfinder-4.4.1/src/xfce4-appfinder.c 2007-01-25 20:51:09.000000000 +0000 +++ xfce4-appfinder-4.4.1.tpg/src/xfce4-appfinder.c 2007-09-05 14:56:42.000000000 +0000 @@ -368,7 +368,6 @@ xfce_appfinder_list_add (gchar *name, XfceAppfinderCacheEntry *entry, XfceAppfinderListParam *param) { GtkTreeIter iter; - GdkPixbuf *icon = NULL; if (param->pcat && (g_pattern_match_string (param->pcat, g_utf8_casefold(entry->categories, -1)) == FALSE)) { @@ -385,13 +384,10 @@ return; } } - - if (entry->icon) - icon = xfce_themed_icon_load(entry->icon, 24); - + gtk_list_store_append(param->store, &iter); gtk_list_store_set(param->store, &iter, - APPLICATION_TREE_ICON, icon, + APPLICATION_TREE_ICON, entry->icon ? entry->icon : NULL, APPLICATION_TREE_TEXT, name, -1); } @@ -436,6 +432,8 @@ g_hash_table_foreach (appfinder->cache, (GHFunc)xfce_appfinder_list_add, param); + if (param) g_free(param); + if (psearch) { g_pattern_spec_free (psearch); @@ -619,6 +617,10 @@ } else { + if (!gtk_tree_model_iter_next (gtk_tree_view_get_model (GTK_TREE_VIEW(appfinder->appsTree)), &iter)) { + gtk_tree_model_get_iter_first (gtk_tree_view_get_model (GTK_TREE_VIEW(appfinder->appsTree)), &iter); + gtk_tree_selection_select_iter(gtk_tree_view_get_selection(GTK_TREE_VIEW(appfinder->appsTree)), &iter); + } gtk_widget_set_sensitive(appfinder->appsTree, TRUE); } @@ -631,6 +633,27 @@ } +gchar * +xfce_appfinder_application_path (XfceAppfinder *appfinder) +{ + gchar *name = NULL; + gchar *path = NULL; + GtkTreeIter iter; + GtkTreeModel *treemodel = NULL; + GtkTreeSelection *selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(appfinder->appsTree)); + + if(gtk_tree_selection_get_selected(selection, &treemodel, &iter)) { + gtk_tree_model_get(treemodel, &iter, APPLICATION_TREE_TEXT, &name, -1); + + if (name) { + path = get_path_from_name (name, appfinder); + g_free(name); + } + } + + return path; +} + void xfce_appfinder_clean (XfceAppfinder *appfinder) { @@ -786,7 +809,7 @@ if (icon) { - cent->icon = g_strdup(icon); + cent->icon = xfce_themed_icon_load(icon, 24); } else { diff -Naur xfce4-appfinder-4.4.1/src/xfce4-appfinder.h xfce4-appfinder-4.4.1.tpg/src/xfce4-appfinder.h --- xfce4-appfinder-4.4.1/src/xfce4-appfinder.h 2007-01-25 20:51:09.000000000 +0000 +++ xfce4-appfinder-4.4.1.tpg/src/xfce4-appfinder.h 2007-09-05 14:56:42.000000000 +0000 @@ -46,7 +46,7 @@ gchar *exec; gchar *comment; gchar *categories; - gchar *icon; + GdkPixbuf *icon; }; struct _XfceAppfinder @@ -90,6 +90,7 @@ GtkWidget* xfce_appfinder_new (void); void xfce_appfinder_search (XfceAppfinder *appfinder, const gchar *pattern); +gchar *xfce_appfinder_application_path (XfceAppfinder *appfinder); void xfce_appfinder_view_categories (XfceAppfinder *appfinder, gboolean visible); void xfce_appfinder_clean (XfceAppfinder *appfinder);