diff options
Diffstat (limited to 'src/Fl_x.cxx')
| -rw-r--r-- | src/Fl_x.cxx | 67 |
1 files changed, 53 insertions, 14 deletions
diff --git a/src/Fl_x.cxx b/src/Fl_x.cxx index 20041dfec..982369758 100644 --- a/src/Fl_x.cxx +++ b/src/Fl_x.cxx @@ -319,6 +319,7 @@ XVisualInfo *fl_visual; Colormap fl_colormap; static XIM fl_xim_im = 0; XIC fl_xim_ic = 0; +static Window fl_xim_win = 0; static char fl_is_over_the_spot = 0; static XRectangle status_area; @@ -614,6 +615,55 @@ static void fl_init_xim() { if(xim_styles) XFree(xim_styles); } +void fl_xim_deactivate(void); + +void fl_xim_activate(Window xid) { + if (!fl_xim_im) + return; + + // If the focused window has changed, then use the brute force method + // of completely recreating the input context. + if (fl_xim_win != xid) { + fl_xim_deactivate(); + + fl_new_ic(); + fl_xim_win = xid; + + XSetICValues(fl_xim_ic, + XNFocusWindow, fl_xim_win, + XNClientWindow, fl_xim_win, + NULL); + } + + fl_set_spot(spotf, spots, spot.x, spot.y, spot.width, spot.height); +} + +void fl_xim_deactivate(void) { + if (!fl_xim_ic) + return; + + XDestroyIC(fl_xim_ic); + fl_xim_ic = NULL; + + fl_xim_win = 0; +} + +void Fl::enable_im() { + Fl_Window *win; + + win = Fl::first_window(); + if (win && win->shown()) { + fl_xim_activate(fl_xid(win)); + XSetICFocus(fl_xim_ic); + } else { + fl_new_ic(); + } +} + +void Fl::disable_im() { + fl_xim_deactivate(); +} + void fl_open_display() { if (fl_display) return; @@ -1259,10 +1309,9 @@ int fl_handle(const XEvent& thisevent) XEvent xevent = thisevent; fl_xevent = &thisevent; Window xid = xevent.xany.window; - static Window xim_win = 0; if (fl_xim_ic && xevent.type == DestroyNotify && - xid != xim_win && !fl_find(xid)) + xid != fl_xim_win && !fl_find(xid)) { XIM xim_im; xim_im = XOpenIM(fl_display, NULL, NULL, NULL); @@ -1278,19 +1327,9 @@ int fl_handle(const XEvent& thisevent) } if (fl_xim_ic && (xevent.type == FocusIn)) - { - if (xim_win != xid) { - xim_win = xid; - XDestroyIC(fl_xim_ic); - fl_xim_ic = NULL; - fl_new_ic(); - XSetICValues(fl_xim_ic, XNFocusWindow, xevent.xclient.window, - XNClientWindow, xid, NULL); - } - fl_set_spot(spotf, spots, spot.x, spot.y, spot.width, spot.height); - } + fl_xim_activate(xid); - if ( XFilterEvent((XEvent *)&xevent, 0) ) + if (fl_xim_ic && XFilterEvent((XEvent *)&xevent, 0)) return(1); #if USE_XRANDR |
