summaryrefslogtreecommitdiff
path: root/src/sxwm.c
diff options
context:
space:
mode:
authorAbhinav <abhinav.prsai@gmail.com>2025-05-29 12:09:20 +0100
committerAbhinav <abhinav.prsai@gmail.com>2025-05-29 12:09:20 +0100
commita3acd99d794a387c74e72c9c5a52fcb2956b65bb (patch)
treec9333172ad574451111e638b0b7f8494313d0b9e /src/sxwm.c
parent718bcab08c2c0e7db628b6d0eae833184fca17d4 (diff)
unmanage unmapped windows. fix for issue #46
Diffstat (limited to 'src/sxwm.c')
-rw-r--r--src/sxwm.c44
1 files changed, 39 insertions, 5 deletions
diff --git a/src/sxwm.c b/src/sxwm.c
index d3917c7..9d97bac 100644
--- a/src/sxwm.c
+++ b/src/sxwm.c
@@ -56,6 +56,7 @@ void hdl_keypress(XEvent *xev);
void hdl_map_req(XEvent *xev);
void hdl_motion(XEvent *xev);
void hdl_root_property(XEvent *xev);
+void hdl_unmap_ntf(XEvent *xev);
/* void inc_gaps(void); */
void init_defaults(void);
/* void move_master_next(void); */
@@ -591,7 +592,7 @@ void hdl_keypress(XEvent *xev)
switch (b->type) {
case TYPE_CMD:
spawn(b->action.cmd);
- for (int j = 0; j < 256; j++) {
+ for (int j = 0; j < 256; j++) {
Bool valid = False;
for (int k = 0; user_config.should_float[j] && user_config.should_float[j][k] && b->action.cmd[k]; k++) {
if (!strcmp(b->action.cmd[k], user_config.should_float[j][k])) {
@@ -739,7 +740,7 @@ void hdl_map_req(XEvent *xev)
should_float = True;
c->fixed = True;
}
-
+
if (should_float || global_floating || next_should_float) {
c->floating = True;
@@ -754,7 +755,7 @@ void hdl_map_req(XEvent *xev)
XConfigureWindow(
dpy, c->win, CWX | CWY | CWWidth | CWHeight,
- &(XWindowChanges){.x = c->x, .y = c->y, .width = c->w, .height = c->h});
+ &(XWindowChanges){.x = c->x, .y = c->y, .width = c->w, .height = c->h});
}
tile();
@@ -766,8 +767,7 @@ void hdl_map_req(XEvent *xev)
}
next_should_float = False;
}
- }
-
+ }
/* center floating windows & set border */
if (c->floating && !c->fullscreen) {
@@ -904,6 +904,39 @@ void hdl_root_property(XEvent *xev)
}
}
+void hdl_unmap_ntf(XEvent *xev)
+{
+ Window w = xev->xunmap.window;
+
+ for (int ws = 0; ws < NUM_WORKSPACES; ws++) {
+ Client *prev = NULL, *c = workspaces[ws];
+ while (c && c->win != w) {
+ prev = c;
+ c = c->next;
+ }
+ if (c) {
+ if (focused == c) {
+ if (c->next)
+ focused = c->next;
+ else if (prev)
+ focused = prev;
+ else
+ focused = NULL;
+ }
+ if (!prev)
+ workspaces[ws] = c->next;
+ else
+ prev->next = c->next;
+ free(c);
+ open_windows--;
+ update_net_client_list();
+ tile();
+ update_borders();
+ break;
+ }
+ }
+}
+
void update_struts(void)
{
reserve_left = reserve_right = reserve_top = reserve_bottom = 0;
@@ -1274,6 +1307,7 @@ void setup(void)
evtable[MapRequest] = hdl_map_req;
evtable[MotionNotify] = hdl_motion;
evtable[PropertyNotify] = hdl_root_property;
+ evtable[UnmapNotify] = hdl_unmap_ntf;
scan_existing_windows();
signal(SIGCHLD, SIG_IGN); /* Prevent child processes from becoming zombies */