summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--TODO1
-rw-r--r--src/xfce-appfinder-window.c128
2 files changed, 124 insertions, 5 deletions
diff --git a/TODO b/TODO
index b0560de..4eea905 100644
--- a/TODO
+++ b/TODO
@@ -11,5 +11,4 @@
* save and/or manage a 'Favorites' category?
* add documentation
-* remember last category for restarts and menu regeneration
* make the DBG macro work
diff --git a/src/xfce-appfinder-window.c b/src/xfce-appfinder-window.c
index abe8763..60076de 100644
--- a/src/xfce-appfinder-window.c
+++ b/src/xfce-appfinder-window.c
@@ -27,6 +27,8 @@
#include <string.h>
#endif
+#include <gdk/gdk.h>
+#include <gdk/gdkkeysyms.h>
#include <gtk/gtk.h>
#include <libxfce4util/libxfce4util.h>
@@ -85,6 +87,15 @@ static void _xfce_appfinder_window_entry_activated (GtkEntry
static void _xfce_appfinder_window_entry_focused (GtkWidget *entry,
GdkEventFocus *event,
XfceAppfinderWindow *window);
+static gboolean _xfce_appfinder_window_entry_key_pressed (GtkWidget *widget,
+ GdkEventKey *event,
+ XfceAppfinderWindow *window);
+static gboolean _xfce_appfinder_window_radio_key_pressed (GtkWidget *widget,
+ GdkEventKey *event,
+ XfceAppfinderWindow *window);
+static gboolean _xfce_appfinder_window_view_key_pressed (GtkWidget *widget,
+ GdkEventKey *event,
+ XfceAppfinderWindow *window);
static void _xfce_appfinder_window_category_changed (XfceAppfinderWindow *window,
GtkToggleButton *button);
static void _xfce_appfinder_window_cursor_changed (GtkTreeView *tree_view,
@@ -319,6 +330,7 @@ xfce_appfinder_window_init (XfceAppfinderWindow *window)
g_signal_connect (window->search_entry, "changed", G_CALLBACK (_xfce_appfinder_window_entry_changed), window);
g_signal_connect (window->search_entry, "activate", G_CALLBACK (_xfce_appfinder_window_entry_activated), window);
g_signal_connect (window->search_entry, "focus-in-event", G_CALLBACK (_xfce_appfinder_window_entry_focused), window);
+ g_signal_connect (window->search_entry, "key-press-event", G_CALLBACK (_xfce_appfinder_window_entry_key_pressed), window);
gtk_container_add (GTK_CONTAINER (alignment), window->search_entry);
gtk_widget_show (window->search_entry);
@@ -352,6 +364,7 @@ xfce_appfinder_window_init (XfceAppfinderWindow *window)
g_signal_connect (window->tree_view, "cursor-changed", G_CALLBACK (_xfce_appfinder_window_cursor_changed), window);
g_signal_connect_swapped (window->tree_view, "row-activated", G_CALLBACK (_xfce_appfinder_window_execute), window);
g_signal_connect (window->tree_view, "drag-data-get", G_CALLBACK (_xfce_appfinder_window_drag_data_get), window);
+ g_signal_connect (window->tree_view, "key-press-event", G_CALLBACK (_xfce_appfinder_window_view_key_pressed), window);
gtk_container_add (GTK_CONTAINER (scrollwin), window->tree_view);
gtk_widget_show (window->tree_view);
@@ -517,14 +530,22 @@ _xfce_appfinder_window_entry_activated (GtkEntry *entry,
XfceAppfinderWindow *window)
{
GtkTreePath *path;
+ GtkTreePath *start;
+ GtkTreePath *end;
g_return_if_fail (XFCE_IS_APPFINDER_WINDOW (window));
- path = gtk_tree_path_new_first ();
- gtk_tree_view_set_cursor (GTK_TREE_VIEW (window->tree_view), path, NULL, FALSE);
- gtk_tree_path_free (path);
+ if (G_LIKELY (gtk_tree_view_get_visible_range (GTK_TREE_VIEW (window->tree_view), &start, &end)))
+ {
+ path = gtk_tree_path_new_first ();
+ gtk_tree_view_set_cursor (GTK_TREE_VIEW (window->tree_view), path, NULL, FALSE);
+ gtk_tree_path_free (path);
+
+ gtk_tree_path_free (start);
+ gtk_tree_path_free (end);
- gtk_widget_grab_focus (window->tree_view);
+ gtk_widget_grab_focus (window->tree_view);
+ }
}
@@ -548,6 +569,103 @@ _xfce_appfinder_window_entry_focused (GtkWidget *entry,
+static gboolean
+_xfce_appfinder_window_entry_key_pressed (GtkWidget *widget,
+ GdkEventKey *event,
+ XfceAppfinderWindow *window)
+{
+ GtkWidget *child;
+ GList *children;
+ gboolean handled = FALSE;
+
+ g_return_val_if_fail (XFCE_IS_APPFINDER_WINDOW (window), FALSE);
+
+ if (event->keyval == GDK_Up || event->keyval == GDK_Down)
+ {
+ children = gtk_container_get_children (GTK_CONTAINER (window->categories_box));
+
+ if (G_LIKELY (children != NULL))
+ {
+ child = event->keyval == GDK_Down ? g_list_first (children)->data : g_list_last (children)->data;
+
+ if (G_LIKELY (GTK_IS_TOGGLE_BUTTON (child)))
+ {
+ gtk_widget_grab_focus (child);
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (child), TRUE);
+
+ handled = TRUE;
+ }
+ }
+ }
+
+ return handled;
+}
+
+
+
+static gboolean
+_xfce_appfinder_window_radio_key_pressed (GtkWidget *widget,
+ GdkEventKey *event,
+ XfceAppfinderWindow *window)
+{
+ GList *children;
+ gboolean entry_grab = FALSE;
+ gboolean handled = FALSE;
+
+ g_return_val_if_fail (XFCE_IS_APPFINDER_WINDOW (window), FALSE);
+
+ children = gtk_container_get_children (GTK_CONTAINER (window->categories_box));
+
+ switch (event->keyval)
+ {
+ case GDK_Up:
+ case GDK_Down:
+
+ if (G_LIKELY (children != NULL))
+ {
+ if (event->keyval == GDK_Up)
+ entry_grab = (widget == g_list_first (children)->data);
+ else
+ entry_grab = (widget == g_list_last (children)->data);
+
+ if (G_UNLIKELY (entry_grab))
+ {
+ gtk_widget_grab_focus (window->search_entry);
+ handled = TRUE;
+ }
+ }
+
+ break;
+ case GDK_Right:
+ _xfce_appfinder_window_entry_activated (GTK_ENTRY (window->search_entry), window);
+ handled = TRUE;
+ default:
+ break;
+ }
+
+ return handled;
+}
+
+
+
+static gboolean
+_xfce_appfinder_window_view_key_pressed (GtkWidget *widget,
+ GdkEventKey *event,
+ XfceAppfinderWindow *window)
+{
+ g_return_val_if_fail (XFCE_IS_APPFINDER_WINDOW (window), FALSE);
+
+ if (event->keyval == GDK_Left)
+ {
+ gtk_widget_grab_focus (window->search_entry);
+ return TRUE;
+ }
+ else
+ return FALSE;
+}
+
+
+
static void
_xfce_appfinder_window_category_changed (XfceAppfinderWindow *window,
GtkToggleButton *button)
@@ -744,6 +862,7 @@ _xfce_appfinder_window_load_menu (XfceAppfinderWindow *window,
{
button = gtk_radio_button_new_with_label (window->categories_group, name);
gtk_button_set_focus_on_click (GTK_BUTTON (button), FALSE);
+ g_signal_connect (button, "key-press-event", G_CALLBACK (_xfce_appfinder_window_radio_key_pressed), window);
gtk_container_add (GTK_CONTAINER (window->categories_box), button);
gtk_widget_show (button);
@@ -810,6 +929,7 @@ _xfce_appfinder_window_reload_menu (XfceAppfinderWindow *window)
button = gtk_radio_button_new_with_label (NULL, _("All"));
gtk_button_set_focus_on_click (GTK_BUTTON (button), FALSE);
g_signal_connect_swapped (button, "toggled", G_CALLBACK (_xfce_appfinder_window_category_changed), window);
+ g_signal_connect (button, "key-press-event", G_CALLBACK (_xfce_appfinder_window_radio_key_pressed), window);
gtk_container_add (GTK_CONTAINER (window->categories_box), button);
gtk_widget_show (button);