diff options
Diffstat (limited to 'dinput.c')
| -rw-r--r-- | dinput.c | 230 |
1 files changed, 0 insertions, 230 deletions
diff --git a/dinput.c b/dinput.c deleted file mode 100644 index 4bbc7bc..0000000 --- a/dinput.c +++ /dev/null | |||
| @@ -1,230 +0,0 @@ | |||
| 1 | /* See LICENSE file for copyright and license details. */ | ||
| 2 | #include <ctype.h> | ||
| 3 | #include <locale.h> | ||
| 4 | #include <stdio.h> | ||
| 5 | #include <stdlib.h> | ||
| 6 | #include <string.h> | ||
| 7 | #include <X11/keysym.h> | ||
| 8 | #include <X11/Xlib.h> | ||
| 9 | #include <X11/Xutil.h> | ||
| 10 | #include "dmenu.h" | ||
| 11 | |||
| 12 | /* forward declarations */ | ||
| 13 | static void cleanup(void); | ||
| 14 | |||
| 15 | /* variables */ | ||
| 16 | static size_t cursor = 0; | ||
| 17 | |||
| 18 | void | ||
| 19 | cleanup(void) { | ||
| 20 | cleanupdraw(&dc); | ||
| 21 | XDestroyWindow(dpy, win); | ||
| 22 | XUngrabKeyboard(dpy, CurrentTime); | ||
| 23 | XCloseDisplay(dpy); | ||
| 24 | } | ||
| 25 | |||
| 26 | void | ||
| 27 | drawbar(void) | ||
| 28 | { | ||
| 29 | dc.x = 0; | ||
| 30 | dc.y = 0; | ||
| 31 | dc.w = mw; | ||
| 32 | dc.h = mh; | ||
| 33 | drawbox(&dc, normcol); | ||
| 34 | /* print prompt? */ | ||
| 35 | if(prompt) { | ||
| 36 | dc.w = promptw; | ||
| 37 | drawbox(&dc, selcol); | ||
| 38 | drawtext(&dc, prompt, selcol); | ||
| 39 | dc.x += dc.w; | ||
| 40 | } | ||
| 41 | dc.w = mw - dc.x; | ||
| 42 | drawtext(&dc, text, normcol); | ||
| 43 | drawline(&dc, textnw(&dc, text, cursor) + dc.font.height/2, 2, 1, | ||
| 44 | dc.font.height-2, normcol); | ||
| 45 | commitdraw(&dc, win); | ||
| 46 | } | ||
| 47 | |||
| 48 | void | ||
| 49 | kpress(XKeyEvent *e) { | ||
| 50 | char buf[sizeof text]; | ||
| 51 | int num; | ||
| 52 | unsigned int i, len; | ||
| 53 | KeySym ksym; | ||
| 54 | |||
| 55 | len = strlen(text); | ||
| 56 | num = XLookupString(e, buf, sizeof buf, &ksym, NULL); | ||
| 57 | if(ksym == XK_KP_Enter) | ||
| 58 | ksym = XK_Return; | ||
| 59 | else if(ksym >= XK_KP_0 && ksym <= XK_KP_9) | ||
| 60 | ksym = (ksym - XK_KP_0) + XK_0; | ||
| 61 | else if(IsFunctionKey(ksym) || IsKeypadKey(ksym) | ||
| 62 | || IsMiscFunctionKey(ksym) || IsPFKey(ksym) | ||
| 63 | || IsPrivateKeypadKey(ksym)) | ||
| 64 | return; | ||
| 65 | /* first check if a control mask is omitted */ | ||
| 66 | if(e->state & ControlMask) { | ||
| 67 | switch(tolower(ksym)) { | ||
| 68 | default: | ||
| 69 | return; | ||
| 70 | case XK_a: | ||
| 71 | ksym = XK_Home; | ||
| 72 | break; | ||
| 73 | case XK_b: | ||
| 74 | ksym = XK_Left; | ||
| 75 | break; | ||
| 76 | case XK_c: | ||
| 77 | ksym = XK_Escape; | ||
| 78 | break; | ||
| 79 | case XK_e: | ||
| 80 | ksym = XK_End; | ||
| 81 | break; | ||
| 82 | case XK_f: | ||
| 83 | ksym = XK_Right; | ||
| 84 | break; | ||
| 85 | case XK_h: | ||
| 86 | ksym = XK_BackSpace; | ||
| 87 | break; | ||
| 88 | case XK_j: | ||
| 89 | case XK_m: | ||
| 90 | ksym = XK_Return; | ||
| 91 | break; | ||
| 92 | case XK_k: | ||
| 93 | text[cursor] = '\0'; | ||
| 94 | break; | ||
| 95 | case XK_u: | ||
| 96 | memmove(text, text + cursor, sizeof text - cursor + 1); | ||
| 97 | cursor = 0; | ||
| 98 | break; | ||
| 99 | case XK_w: | ||
| 100 | if(cursor > 0) { | ||
| 101 | i = cursor; | ||
| 102 | while(i-- > 0 && text[i] == ' '); | ||
| 103 | while(i-- > 0 && text[i] != ' '); | ||
| 104 | memmove(text + i + 1, text + cursor, sizeof text - cursor + 1); | ||
| 105 | cursor = i + 1; | ||
| 106 | } | ||
| 107 | break; | ||
| 108 | case XK_y: | ||
| 109 | { | ||
| 110 | FILE *fp; | ||
| 111 | char *s; | ||
| 112 | if(!(fp = popen("sselp", "r"))) | ||
| 113 | eprint("cannot popen sselp\n"); | ||
| 114 | s = fgets(buf, sizeof buf, fp); | ||
| 115 | pclose(fp); | ||
| 116 | if(s == NULL) | ||
| 117 | return; | ||
| 118 | } | ||
| 119 | num = strlen(buf); | ||
| 120 | if(num && buf[num-1] == '\n') | ||
| 121 | buf[--num] = '\0'; | ||
| 122 | break; | ||
| 123 | } | ||
| 124 | } | ||
| 125 | switch(ksym) { | ||
| 126 | default: | ||
| 127 | num = MIN(num, sizeof text - cursor); | ||
| 128 | if(num && !iscntrl((int) buf[0])) { | ||
| 129 | memmove(text + cursor + num, text + cursor, sizeof text - cursor - num); | ||
| 130 | memcpy(text + cursor, buf, num); | ||
| 131 | cursor += num; | ||
| 132 | } | ||
| 133 | break; | ||
| 134 | case XK_BackSpace: | ||
| 135 | if(cursor == 0) | ||
| 136 | return; | ||
| 137 | for(i = 1; cursor - i > 0 && !IS_UTF8_1ST_CHAR(text[cursor - i]); i++); | ||
| 138 | memmove(text + cursor - i, text + cursor, sizeof text - cursor + i); | ||
| 139 | cursor -= i; | ||
| 140 | break; | ||
| 141 | case XK_Delete: | ||
| 142 | if(cursor == len) | ||
| 143 | return; | ||
| 144 | for(i = 1; cursor + i < len && !IS_UTF8_1ST_CHAR(text[cursor + i]); i++); | ||
| 145 | memmove(text + cursor, text + cursor + i, sizeof text - cursor); | ||
| 146 | break; | ||
| 147 | case XK_End: | ||
| 148 | cursor = len; | ||
| 149 | break; | ||
| 150 | case XK_Escape: | ||
| 151 | exit(EXIT_FAILURE); | ||
| 152 | case XK_Home: | ||
| 153 | cursor = 0; | ||
| 154 | break; | ||
| 155 | case XK_Left: | ||
| 156 | if(cursor == 0) | ||
| 157 | return; | ||
| 158 | while(cursor-- > 0 && !IS_UTF8_1ST_CHAR(text[cursor])); | ||
| 159 | break; | ||
| 160 | case XK_Return: | ||
| 161 | fprintf(stdout, "%s", text); | ||
| 162 | fflush(stdout); | ||
| 163 | exit(EXIT_SUCCESS); | ||
| 164 | case XK_Right: | ||
| 165 | if(cursor == len) | ||
| 166 | return; | ||
| 167 | while(cursor++ < len && !IS_UTF8_1ST_CHAR(text[cursor])); | ||
| 168 | break; | ||
| 169 | } | ||
| 170 | drawbar(); | ||
| 171 | } | ||
| 172 | |||
| 173 | int | ||
| 174 | main(int argc, char *argv[]) { | ||
| 175 | unsigned int i; | ||
| 176 | |||
| 177 | /* command line args */ | ||
| 178 | progname = "dinput"; | ||
| 179 | for(i = 1; i < argc; i++) | ||
| 180 | if(!strcmp(argv[i], "-i")) | ||
| 181 | ; /* ignore flag */ | ||
| 182 | else if(!strcmp(argv[i], "-b")) | ||
| 183 | topbar = False; | ||
| 184 | else if(!strcmp(argv[i], "-l")) | ||
| 185 | i++; /* ignore flag */ | ||
| 186 | else if(!strcmp(argv[i], "-fn")) { | ||
| 187 | if(++i < argc) font = argv[i]; | ||
| 188 | } | ||
| 189 | else if(!strcmp(argv[i], "-nb")) { | ||
| 190 | if(++i < argc) normbgcolor = argv[i]; | ||
| 191 | } | ||
| 192 | else if(!strcmp(argv[i], "-nf")) { | ||
| 193 | if(++i < argc) normfgcolor = argv[i]; | ||
| 194 | } | ||
| 195 | else if(!strcmp(argv[i], "-p")) { | ||
| 196 | if(++i < argc) prompt = argv[i]; | ||
| 197 | } | ||
| 198 | else if(!strcmp(argv[i], "-sb")) { | ||
| 199 | if(++i < argc) selbgcolor = argv[i]; | ||
| 200 | } | ||
| 201 | else if(!strcmp(argv[i], "-sf")) { | ||
| 202 | if(++i < argc) selfgcolor = argv[i]; | ||
| 203 | } | ||
| 204 | else if(!strcmp(argv[i], "-v")) { | ||
| 205 | printf("dinput-"VERSION", © 2006-2010 dmenu engineers, see LICENSE for details\n"); | ||
| 206 | exit(EXIT_SUCCESS); | ||
| 207 | } | ||
| 208 | else if(!*text) { | ||
| 209 | strncpy(text, argv[i], sizeof text); | ||
| 210 | cursor = strlen(text); | ||
| 211 | } | ||
| 212 | else { | ||
| 213 | fputs("usage: dinput [-b] [-fn <font>] [-nb <color>] [-nf <color>]\n" | ||
| 214 | " [-p <prompt>] [-sb <color>] [-sf <color>] [-v] [<text>]\n", stderr); | ||
| 215 | exit(EXIT_FAILURE); | ||
| 216 | } | ||
| 217 | if(!setlocale(LC_CTYPE, "") || !XSupportsLocale()) | ||
| 218 | fprintf(stderr, "dinput: warning: no locale support\n"); | ||
| 219 | if(!(dpy = XOpenDisplay(NULL))) | ||
| 220 | eprint("cannot open display\n"); | ||
| 221 | if(atexit(&cleanup) != 0) | ||
| 222 | eprint("cannot register cleanup\n"); | ||
| 223 | screen = DefaultScreen(dpy); | ||
| 224 | root = RootWindow(dpy, screen); | ||
| 225 | |||
| 226 | grabkeyboard(); | ||
| 227 | setup(0); | ||
| 228 | run(); | ||
| 229 | return 0; | ||
| 230 | } | ||
