 +  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)
 +    {
-+      if (commit)
-+        g_signal_emit_by_name (context, "commit", qc->preedit_str);
++      g_signal_emit_by_name (context, "commit", qc->preedit_str);
 +
 +      g_free (qc->preedit_str);
 +      qc->preedit_str = NULL;

diff --git a/modules/input/imquartz.c b/modules/input/imquartz.c
index 61ad914..720f039 100644
--- a/modules/input/imquartz.c
+++ b/modules/input/imquartz.c
@@ -211,9 +211,37 @@ quartz_filter_keypress (GtkIMContext *context,
 }
 
 static void
+discard_preedit (GtkIMContext *context, gboolean commit)
+{
+  GtkIMContextQuartz *qc = GTK_IM_CONTEXT_QUARTZ (context);
+

 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
