summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/parser.c43
-rw-r--r--src/sxwm.c48
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);
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,