diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/parser.c | 43 | ||||
| -rw-r--r-- | src/sxwm.c | 48 |
2 files changed, 38 insertions, 53 deletions
diff --git a/src/parser.c b/src/parser.c index 6b3185a..d6d35c2 100644 --- a/src/parser.c +++ b/src/parser.c @@ -378,38 +378,31 @@ found: } } else if (!strcmp(key, "exec")) { - char *comment = strchr(rest, '#'); - size_t len = comment ? (size_t)(comment - rest) : strlen(rest); - char win[len + 1]; - strncpy(win, rest, len); - win[len] = '\0'; - - char *final = strip(win); - char *cmd = strip(final); - if (*cmd == '"') { - cmd++; - } - else { - fprintf(stderr, "sxwmrc:%d: exec not enclosed in quotes", lineno); + if (torun >= 256) { + fprintf(stderr, "sxwmrc:%d: too many exec commands\n", lineno); + continue; } - char *end = cmd + strlen(cmd) - 1; - if (*end == '"') { - *end = '\0'; - } - else { - fprintf(stderr, "sxwmrc:%d: exec not enclosed in quotes", lineno); + char *comment = strchr(rest, '#'); + if (comment) { + *comment = '\0'; } - printf("DEBUG: exec command '%s'\n", cmd); - cfg->torun[torun] = strdup(cmd); + char *cmd = strip(rest); + cmd = strip_quotes(cmd); - if (torun > 254) { - fprintf(stderr, "sxwmrc:%d: too many execs", lineno); + if (!*cmd) { + fprintf(stderr, "sxwmrc:%d: empty exec command\n", lineno); + continue; } - else { - torun++; + + cfg->torun[torun] = strdup(cmd); + if (!cfg->torun[torun]) { + fprintf(stderr, "sxwmrc:%d: failed to allocate memory for exec command\n", lineno); + continue; } + + torun++; } else { fprintf(stderr, "sxwmrc:%d: unknown option '%s'\n", lineno, key); @@ -41,6 +41,7 @@ void change_workspace(int ws); int clean_mask(int mask); /* void close_focused(void); */ /* void dec_gaps(void); */ +void startup_exec(void); /* void focus_next(void); */ /* void focus_prev(void); */ int get_monitor_for(Client *c); @@ -299,6 +300,22 @@ void dec_gaps(void) } } +void startup_exec(void) +{ + for (int i = 0; i < 256; i++) { + if (user_config.torun[i]) { + const char **argv = build_argv(user_config.torun[i]); + if (argv) { + spawn(argv); + for (int j = 0; argv[j]; j++) { + free((char *)argv[j]); + } + free(argv); + } + } + } +} + void focus_next(void) { if (!focused || !workspaces[current_ws]) { @@ -1347,36 +1364,11 @@ void setup(void) other_wm(); init_defaults(); if (parser(&user_config)) { - fprintf(stderr, "sxrc: error parsing config file\n"); + fprintf(stderr, "sxwmrc: error parsing config file\n"); init_defaults(); } - - for (int i = 0; i < 256; i++) { - if (user_config.torun[i]) { - printf("[DEBUG] executing %s\n", user_config.torun[i]); - pid_t pid = fork(); - if (pid == 0) { - char *argv[256]; - int j = 0; - char *arg = strtok(user_config.torun[i], " "); - while (arg && j < 256) { - argv[j++] = arg; - arg = strtok(NULL, " "); - } - argv[j] = NULL; - execvp(argv[0], argv); - perror("execvp"); - _exit(127); - } - else if (pid > 0) { - // parent: don’t wait, just continue (background) - } - else { - perror("fork"); - } - } - } grab_keys(); + startup_exec(); c_normal = XcursorLibraryLoadCursor(dpy, "left_ptr"); c_move = XcursorLibraryLoadCursor(dpy, "fleur"); @@ -1397,7 +1389,7 @@ void setup(void) * swapping, * resizing * windows in that order. - */ + */ XGrabButton(dpy, Button1, 0, root, True, ButtonPressMask | ButtonReleaseMask | PointerMotionMask, GrabModeAsync, GrabModeAsync, None, None); XGrabButton(dpy, Button1, user_config.modkey, root, True, ButtonPressMask | ButtonReleaseMask | PointerMotionMask, |
