X-Git-Url: https://jasonwoof.com/gitweb/?a=blobdiff_plain;f=scrotwm.c;h=3b7bfce0a0b3a014188d27ffafcad8fbacda6b41;hb=014589e60503fee99276da4252258e553d62b055;hp=4e9ecfdcc76e05dc302d7639037a2ad12abf8081;hpb=f5c5fd74a8223aee7f49ece1db020d7495296047;p=spectrwm.git diff --git a/scrotwm.c b/scrotwm.c index 4e9ecfd..3b7bfce 100644 --- a/scrotwm.c +++ b/scrotwm.c @@ -332,8 +332,10 @@ struct layout { { NULL, NULL, 0, NULL }, }; -/* position of max_stack mode in the layouts array */ -#define SWM_MAX_STACK 2 +/* position of max_stack mode in the layouts array, index into layouts! */ +#define SWM_V_STACK (0) +#define SWM_H_STACK (1) +#define SWM_MAX_STACK (2) #define SWM_H_SLICE (32) #define SWM_V_SLICE (32) @@ -4524,8 +4526,9 @@ setautorun(char *selector, char *value, int flags) { int ws_id; char s[1024]; + char *ap, *sp = s; union arg a; - char *real_args[] = { NULL, NULL }; + int argc = 0; long pid; struct pid_e *p; @@ -4533,11 +4536,11 @@ setautorun(char *selector, char *value, int flags) return (0); bzero(s, sizeof s); - if (sscanf(value, "ws[%d]:%1023s", &ws_id, s) != 2) - errx(1, "invalid autorun entry, should be 'ws:command'\n"); + if (sscanf(value, "ws[%d]:%1023c", &ws_id, s) != 2) + errx(1, "invalid autorun entry, should be 'ws[]:command'\n"); ws_id--; if (ws_id < 0 || ws_id >= SWM_WS_MAX) - errx(1, "invalid workspace %d\n", ws_id + 1); + errx(1, "autorun: invalid workspace %d\n", ws_id + 1); /* * This is a little intricate @@ -4546,13 +4549,27 @@ setautorun(char *selector, char *value, int flags) * used before AND not claimed by manage_window. We get away with * altering it in the parent after INSERT because this can not be a race */ - real_args[0] = s; - a.argv = real_args; /* XXX this sucks and should have args for real */ + a.argv = NULL; + while ((ap = strsep(&sp, " \t")) != NULL) { + if (*ap == '\0') + continue; + DNPRINTF(SWM_D_SPAWN, "setautorun: arg [%s]\n", ap); + argc++; + if ((a.argv = realloc(a.argv, argc * sizeof(char *))) == NULL) + err(1, "setautorun: realloc"); + a.argv[argc - 1] = ap; + } + + if ((a.argv = realloc(a.argv, (argc + 1) * sizeof(char *))) == NULL) + err(1, "setautorun: realloc"); + a.argv[argc] = NULL; + if ((pid = fork()) == 0) { spawn(ws_id, &a, 1); /* NOTREACHED */ _exit(1); } + free(a.argv); /* parent */ p = find_pid(pid); @@ -4569,11 +4586,70 @@ setautorun(char *selector, char *value, int flags) return (0); } +int +setlayout(char *selector, char *value, int flags) +{ + int ws_id, st, i, x, mg, ma, si; + char s[1024]; + struct workspace *ws; + + if (getenv("SWM_STARTED")) + return (0); + + bzero(s, sizeof s); + if (sscanf(value, "ws[%d]:%d:%d:%d:%1023c", + &ws_id, &mg, &ma, &si, s) != 5) + errx(1, "invalid layout entry, should be 'ws[]:'\n"); + ws_id--; + if (ws_id < 0 || ws_id >= SWM_WS_MAX) + errx(1, "layout: invalid workspace %d\n", ws_id + 1); + + if (!strcasecmp(s, "vertical")) + st = SWM_V_STACK; + else if (!strcasecmp(s, "horizontal")) + st = SWM_H_STACK; + else if (!strcasecmp(s, "fullscreen")) + st = SWM_MAX_STACK; + else + errx(1, "invalid layout entry, should be 'ws[]:'\n"); + + for (i = 0; i < ScreenCount(display); i++) { + ws = (struct workspace *)&screens[i].ws; + ws[ws_id].cur_layout = &layouts[st]; + if (st == SWM_MAX_STACK) + continue; + + /* master grow */ + for (x = 0; x < abs(mg); x++) { + ws[ws_id].cur_layout->l_config(&ws[ws_id], + mg >= 0 ? SWM_ARG_ID_MASTERGROW : + SWM_ARG_ID_MASTERSHRINK); + stack(); + } + /* master add */ + for (x = 0; x < abs(ma); x++) { + ws[ws_id].cur_layout->l_config(&ws[ws_id], + ma >= 0 ? SWM_ARG_ID_MASTERADD : + SWM_ARG_ID_MASTERDEL); + stack(); + } + /* stack inc */ + for (x = 0; x < abs(si); x++) { + ws[ws_id].cur_layout->l_config(&ws[ws_id], + si >= 0 ? SWM_ARG_ID_STACKINC : + SWM_ARG_ID_STACKDEC); + stack(); + } + } + + return (0); +} + /* config options */ struct config_option { char *optname; - int (*func)(char*, char*, int); - int funcflags; + int (*func)(char*, char*, int); + int funcflags; }; struct config_option configopt[] = { { "bar_enabled", setconfvalue, SWM_S_BAR_ENABLED }, @@ -4609,6 +4685,7 @@ struct config_option configopt[] = { { "disable_border", setconfvalue, SWM_S_DISABLE_BORDER }, { "border_width", setconfvalue, SWM_S_BORDER_WIDTH }, { "autorun", setautorun, 0 }, + { "layout", setlayout, 0 }, };