ithinglaunch.c - thinglaunch - A simple command and password promtper for X11. Err bitreich.org 70 hgit clone git://bitreich.org/thinglaunch URL:git://bitreich.org/thinglaunch bitreich.org 70 1Log /scm/thinglaunch/log.gph bitreich.org 70 1Files /scm/thinglaunch/files.gph bitreich.org 70 1Refs /scm/thinglaunch/refs.gph bitreich.org 70 1Tags /scm/thinglaunch/tag bitreich.org 70 1LICENSE /scm/thinglaunch/file/LICENSE.gph bitreich.org 70 i--- Err bitreich.org 70 ithinglaunch.c (10624B) Err bitreich.org 70 i--- Err bitreich.org 70 i 1 /* Err bitreich.org 70 i 2 * Copy me if you can. Err bitreich.org 70 i 3 * by 20h Err bitreich.org 70 i 4 * Err bitreich.org 70 i 5 * For now this is a slightly modified version of the original from Err bitreich.org 70 i 6 * Matt Johnston . See LICENSE.orig for his messages. Err bitreich.org 70 i 7 */ Err bitreich.org 70 i 8 Err bitreich.org 70 i 9 #include Err bitreich.org 70 i 10 #include Err bitreich.org 70 i 11 #include Err bitreich.org 70 i 12 #include Err bitreich.org 70 i 13 #include Err bitreich.org 70 i 14 Err bitreich.org 70 i 15 #include Err bitreich.org 70 i 16 #include Err bitreich.org 70 i 17 #include Err bitreich.org 70 i 18 #include Err bitreich.org 70 i 19 #include Err bitreich.org 70 i 20 #include Err bitreich.org 70 i 21 #include Err bitreich.org 70 i 22 #include Err bitreich.org 70 i 23 #include Err bitreich.org 70 i 24 #include Err bitreich.org 70 i 25 Err bitreich.org 70 i 26 #include "arg.h" Err bitreich.org 70 i 27 #include "config.h" Err bitreich.org 70 i 28 Err bitreich.org 70 i 29 unsigned long getcolor(const char *colstr); Err bitreich.org 70 i 30 XIMStyle choosebetterstyle(XIMStyle style1, XIMStyle style2); Err bitreich.org 70 i 31 void initim(void); Err bitreich.org 70 i 32 void createwindow(void); Err bitreich.org 70 i 33 void setupgc(void); Err bitreich.org 70 i 34 void eventloop(void); Err bitreich.org 70 i 35 void grabhack(void); Err bitreich.org 70 i 36 void redraw(void); Err bitreich.org 70 i 37 void keypress(XKeyEvent *keyevent); Err bitreich.org 70 i 38 void execcmd(void); Err bitreich.org 70 i 39 void die(char *errstr, ...); Err bitreich.org 70 i 40 Err bitreich.org 70 i 41 Display *dpy; Err bitreich.org 70 i 42 GC gc; Err bitreich.org 70 i 43 GC rectgc; Err bitreich.org 70 i 44 XIM im; Err bitreich.org 70 i 45 XIC ic; Err bitreich.org 70 i 46 Window win; Err bitreich.org 70 i 47 XFontStruct *font_info; Err bitreich.org 70 i 48 XFontSet fontset; Err bitreich.org 70 i 49 int screen, issecret = 0, tostdout = 0; Err bitreich.org 70 i 50 unsigned long fgcol, bgcol; Err bitreich.org 70 i 51 static char *name = "thinglaunch"; Err bitreich.org 70 i 52 Err bitreich.org 70 i 53 char *argv0; Err bitreich.org 70 i 54 Err bitreich.org 70 i 55 #define MAXCMD 255 Err bitreich.org 70 i 56 #define WINWIDTH 640 Err bitreich.org 70 i 57 #define WINHEIGHT 25 Err bitreich.org 70 i 58 Err bitreich.org 70 i 59 /* the actual commandline */ Err bitreich.org 70 i 60 wchar_t command[MAXCMD+1]; Err bitreich.org 70 i 61 wchar_t secret[MAXCMD+1]; Err bitreich.org 70 i 62 char cbuf[MAXCMD*4+1]; Err bitreich.org 70 i 63 Err bitreich.org 70 i 64 void Err bitreich.org 70 i 65 usage(void) Err bitreich.org 70 i 66 { Err bitreich.org 70 i 67 fprintf(stderr, "usage: %s [-hos] [-p prompt]\n", argv0); Err bitreich.org 70 i 68 exit(1); Err bitreich.org 70 i 69 } Err bitreich.org 70 i 70 Err bitreich.org 70 i 71 int Err bitreich.org 70 i 72 main(int argc, char *argv[]) Err bitreich.org 70 i 73 { Err bitreich.org 70 i 74 char promptb[256]; Err bitreich.org 70 i 75 Err bitreich.org 70 i 76 if (strstr(argv[0], "thingaskpass")) { Err bitreich.org 70 i 77 issecret = 1; Err bitreich.org 70 i 78 tostdout = 1; Err bitreich.org 70 i 79 prompt = "secret> "; Err bitreich.org 70 i 80 } Err bitreich.org 70 i 81 if (strstr(argv[0], "thingsudoaskpass")) { Err bitreich.org 70 i 82 issecret = 1; Err bitreich.org 70 i 83 tostdout = 1; Err bitreich.org 70 i 84 if (argc > 1) { Err bitreich.org 70 i 85 snprintf(promptb, sizeof(promptb), Err bitreich.org 70 i 86 "sudo('%s')> ", argv[1]); Err bitreich.org 70 i 87 prompt = promptb; Err bitreich.org 70 i 88 } else { Err bitreich.org 70 i 89 prompt = "sudo> "; Err bitreich.org 70 i 90 } Err bitreich.org 70 i 91 argc = 0; Err bitreich.org 70 i 92 } Err bitreich.org 70 i 93 Err bitreich.org 70 i 94 if (argc > 1) { Err bitreich.org 70 i 95 ARGBEGIN { Err bitreich.org 70 i 96 case 'o': Err bitreich.org 70 i 97 tostdout = 1; Err bitreich.org 70 i 98 break; Err bitreich.org 70 i 99 case 's': Err bitreich.org 70 i 100 issecret = 1; Err bitreich.org 70 i 101 break; Err bitreich.org 70 i 102 case 'p': Err bitreich.org 70 i 103 prompt = EARGF(usage()); Err bitreich.org 70 i 104 break; Err bitreich.org 70 i 105 default: Err bitreich.org 70 i 106 case 'h': Err bitreich.org 70 i 107 usage(); Err bitreich.org 70 i 108 break; Err bitreich.org 70 i 109 } ARGEND; Err bitreich.org 70 i 110 Err bitreich.org 70 i 111 if (argc > 0) Err bitreich.org 70 i 112 prompt = argv[0]; Err bitreich.org 70 i 113 } Err bitreich.org 70 i 114 Err bitreich.org 70 i 115 bzero(command, sizeof(command)); Err bitreich.org 70 i 116 bzero(secret, sizeof(secret)); Err bitreich.org 70 i 117 Err bitreich.org 70 i 118 createwindow(); Err bitreich.org 70 i 119 setupgc(); Err bitreich.org 70 i 120 grabhack(); Err bitreich.org 70 i 121 eventloop(); Err bitreich.org 70 i 122 Err bitreich.org 70 i 123 return 0; Err bitreich.org 70 i 124 } Err bitreich.org 70 i 125 Err bitreich.org 70 i 126 unsigned long Err bitreich.org 70 i 127 getcolor(const char *colstr) Err bitreich.org 70 i 128 { Err bitreich.org 70 i 129 Colormap cmap = DefaultColormap(dpy, screen); Err bitreich.org 70 i 130 XColor color; Err bitreich.org 70 i 131 Err bitreich.org 70 i 132 if (!XAllocNamedColor(dpy, cmap, colstr, &color, &color)) Err bitreich.org 70 i 133 die("error, cannot allocate color '%s'\n", colstr); Err bitreich.org 70 i 134 return color.pixel; Err bitreich.org 70 i 135 } Err bitreich.org 70 i 136 Err bitreich.org 70 i 137 /* Err bitreich.org 70 i 138 * Stolen from: Err bitreich.org 70 i 139 * http://menehune.opt.wfu.edu/Kokua/Irix_6.5.21_doc_cd/usr/share/\ Err bitreich.org 70 i 140 * Insight/library/SGI_bookshelves/SGI_Developer/books/XLib_PG/sgi_\ Err bitreich.org 70 i 141 * html/ch11.html#S2-1002-11-11 Err bitreich.org 70 i 142 */ Err bitreich.org 70 i 143 XIMStyle Err bitreich.org 70 i 144 choosebetterstyle(XIMStyle style1, XIMStyle style2) Err bitreich.org 70 i 145 { Err bitreich.org 70 i 146 XIMStyle s,t; Err bitreich.org 70 i 147 XIMStyle preedit = XIMPreeditArea | XIMPreeditCallbacks | Err bitreich.org 70 i 148 XIMPreeditPosition | XIMPreeditNothing | XIMPreeditNone; Err bitreich.org 70 i 149 XIMStyle status = XIMStatusArea | XIMStatusCallbacks | Err bitreich.org 70 i 150 XIMStatusNothing | XIMStatusNone; Err bitreich.org 70 i 151 if (style1 == 0) return style2; Err bitreich.org 70 i 152 if (style2 == 0) return style1; Err bitreich.org 70 i 153 if ((style1 & (preedit | status)) == (style2 & (preedit | status))) Err bitreich.org 70 i 154 return style1; Err bitreich.org 70 i 155 s = style1 & preedit; Err bitreich.org 70 i 156 t = style2 & preedit; Err bitreich.org 70 i 157 if (s != t) { Err bitreich.org 70 i 158 if (s | t | XIMPreeditCallbacks) Err bitreich.org 70 i 159 return (s == XIMPreeditCallbacks)?style1:style2; Err bitreich.org 70 i 160 else if (s | t | XIMPreeditPosition) Err bitreich.org 70 i 161 return (s == XIMPreeditPosition)?style1:style2; Err bitreich.org 70 i 162 else if (s | t | XIMPreeditArea) Err bitreich.org 70 i 163 return (s == XIMPreeditArea)?style1:style2; Err bitreich.org 70 i 164 else if (s | t | XIMPreeditNothing) Err bitreich.org 70 i 165 return (s == XIMPreeditNothing)?style1:style2; Err bitreich.org 70 i 166 } Err bitreich.org 70 i 167 else { /* if preedit flags are the same, compare status flags */ Err bitreich.org 70 i 168 s = style1 & status; Err bitreich.org 70 i 169 t = style2 & status; Err bitreich.org 70 i 170 if (s | t | XIMStatusCallbacks) Err bitreich.org 70 i 171 return (s == XIMStatusCallbacks)?style1:style2; Err bitreich.org 70 i 172 else if (s | t | XIMStatusArea) Err bitreich.org 70 i 173 return (s == XIMStatusArea)?style1:style2; Err bitreich.org 70 i 174 else if (s | t | XIMStatusNothing) Err bitreich.org 70 i 175 return (s == XIMStatusNothing)?style1:style2; Err bitreich.org 70 i 176 } Err bitreich.org 70 i 177 } Err bitreich.org 70 i 178 Err bitreich.org 70 i 179 void Err bitreich.org 70 i 180 initim(void) Err bitreich.org 70 i 181 { Err bitreich.org 70 i 182 XIMStyles *im_supported_styles; Err bitreich.org 70 i 183 XIMStyle app_supported_styles; Err bitreich.org 70 i 184 XIMStyle style; Err bitreich.org 70 i 185 XIMStyle best_style; Err bitreich.org 70 i 186 XVaNestedList list; Err bitreich.org 70 i 187 char **missing_charsets; Err bitreich.org 70 i 188 int num_missing_charsets = 0; Err bitreich.org 70 i 189 char *default_string; Err bitreich.org 70 i 190 int i; Err bitreich.org 70 i 191 Err bitreich.org 70 i 192 fontset = XCreateFontSet(dpy, font, &missing_charsets, Err bitreich.org 70 i 193 &num_missing_charsets, &default_string); Err bitreich.org 70 i 194 if (num_missing_charsets > 0) Err bitreich.org 70 i 195 XFreeStringList(missing_charsets); Err bitreich.org 70 i 196 Err bitreich.org 70 i 197 if (!(im = XOpenIM(dpy, NULL, NULL, NULL))) Err bitreich.org 70 i 198 die("Couldn't open input method.\n"); Err bitreich.org 70 i 199 Err bitreich.org 70 i 200 XGetIMValues(im, XNQueryInputStyle, &im_supported_styles, NULL); Err bitreich.org 70 i 201 app_supported_styles = XIMPreeditNone | XIMPreeditNothing \ Err bitreich.org 70 i 202 | XIMPreeditArea; Err bitreich.org 70 i 203 app_supported_styles |= XIMStatusNone | XIMStatusNothing \ Err bitreich.org 70 i 204 | XIMStatusArea; Err bitreich.org 70 i 205 Err bitreich.org 70 i 206 for(i = 0, best_style = 0; i < im_supported_styles->count_styles; Err bitreich.org 70 i 207 i++) { Err bitreich.org 70 i 208 style = im_supported_styles->supported_styles[i]; Err bitreich.org 70 i 209 if ((style & app_supported_styles) == style) Err bitreich.org 70 i 210 best_style = choosebetterstyle(style, best_style); Err bitreich.org 70 i 211 } Err bitreich.org 70 i 212 if (best_style == 0) Err bitreich.org 70 i 213 die("no common shared interaction style found.\n"); Err bitreich.org 70 i 214 XFree(im_supported_styles); Err bitreich.org 70 i 215 Err bitreich.org 70 i 216 list = XVaCreateNestedList(0, XNFontSet, fontset, NULL); Err bitreich.org 70 i 217 ic = XCreateIC(im, XNInputStyle, best_style, XNClientWindow, win, Err bitreich.org 70 i 218 XNPreeditAttributes, list, XNStatusAttributes, Err bitreich.org 70 i 219 list, NULL); Err bitreich.org 70 i 220 XFree(list); Err bitreich.org 70 i 221 if (ic == NULL) Err bitreich.org 70 i 222 die("Could not create input context.\n"); Err bitreich.org 70 i 223 } Err bitreich.org 70 i 224 Err bitreich.org 70 i 225 void Err bitreich.org 70 i 226 createwindow(void) Err bitreich.org 70 i 227 { Err bitreich.org 70 i 228 char *display_name; Err bitreich.org 70 i 229 int display_width, display_height; Err bitreich.org 70 i 230 int top, left; Err bitreich.org 70 i 231 XSizeHints *win_size_hints; Err bitreich.org 70 i 232 XSetWindowAttributes attrib; Err bitreich.org 70 i 233 XClassHint *ch; Err bitreich.org 70 i 234 XTextProperty str; Err bitreich.org 70 i 235 Err bitreich.org 70 i 236 if (!setlocale(LC_CTYPE, "") || !XSupportsLocale()) Err bitreich.org 70 i 237 fprintf(stderr, "warning: no locale support.\n"); Err bitreich.org 70 i 238 Err bitreich.org 70 i 239 display_name = getenv("DISPLAY"); Err bitreich.org 70 i 240 if (display_name == NULL) Err bitreich.org 70 i 241 die("DISPLAY not set.\n"); Err bitreich.org 70 i 242 Err bitreich.org 70 i 243 dpy = XOpenDisplay(display_name); Err bitreich.org 70 i 244 if (dpy == NULL) Err bitreich.org 70 i 245 die("Couldn't connect to DISPLAY.\n"); Err bitreich.org 70 i 246 Err bitreich.org 70 i 247 if (!XSetLocaleModifiers("")) Err bitreich.org 70 i 248 fprintf(stderr, "warning: could not set local modifiers.\n"); Err bitreich.org 70 i 249 Err bitreich.org 70 i 250 initim(); Err bitreich.org 70 i 251 Err bitreich.org 70 i 252 screen = DefaultScreen(dpy); Err bitreich.org 70 i 253 display_width = DisplayWidth(dpy, screen); Err bitreich.org 70 i 254 display_height = DisplayHeight(dpy, screen); Err bitreich.org 70 i 255 Err bitreich.org 70 i 256 top = (display_height/2 - WINHEIGHT/2); Err bitreich.org 70 i 257 left = (display_width/2 - WINWIDTH/2); Err bitreich.org 70 i 258 Err bitreich.org 70 i 259 bgcol = getcolor(normbgcolor); Err bitreich.org 70 i 260 fgcol = getcolor(normfgcolor); Err bitreich.org 70 i 261 Err bitreich.org 70 i 262 /*win = XCreateSimpleWindow(dpy, RootWindow(dpy, screen), Err bitreich.org 70 i 263 left, top, WINWIDTH, WINHEIGHT, borderwidth, Err bitreich.org 70 i 264 bgcol, bgcol);*/ Err bitreich.org 70 i 265 Err bitreich.org 70 i 266 attrib.override_redirect = True; Err bitreich.org 70 i 267 win = XCreateWindow(dpy, RootWindow(dpy, screen), Err bitreich.org 70 i 268 left, top, WINWIDTH, WINHEIGHT, Err bitreich.org 70 i 269 0, CopyFromParent,InputOutput,CopyFromParent, Err bitreich.org 70 i 270 CWOverrideRedirect,&attrib); Err bitreich.org 70 i 271 Err bitreich.org 70 i 272 /* set up the window hints etc */ Err bitreich.org 70 i 273 win_size_hints = XAllocSizeHints(); Err bitreich.org 70 i 274 if (!win_size_hints) Err bitreich.org 70 i 275 die("out of memory allocating hints.\n"); Err bitreich.org 70 i 276 Err bitreich.org 70 i 277 win_size_hints->flags = PMaxSize | PMinSize; Err bitreich.org 70 i 278 win_size_hints->min_width = win_size_hints->max_width = WINWIDTH; Err bitreich.org 70 i 279 Err bitreich.org 70 i 280 win_size_hints->min_height = win_size_hints->max_height = WINHEIGHT; Err bitreich.org 70 i 281 Err bitreich.org 70 i 282 XStringListToTextProperty(&name, 1, &str); Err bitreich.org 70 i 283 ch = XAllocClassHint(); Err bitreich.org 70 i 284 ch->res_class = name; Err bitreich.org 70 i 285 ch->res_name = name; Err bitreich.org 70 i 286 Err bitreich.org 70 i 287 XSetWMProperties(dpy, win, &str, &str, NULL, 0, win_size_hints, Err bitreich.org 70 i 288 NULL, ch); Err bitreich.org 70 i 289 Err bitreich.org 70 i 290 XFree(win_size_hints); Err bitreich.org 70 i 291 XFree(ch); Err bitreich.org 70 i 292 XFree(str.value); Err bitreich.org 70 i 293 Err bitreich.org 70 i 294 XMapWindow(dpy, win); Err bitreich.org 70 i 295 } Err bitreich.org 70 i 296 Err bitreich.org 70 i 297 void Err bitreich.org 70 i 298 setupgc(void) Err bitreich.org 70 i 299 { Err bitreich.org 70 i 300 XGCValues values; Err bitreich.org 70 i 301 int valuemask = 0; Err bitreich.org 70 i 302 int line_width = 1; Err bitreich.org 70 i 303 int line_style = LineSolid; Err bitreich.org 70 i 304 int cap_style = CapButt; Err bitreich.org 70 i 305 int join_style = JoinBevel; Err bitreich.org 70 i 306 Err bitreich.org 70 i 307 gc = XCreateGC(dpy, win, valuemask, &values); Err bitreich.org 70 i 308 rectgc = XCreateGC(dpy, win, valuemask, &values); Err bitreich.org 70 i 309 XSetForeground(dpy, gc, fgcol); Err bitreich.org 70 i 310 XSetBackground(dpy, gc, bgcol); Err bitreich.org 70 i 311 Err bitreich.org 70 i 312 XSetForeground(dpy, rectgc, bgcol); Err bitreich.org 70 i 313 XSetBackground(dpy, rectgc, bgcol); Err bitreich.org 70 i 314 Err bitreich.org 70 i 315 XSetLineAttributes(dpy, gc, line_width, line_style, Err bitreich.org 70 i 316 cap_style, join_style); Err bitreich.org 70 i 317 Err bitreich.org 70 i 318 /* setup the font */ Err bitreich.org 70 i 319 font_info = XLoadQueryFont(dpy, font); Err bitreich.org 70 i 320 if (!font_info) Err bitreich.org 70 i 321 die("couldn't load font.\n"); Err bitreich.org 70 i 322 Err bitreich.org 70 i 323 XSetFont(dpy, gc, font_info->fid); Err bitreich.org 70 i 324 } Err bitreich.org 70 i 325 Err bitreich.org 70 i 326 void Err bitreich.org 70 i 327 eventloop(void) Err bitreich.org 70 i 328 { Err bitreich.org 70 i 329 XEvent e; Err bitreich.org 70 i 330 Err bitreich.org 70 i 331 redraw(); Err bitreich.org 70 i 332 Err bitreich.org 70 i 333 XSelectInput(dpy, win, ExposureMask | KeyPressMask); Err bitreich.org 70 i 334 Err bitreich.org 70 i 335 for (;;) { Err bitreich.org 70 i 336 XNextEvent(dpy, &e); Err bitreich.org 70 i 337 switch(e.type) { Err bitreich.org 70 i 338 case Expose: Err bitreich.org 70 i 339 redraw(); Err bitreich.org 70 i 340 break; Err bitreich.org 70 i 341 case KeyPress: Err bitreich.org 70 i 342 keypress(&e.xkey); Err bitreich.org 70 i 343 break; Err bitreich.org 70 i 344 default: Err bitreich.org 70 i 345 break; Err bitreich.org 70 i 346 } Err bitreich.org 70 i 347 } Err bitreich.org 70 i 348 } Err bitreich.org 70 i 349 Err bitreich.org 70 i 350 /* this loop is required since pwm grabs the keyboard during the event loop */ Err bitreich.org 70 i 351 void Err bitreich.org 70 i 352 grabhack(void) Err bitreich.org 70 i 353 { Err bitreich.org 70 i 354 long maxwait = 3000000; /* 3 seconds */ Err bitreich.org 70 i 355 long interval = 5000; /* 5 millisec */ Err bitreich.org 70 i 356 long i; Err bitreich.org 70 i 357 int x; Err bitreich.org 70 i 358 Err bitreich.org 70 i 359 redraw(); Err bitreich.org 70 i 360 Err bitreich.org 70 i 361 /* if it takes longer than maxwait, just die */ Err bitreich.org 70 i 362 for (i = 0; i < (maxwait / interval); i++) { Err bitreich.org 70 i 363 usleep(interval); Err bitreich.org 70 i 364 x = XGrabKeyboard(dpy, win, False, GrabModeAsync, Err bitreich.org 70 i 365 GrabModeAsync, CurrentTime); Err bitreich.org 70 i 366 if (x == 0) Err bitreich.org 70 i 367 return; Err bitreich.org 70 i 368 } Err bitreich.org 70 i 369 Err bitreich.org 70 i 370 die("Couldn't grab keyboard.\n"); Err bitreich.org 70 i 371 } Err bitreich.org 70 i 372 Err bitreich.org 70 i 373 void Err bitreich.org 70 i 374 redraw(void) Err bitreich.org 70 i 375 { Err bitreich.org 70 i 376 int font_height, textwidth, promptwidth, dir, ascent, descent; Err bitreich.org 70 i 377 XCharStruct cs; Err bitreich.org 70 i 378 XRectangle ink, logical; Err bitreich.org 70 i 379 Err bitreich.org 70 i 380 font_height = font_info->ascent + font_info->descent; Err bitreich.org 70 i 381 XTextExtents(font_info, prompt, strlen(prompt), &dir, &ascent, Err bitreich.org 70 i 382 &descent, &cs); Err bitreich.org 70 i 383 promptwidth = cs.width; Err bitreich.org 70 i 384 XwcTextExtents(fontset, command, wcslen(command), &ink, &logical); Err bitreich.org 70 i 385 textwidth = logical.width; Err bitreich.org 70 i 386 textwidth += promptwidth; Err bitreich.org 70 i 387 Err bitreich.org 70 i 388 XFillRectangle(dpy, win, rectgc, 0, 0, WINWIDTH, WINHEIGHT); Err bitreich.org 70 i 389 XDrawRectangle(dpy, win, gc, 0, 0, WINWIDTH-1, WINHEIGHT-1); Err bitreich.org 70 i 390 XDrawString(dpy, win, gc, 2, font_height+2, prompt, Err bitreich.org 70 i 391 strlen(prompt)); Err bitreich.org 70 i 392 XwcDrawString(dpy, win, fontset, gc, 4 + promptwidth, Err bitreich.org 70 i 393 font_height+2, command, wcslen(command)); Err bitreich.org 70 i 394 XDrawLine(dpy, win, gc, 4 + textwidth, font_height + 2, Err bitreich.org 70 i 395 4 + textwidth + 10, font_height+2); Err bitreich.org 70 i 396 Err bitreich.org 70 i 397 XFlush(dpy); Err bitreich.org 70 i 398 } Err bitreich.org 70 i 399 Err bitreich.org 70 i 400 void Err bitreich.org 70 i 401 keypress(XKeyEvent *keyevent) Err bitreich.org 70 i 402 { Err bitreich.org 70 i 403 KeySym key_symbol; Err bitreich.org 70 i 404 int len; Err bitreich.org 70 i 405 wchar_t buffer[3]; Err bitreich.org 70 i 406 Err bitreich.org 70 i 407 len = XwcLookupString(ic, keyevent, buffer, 3, &key_symbol, NULL); Err bitreich.org 70 i 408 buffer[len] = L'\0'; Err bitreich.org 70 i 409 Err bitreich.org 70 i 410 switch(key_symbol) { Err bitreich.org 70 i 411 case XK_Escape: Err bitreich.org 70 i 412 exit(1); Err bitreich.org 70 i 413 break; Err bitreich.org 70 i 414 case XK_BackSpace: Err bitreich.org 70 i 415 len = wcslen(command); Err bitreich.org 70 i 416 if (len > 0) { Err bitreich.org 70 i 417 command[len-1] = L'\0'; Err bitreich.org 70 i 418 if (issecret) Err bitreich.org 70 i 419 secret[len-1] = L'\0'; Err bitreich.org 70 i 420 } Err bitreich.org 70 i 421 break; Err bitreich.org 70 i 422 case XK_Return: Err bitreich.org 70 i 423 case XK_KP_Enter: Err bitreich.org 70 i 424 execcmd(); Err bitreich.org 70 i 425 break; Err bitreich.org 70 i 426 case XK_c: Err bitreich.org 70 i 427 if (keyevent->state & ControlMask) Err bitreich.org 70 i 428 exit(1); Err bitreich.org 70 i 429 default: Err bitreich.org 70 i 430 if (key_symbol > 255) Err bitreich.org 70 i 431 break; Err bitreich.org 70 i 432 Err bitreich.org 70 i 433 len = wcslen(command); Err bitreich.org 70 i 434 if (len < MAXCMD) { Err bitreich.org 70 i 435 if (issecret) { Err bitreich.org 70 i 436 secret[len] = buffer[0]; Err bitreich.org 70 i 437 secret[len+1] = L'\0'; Err bitreich.org 70 i 438 command[len] = L'*'; Err bitreich.org 70 i 439 command[len+1] = L'\0'; Err bitreich.org 70 i 440 } else { Err bitreich.org 70 i 441 command[len] = buffer[0]; Err bitreich.org 70 i 442 command[len+1] = L'\0'; Err bitreich.org 70 i 443 } Err bitreich.org 70 i 444 } Err bitreich.org 70 i 445 break; Err bitreich.org 70 i 446 } Err bitreich.org 70 i 447 redraw(); Err bitreich.org 70 i 448 } Err bitreich.org 70 i 449 Err bitreich.org 70 i 450 void Err bitreich.org 70 i 451 execcmd(void) Err bitreich.org 70 i 452 { Err bitreich.org 70 i 453 char *shell; Err bitreich.org 70 i 454 pid_t pid; Err bitreich.org 70 i 455 Err bitreich.org 70 i 456 XDestroyWindow(dpy, win); Err bitreich.org 70 i 457 Err bitreich.org 70 i 458 bzero(cbuf, sizeof(cbuf)); Err bitreich.org 70 i 459 if (issecret) Err bitreich.org 70 i 460 wcstombs(cbuf, secret, sizeof(cbuf)-1); Err bitreich.org 70 i 461 else Err bitreich.org 70 i 462 wcstombs(cbuf, command, sizeof(cbuf)-1); Err bitreich.org 70 i 463 Err bitreich.org 70 i 464 if (tostdout) { Err bitreich.org 70 i 465 printf("%s\n", cbuf); Err bitreich.org 70 i 466 exit(0); Err bitreich.org 70 i 467 } Err bitreich.org 70 i 468 Err bitreich.org 70 i 469 switch ((pid = fork())) { Err bitreich.org 70 i 470 case -1: Err bitreich.org 70 i 471 die("fork: %s\n", strerror(errno)); Err bitreich.org 70 i 472 case 0: Err bitreich.org 70 i 473 break; Err bitreich.org 70 i 474 default: Err bitreich.org 70 i 475 _exit(0); Err bitreich.org 70 i 476 } Err bitreich.org 70 i 477 Err bitreich.org 70 i 478 shell = getenv("SHELL"); Err bitreich.org 70 i 479 if (!shell) Err bitreich.org 70 i 480 shell = "/bin/sh"; Err bitreich.org 70 i 481 Err bitreich.org 70 i 482 execlp(shell, basename(shell), "-c", cbuf, (char *)NULL); Err bitreich.org 70 i 483 die("execlp: %s\n", strerror(errno)); Err bitreich.org 70 i 484 } Err bitreich.org 70 i 485 Err bitreich.org 70 i 486 void Err bitreich.org 70 i 487 die(char *errstr, ...) Err bitreich.org 70 i 488 { Err bitreich.org 70 i 489 va_list ap; Err bitreich.org 70 i 490 Err bitreich.org 70 i 491 va_start(ap, errstr); Err bitreich.org 70 i 492 vfprintf(stderr, errstr, ap); Err bitreich.org 70 i 493 va_end(ap); Err bitreich.org 70 i 494 Err bitreich.org 70 i 495 exit(1); Err bitreich.org 70 i 496 } Err bitreich.org 70 i 497 Err bitreich.org 70 .