From de5be2ff9d3e8d0c0f3c725a9fb9ea7046c12862 Mon Sep 17 00:00:00 2001 From: Abhinav Date: Tue, 24 Jun 2025 01:07:50 +0100 Subject: add open_in_workspace user can now open specific windows in specific workspaces --- src/sxwm.c | 50 +++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 49 insertions(+), 1 deletion(-) (limited to 'src/sxwm.c') diff --git a/src/sxwm.c b/src/sxwm.c index 8e9b2c4..5e86c75 100644 --- a/src/sxwm.c +++ b/src/sxwm.c @@ -47,6 +47,7 @@ Window find_toplevel(Window w); /* void focus_prev(void); */ int get_monitor_for(Client *c); pid_t get_pid(Window w); +int get_workspace_for_window(Window w); void grab_keys(void); void hdl_button(XEvent *xev); void hdl_button_release(XEvent *xev); @@ -667,6 +668,36 @@ pid_t get_pid(Window w) return pid; } +int get_workspace_for_window(Window w) +{ + XClassHint ch; + if (!XGetClassHint(dpy, w, &ch)) { + return current_ws; /* default to current workspace */ + } + + for (int i = 0; i < 256; i++) { + if (!user_config.open_in_workspace[i]) { + break; + } + + char *rule_class = user_config.open_in_workspace[i][0]; + char *rule_ws = user_config.open_in_workspace[i][1]; + + if (rule_class && rule_ws) { + if ((ch.res_class && strcasecmp(ch.res_class, rule_class) == 0) || + (ch.res_name && strcasecmp(ch.res_name, rule_class) == 0)) { + XFree(ch.res_class); + XFree(ch.res_name); + return atoi(rule_ws); + } + } + } + + XFree(ch.res_class); + XFree(ch.res_name); + return current_ws; /* default to current workspace */ +} + void grab_keys(void) { const int guards[] = {0, @@ -1117,7 +1148,8 @@ void hdl_map_req(XEvent *xev) return; } - Client *c = add_client(w, current_ws); + int target_ws = get_workspace_for_window(w); + Client *c = add_client(w, target_ws); if (!c) { return; } @@ -1152,6 +1184,11 @@ void hdl_map_req(XEvent *xev) XSetWindowBorderWidth(dpy, w, user_config.border_width); } + if (target_ws != current_ws) { + update_net_client_list(); + return; + } + /* map & borders */ update_net_client_list(); if (!global_floating && !c->floating) { @@ -1457,6 +1494,7 @@ void init_defaults(void) for (int i = 0; i < 256; i++) { default_config.can_be_swallowed[i] = NULL; default_config.can_swallow[i] = NULL; + default_config.open_in_workspace[i] = NULL; } default_config.motion_throttle = 60; @@ -1707,6 +1745,16 @@ void reload_config(void) free(user_config.can_be_swallowed[i]); user_config.can_be_swallowed[i] = NULL; } + if (user_config.open_in_workspace[i]) { + if (user_config.open_in_workspace[i][0]) { + free(user_config.open_in_workspace[i][0]); + } + if (user_config.open_in_workspace[i][1]) { + free(user_config.open_in_workspace[i][1]); + } + free(user_config.open_in_workspace[i]); + user_config.open_in_workspace[i] = NULL; + } } /* free should_float arrays */ -- cgit v1.2.3