diff options
| -rw-r--r-- | arg.h | 55 | ||||
| -rw-r--r-- | st.c | 118 |
2 files changed, 112 insertions, 61 deletions
| @@ -0,0 +1,55 @@ | |||
| 1 | /* | ||
| 2 | * Copy me if you can. | ||
| 3 | * by 20h | ||
| 4 | */ | ||
| 5 | |||
| 6 | #ifndef __ARG_H__ | ||
| 7 | #define __ARG_H__ | ||
| 8 | |||
| 9 | extern char *argv0; | ||
| 10 | |||
| 11 | #define USED(x) ((void)(x)) | ||
| 12 | |||
| 13 | /* use main(int argc, char *argv[]) */ | ||
| 14 | #define ARGBEGIN for (argv0 = *argv, argv++, argc--;\ | ||
| 15 | argv[0] && argv[0][1]\ | ||
| 16 | && argv[0][0] == '-';\ | ||
| 17 | argc--, argv++) {\ | ||
| 18 | char _argc;\ | ||
| 19 | char **_argv;\ | ||
| 20 | int brk;\ | ||
| 21 | if (argv[0][1] == '-' && argv[0][2] == '\0') {\ | ||
| 22 | argv++;\ | ||
| 23 | argc--;\ | ||
| 24 | break;\ | ||
| 25 | }\ | ||
| 26 | for (brk = 0, argv[0]++, _argv = argv;\ | ||
| 27 | argv[0][0] && !brk;\ | ||
| 28 | argv[0]++) {\ | ||
| 29 | if (_argv != argv)\ | ||
| 30 | break;\ | ||
| 31 | _argc = argv[0][0];\ | ||
| 32 | switch (_argc) | ||
| 33 | |||
| 34 | #define ARGEND }\ | ||
| 35 | USED(_argc);\ | ||
| 36 | }\ | ||
| 37 | USED(argv);\ | ||
| 38 | USED(argc); | ||
| 39 | |||
| 40 | #define ARGC() _argc | ||
| 41 | |||
| 42 | #define EARGF(x) ((argv[0][1] == '\0' && argv[1] == NULL)?\ | ||
| 43 | ((x), abort(), (char *)0) :\ | ||
| 44 | (brk = 1, (argv[0][1] != '\0')?\ | ||
| 45 | (&argv[0][1]) :\ | ||
| 46 | (argc--, argv++, argv[0]))) | ||
| 47 | |||
| 48 | #define ARGF() ((argv[0][1] == '\0' && argv[1] == NULL)?\ | ||
| 49 | (char *)0 :\ | ||
| 50 | (brk = 1, (argv[0][1] != '\0')?\ | ||
| 51 | (&argv[0][1]) :\ | ||
| 52 | (argc--, argv++, argv[0]))) | ||
| 53 | |||
| 54 | #endif | ||
| 55 | |||
| @@ -27,6 +27,10 @@ | |||
| 27 | #include <X11/Xft/Xft.h> | 27 | #include <X11/Xft/Xft.h> |
| 28 | #include <fontconfig/fontconfig.h> | 28 | #include <fontconfig/fontconfig.h> |
| 29 | 29 | ||
| 30 | #include "arg.h" | ||
| 31 | |||
| 32 | char *argv0; | ||
| 33 | |||
| 30 | #define Glyph Glyph_ | 34 | #define Glyph Glyph_ |
| 31 | #define Font Font_ | 35 | #define Font Font_ |
| 32 | #define Draw XftDraw * | 36 | #define Draw XftDraw * |
| @@ -41,10 +45,6 @@ | |||
| 41 | #include <libutil.h> | 45 | #include <libutil.h> |
| 42 | #endif | 46 | #endif |
| 43 | 47 | ||
| 44 | #define USAGE \ | ||
| 45 | "st " VERSION " (c) 2010-2013 st engineers\n" \ | ||
| 46 | "usage: st [-a] [-v] [-c class] [-f font] [-g geometry] [-o file]" \ | ||
| 47 | " [-t title] [-w windowid] [-e command ...]\n" | ||
| 48 | 48 | ||
| 49 | /* XEMBED messages */ | 49 | /* XEMBED messages */ |
| 50 | #define XEMBED_FOCUS_IN 4 | 50 | #define XEMBED_FOCUS_IN 4 |
| @@ -3308,70 +3308,66 @@ run(void) { | |||
| 3308 | } | 3308 | } |
| 3309 | } | 3309 | } |
| 3310 | 3310 | ||
| 3311 | void | ||
| 3312 | usage(void) { | ||
| 3313 | die("%s " VERSION " (c) 2010-2013 st engineers\n" \ | ||
| 3314 | "usage: st [-a] [-v] [-c class] [-f font] [-g geometry] [-o file]" \ | ||
| 3315 | " [-t title] [-w windowid] [-e command ...]\n", argv0); | ||
| 3316 | } | ||
| 3317 | |||
| 3311 | int | 3318 | int |
| 3312 | main(int argc, char *argv[]) { | 3319 | main(int argc, char *argv[]) { |
| 3313 | int i, bitm, xr, yr; | 3320 | int bitm, xr, yr; |
| 3314 | uint wr, hr; | 3321 | uint wr, hr; |
| 3315 | 3322 | ||
| 3316 | xw.fw = xw.fh = xw.fx = xw.fy = 0; | 3323 | xw.fw = xw.fh = xw.fx = xw.fy = 0; |
| 3317 | xw.isfixed = False; | 3324 | xw.isfixed = False; |
| 3318 | 3325 | ||
| 3319 | for(i = 1; i < argc; i++) { | 3326 | ARGBEGIN { |
| 3320 | switch(argv[i][0] != '-' || argv[i][2] ? -1 : argv[i][1]) { | 3327 | case 'a': |
| 3321 | case 'a': | 3328 | allowaltscreen = false; |
| 3322 | allowaltscreen = false; | 3329 | break; |
| 3323 | break; | 3330 | case 'c': |
| 3324 | case 'c': | 3331 | opt_class = EARGF(usage()); |
| 3325 | if(++i < argc) | 3332 | break; |
| 3326 | opt_class = argv[i]; | 3333 | case 'e': |
| 3327 | break; | 3334 | /* eat all remaining arguments */ |
| 3328 | case 'e': | 3335 | opt_cmd = &argv[1]; |
| 3329 | /* eat all remaining arguments */ | 3336 | goto run; |
| 3330 | if(++i < argc) | 3337 | case 'f': |
| 3331 | opt_cmd = &argv[i]; | 3338 | opt_font = EARGF(usage()); |
| 3332 | goto run; | 3339 | break; |
| 3333 | case 'f': | 3340 | case 'g': |
| 3334 | if(++i < argc) | 3341 | bitm = XParseGeometry(EARGF(usage()), &xr, &yr, &wr, &hr); |
| 3335 | opt_font = argv[i]; | 3342 | if(bitm & XValue) |
| 3336 | break; | 3343 | xw.fx = xr; |
| 3337 | case 'g': | 3344 | if(bitm & YValue) |
| 3338 | if(++i >= argc) | 3345 | xw.fy = yr; |
| 3339 | break; | 3346 | if(bitm & WidthValue) |
| 3340 | 3347 | xw.fw = (int)wr; | |
| 3341 | bitm = XParseGeometry(argv[i], &xr, &yr, &wr, &hr); | 3348 | if(bitm & HeightValue) |
| 3342 | if(bitm & XValue) | 3349 | xw.fh = (int)hr; |
| 3343 | xw.fx = xr; | 3350 | if(bitm & XNegative && xw.fx == 0) |
| 3344 | if(bitm & YValue) | 3351 | xw.fx = -1; |
| 3345 | xw.fy = yr; | 3352 | if(bitm & XNegative && xw.fy == 0) |
| 3346 | if(bitm & WidthValue) | 3353 | xw.fy = -1; |
| 3347 | xw.fw = (int)wr; | 3354 | |
| 3348 | if(bitm & HeightValue) | 3355 | if(xw.fh != 0 && xw.fw != 0) |
| 3349 | xw.fh = (int)hr; | 3356 | xw.isfixed = True; |
| 3350 | if(bitm & XNegative && xw.fx == 0) | 3357 | break; |
| 3351 | xw.fx = -1; | 3358 | case 'o': |
| 3352 | if(bitm & XNegative && xw.fy == 0) | 3359 | opt_io = EARGF(usage()); |
| 3353 | xw.fy = -1; | 3360 | break; |
| 3354 | 3361 | case 't': | |
| 3355 | if(xw.fh != 0 && xw.fw != 0) | 3362 | opt_title = EARGF(usage()); |
| 3356 | xw.isfixed = True; | 3363 | break; |
| 3357 | break; | 3364 | case 'w': |
| 3358 | case 'o': | 3365 | opt_embed = EARGF(usage()); |
| 3359 | if(++i < argc) | 3366 | break; |
| 3360 | opt_io = argv[i]; | 3367 | case 'v': |
| 3361 | break; | 3368 | default: |
| 3362 | case 't': | 3369 | usage(); |
| 3363 | if(++i < argc) | 3370 | } ARGEND; |
| 3364 | opt_title = argv[i]; | ||
| 3365 | break; | ||
| 3366 | case 'v': | ||
| 3367 | default: | ||
| 3368 | die(USAGE); | ||
| 3369 | case 'w': | ||
| 3370 | if(++i < argc) | ||
| 3371 | opt_embed = argv[i]; | ||
| 3372 | break; | ||
| 3373 | } | ||
| 3374 | } | ||
| 3375 | 3371 | ||
| 3376 | run: | 3372 | run: |
| 3377 | setlocale(LC_CTYPE, ""); | 3373 | setlocale(LC_CTYPE, ""); |
