[gnome-software] Move search closer to the mockups
- From: Matthias Clasen <matthiasc src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-software] Move search closer to the mockups
- Date: Fri, 30 Aug 2013 02:04:26 +0000 (UTC)
commit ccab8aacee909e6f0171f704d33e8134193876e3
Author: Matthias Clasen <mclasen redhat com>
Date: Thu Aug 29 21:05:20 2013 -0400
Move search closer to the mockups
Make typing go to the search entry whenever it is visible, and
make Escape clear the entry.
src/gs-shell.c | 113 ++++++++++++++++++++++++++++++++++++++++++++++++++++++--
1 files changed, 109 insertions(+), 4 deletions(-)
---
diff --git a/src/gs-shell.c b/src/gs-shell.c
index bdd7185..c1bc9b7 100644
--- a/src/gs-shell.c
+++ b/src/gs-shell.c
@@ -182,6 +182,103 @@ gs_shell_search_activated_cb (GtkEntry *entry, GsShell *shell)
gs_shell_set_mode (shell, GS_SHELL_MODE_SEARCH);
}
+static gboolean
+is_keynav_event (GdkEvent *event,
+ guint keyval)
+{
+ GdkModifierType state = 0;
+
+ gdk_event_get_state (event, &state);
+
+ if (keyval == GDK_KEY_Tab ||
+ keyval == GDK_KEY_KP_Tab ||
+ keyval == GDK_KEY_Up ||
+ keyval == GDK_KEY_KP_Up ||
+ keyval == GDK_KEY_Down ||
+ keyval == GDK_KEY_KP_Down ||
+ keyval == GDK_KEY_Left ||
+ keyval == GDK_KEY_KP_Left ||
+ keyval == GDK_KEY_Right ||
+ keyval == GDK_KEY_KP_Right ||
+ keyval == GDK_KEY_Home ||
+ keyval == GDK_KEY_KP_Home ||
+ keyval == GDK_KEY_End ||
+ keyval == GDK_KEY_KP_End ||
+ keyval == GDK_KEY_Page_Up ||
+ keyval == GDK_KEY_KP_Page_Up ||
+ keyval == GDK_KEY_Page_Down ||
+ keyval == GDK_KEY_KP_Page_Down ||
+ ((state & (GDK_CONTROL_MASK | GDK_MOD1_MASK)) != 0))
+ return TRUE;
+
+ return FALSE;
+}
+
+static gboolean
+entry_keypress_handler (GtkWidget *widget, GdkEvent *event, GsShell *shell)
+{
+ guint keyval;
+ GtkWidget *entry;
+
+ if (!gdk_event_get_keyval (event, &keyval) ||
+ keyval != GDK_KEY_Escape)
+ return GDK_EVENT_PROPAGATE;
+
+ entry = GTK_WIDGET (gtk_builder_get_object (shell->priv->builder, "entry_search"));
+ gtk_entry_set_text (GTK_ENTRY (entry), "");
+
+ return GDK_EVENT_STOP;
+}
+
+static void
+preedit_changed_cb (GtkEntry *entry, GtkWidget *popup, gboolean *preedit_changed)
+{
+ *preedit_changed = TRUE;
+}
+
+static gboolean
+window_keypress_handler (GtkWidget *window, GdkEvent *event, GsShell *shell)
+{
+ GtkWidget *entry;
+ guint keyval;
+ gboolean handled;
+ gboolean preedit_changed;
+ guint preedit_change_id;
+ gboolean res;
+ gchar *old_text, *new_text;
+
+ if (gs_shell_get_mode (shell) != GS_SHELL_MODE_OVERVIEW &&
+ gs_shell_get_mode (shell) != GS_SHELL_MODE_INSTALLED)
+ return GDK_EVENT_PROPAGATE;
+
+ if (!gdk_event_get_keyval (event, &keyval) ||
+ is_keynav_event (event, keyval) ||
+ keyval == GDK_KEY_space ||
+ keyval == GDK_KEY_Menu)
+ return GDK_EVENT_PROPAGATE;
+
+ entry = GTK_WIDGET (gtk_builder_get_object (shell->priv->builder, "entry_search"));
+
+ handled = GDK_EVENT_PROPAGATE;
+ preedit_changed = FALSE;
+ preedit_change_id = g_signal_connect (entry, "preedit-changed",
+ G_CALLBACK (preedit_changed_cb), &preedit_changed);
+
+ old_text = g_strdup (gtk_entry_get_text (GTK_ENTRY (entry)));
+ res = gtk_widget_event (entry, event);
+ new_text = g_strdup (gtk_entry_get_text (GTK_ENTRY (entry)));
+
+ g_signal_handler_disconnect (entry, preedit_change_id);
+
+ if ((res && g_strcmp0 (new_text, old_text) != 0) || preedit_changed)
+ handled = GDK_EVENT_STOP;
+
+ g_free (old_text);
+ g_free (new_text);
+
+ return handled;
+}
+
/**
* gs_shell_setup:
*/
@@ -235,10 +332,6 @@ gs_shell_setup (GsShell *shell, GsPluginLoader *plugin_loader, GCancellable *can
g_signal_connect (widget, "clicked",
G_CALLBACK (gs_shell_overview_button_cb), shell);
- widget = GTK_WIDGET (gtk_builder_get_object (priv->builder, "entry_search"));
- g_signal_connect (GTK_EDITABLE (widget), "activate",
- G_CALLBACK (gs_shell_search_activated_cb), shell);
-
gs_shell_overview_setup (priv->shell_overview,
shell,
priv->plugin_loader,
@@ -266,6 +359,18 @@ gs_shell_setup (GsShell *shell, GsPluginLoader *plugin_loader, GCancellable *can
shell,
priv->builder);
+ /* set up search */
+ widget = GTK_WIDGET (gtk_builder_get_object (priv->builder, "entry_search"));
+ g_signal_connect (GTK_EDITABLE (widget), "activate",
+ G_CALLBACK (gs_shell_search_activated_cb), shell);
+ widget = GTK_WIDGET (gtk_builder_get_object (priv->builder, "window_software"));
+ g_signal_connect (widget, "key-press-event",
+ G_CALLBACK (window_keypress_handler), shell);
+ widget = GTK_WIDGET (gtk_builder_get_object (priv->builder, "entry_search"));
+ g_signal_connect (widget, "key-press-event",
+ G_CALLBACK (entry_keypress_handler), shell);
+
+ /* load content */
g_signal_connect (priv->shell_overview, "refreshed",
G_CALLBACK (initial_overview_load_done), shell);
gs_shell_set_mode (shell, GS_SHELL_MODE_OVERVIEW);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]