dmenu

my fork of dmenu
Index Commits Files Refs README LICENSE
commit 8e3e61170bd34d8a8269e376c30cb3afa25343a2
parent 37236f8840624d5e9d590e7be9ba365bc61913a6
Author: anselm@garbe.us <unknown>
Date:   Mon, 22 Mar 2010 07:50:26 +0000

applied cls' patch, thanks Connor!
Diffstat:
Mdmenu.c | 24+++++++++++++-----------
1 file changed, 13 insertions(+), 11 deletions(-)
diff --git a/dmenu.c b/dmenu.c
@@ -372,7 +372,7 @@ initfont(const char *fontstr) {
 
 void
 kpress(XKeyEvent * e) {
-    char buf[32];
+    char buf[sizeof text];
     int i, num;
     unsigned int len;
     KeySym ksym;
@@ -457,25 +457,23 @@ kpress(XKeyEvent * e) {
                 char *c;
                 if(!(fp = (FILE*)popen("sselp", "r")))
                     eprint("dmenu: Could not popen sselp\n");
-                c = fgets(text + len, sizeof(text) - len, fp);
+                c = fgets(buf, sizeof buf, fp);
                 pclose(fp);
                 if(c == NULL)
                     return;
             }
-            len = strlen(text);
-            if(len && text[len-1] == '\n')
-                text[--len] = '\0';
-            match(text);
-            drawmenu();
-            return;
+            num = strlen(buf);
+            if(num && buf[num-1] == '\n')
+                buf[--num] = '\0';
+            break;
         }
     }
     switch(ksym) {
     default:
+        num = MIN(num, sizeof text - cursor);
         if(num && !iscntrl((int) buf[0])) {
-            buf[num] = 0;
-            memmove(text + cursor + num, text + cursor, sizeof text - cursor);
-            strncpy(text + cursor, buf, sizeof text - cursor);
+            memmove(text + cursor + num, text + cursor, sizeof text - cursor - num);
+            memmove(text + cursor, buf, num);
             cursor+=num;
             match(text);
         }
@@ -487,6 +485,10 @@ kpress(XKeyEvent * e) {
             match(text);
         }
         break;
+    case XK_Delete:
+        memmove(text + cursor, text + cursor + 1, sizeof text - cursor);
+        match(text);
+        break;
     case XK_End:
         if(!item)
             return;