]> Pileus Git - ~andy/gtk/blobdiff - modules/input/gtkimcontextxim.c
gtk/gtkicontheme.h include <gdk/gdk.h> instead of <gdk/gdkscreen.h>.
[~andy/gtk] / modules / input / gtkimcontextxim.c
index 5b0bca31020569657886e40ce3f13481ef772d82..7cd0b2ea7fbf754a69dbb906b40f1500ee709fb7 100644 (file)
@@ -86,6 +86,7 @@ struct _GtkXIMInfo
   GtkSettings *settings;
   gulong status_set;
   gulong preedit_set;
+  gulong display_closed_cb;
   XIMStyles *xim_styles;
   GSList *ics;
 
@@ -143,11 +144,15 @@ static void xim_destroy_callback   (XIM      xim,
                                    XPointer call_data);
 
 static XIC       gtk_im_context_xim_get_ic            (GtkIMContextXIM *context_xim);
+static void           xim_info_display_closed (GdkDisplay *display,
+                                              gboolean    is_error,
+                                              GtkXIMInfo *info);
+
 static GObjectClass *parent_class;
 
 GType gtk_type_im_context_xim = 0;
 
-GSList *open_ims = NULL;
+static GSList *open_ims = NULL;
 
 /* List of status windows for different toplevels */
 static GSList *status_windows = NULL;
@@ -307,6 +312,7 @@ setup_im (GtkXIMInfo *info)
 {
   XIMValuesList *ic_values = NULL;
   XIMCallback im_destroy_callback;
+  GdkDisplay *display;
 
   if (info->im == NULL)
     return;
@@ -376,6 +382,10 @@ setup_im (GtkXIMInfo *info)
 
   status_style_change (info);
   preedit_style_change (info);
+
+  display = gdk_screen_get_display (info->screen);
+  info->display_closed_cb = g_signal_connect (display, "closed",
+                                             G_CALLBACK (xim_info_display_closed), info);
 }
 
 static void
@@ -394,12 +404,16 @@ xim_info_display_closed (GdkDisplay *display,
     set_ic_client_window (tmp_list->data, NULL);
 
   g_slist_free (ics);
-  
-  g_signal_handler_disconnect (info->settings, info->status_set);
-  g_signal_handler_disconnect (info->settings, info->preedit_set);
-  
-  XFree (info->xim_styles->supported_styles);
-  XFree (info->xim_styles);
+
+  if (info->status_set)
+    g_signal_handler_disconnect (info->settings, info->status_set);
+  if (info->preedit_set)
+    g_signal_handler_disconnect (info->settings, info->preedit_set);
+  if (info->display_closed_cb)
+    g_signal_handler_disconnect (display, info->display_closed_cb);
+
+  if (info->xim_styles)
+    XFree (info->xim_styles);
   g_free (info->locale);
 
   if (info->im)
@@ -455,9 +469,6 @@ xim_info_try_im (GtkXIMInfo *info)
          return;
        }
       setup_im (info);
-
-      g_signal_connect (display, "closed",
-                       G_CALLBACK (xim_info_display_closed), info);
     }
 }
 
@@ -471,7 +482,9 @@ xim_destroy_callback (XIM      xim,
   info->im = NULL;
 
   g_signal_handler_disconnect (info->settings, info->status_set);
+  info->status_set = 0;
   g_signal_handler_disconnect (info->settings, info->preedit_set);
+  info->preedit_set = 0;
 
   reinitialize_all_ics (info);
   xim_info_try_im (info);
@@ -520,6 +533,7 @@ get_im (GdkWindow *client_window,
       info->settings = NULL;
       info->preedit_set = 0;
       info->status_set = 0;
+      info->display_closed_cb = 0;
       info->ics = NULL;
       info->reconnecting = FALSE;
       info->im = NULL;
@@ -565,6 +579,30 @@ gtk_im_context_xim_finalize (GObject *obj)
 
   context_xim->finalizing = TRUE;
 
+  if (context_xim->im_info && !context_xim->im_info->ics->next) 
+    {
+      if (context_xim->im_info->reconnecting)
+       {
+         GdkDisplay *display;
+
+         display = gdk_screen_get_display (context_xim->im_info->screen);
+         XUnregisterIMInstantiateCallback (GDK_DISPLAY_XDISPLAY (display),
+                                           NULL, NULL, NULL,
+                                           xim_instantiate_callback,
+                                           (XPointer)context_xim->im_info);
+       }
+      else if (context_xim->im_info->im)
+       {
+         XIMCallback im_destroy_callback;
+
+         im_destroy_callback.client_data = NULL;
+         im_destroy_callback.callback = NULL;
+         XSetIMValues (context_xim->im_info->im,
+                       XNDestroyCallback, &im_destroy_callback,
+                       NULL);
+       }
+    }
+
   set_ic_client_window (context_xim, NULL);
 
   g_free (context_xim->locale);
@@ -633,7 +671,7 @@ gtk_im_context_xim_new (void)
   GtkIMContextXIM *result;
   const gchar *charset;
 
-  result = GTK_IM_CONTEXT_XIM (g_object_new (GTK_TYPE_IM_CONTEXT_XIM, NULL));
+  result = g_object_new (GTK_TYPE_IM_CONTEXT_XIM, NULL);
 
   result->locale = g_strdup (setlocale (LC_CTYPE, NULL));
   
@@ -704,6 +742,10 @@ gtk_im_context_xim_filter_keypress (GtkIMContext *context,
   if (XFilterEvent ((XEvent *)&xevent, GDK_DRAWABLE_XID (context_xim->client_window)))
     return TRUE;
   
+  if (event->state &
+      (gtk_accelerator_get_default_mod_mask () & ~(GDK_SHIFT_MASK | GDK_CONTROL_MASK))) 
+    return FALSE;
+
  again:
   if (ic)
     num_bytes = XmbLookupString (ic, &xevent, buffer, buffer_size, &keysym, &status);
@@ -810,7 +852,7 @@ gtk_im_context_xim_set_cursor_location (GtkIMContext *context,
 
   preedit_attr = XVaCreateNestedList (0,
                                      XNSpotLocation, &spot,
-                                     0);
+                                     NULL);
   XSetICValues (ic,
                XNPreeditAttributes, preedit_attr,
                NULL);
@@ -857,7 +899,7 @@ gtk_im_context_xim_reset (GtkIMContext *context)
 
   preedit_attr = XVaCreateNestedList(0,
                                      XNPreeditState, &preedit_state,
-                                     0);
+                                     NULL);
   if (!XGetICValues(ic,
                     XNPreeditAttributes, preedit_attr,
                     NULL))
@@ -869,7 +911,7 @@ gtk_im_context_xim_reset (GtkIMContext *context)
 
   preedit_attr = XVaCreateNestedList(0,
                                      XNPreeditState, preedit_state,
-                                     0);
+                                     NULL);
   if (have_preedit_state)
     XSetICValues(ic,
                 XNPreeditAttributes, preedit_attr,
@@ -1135,8 +1177,7 @@ preedit_draw_callback (XIC                           xic,
 
   context->preedit_length += diff;
 
-  if (new_text)
-    g_free (new_text);
+  g_free (new_text);
 
   if (!context->finalizing)
     g_signal_emit_by_name (context, "preedit_changed");
@@ -1833,4 +1874,13 @@ gtk_im_context_xim_shutdown (void)
 {
   while (status_windows)
     status_window_free (status_windows->data);
+
+  while (open_ims)
+    {
+      GtkXIMInfo *info = open_ims->data;
+      GdkDisplay *display = gdk_screen_get_display (info->screen);
+
+      xim_info_display_closed (display, FALSE, info);
+      open_ims = g_slist_remove_link (open_ims, open_ims);
+    }
 }