|
@ -34,6 +34,7 @@ static void calcoffsetsh(void); |
|
|
static void calcoffsetsv(void); |
|
|
static void calcoffsetsv(void); |
|
|
static char *cistrstr(const char *s, const char *sub); |
|
|
static char *cistrstr(const char *s, const char *sub); |
|
|
static void cleanup(void); |
|
|
static void cleanup(void); |
|
|
|
|
|
static void dinput(void); |
|
|
static void drawmenu(void); |
|
|
static void drawmenu(void); |
|
|
static void drawmenuh(void); |
|
|
static void drawmenuh(void); |
|
|
static void drawmenuv(void); |
|
|
static void drawmenuv(void); |
|
@ -89,28 +90,25 @@ void |
|
|
calcoffsetsh(void) { |
|
|
calcoffsetsh(void) { |
|
|
unsigned int w; |
|
|
unsigned int w; |
|
|
|
|
|
|
|
|
if(!curr) |
|
|
|
|
|
return; |
|
|
|
|
|
w = promptw + cmdw + 2 * spaceitem; |
|
|
|
|
|
for(next = curr; next && w < mw; next=next->right) |
|
|
|
|
|
w += MIN(textw(next->text), mw / 3); |
|
|
|
|
|
w = promptw + cmdw + 2 * spaceitem; |
|
|
|
|
|
for(prev = curr; prev && prev->left && w < mw; prev=prev->left) |
|
|
|
|
|
w += MIN(textw(prev->left->text), mw / 3); |
|
|
|
|
|
|
|
|
w = promptw + cmdw + (2 * spaceitem); |
|
|
|
|
|
for(next = curr; next; next = next->right) |
|
|
|
|
|
if((w += MIN(textw(next->text), mw / 3)) > mw) |
|
|
|
|
|
break; |
|
|
|
|
|
w = promptw + cmdw + (2 * spaceitem); |
|
|
|
|
|
for(prev = curr; prev && prev->left; prev = prev->left) |
|
|
|
|
|
if((w += MIN(textw(prev->left->text), mw / 3)) > mw) |
|
|
|
|
|
break; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
void |
|
|
void |
|
|
calcoffsetsv(void) { |
|
|
calcoffsetsv(void) { |
|
|
unsigned int h; |
|
|
|
|
|
|
|
|
unsigned int i; |
|
|
|
|
|
|
|
|
if(!curr) |
|
|
|
|
|
return; |
|
|
|
|
|
h = (dc.font.height + 2) * lines; |
|
|
|
|
|
for(next = curr; next && h > 0; next = next->right) |
|
|
|
|
|
h -= dc.font.height + 2; |
|
|
|
|
|
h = (dc.font.height + 2) * lines; |
|
|
|
|
|
for(prev = curr; prev && prev->left && h > 0; prev = prev->left) |
|
|
|
|
|
h -= dc.font.height + 2; |
|
|
|
|
|
|
|
|
next = prev = curr; |
|
|
|
|
|
for(i = 0; i < lines && next; i++) |
|
|
|
|
|
next = next->right; |
|
|
|
|
|
for(i = 0; i < lines && prev && prev->left; i++) |
|
|
|
|
|
prev = prev->left; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
char * |
|
|
char * |
|
@ -150,6 +148,13 @@ cleanup(void) { |
|
|
XUngrabKeyboard(dpy, CurrentTime); |
|
|
XUngrabKeyboard(dpy, CurrentTime); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void |
|
|
|
|
|
dinput(void) { |
|
|
|
|
|
cleanup(); |
|
|
|
|
|
execlp("dinput", "dinput", text, NULL); /* todo: argv */ |
|
|
|
|
|
eprint("cannot exec dinput\n"); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
void |
|
|
void |
|
|
drawmenu(void) { |
|
|
drawmenu(void) { |
|
|
dc.x = 0; |
|
|
dc.x = 0; |
|
@ -290,8 +295,7 @@ kpress(XKeyEvent * e) { |
|
|
match(text); |
|
|
match(text); |
|
|
break; |
|
|
break; |
|
|
case XK_x: |
|
|
case XK_x: |
|
|
execlp("dinput", "dinput", text, NULL); /* todo: argv */ |
|
|
|
|
|
eprint("dmenu: cannot exec dinput:"); |
|
|
|
|
|
|
|
|
dinput(); |
|
|
break; |
|
|
break; |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
@ -369,10 +373,9 @@ kpress(XKeyEvent * e) { |
|
|
} |
|
|
} |
|
|
break; |
|
|
break; |
|
|
case XK_Tab: |
|
|
case XK_Tab: |
|
|
if(!sel) |
|
|
|
|
|
return; |
|
|
|
|
|
strncpy(text, sel->text, sizeof text); |
|
|
|
|
|
match(text); |
|
|
|
|
|
|
|
|
if(sel) |
|
|
|
|
|
strncpy(text, sel->text, sizeof text); |
|
|
|
|
|
dinput(); |
|
|
break; |
|
|
break; |
|
|
} |
|
|
} |
|
|
drawmenu(); |
|
|
drawmenu(); |
|
@ -431,11 +434,11 @@ readstdin(void) { |
|
|
if(buf[len-1] == '\n') |
|
|
if(buf[len-1] == '\n') |
|
|
buf[--len] = '\0'; |
|
|
buf[--len] = '\0'; |
|
|
if(!(p = strdup(buf))) |
|
|
if(!(p = strdup(buf))) |
|
|
eprint("dmenu: cannot strdup %u bytes\n", len); |
|
|
|
|
|
|
|
|
eprint("cannot strdup %u bytes\n", len); |
|
|
if((max = MAX(max, len)) == len) |
|
|
if((max = MAX(max, len)) == len) |
|
|
maxname = p; |
|
|
maxname = p; |
|
|
if(!(new = malloc(sizeof *new))) |
|
|
if(!(new = malloc(sizeof *new))) |
|
|
eprint("dmenu: cannot malloc %u bytes\n", sizeof *new); |
|
|
|
|
|
|
|
|
eprint("cannot malloc %u bytes\n", sizeof *new); |
|
|
new->next = new->left = new->right = NULL; |
|
|
new->next = new->left = new->right = NULL; |
|
|
new->text = p; |
|
|
new->text = p; |
|
|
if(!i) |
|
|
if(!i) |
|
@ -544,6 +547,7 @@ main(int argc, char *argv[]) { |
|
|
Bool topbar = True; |
|
|
Bool topbar = True; |
|
|
|
|
|
|
|
|
/* command line args */ |
|
|
/* command line args */ |
|
|
|
|
|
progname = argv[0]; |
|
|
for(i = 1; i < argc; i++) |
|
|
for(i = 1; i < argc; i++) |
|
|
if(!strcmp(argv[i], "-i")) { |
|
|
if(!strcmp(argv[i], "-i")) { |
|
|
fstrncmp = strncasecmp; |
|
|
fstrncmp = strncasecmp; |
|
@ -585,7 +589,7 @@ main(int argc, char *argv[]) { |
|
|
if(!setlocale(LC_CTYPE, "") || !XSupportsLocale()) |
|
|
if(!setlocale(LC_CTYPE, "") || !XSupportsLocale()) |
|
|
fprintf(stderr, "dmenu: warning: no locale support\n"); |
|
|
fprintf(stderr, "dmenu: warning: no locale support\n"); |
|
|
if(!(dpy = XOpenDisplay(NULL))) |
|
|
if(!(dpy = XOpenDisplay(NULL))) |
|
|
eprint("dmenu: cannot open display\n"); |
|
|
|
|
|
|
|
|
eprint("cannot open display\n"); |
|
|
screen = DefaultScreen(dpy); |
|
|
screen = DefaultScreen(dpy); |
|
|
if(!parent) |
|
|
if(!parent) |
|
|
parent = RootWindow(dpy, screen); |
|
|
parent = RootWindow(dpy, screen); |
|
|