]> git.armaanb.net Git - dmenu.git/blobdiff - dmenu.c
Fix cursor drawn position with wide glyphs
[dmenu.git] / dmenu.c
diff --git a/dmenu.c b/dmenu.c
index 5e9c36735152d883d00df4cc21eaad5b3172ce40..d764658ba9859638a516629cac0b1785f90679da 100644 (file)
--- a/dmenu.c
+++ b/dmenu.c
@@ -144,7 +144,7 @@ drawmenu(void)
        drw_setscheme(drw, scheme[SchemeNorm]);
        drw_text(drw, x, 0, w, bh, lrpad / 2, text, 0);
 
-       drw_font_getexts(drw->fonts, text, cursor, &curpos, NULL);
+       curpos = TEXTW(text) - TEXTW(&text[cursor]);
        if ((curpos += lrpad / 2 - 1) < w) {
                drw_setscheme(drw, scheme[SchemeNorm]);
                drw_rect(drw, x + curpos, 2, 2, bh - 4, 1, 0);
@@ -308,13 +308,21 @@ keypress(XKeyEvent *ev)
 {
        char buf[32];
        int len;
-       KeySym ksym = NoSymbol;
+       KeySym ksym;
        Status status;
 
        len = XmbLookupString(xic, ev, buf, sizeof buf, &ksym, &status);
-       if (status == XBufferOverflow)
+       switch (status) {
+       default: /* XLookupNone, XBufferOverflow */
                return;
-       if (ev->state & ControlMask)
+       case XLookupChars:
+               goto insert;
+       case XLookupKeySym:
+       case XLookupBoth:
+               break;
+       }
+
+       if (ev->state & ControlMask) {
                switch(ksym) {
                case XK_a: ksym = XK_Home;      break;
                case XK_b: ksym = XK_Left;      break;
@@ -352,12 +360,10 @@ keypress(XKeyEvent *ev)
                        return;
                case XK_Left:
                        movewordedge(-1);
-                       ksym = NoSymbol;
-                       break;
+                       goto draw;
                case XK_Right:
                        movewordedge(+1);
-                       ksym = NoSymbol;
-                       break;
+                       goto draw;
                case XK_Return:
                case XK_KP_Enter:
                        break;
@@ -367,16 +373,14 @@ keypress(XKeyEvent *ev)
                default:
                        return;
                }
-       else if (ev->state & Mod1Mask)
+       } else if (ev->state & Mod1Mask) {
                switch(ksym) {
                case XK_b:
                        movewordedge(-1);
-                       ksym = NoSymbol;
-                       break;
+                       goto draw;
                case XK_f:
                        movewordedge(+1);
-                       ksym = NoSymbol;
-                       break;
+                       goto draw;
                case XK_g: ksym = XK_Home;  break;
                case XK_G: ksym = XK_End;   break;
                case XK_h: ksym = XK_Up;    break;
@@ -386,13 +390,14 @@ keypress(XKeyEvent *ev)
                default:
                        return;
                }
+       }
+
        switch(ksym) {
        default:
+insert:
                if (!iscntrl(*buf))
                        insert(buf, len);
                break;
-       case NoSymbol:
-               break;
        case XK_Delete:
                if (text[cursor] == '\0')
                        return;
@@ -489,6 +494,8 @@ keypress(XKeyEvent *ev)
                match();
                break;
        }
+
+draw:
        drawmenu();
 }
 
@@ -545,7 +552,7 @@ run(void)
        XEvent ev;
 
        while (!XNextEvent(dpy, &ev)) {
-               if (XFilterEvent(&ev, win))
+               if (XFilterEvent(&ev, None))
                        continue;
                switch(ev.type) {
                case Expose:
@@ -657,6 +664,7 @@ setup(void)
                        XNClientWindow, win, XNFocusWindow, win, NULL);
 
        XMapRaised(dpy, win);
+       XSetInputFocus(dpy, win, RevertToParent, CurrentTime);
        if (embed) {
                XSelectInput(dpy, parentwin, FocusChangeMask);
                if (XQueryTree(dpy, parentwin, &dw, &w, &dws, &du) && dws) {
@@ -722,6 +730,8 @@ main(int argc, char *argv[])
 
        if (!setlocale(LC_CTYPE, "") || !XSupportsLocale())
                fputs("warning: no locale support\n", stderr);
+       if (!XSetLocaleModifiers(""))
+               fputs("warning: no locale modifiers support\n", stderr);
        if (!(dpy = XOpenDisplay(NULL)))
                die("cannot open display");
        screen = DefaultScreen(dpy);