[gtk+/gtk-2-24] Bug 705182 Reset Cocoa IME state when immodule is reset



commit 5af66c3f0d1de5d384908c846149a391776afc1a
Author: Michael Hutchison <m j hutchison gmail com>
Date:   Thu Aug 15 09:44:02 2013 -0700

    Bug 705182 Reset Cocoa IME state when immodule is reset
    
    Commits the pre-edit string on receipt of focus_out and reset
    commands.
    Patch refinements by Cody Russell <bratsche gnome org> and
    Ek Kato <ek kato gmail com>

 modules/input/imquartz.c |   34 ++++++++++++++++++++++++++++++++++
 1 files changed, 34 insertions(+), 0 deletions(-)
---
diff --git a/modules/input/imquartz.c b/modules/input/imquartz.c
index 61ad914..9e42d8f 100644
--- a/modules/input/imquartz.c
+++ b/modules/input/imquartz.c
@@ -211,9 +211,40 @@ quartz_filter_keypress (GtkIMContext *context,
 }
 
 static void
+discard_preedit (GtkIMContext *context)
+{
+  GtkIMContextQuartz *qc = GTK_IM_CONTEXT_QUARTZ (context);
+
+  if (!qc->client_window)
+    return;
+
+  NSView *nsview = gdk_quartz_window_get_nsview (qc->client_window);
+  if (!nsview)
+    return;
+
+  if (GDK_IS_WINDOW (nsview))
+    return;
+
+  /* reset any partial input for this NSView */
+  [(GdkQuartzView *)nsview unmarkText];
+  NSInputManager *currentInputManager = [NSInputManager currentInputManager];
+  [currentInputManager markedTextAbandoned:nsview];
+
+  if (qc->preedit_str)
+    {
+      g_signal_emit_by_name (context, "commit", qc->preedit_str);
+
+      g_free (qc->preedit_str);
+      qc->preedit_str = NULL;
+      g_signal_emit_by_name (context, "preedit_changed");
+    }
+}
+
+static void
 quartz_reset (GtkIMContext *context)
 {
   GTK_NOTE (MISC, g_print ("quartz_reset\n"));
+  discard_preedit (context);
 }
 
 static void
@@ -242,6 +273,9 @@ quartz_focus_out (GtkIMContext *context)
 
   GtkIMContextQuartz *qc = GTK_IM_CONTEXT_QUARTZ (context);
   qc->focused = FALSE;
+
+  /* Commit any partially built strings or it'll mess up other GTK+ widgets in the window */
+  discard_preedit (context);
 }
 
 static void


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]