summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRui Matos <tiagomatos@gmail.com>2013-03-25 13:38:18 -0400
committerCosimo Cecchi <cosimoc@gnome.org>2013-03-25 13:38:53 -0400
commit8a2d1c9e54c8765e952a4821692618d946a3d7a2 (patch)
tree73649c3a0955b45eac8f0a306c5994bcf81724f0
parent378c01ddb6cb833910cf2fcd9d16f87a807df528 (diff)
downloadnautilus-8a2d1c9e54c8765e952a4821692618d946a3d7a2.tar.gz
query-editor: Fix initial key press processing with async IMs
When using an async input method we can't rely on the entry's text or preedit text being updated as a direct result of processing a key event. Instead, we can look at the event keyval and check if it's going to yield a printable character to decide if we are interested in the event. https://bugzilla.gnome.org/show_bug.cgi?id=696260
-rw-r--r--src/nautilus-query-editor.c38
1 files changed, 7 insertions, 31 deletions
diff --git a/src/nautilus-query-editor.c b/src/nautilus-query-editor.c
index a98e70a03..023e011f4 100644
--- a/src/nautilus-query-editor.c
+++ b/src/nautilus-query-editor.c
@@ -69,7 +69,6 @@ struct NautilusQueryEditorDetails {
char *current_uri;
GList *rows;
- gboolean got_preedit;
NautilusQuery *query;
};
@@ -173,14 +172,6 @@ entry_focus_hack (GtkWidget *entry,
send_focus_change (entry, device, TRUE);
}
-static void
-entry_preedit_changed_cb (GtkEntry *entry,
- gchar *preedit,
- NautilusQueryEditor *editor)
-{
- editor->details->got_preedit = TRUE;
-}
-
gboolean
nautilus_query_editor_handle_event (NautilusQueryEditor *editor,
GdkEventKey *event)
@@ -188,12 +179,7 @@ nautilus_query_editor_handle_event (NautilusQueryEditor *editor,
GtkWidget *toplevel;
GtkWidget *old_focus;
GdkEvent *new_event;
- gboolean handled = FALSE;
- gulong id;
gboolean retval;
- gboolean text_changed;
- char *old_text;
- const char *new_text;
/* if we're focused already, no need to handle the event manually */
if (gtk_widget_has_focus (editor->details->entry)) {
@@ -210,7 +196,11 @@ nautilus_query_editor_handle_event (NautilusQueryEditor *editor,
return FALSE;
}
- editor->details->got_preedit = FALSE;
+ /* if it's not printable we don't need it */
+ if (!g_unichar_isprint (gdk_keyval_to_unicode (event->keyval))) {
+ return FALSE;
+ }
+
if (!gtk_widget_get_realized (editor->details->entry)) {
gtk_widget_realize (editor->details->entry);
}
@@ -225,11 +215,6 @@ nautilus_query_editor_handle_event (NautilusQueryEditor *editor,
/* input methods will typically only process events after getting focus */
gtk_widget_grab_focus (editor->details->entry);
- old_text = g_strdup (gtk_entry_get_text (GTK_ENTRY (editor->details->entry)));
-
- id = g_signal_connect (editor->details->entry, "preedit-changed",
- G_CALLBACK (entry_preedit_changed_cb), editor);
-
new_event = gdk_event_copy ((GdkEvent *) event);
g_object_unref (((GdkEventKey *) new_event)->window);
((GdkEventKey *) new_event)->window = g_object_ref
@@ -237,20 +222,11 @@ nautilus_query_editor_handle_event (NautilusQueryEditor *editor,
retval = gtk_widget_event (editor->details->entry, new_event);
gdk_event_free (new_event);
- g_signal_handler_disconnect (editor->details->entry, id);
-
- new_text = gtk_entry_get_text (GTK_ENTRY (editor->details->entry));
- text_changed = strcmp (old_text, new_text) != 0;
- g_free (old_text);
-
- handled = (editor->details->got_preedit) || (retval && text_changed);
- editor->details->got_preedit = FALSE;
-
- if (!handled && old_focus) {
+ if (!retval && old_focus) {
gtk_widget_grab_focus (old_focus);
}
- return handled;
+ return retval;
}
static void