diff options
| -rw-r--r-- | dmenu.c | 24 |
1 files changed, 13 insertions, 11 deletions
| @@ -372,7 +372,7 @@ initfont(const char *fontstr) { | |||
| 372 | 372 | ||
| 373 | void | 373 | void |
| 374 | kpress(XKeyEvent * e) { | 374 | kpress(XKeyEvent * e) { |
| 375 | char buf[32]; | 375 | char buf[sizeof text]; |
| 376 | int i, num; | 376 | int i, num; |
| 377 | unsigned int len; | 377 | unsigned int len; |
| 378 | KeySym ksym; | 378 | KeySym ksym; |
| @@ -457,25 +457,23 @@ kpress(XKeyEvent * e) { | |||
| 457 | char *c; | 457 | char *c; |
| 458 | if(!(fp = (FILE*)popen("sselp", "r"))) | 458 | if(!(fp = (FILE*)popen("sselp", "r"))) |
| 459 | eprint("dmenu: Could not popen sselp\n"); | 459 | eprint("dmenu: Could not popen sselp\n"); |
| 460 | c = fgets(text + len, sizeof(text) - len, fp); | 460 | c = fgets(buf, sizeof buf, fp); |
| 461 | pclose(fp); | 461 | pclose(fp); |
| 462 | if(c == NULL) | 462 | if(c == NULL) |
| 463 | return; | 463 | return; |
| 464 | } | 464 | } |
| 465 | len = strlen(text); | 465 | num = strlen(buf); |
| 466 | if(len && text[len-1] == '\n') | 466 | if(num && buf[num-1] == '\n') |
| 467 | text[--len] = '\0'; | 467 | buf[--num] = '\0'; |
| 468 | match(text); | 468 | break; |
| 469 | drawmenu(); | ||
| 470 | return; | ||
| 471 | } | 469 | } |
| 472 | } | 470 | } |
| 473 | switch(ksym) { | 471 | switch(ksym) { |
| 474 | default: | 472 | default: |
| 473 | num = MIN(num, sizeof text - cursor); | ||
| 475 | if(num && !iscntrl((int) buf[0])) { | 474 | if(num && !iscntrl((int) buf[0])) { |
| 476 | buf[num] = 0; | 475 | memmove(text + cursor + num, text + cursor, sizeof text - cursor - num); |
| 477 | memmove(text + cursor + num, text + cursor, sizeof text - cursor); | 476 | memmove(text + cursor, buf, num); |
| 478 | strncpy(text + cursor, buf, sizeof text - cursor); | ||
| 479 | cursor+=num; | 477 | cursor+=num; |
| 480 | match(text); | 478 | match(text); |
| 481 | } | 479 | } |
| @@ -487,6 +485,10 @@ kpress(XKeyEvent * e) { | |||
| 487 | match(text); | 485 | match(text); |
| 488 | } | 486 | } |
| 489 | break; | 487 | break; |
| 488 | case XK_Delete: | ||
| 489 | memmove(text + cursor, text + cursor + 1, sizeof text - cursor); | ||
| 490 | match(text); | ||
| 491 | break; | ||
| 490 | case XK_End: | 492 | case XK_End: |
| 491 | if(!item) | 493 | if(!item) |
| 492 | return; | 494 | return; |
