all repos — dmenu @ eededaa76fb12c10d6de3cb5fcf1479efd39ad75

my build of dmenu

applied Connor's next nice patch, thanks a lot!
Anselm R Garbe anselm@garbe.us
Wed, 31 Mar 2010 22:37:41 +0100
commit

eededaa76fb12c10d6de3cb5fcf1479efd39ad75

parent

8e3e61170bd34d8a8269e376c30cb3afa25343a2

1 files changed, 29 insertions(+), 36 deletions(-)

jump to
M dmenu.cdmenu.c

@@ -52,6 +52,7 @@ static void calcoffsetsh(void);

static void calcoffsetsv(void); static char *cistrstr(const char *s, const char *sub); static void cleanup(void); +static void drawcursor(void); static void drawmenu(void); static void drawmenuh(void); static void drawmenuv(void);

@@ -247,9 +248,7 @@ drawtext((curr && curr->left) ? "<" : NULL, dc.norm);

dc.x += dc.w; /* determine maximum items */ for(i = curr; i != next; i=i->right) { - dc.w = textw(i->text); - if(dc.w > mw / 3) - dc.w = mw / 3; + dc.w = MIN(textw(i->text), mw / 3); drawtext(i->text, (sel == i) ? dc.sel : dc.norm); dc.x += dc.w; }

@@ -395,7 +394,8 @@ if(e->state & ControlMask) {

switch (ksym) { default: /* ignore other control sequences */ return; - case XK_bracketleft: + case XK_c: + case XK_C: ksym = XK_Escape; break; case XK_h:

@@ -414,18 +414,16 @@ case XK_u:

case XK_U: text[0] = 0; match(text); - drawmenu(); break; case XK_w: case XK_W: - if(len) { - i = len - 1; - while(i >= 0 && text[i] == ' ') - text[i--] = 0; - while(i >= 0 && text[i] != ' ') - text[i--] = 0; + if(cursor > 0) { + i = cursor; + while(i-- > 0 && text[i] == ' '); + while(i-- > 0 && text[i] != ' '); + memmove(text + i + 1, text + cursor, sizeof text - cursor); + cursor = i + 1; match(text); - drawmenu(); } break; }

@@ -473,14 +471,14 @@ default:

num = MIN(num, sizeof text - cursor); if(num && !iscntrl((int) buf[0])) { memmove(text + cursor + num, text + cursor, sizeof text - cursor - num); - memmove(text + cursor, buf, num); + memcpy(text + cursor, buf, num); cursor+=num; match(text); } break; case XK_BackSpace: if(cursor > 0) { - memmove(text + cursor + -1, text + cursor, sizeof text - cursor); + memmove(text + cursor - 1, text + cursor, sizeof text - cursor + 1); cursor--; match(text); }

@@ -490,8 +488,10 @@ memmove(text + cursor, text + cursor + 1, sizeof text - cursor);

match(text); break; case XK_End: - if(!item) - return; + if(cursor < len) { + cursor = len; + break; + } while(next) { sel = curr = next; calcoffsets();

@@ -504,8 +504,10 @@ ret = 1;

running = False; break; case XK_Home: - if(!item) - return; + if(sel == item) { + cursor = 0; + break; + } sel = curr = item; calcoffsets(); break;

@@ -536,12 +538,10 @@ sel = curr = prev;

calcoffsets(); break; case XK_Return: - if((e->state & ShiftMask) && *text) + if((e->state & ShiftMask) || !sel) fprintf(stdout, "%s", text); - else if(sel) + else fprintf(stdout, "%s", sel->text); - else if(*text) - fprintf(stdout, "%s", text); fflush(stdout); running = False; break;

@@ -567,9 +567,6 @@ cursor = strlen(text);

match(text); break; } - len = strlen(text); - cursor = MIN(cursor, len); - cursor = MAX(cursor, 0); drawmenu(); }

@@ -620,13 +617,13 @@ char *p, buf[1024];

unsigned int len = 0, max = 0; Item *i, *new; - i = 0; + i = NULL; while(fgets(buf, sizeof buf, stdin)) { len = strlen(buf); - if (buf[len - 1] == '\n') - buf[len - 1] = 0; + if(buf[len-1] == '\n') + buf[--len] = '\0'; if(!(p = strdup(buf))) - eprint("fatal: could not strdup() %u bytes\n", strlen(buf)); + eprint("fatal: could not strdup() %u bytes\n", len); if(max < len) { maxname = p; max = len;

@@ -734,13 +731,9 @@ XSetLineAttributes(dpy, dc.gc, 1, LineSolid, CapButt, JoinMiter);

if(!dc.font.set) XSetFont(dpy, dc.gc, dc.font.xfont->fid); if(maxname) - cmdw = textw(maxname); - if(cmdw > mw / 3) - cmdw = mw / 3; + cmdw = MIN(textw(maxname), mw / 3); if(prompt) - promptw = textw(prompt); - if(promptw > mw / 5) - promptw = mw / 5; + promptw = MIN(textw(prompt), mw / 5); text[0] = 0; match(text); XMapRaised(dpy, win);

@@ -799,7 +792,7 @@ else if(!strcmp(argv[i], "-sf")) {

if(++i < argc) selfgcolor = argv[i]; } else if(!strcmp(argv[i], "-v")) - eprint("dmenu-"VERSION", © 2006-2009 dmenu engineers, see LICENSE for details\n"); + eprint("dmenu-"VERSION", © 2006-2010 dmenu engineers, see LICENSE for details\n"); else eprint("usage: dmenu [-i] [-b] [-l <lines>] [-fn <font>] [-nb <color>] [-nf <color>]\n" " [-p <prompt>] [-sb <color>] [-sf <color>] [-v]\n");