X-Git-Url: https://git.danieliu.xyz/?a=blobdiff_plain;f=st.c;h=d1b90efe11b54c82dd7273d91ae33756840c3657;hb=3470e3af23f4b98ce4293f6090c8df59a08329d9;hp=c9d0fb8dcd03fd3727a69cd3d4cb0078039fcf3e;hpb=ab7037cb33b4be4d16e3197d907066ed5b8ab16b;p=st.git diff --git a/st.c b/st.c index c9d0fb8..d1b90ef 100644 --- a/st.c +++ b/st.c @@ -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 */ @@ -114,7 +116,7 @@ typedef struct { int bufh; /* pixmap height */ int ch; /* char height */ int cw; /* char width */ - int hasfocus; + int focus; int vis; /* is visible */ } XWindow; @@ -1043,7 +1045,7 @@ tputc(char c) { tnewline(); break; case '\a': - if(!xw.hasfocus) + if(!xw.focus) xseturgency(1); break; case '\033': @@ -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); @@ -1286,7 +1295,7 @@ xdrawcursor(void) { xclear(oldx, oldy, oldx, oldy); /* draw the new one */ - if(!(term.c.state & CURSOR_HIDE) && xw.hasfocus) { + if(!(term.c.state & CURSOR_HIDE) && xw.focus) { xdraws(&g.c, g, term.c.x, term.c.y, 1); oldx = term.c.x, oldy = term.c.y; } @@ -1388,7 +1397,7 @@ xseturgency(int add) { void focus(XEvent *ev) { - if((xw.hasfocus = ev->type == FocusIn)) + if((xw.focus = ev->type == FocusIn)) xseturgency(0); draw(SCREEN_UPDATE); } @@ -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); }