|
@@ -107,6 +107,8 @@ typedef struct {
|
|
|
Colormap cmap;
|
|
|
Window win;
|
|
|
Pixmap buf;
|
|
|
+ XIM xim;
|
|
|
+ XIC xic;
|
|
|
int scr;
|
|
|
int w; /* window width */
|
|
|
int h; /* window height */
|
|
@@ -1228,6 +1230,13 @@ xinit(void) {
|
|
|
| CWColormap,
|
|
|
&attrs);
|
|
|
xw.buf = XCreatePixmap(xw.dis, xw.win, xw.bufw, xw.bufh, XDefaultDepth(xw.dis, xw.scr));
|
|
|
+
|
|
|
+
|
|
|
+ /* input methods */
|
|
|
+ xw.xim = XOpenIM(xw.dis, NULL, NULL, NULL);
|
|
|
+ xw.xic = XCreateIC(xw.xim, XNInputStyle, XIMPreeditNothing
|
|
|
+ | XIMStatusNothing, XNClientWindow, xw.win,
|
|
|
+ XNFocusWindow, xw.win, NULL);
|
|
|
/* gc */
|
|
|
dc.gc = XCreateGC(xw.dis, xw.win, 0, NULL);
|
|
|
|
|
@@ -1411,10 +1420,11 @@ kpress(XEvent *ev) {
|
|
|
int len;
|
|
|
int meta;
|
|
|
int shift;
|
|
|
+ Status status;
|
|
|
|
|
|
meta = e->state & Mod1Mask;
|
|
|
shift = e->state & ShiftMask;
|
|
|
- len = XLookupString(e, buf, sizeof(buf), &ksym, NULL);
|
|
|
+ len = XmbLookupString(xw.xic, e, buf, sizeof(buf), &ksym, &status);
|
|
|
|
|
|
if((customkey = kmap(ksym)))
|
|
|
ttywrite(customkey, strlen(customkey));
|
|
@@ -1484,6 +1494,8 @@ run(void) {
|
|
|
}
|
|
|
while(XPending(xw.dis)) {
|
|
|
XNextEvent(xw.dis, &ev);
|
|
|
+ if (XFilterEvent(&ev, xw.win))
|
|
|
+ continue;
|
|
|
if(handler[ev.type])
|
|
|
(handler[ev.type])(&ev);
|
|
|
}
|