diff -up dmenu-3.2/main.c dmenu-3.2-emacs/main.c --- dmenu-3.2/main.c 2007-05-30 11:21:59.000000000 +0100 +++ dmenu-3.2-emacs/main.c 2007-07-15 12:12:41.000000000 +0100 @@ -231,6 +231,46 @@ kpress(XKeyEvent * e) { switch (ksym) { default: /* ignore other control sequences */ return; + case XK_a: + if(!item) + return; + sel = curr = item; + calcoffsets(); + break; + case XK_e: + if(!item) + return; + while(next) { + sel = curr = next; + calcoffsets(); + } + while(sel && sel->right) + sel = sel->right; + break; + case XK_r: + case XK_b: + if(!(sel && sel->left)) + return; + sel=sel->left; + if(sel->right == curr) { + curr = prev; + calcoffsets(); + } + break; + case XK_s: + case XK_f: + if(!(sel && sel->right)) + return; + sel=sel->right; + if(sel == next) { + curr = next; + calcoffsets(); + } + break; + case XK_g: + ret = 1; + running = False; + break; case XK_bracketleft: ksym = XK_Escape; break; @@ -243,9 +283,10 @@ kpress(XKeyEvent * e) { ksym = XK_Tab; break; case XK_j: - case XK_J: - ksym = XK_Return; - break; + fprintf(stdout, "%s", text); + fflush(stdout); + running = False; + break; case XK_u: case XK_U: text[0] = 0; @@ -287,6 +328,17 @@ kpress(XKeyEvent * e) { case XK_G: ksym = XK_End; break; + case XK_BackSpace: + if(len) { + i = len - 1; + while(i >= 0 && text[i] == ' ') + text[i--] = 0; + while(i >= 0 && text[i] != ' ') + text[i--] = 0; + match(text); + drawmenu(); + } + return; } } switch(ksym) { @@ -348,9 +400,7 @@ kpress(XKeyEvent * e) { calcoffsets(); break; case XK_Return: - if((e->state & ShiftMask) && text) - fprintf(stdout, "%s", text); - else if(sel) + if(sel) fprintf(stdout, "%s", sel->text); else if(text) fprintf(stdout, "%s", text); Only in dmenu-3.2-emacs: main.c.orig