This simplifies later processing because we don't have to figure out if
we need to insert or remove windows when they are mapped or unmapped. We
can just insert and remove them when the are created and destroyed then
send ST_SHOW/ST_HIDE events the rest of the time.
struct win_sys {
xcb_window_t xcb; // xcb window id
xcb_event_mask_t events; // currently watch events
struct win_sys {
xcb_window_t xcb; // xcb window id
xcb_event_mask_t events; // currently watch events
- int override; // normal vs override redirect
- int mapped; // window is currently mapped
+ int managed; // window is managed by wm
}
/* Send window state info */
}
/* Send window state info */
-static int send_state(void)
+static void send_manage(win_t *win, int managed)
+ if (win->sys->managed == managed)
+ return;
+ if (managed)
+ wm_insert(win);
+ else
+ wm_remove(win);
+ win->sys->managed = managed;
+/* Send window state info */
+static void send_state(win_t *win, state_t next)
+{
+ if (!win->sys->managed)
+ return;
+ if (win->state == next)
+ return;
+ state_t prev = win->state;
+ win->state = next;
+ wm_handle_state(win, prev, next);
+}
/**********************
* X11 Event Handlers *
/**********************
* X11 Event Handlers *
win->sys = sys;
sys->xcb = event->window;
win->sys = sys;
sys->xcb = event->window;
- sys->override = event->override_redirect;
+
+ if (!event->override_redirect)
+ send_manage(win, 1);
tsearch(win, &cache, win_cmp);
}
tsearch(win, &cache, win_cmp);
}
event->window, win);
if (!win) return;
event->window, win);
if (!win) return;
tdelete(win, &cache, win_cmp);
free(win->sys);
tdelete(win, &cache, win_cmp);
free(win->sys);
event->window, win);
if (!win) return;
event->window, win);
if (!win) return;
- if (!win->sys->override && !win->sys->mapped)
- wm_insert(win);
- win->sys->mapped = 1;
-
+ send_state(win, ST_SHOW);
xcb_map_window(conn, win->sys->xcb);
sys_move(win, win->x, win->y, win->w, win->h);
}
xcb_map_window(conn, win->sys->xcb);
sys_move(win, win->x, win->y, win->w, win->h);
}
xcb_window_t *kids = NULL;
int nkids = do_query_tree(root, &kids);
for(int i = 0; i < nkids; i++) {
xcb_window_t *kids = NULL;
int nkids = do_query_tree(root, &kids);
for(int i = 0; i < nkids; i++) {
+ int override=0, mapped=0;
win_t *win = new0(win_t);
win->sys = new0(win_sys_t);
win->sys->xcb = kids[i];
win_t *win = new0(win_t);
win->sys = new0(win_sys_t);
win->sys->xcb = kids[i];
- do_get_geometry(kids[i], &win->x, &win->y, &win->w, &win->h);
- do_get_window_attributes(kids[i],
- &win->sys->override, &win->sys->mapped);
tsearch(win, &cache, win_cmp);
tsearch(win, &cache, win_cmp);
- if (!win->sys->override && win->sys->mapped)
- wm_insert(win);
+ do_get_geometry(kids[i], &win->x, &win->y, &win->w, &win->h);
+ do_get_window_attributes(kids[i], &override, &mapped);
+ if (!override)
+ send_manage(win, 1);
+ if (mapped)
+ send_state(win, ST_SHOW);