X-Git-Url: https://git.xinqibao.xyz/dmenu.git/blobdiff_plain/e2a280541eab62717d6a9a72d047c832e5cb1edc..cd132c8d5b17ac2f4a3e611836d4cde4995d7a0c:/dmenu.c diff --git a/dmenu.c b/dmenu.c index 5e9c367..7745947 100644 --- a/dmenu.c +++ b/dmenu.c @@ -24,6 +24,12 @@ #define LENGTH(X) (sizeof X / sizeof X[0]) #define TEXTW(X) (drw_fontset_getwidth(drw, (X)) + lrpad) +#ifdef __OpenBSD__ +#include +#else +#define pledge(a,b) 0 +#endif + /* enums */ enum { SchemeNorm, SchemeSel, SchemeOut, SchemeLast }; /* color schemes */ @@ -144,7 +150,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 +314,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 +366,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 +379,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 +396,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 +500,8 @@ keypress(XKeyEvent *ev) match(); break; } + +draw: drawmenu(); } @@ -545,7 +558,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 +670,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 +736,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); @@ -736,6 +752,9 @@ main(int argc, char *argv[]) die("no fonts could be loaded."); lrpad = drw->fonts->h; + if (pledge("stdio rpath", NULL) < 0) + die("pledge"); + if (fast) { grabkeyboard(); readstdin();