forked from AuroraMiddleware/gtk
Use the new API in GtkSearchBar if we can
Sadly, GtkSearchBar allows connecting plain entries, so we have to keep the old code around.
This commit is contained in:
parent
354536d464
commit
3bf12c44e2
@ -485,6 +485,7 @@ gtk_private_h_sources = \
|
||||
gtkscaleprivate.h \
|
||||
gtksearchengine.h \
|
||||
gtksearchenginesimple.h \
|
||||
gtksearchentryprivate.h \
|
||||
gtkselectionprivate.h \
|
||||
gtksettingsprivate.h \
|
||||
gtksizegroup-private.h \
|
||||
|
@ -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)
|
||||
return GDK_EVENT_PROPAGATE;
|
||||
|
||||
gtk_revealer_set_reveal_child (GTK_REVEALER (priv->revealer), FALSE);
|
||||
|
||||
if (event->key.keyval == GDK_KEY_Escape)
|
||||
{
|
||||
stop_search_cb (widget, bar);
|
||||
return GDK_EVENT_STOP;
|
||||
}
|
||||
else
|
||||
return GDK_EVENT_PROPAGATE;
|
||||
}
|
||||
|
||||
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_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);
|
||||
|
||||
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;
|
||||
if (handled == GDK_EVENT_STOP)
|
||||
gtk_revealer_set_reveal_child (GTK_REVEALER (priv->revealer), TRUE);
|
||||
}
|
||||
|
||||
g_free (old_text);
|
||||
g_free (new_text);
|
||||
|
||||
return handled;
|
||||
}
|
||||
@ -513,6 +494,9 @@ gtk_search_bar_connect_entry (GtkSearchBar *bar,
|
||||
|
||||
if (priv->entry != NULL)
|
||||
{
|
||||
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,6 +506,10 @@ gtk_search_bar_connect_entry (GtkSearchBar *bar,
|
||||
{
|
||||
priv->entry = GTK_WIDGET (entry);
|
||||
g_object_add_weak_pointer (G_OBJECT (priv->entry), (gpointer *) &priv->entry);
|
||||
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);
|
||||
}
|
||||
|
@ -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;
|
||||
|
36
gtk/gtksearchentryprivate.h
Normal file
36
gtk/gtksearchentryprivate.h
Normal file
@ -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__ */
|
Loading…
Reference in New Issue
Block a user