[gtk+] Use the new API in GtkSearchBar if we can
- From: Matthias Clasen <matthiasc src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk+] Use the new API in GtkSearchBar if we can
- Date: Sat, 24 Jan 2015 18:36:01 +0000 (UTC)
commit 3bf12c44e28076fd23c21a5e512df19070d04a0a
Author: Matthias Clasen <mclasen redhat com>
Date: Sat Dec 27 18:29:07 2014 -0500
Use the new API in GtkSearchBar if we can
Sadly, GtkSearchBar allows connecting plain entries, so we have
to keep the old code around.
gtk/Makefile.am | 1 +
gtk/gtksearchbar.c | 152 ++++++++++++++++++++-----------------------
gtk/gtksearchentry.c | 6 +-
gtk/gtksearchentryprivate.h | 36 ++++++++++
4 files changed, 110 insertions(+), 85 deletions(-)
---
diff --git a/gtk/Makefile.am b/gtk/Makefile.am
index 4059603..d44a4dc 100644
--- a/gtk/Makefile.am
+++ b/gtk/Makefile.am
@@ -485,6 +485,7 @@ gtk_private_h_sources = \
gtkscaleprivate.h \
gtksearchengine.h \
gtksearchenginesimple.h \
+ gtksearchentryprivate.h \
gtkselectionprivate.h \
gtksettingsprivate.h \
gtksizegroup-private.h \
diff --git a/gtk/gtksearchbar.c b/gtk/gtksearchbar.c
index 97b7fb2..d1b3f3c 100644
--- a/gtk/gtksearchbar.c
+++ b/gtk/gtksearchbar.c
@@ -33,6 +33,7 @@
#include "gtkprivate.h"
#include "gtkrender.h"
#include "gtksearchbar.h"
+#include "gtksearchentryprivate.h"
/**
* SECTION:gtksearchbar
@@ -84,40 +85,12 @@ enum {
static GParamSpec *widget_props[LAST_PROPERTY] = { NULL, };
-static gboolean
-is_keynav_event (GdkEvent *event,
- guint keyval)
+static void
+stop_search_cb (GtkWidget *entry,
+ GtkSearchBar *bar)
{
- 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;
-
- /* Other navigation events should get automatically
- * ignored as they will not change the content of the entry
- */
-
- return FALSE;
+ GtkSearchBarPrivate *priv = gtk_search_bar_get_instance_private (bar);
+ gtk_revealer_set_reveal_child (GTK_REVEALER (priv->revealer), FALSE);
}
static gboolean
@@ -125,16 +98,13 @@ entry_key_pressed_event_cb (GtkWidget *widget,
GdkEvent *event,
GtkSearchBar *bar)
{
- GtkSearchBarPrivate *priv = gtk_search_bar_get_instance_private (bar);
- guint keyval;
-
- if (!gdk_event_get_keyval (event, &keyval) ||
- keyval != GDK_KEY_Escape)
+ if (event->key.keyval == GDK_KEY_Escape)
+ {
+ stop_search_cb (widget, bar);
+ return GDK_EVENT_STOP;
+ }
+ else
return GDK_EVENT_PROPAGATE;
-
- gtk_revealer_set_reveal_child (GTK_REVEALER (priv->revealer), FALSE);
-
- return GDK_EVENT_STOP;
}
static void
@@ -145,6 +115,45 @@ preedit_changed_cb (GtkEntry *entry,
*preedit_changed = TRUE;
}
+static gboolean
+gtk_search_bar_handle_event_for_entry (GtkSearchBar *bar,
+ GdkEvent *event)
+{
+ GtkSearchBarPrivate *priv = gtk_search_bar_get_instance_private (bar);
+ gboolean handled;
+ gboolean preedit_changed;
+ guint preedit_change_id;
+ gboolean res;
+ char *old_text, *new_text;
+
+ if (gtk_search_entry_is_keynav_event (event) ||
+ event->key.keyval == GDK_KEY_space ||
+ event->key.keyval == GDK_KEY_Menu)
+ return GDK_EVENT_PROPAGATE;
+
+ if (!gtk_widget_get_realized (priv->entry))
+ gtk_widget_realize (priv->entry);
+
+ handled = GDK_EVENT_PROPAGATE;
+ preedit_changed = FALSE;
+ preedit_change_id = g_signal_connect (priv->entry, "preedit-changed",
+ G_CALLBACK (preedit_changed_cb), &preedit_changed);
+
+ old_text = g_strdup (gtk_entry_get_text (GTK_ENTRY (priv->entry)));
+ res = gtk_widget_event (priv->entry, event);
+ new_text = g_strdup (gtk_entry_get_text (GTK_ENTRY (priv->entry)));
+
+ g_signal_handler_disconnect (priv->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;
+}
+
/**
* gtk_search_bar_handle_event:
* @bar: a #GtkSearchBar
@@ -191,12 +200,10 @@ gtk_search_bar_handle_event (GtkSearchBar *bar,
GdkEvent *event)
{
GtkSearchBarPrivate *priv = gtk_search_bar_get_instance_private (bar);
- guint keyval;
gboolean handled;
- gboolean preedit_changed;
- guint preedit_change_id;
- gboolean res;
- char *old_text, *new_text;
+
+ if (priv->reveal_child)
+ return GDK_EVENT_PROPAGATE;
if (priv->entry == NULL)
{
@@ -204,39 +211,13 @@ gtk_search_bar_handle_event (GtkSearchBar *bar,
return GDK_EVENT_PROPAGATE;
}
- /* Exit early if the search bar is already shown,
- * the event doesn't contain a key press,
- * or the event is a navigation or space bar key press
- */
- if (priv->reveal_child ||
- !gdk_event_get_keyval (event, &keyval) ||
- is_keynav_event (event, keyval) ||
- keyval == GDK_KEY_space ||
- keyval == GDK_KEY_Menu)
- return GDK_EVENT_PROPAGATE;
-
- if (!gtk_widget_get_realized (priv->entry))
- gtk_widget_realize (priv->entry);
-
- handled = GDK_EVENT_PROPAGATE;
- preedit_changed = FALSE;
- preedit_change_id = g_signal_connect (priv->entry, "preedit-changed",
- G_CALLBACK (preedit_changed_cb), &preedit_changed);
-
- old_text = g_strdup (gtk_entry_get_text (GTK_ENTRY (priv->entry)));
- res = gtk_widget_event (priv->entry, event);
- new_text = g_strdup (gtk_entry_get_text (GTK_ENTRY (priv->entry)));
-
- g_signal_handler_disconnect (priv->entry, preedit_change_id);
-
- if ((res && g_strcmp0 (new_text, old_text) != 0) || preedit_changed)
- {
- handled = GDK_EVENT_STOP;
- gtk_revealer_set_reveal_child (GTK_REVEALER (priv->revealer), TRUE);
- }
+ if (GTK_IS_SEARCH_ENTRY (priv->entry))
+ handled = gtk_search_entry_handle_event (GTK_SEARCH_ENTRY (priv->entry), event);
+ else
+ handled = gtk_search_bar_handle_event_for_entry (bar, event);
- g_free (old_text);
- g_free (new_text);
+ if (handled == GDK_EVENT_STOP)
+ gtk_revealer_set_reveal_child (GTK_REVEALER (priv->revealer), TRUE);
return handled;
}
@@ -513,7 +494,10 @@ gtk_search_bar_connect_entry (GtkSearchBar *bar,
if (priv->entry != NULL)
{
- g_signal_handlers_disconnect_by_func (priv->entry, entry_key_pressed_event_cb, bar);
+ if (GTK_IS_SEARCH_ENTRY (priv->entry))
+ g_signal_handlers_disconnect_by_func (priv->entry, stop_search_cb, bar);
+ else
+ g_signal_handlers_disconnect_by_func (priv->entry, entry_key_pressed_event_cb, bar);
g_object_remove_weak_pointer (G_OBJECT (priv->entry), (gpointer *) &priv->entry);
priv->entry = NULL;
}
@@ -522,8 +506,12 @@ gtk_search_bar_connect_entry (GtkSearchBar *bar,
{
priv->entry = GTK_WIDGET (entry);
g_object_add_weak_pointer (G_OBJECT (priv->entry), (gpointer *) &priv->entry);
- g_signal_connect (priv->entry, "key-press-event",
- G_CALLBACK (entry_key_pressed_event_cb), bar);
+ if (GTK_IS_SEARCH_ENTRY (priv->entry))
+ g_signal_connect (priv->entry, "stop-search",
+ G_CALLBACK (stop_search_cb), bar);
+ else
+ g_signal_connect (priv->entry, "key-press-event",
+ G_CALLBACK (entry_key_pressed_event_cb), bar);
}
}
diff --git a/gtk/gtksearchentry.c b/gtk/gtksearchentry.c
index 7e02f0e..0fa0b20 100644
--- a/gtk/gtksearchentry.c
+++ b/gtk/gtksearchentry.c
@@ -385,8 +385,8 @@ gtk_search_entry_new (void)
return GTK_WIDGET (g_object_new (GTK_TYPE_SEARCH_ENTRY, NULL));
}
-static gboolean
-is_keynav_event (GdkEvent *event)
+gboolean
+gtk_search_entry_is_keynav_event (GdkEvent *event)
{
GdkModifierType state = 0;
guint keyval;
@@ -447,7 +447,7 @@ gtk_search_entry_handle_event (GtkSearchEntry *entry,
if (!gtk_widget_get_realized (GTK_WIDGET (entry)))
gtk_widget_realize (GTK_WIDGET (entry));
- if (is_keynav_event (event) ||
+ if (gtk_search_entry_is_keynav_event (event) ||
event->key.keyval == GDK_KEY_space ||
event->key.keyval == GDK_KEY_Menu)
return GDK_EVENT_PROPAGATE;
diff --git a/gtk/gtksearchentryprivate.h b/gtk/gtksearchentryprivate.h
new file mode 100644
index 0000000..1e913ff
--- /dev/null
+++ b/gtk/gtksearchentryprivate.h
@@ -0,0 +1,36 @@
+/* GTK - The GIMP Toolkit
+ * Copyright (C) 2014 Red Hat, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/*
+ * Modified by the GTK+ Team and others 2012. See the AUTHORS
+ * file for a list of people on the GTK+ Team. See the ChangeLog
+ * files for a list of changes. These files are distributed with
+ * GTK+ at ftp://ftp.gtk.org/pub/gtk/.
+ */
+
+#ifndef __GTK_SEARCH_ENTRY_PRIVATE_H__
+#define __GTK_SEARCH_ENTRY_PRIVATE_H__
+
+#include <gtk/gtksearchentry.h>
+
+G_BEGIN_DECLS
+
+gboolean gtk_search_entry_is_keynav_event (GdkEvent *event);
+
+G_END_DECLS
+
+#endif /* __GTK_SEARCH_ENTRY_PRIVATE_H__ */
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]