diff -r 3c3a635d3de6 dmenu.1 --- a/dmenu.1 Tue Dec 15 09:52:52 2009 -0500 +++ b/dmenu.1 Tue Dec 15 09:53:41 2009 -0500 @@ -12,6 +12,7 @@ .RB [ \-p " "] .RB [ \-sb " "] .RB [ \-sf " "] +.RB [ \-hist " "] .RB [ \-v ] .SH DESCRIPTION .SS Overview diff -r 3c3a635d3de6 dmenu.c --- a/dmenu.c Tue Dec 15 09:52:52 2009 -0500 +++ b/dmenu.c Tue Dec 15 09:53:41 2009 -0500 @@ -20,6 +20,8 @@ #define MIN(a, b) ((a) < (b) ? (a) : (b)) #define MAX(a, b) ((a) > (b) ? (a) : (b)) +#define HIST_SIZE 20 + /* enums */ enum { ColFG, ColBG, ColLast }; @@ -97,6 +99,52 @@ static void (*calcoffsets)(void) = calcoffsetsh; static void (*drawmenu)(void) = drawmenuh; +static char hist[HIST_SIZE][1024]; +static char *histfile = NULL; +static int hcnt = 0; + +static int +writehistory(char *command) { + int i = 0, j = hcnt; + FILE *f; + + if(!histfile || strlen(command) <= 0) + return 0; + + if( (f = fopen(histfile, "w")) ) { + fputs(command, f); + fputc('\n', f); + for(; i" : NULL, dc.norm); - } + } XCopyArea(dpy, dc.drawable, win, dc.gc, 0, 0, mw, mh, 0, 0); XFlush(dpy); } @@ -551,6 +599,7 @@ fprintf(stdout, "%s", sel->text); else if(*text) fprintf(stdout, "%s", text); + writehistory( (sel == NULL) ? text : sel->text); fflush(stdout); running = False; break; @@ -628,8 +677,34 @@ char *p, buf[1024]; unsigned int len = 0, max = 0; Item *i, *new; + int k; + + i = 0; - i = 0; + if( readhistory() ) { + for(k=0; knext = new->left = new->right = NULL; + new->text = p; + if(!i) + allitems = new; + else + i->next = new; + i = new; + } + } + len=0; max=0; + + while(fgets(buf, sizeof buf, stdin)) { len = strlen(buf); if (buf[len - 1] == '\n') @@ -808,11 +883,14 @@ else if(!strcmp(argv[i], "-sf")) { if(++i < argc) selfgcolor = argv[i]; } + else if(!strcmp(argv[i], "-hist")) { + if(++i < argc) histfile = argv[i]; + } else if(!strcmp(argv[i], "-v")) eprint("dmenu-"VERSION", © 2006-2009 dmenu engineers, see LICENSE for details\n"); else eprint("usage: dmenu [-i] [-b] [-l ] [-fn ] [-nb ] [-nf ]\n" - " [-p ] [-sb ] [-sf ] [-v]\n"); + " [-p ] [-hist ] [-sb ] [-sf ] [-v]\n"); if(!setlocale(LC_CTYPE, "") || !XSupportsLocale()) fprintf(stderr, "warning: no locale support\n"); if(!(dpy = XOpenDisplay(NULL)))