GtkSettings *settings;
gulong status_set;
gulong preedit_set;
+ gulong display_closed_cb;
XIMStyles *xim_styles;
GSList *ics;
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;
{
XIMValuesList *ic_values = NULL;
XIMCallback im_destroy_callback;
+ GdkDisplay *display;
if (info->im == NULL)
return;
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
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)
return;
}
setup_im (info);
-
- g_signal_connect (display, "closed",
- G_CALLBACK (xim_info_display_closed), info);
}
}
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);
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;
xim_instantiate_callback,
(XPointer)context_xim->im_info);
}
- else
+ else if (context_xim->im_info->im)
{
XIMCallback im_destroy_callback;
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);
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");
{
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);
+ }
}