[gnome-logs] Add keyboard navigation for the back button
- From: David King <davidk src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-logs] Add keyboard navigation for the back button
- Date: Mon, 3 Mar 2014 13:13:38 +0000 (UTC)
commit 289a514553fd2589c72ff47c96bf95822a6f5485
Author: David King <davidk gnome org>
Date: Wed Feb 26 12:34:56 2014 +0000
Add keyboard navigation for the back button
Thanks to Joanmarie Diggs for the suggestion.
https://bugzilla.gnome.org/show_bug.cgi?id=724980
src/gl-eventtoolbar.c | 32 ++++++++++++++++++++++++++++++++
src/gl-eventtoolbar.h | 2 ++
src/gl-window.c | 42 ++++++++++++++++++++++++++++++++++++++----
3 files changed, 72 insertions(+), 4 deletions(-)
---
diff --git a/src/gl-eventtoolbar.c b/src/gl-eventtoolbar.c
index eb2515f..9146d98 100644
--- a/src/gl-eventtoolbar.c
+++ b/src/gl-eventtoolbar.c
@@ -194,6 +194,38 @@ gl_event_toolbar_init (GlEventToolbar *toolbar)
}
}
+gboolean
+gl_event_toolbar_handle_back_button_event (GlEventToolbar *toolbar,
+ GdkEventKey *event)
+{
+ GlEventToolbarPrivate *priv;
+ GdkModifierType state;
+ GdkKeymap *keymap;
+ gboolean is_rtl;
+
+ g_return_val_if_fail (toolbar != NULL && event != NULL,
+ GDK_EVENT_PROPAGATE);
+
+ priv = gl_event_toolbar_get_instance_private (toolbar);
+
+ state = event->state;
+ keymap = gdk_keymap_get_default ();
+ gdk_keymap_add_virtual_modifiers (keymap, &state);
+ state = state & gtk_accelerator_get_default_mod_mask ();
+ is_rtl = gtk_widget_get_direction (priv->back_button) == GTK_TEXT_DIR_RTL;
+
+ if ((!is_rtl && state == GDK_MOD1_MASK && event->keyval == GDK_KEY_Left)
+ || (is_rtl && state == GDK_MOD1_MASK && event->keyval == GDK_KEY_Right)
+ || event->keyval == GDK_KEY_Back)
+ {
+ return GDK_EVENT_STOP;
+ }
+ else
+ {
+ return GDK_EVENT_PROPAGATE;
+ }
+}
+
void
gl_event_toolbar_set_mode (GlEventToolbar *toolbar, GlEventToolbarMode mode)
{
diff --git a/src/gl-eventtoolbar.h b/src/gl-eventtoolbar.h
index 31f4bb6..9accb93 100644
--- a/src/gl-eventtoolbar.h
+++ b/src/gl-eventtoolbar.h
@@ -53,6 +53,8 @@ typedef enum
GType gl_event_toolbar_get_type (void);
GtkWidget * gl_event_toolbar_new (void);
+gboolean gl_event_toolbar_handle_back_button_event (GlEventToolbar *toolbar,
+ GdkEventKey *event);
void gl_event_toolbar_set_mode (GlEventToolbar *toolbar,
GlEventToolbarMode mode);
diff --git a/src/gl-window.c b/src/gl-window.c
index e9e4351..82ee364 100644
--- a/src/gl-window.c
+++ b/src/gl-window.c
@@ -198,22 +198,56 @@ on_gl_window_key_press_event (GlWindow *window,
gpointer user_data)
{
GlWindowPrivate *priv;
- GAction *search;
+ GAction *action;
+ GVariant *variant;
+ const gchar *mode;
+ GEnumClass *eclass;
+ GEnumValue *evalue;
priv = gl_window_get_instance_private (window);
- search = g_action_map_lookup_action (G_ACTION_MAP (window), "search");
+ action = g_action_map_lookup_action (G_ACTION_MAP (window), "search");
- if (g_action_get_enabled (search))
+ if (g_action_get_enabled (action))
{
if (gtk_search_bar_handle_event (GTK_SEARCH_BAR (priv->event_search),
event) == GDK_EVENT_STOP)
{
- g_action_change_state (search, g_variant_new_boolean (TRUE));
+ g_action_change_state (action, g_variant_new_boolean (TRUE));
return GDK_EVENT_STOP;
}
}
+ action = g_action_map_lookup_action (G_ACTION_MAP (window), "view-mode");
+ variant = g_action_get_state (action);
+ mode = g_variant_get_string (variant, NULL);
+ eclass = g_type_class_ref (GL_TYPE_EVENT_VIEW_MODE);
+ evalue = g_enum_get_value_by_nick (eclass, mode);
+
+ g_variant_unref (variant);
+
+ switch (evalue->value)
+ {
+ case GL_EVENT_VIEW_MODE_LIST:
+ break; /* Ignored, as there is no back button. */
+ case GL_EVENT_VIEW_MODE_DETAIL:
+ if (gl_event_toolbar_handle_back_button_event (GL_EVENT_TOOLBAR (priv->event_toolbar),
+ (GdkEventKey*)event)
+ == GDK_EVENT_STOP)
+ {
+ GlEventView *events;
+
+ events = GL_EVENT_VIEW (priv->events);
+ gl_event_view_set_mode (events, GL_EVENT_VIEW_MODE_LIST);
+ g_type_class_unref (eclass);
+
+ return GDK_EVENT_STOP;
+ }
+ break;
+ }
+
+ g_type_class_unref (eclass);
+
return GDK_EVENT_PROPAGATE;
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]