summaryrefslogtreecommitdiff
path: root/gdk/x11
diff options
context:
space:
mode:
authorOwen Taylor <otaylor@redhat.com>1999-01-28 03:38:58 +0000
committerOwen Taylor <otaylor@src.gnome.org>1999-01-28 03:38:58 +0000
commitb2c8fed88048b0f159400bad0a76bfeb13d7c626 (patch)
treefa3324ace416a9f1f7b82f2c3b672f79b6e47476 /gdk/x11
parenta472efda2da1e0e177fece9950c3fa64f9d8c9d5 (diff)
downloadgdk-pixbuf-b2c8fed88048b0f159400bad0a76bfeb13d7c626.tar.gz
[ patch from Takashi Matsuda <matsu@arch.comp.kyutech.ac.jp> ]
Wed Jan 27 21:56:07 1999 Owen Taylor <otaylor@redhat.com> [ patch from Takashi Matsuda <matsu@arch.comp.kyutech.ac.jp> ] * acconfig.h configure.in gdk/gdkim.c: Add configure flag for disabling XRegisterIMInstantiateCallback(), default it to off for Solaris. Always try to open the input method immediately, and only if that fails, register than instantiate callback. * gdk/gdkentry.c: Some tweaks to make sure that we only get and set the IC attributes when appropriate.
Diffstat (limited to 'gdk/x11')
-rw-r--r--gdk/x11/gdkim-x11.c63
1 files changed, 44 insertions, 19 deletions
diff --git a/gdk/x11/gdkim-x11.c b/gdk/x11/gdkim-x11.c
index 083a407f5..6c1c068c0 100644
--- a/gdk/x11/gdkim-x11.c
+++ b/gdk/x11/gdkim-x11.c
@@ -54,13 +54,15 @@ typedef struct {
gpointer value;
} GdkImArg;
+#ifndef XIM_INSTANTIATE_IS_MISSING_OR_STRANGE
static void gdk_im_instantiate_cb (Display *display,
XPointer client_data,
XPointer call_data);
+#endif
static void gdk_im_destroy_cb (XIM im,
XPointer client_data,
XPointer call_data);
-
+static gint gdk_im_real_open (void);
static void gdk_ic_real_new (GdkIC *ic);
static GdkICAttributesType gdk_ic_real_set_attr (GdkIC *ic,
@@ -338,39 +340,57 @@ gdk_im_destroy_cb (XIM im, XPointer client_data, XPointer call_data)
private->xic = NULL;
}
+#ifndef XIM_INSTANTIATE_IS_MISSING_OR_STRANGE
XRegisterIMInstantiateCallback (gdk_display, NULL, NULL, NULL,
gdk_im_instantiate_cb, NULL);
+#endif
}
+#ifndef XIM_INSTANTIATE_IS_MISSING_OR_STRANGE
static void
gdk_im_instantiate_cb (Display *display,
XPointer client_data, XPointer call_data)
{
- XIMCallback destroy_cb;
- GList *node;
-
GDK_NOTE (XIM, g_message ("New IM is instantiated."));
if (display != gdk_display)
return;
- XUnregisterIMInstantiateCallback (gdk_display, NULL, NULL, NULL,
- gdk_im_instantiate_cb, NULL);
+ gdk_im_real_open ();
+
+ if (xim_im != NULL)
+ XUnregisterIMInstantiateCallback (gdk_display, NULL, NULL, NULL,
+ gdk_im_instantiate_cb, NULL);
+}
+#endif
+
+static gint
+gdk_im_real_open (void)
+{
+ XIMCallback destroy_cb;
+ GList *node;
xim_im = XOpenIM (GDK_DISPLAY(), NULL, NULL, NULL);
if (xim_im == NULL)
- GDK_NOTE (XIM, g_warning ("Unable to open open IM."));
-
- destroy_cb.callback = gdk_im_destroy_cb;
- destroy_cb.client_data = NULL;
- XSetIMValues (xim_im, XNDestroyCallback, &destroy_cb, NULL);
+ {
+ GDK_NOTE (XIM, g_warning ("Unable to open IM."));
+ return FALSE;
+ }
+ else
+ {
+ destroy_cb.callback = gdk_im_destroy_cb;
+ destroy_cb.client_data = NULL;
+ if (NULL != XSetIMValues (xim_im, XNDestroyCallback, &destroy_cb, NULL))
+ GDK_NOTE (XIM, g_warning ("Could not set destroy callback to IM. Be careful to not destroy your input method."));
- XGetIMValues (xim_im, XNQueryInputStyle, &xim_styles, NULL, NULL);
+ XGetIMValues (xim_im, XNQueryInputStyle, &xim_styles, NULL, NULL);
- for (node = xim_ic_list; node != NULL; node = g_list_next(node))
- {
- GdkICPrivate *private = (GdkICPrivate *) (node->data);
- if (private->xic == NULL)
- gdk_ic_real_new ((GdkIC *)private);
+ for (node = xim_ic_list; node != NULL; node = g_list_next(node))
+ {
+ GdkICPrivate *private = (GdkICPrivate *) (node->data);
+ if (private->xic == NULL)
+ gdk_ic_real_new ((GdkIC *)private);
+ }
+ return TRUE;
}
}
@@ -388,10 +408,15 @@ gdk_im_open (void)
if (!(xim_best_allowed_style & GDK_IM_STATUS_MASK))
gdk_im_set_best_style (GDK_IM_STATUS_CALLBACKS);
+ if (gdk_im_real_open ())
+ return TRUE;
+
+#ifndef XIM_INSTANTIATE_IS_MISSING_OR_STRANGE
XRegisterIMInstantiateCallback (gdk_display, NULL, NULL, NULL,
- gdk_im_instantiate_cb, NULL);
+ gdk_im_instantiate_cb, NULL);
+#endif
- return (xim_im != NULL);
+ return FALSE;
}
void