|
Author: spitzak
Date: 2010-04-08 13:25:03 -0700 (Thu, 08 Apr 2010)
New Revision: 7473
Log:
It appears that deferring XCreateIC() until first needed avoids some bugs that make
it flaky and not work sometimes. This one for my (simple European compose-key)
layout seems to work reliably except it fails if you type Compose as the very
first key (Compose works after that). Not tested for Asian locales.
Modified:
trunk/src/x11/run.cxx
Modified: trunk/src/x11/run.cxx
===================================================================
--- trunk/src/x11/run.cxx 2010-04-08 17:51:28 UTC (rev 7472)
+++ trunk/src/x11/run.cxx 2010-04-08 20:25:03 UTC (rev 7473)
@@ -102,7 +102,7 @@
static char fl_is_over_the_spot = 0;
static XRectangle status_area;
-static void fl_new_ic()
+static void fl_new_ic(XWindow xid)
{
// Give up if this failed earlier:
if (!fl_xim_im)
@@ -125,7 +125,7 @@
if (XGetIMValues(fl_xim_im, XNQueryInputStyle,
&xim_styles, NULL, NULL) ||
!xim_styles || !xim_styles->count_styles) {
- warning("No XIM style found\n");
+ warning("No XIM style found");
XCloseIM(fl_xim_im);
fl_xim_im = NULL;
return;
@@ -162,6 +162,7 @@
XNInputStyle, (XIMPreeditPosition | XIMStatusArea),
XNPreeditAttributes, preedit_attr,
XNStatusAttributes, status_attr,
+ XNClientWindow, xid,
NULL);
XFree(status_attr);
}
@@ -169,15 +170,18 @@
fl_xim_ic = XCreateIC(fl_xim_im,
XNInputStyle,XIMPreeditPosition | XIMStatusNothing,
XNPreeditAttributes, preedit_attr,
+ XNClientWindow, xid,
NULL);
XFree(preedit_attr);
if (fl_xim_ic) {
fl_is_over_the_spot = 1;
+#if 0 // This appears to have been done in the "if (sarea)" above
XVaNestedList status_attr;
status_attr = XVaCreateNestedList(0, XNAreaNeeded, &status_area, NULL);
if (status_area.height != 0)
XGetICValues(fl_xim_ic, XNStatusAttributes, status_attr, NULL);
XFree(status_attr);
+#endif
return;
}
}
@@ -186,9 +190,10 @@
fl_is_over_the_spot = 0;
fl_xim_ic = XCreateIC(fl_xim_im,
XNInputStyle, (XIMPreeditNothing | XIMStatusNothing),
+ XNClientWindow, xid,
NULL);
if (!fl_xim_ic) {
- warning("XCreateIC() failed\n");
+ warning("XCreateIC() failed");
XCloseIM(fl_xim_im);
fl_xim_im = NULL;
}
@@ -203,7 +208,7 @@
fl_xim_im = XOpenIM(xdisplay, NULL, NULL, NULL);
if (!fl_xim_im)
- warning("XOpenIM() failed\n");
+ warning("XOpenIM() failed");
}
void fl_set_spot(fltk::Font *f, Widget *w, int x, int y)
@@ -1575,8 +1580,6 @@
case FocusIn:
#if USE_XIM
- // For some reason, always destroying & recreating seems to help this work:
- /*if (!fl_xim_ic)*/ fl_new_ic();
if (fl_xim_ic) {
XSetICValues(fl_xim_ic,
XNClientWindow, xevent.xclient.window,
@@ -1619,6 +1622,8 @@
int len;
KeySym keysym;
#if USE_XIM
+ if (!fl_xim_ic)
+ fl_new_ic(xevent.xany.window);
if (fl_xim_ic) {
Status status;
RETRY:
[ Direct Link to Message ] | |