From b0bf3e6250b767f2786f340b577df5f445f9d6aa Mon Sep 17 00:00:00 2001 From: Abhinav Date: Fri, 6 Jun 2025 23:41:37 +0100 Subject: clean up exec command sxwm.c: before, some of the parsing logic of the exec command was located in setup, but i have relocated it to a seperate function called startup_exec. i have also replaced the manual spawning of windows with the spawn function parser.c: added the missing parsing logic of exec and simplified it --- src/parser.c | 43 ++++++++++++++++++------------------------- src/sxwm.c | 48 ++++++++++++++++++++---------------------------- 2 files changed, 38 insertions(+), 53 deletions(-) (limited to 'src') 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); diff --git a/src/sxwm.c b/src/sxwm.c index c464add..5ad238b 100644 --- a/src/sxwm.c +++ b/src/sxwm.c @@ -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, -- cgit v1.2.3