[gnome-software] Move search closer to the mockups



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]