X-Git-Url: http://pileus.org/git/?a=blobdiff_plain;f=sys-xcb.c;h=f412bcd3b87e6da585ec79efd299751ab210ef9e;hb=9c89736d5e2b165df80ae48670a74580e85513c4;hp=06e4d8818c29129935bef41c6d559428c022d881;hpb=e3bef4852df267f5250ef8565208715646b54151;p=wmpus diff --git a/sys-xcb.c b/sys-xcb.c index 06e4d88..f412bcd 100644 --- a/sys-xcb.c +++ b/sys-xcb.c @@ -52,13 +52,6 @@ struct win_sys { int managed; // window is managed by wm }; -typedef enum { - CLR_FOCUS, - CLR_UNFOCUS, - CLR_URGENT, - NCOLORS -} color_t; - /* Global data */ static xcb_connection_t *conn; static xcb_ewmh_connection_t ewmh; @@ -67,11 +60,16 @@ static xcb_colormap_t colormap; static xcb_window_t root; static xcb_event_mask_t events; static list_t *screens; +static list_t *struts; static void *cache; -static xcb_pixmap_t colors[NCOLORS]; static unsigned int grabbed; static int running; static xcb_window_t control; + +static xcb_pixmap_t clr_focus; +static xcb_pixmap_t clr_unfocus; +static xcb_pixmap_t clr_urgent; + static xcb_atom_t wm_protos; static xcb_atom_t wm_delete; @@ -245,43 +243,74 @@ static void win_free(win_t *win) free(win); } +static void win_add_strut(win_t *win) +{ + win->type = TYPE_TOOLBAR; + for (list_t *cur = screens; cur; cur = cur->next) { + win_t *screen = cur->data; + strut_t *strut = &win->sys->strut; + screen->x += strut->left; + screen->y += strut->top; + screen->w -= strut->left + strut->right; + screen->h -= strut->top + strut->bottom; + } + struts = list_insert(struts, win); + +} + +static void win_del_strut(win_t *win) +{ + list_t *link = list_find(struts, win); + if (!link) + return; + for (list_t *cur = screens; cur; cur = cur->next) { + win_t *screen = cur->data; + strut_t *strut = &win->sys->strut; + screen->x -= strut->left; + screen->y -= strut->top; + screen->w += strut->left + strut->right; + screen->h += strut->top + strut->bottom; + } + struts = list_remove(struts, link, 0); +} + /**************** * XCB Wrappers * ****************/ -static void *do_query_tree(xcb_window_t win, xcb_window_t **kids, int *nkids) +static void *do_query_tree(xcb_window_t xcb, xcb_window_t **kids, int *nkids) { xcb_query_tree_cookie_t cookie = - xcb_query_tree(conn, win); + xcb_query_tree(conn, xcb); if (!cookie.sequence) - return warn("do_query_tree: %d - bad cookie", win), NULL; + return warn("do_query_tree: %d - bad cookie", xcb), NULL; xcb_query_tree_reply_t *reply = xcb_query_tree_reply(conn, cookie, NULL); if (!reply) - return warn("do_query_tree: %d - no reply", win), NULL; + return warn("do_query_tree: %d - no reply", xcb), NULL; *nkids = xcb_query_tree_children_length(reply); *kids = xcb_query_tree_children(reply); - printf("do_query_tree: %d - n=%d\n", win, *nkids); + printf("do_query_tree: %d - n=%d\n", xcb, *nkids); return reply; } -static int do_get_geometry(xcb_window_t win, +static int do_get_geometry(xcb_window_t xcb, int *x, int *y, int *w, int *h) { xcb_get_geometry_cookie_t cookie = - xcb_get_geometry(conn, win); + xcb_get_geometry(conn, xcb); if (!cookie.sequence) - return warn("do_get_geometry: %d - bad cookie", win); + return warn("do_get_geometry: %d - bad cookie", xcb); xcb_get_geometry_reply_t *reply = xcb_get_geometry_reply(conn, cookie, NULL); if (!reply) - return warn("do_get_geometry: %d - no reply", win); + return warn("do_get_geometry: %d - no reply", xcb); printf("do_get_geometry: %d - %dx%d @ %d,%d\n", - win, reply->width, reply->height, reply->x, reply->y); + xcb, reply->width, reply->height, reply->x, reply->y); *x = reply->x; *y = reply->y; *w = reply->width; @@ -290,21 +319,21 @@ static int do_get_geometry(xcb_window_t win, return 1; } -static int do_get_window_attributes(xcb_window_t win, +static int do_get_window_attributes(xcb_window_t xcb, int *override, int *mapped) { xcb_get_window_attributes_cookie_t cookie = - xcb_get_window_attributes(conn, win); + xcb_get_window_attributes(conn, xcb); if (!cookie.sequence) - return warn("do_get_window_attributes: %d - bad cookie", win); + return warn("do_get_window_attributes: %d - bad cookie", xcb); xcb_get_window_attributes_reply_t *reply = xcb_get_window_attributes_reply(conn, cookie, NULL); if (!reply) - return warn("do_get_window_attributes: %d - no reply ", win); + return warn("do_get_window_attributes: %d - no reply ", xcb); printf("do_get_window_attributes: %d - %d\n", - win, reply->override_redirect); + xcb, reply->override_redirect); *override = reply->override_redirect; *mapped = reply->map_state != XCB_MAP_STATE_UNMAPPED; free(reply); @@ -400,10 +429,10 @@ static int do_ewmh_init_atoms(void) return status; } -static int do_get_strut(xcb_window_t win, strut_t *strut) +static int do_get_strut(xcb_window_t xcb, strut_t *strut) { xcb_get_property_cookie_t cookie = - xcb_ewmh_get_wm_strut(&ewmh, win); + xcb_ewmh_get_wm_strut(&ewmh, xcb); if (!cookie.sequence) return warn("do_get_strut: bad cookie"); @@ -459,7 +488,7 @@ static void do_ungrab_pointer(void) xcb_ungrab_pointer(conn, XCB_CURRENT_TIME); } -static void do_configure_window(xcb_window_t win, +static void do_configure_window(xcb_window_t xcb, int x, int y, int w, int h, int b, int s, int r) { @@ -482,20 +511,20 @@ static void do_configure_window(xcb_window_t win, } } - xcb_configure_window(conn, win, mask, list); + xcb_configure_window(conn, xcb, mask, list); } -static int do_client_message(xcb_window_t win, xcb_atom_t atom) +static int do_client_message(xcb_window_t xcb, xcb_atom_t atom) { /* Get protocols */ xcb_get_property_cookie_t cookie = - xcb_icccm_get_wm_protocols(conn, win, wm_protos); + xcb_icccm_get_wm_protocols(conn, xcb, wm_protos); if (!cookie.sequence) - return warn("do_client_message: %d - bad cookie", win); + return warn("do_client_message: %d - bad cookie", xcb); xcb_icccm_get_wm_protocols_reply_t protos = {}; if (!xcb_icccm_get_wm_protocols_reply(conn, cookie, &protos, NULL)) - return warn("do_client_message: %d - no reply", win); + return warn("do_client_message: %d - no reply", xcb); /* Search for the atom */ int found = 0; @@ -504,18 +533,18 @@ static int do_client_message(xcb_window_t win, xcb_atom_t atom) found = 1; xcb_icccm_get_wm_protocols_reply_wipe(&protos); if (!found) - return warn("do_client_message: %d - no atom", win); + return warn("do_client_message: %d - no atom", xcb); /* Send the message */ xcb_client_message_event_t msg = { .response_type = XCB_CLIENT_MESSAGE, .format = 32, - .window = win, + .window = xcb, .type = wm_protos, .data.data32[0] = atom, .data.data32[1] = XCB_CURRENT_TIME, }; - xcb_send_event(conn, 0, win, XCB_EVENT_MASK_NO_EVENT, + xcb_send_event(conn, 0, xcb, XCB_EVENT_MASK_NO_EVENT, (const char *)&msg); return 1; } @@ -647,7 +676,7 @@ static void on_focus_in(xcb_focus_in_event_t *event) return; printf("on_focus_in: xcb=%-8u mode=%d\n", event->event, event->mode); xcb_change_window_attributes(conn, event->event, - XCB_CW_BORDER_PIXEL, &colors[CLR_FOCUS]); + XCB_CW_BORDER_PIXEL, &clr_focus); if (event->mode == XCB_NOTIFY_MODE_NORMAL) send_event(EV_FOCUS, event->event); } @@ -659,7 +688,7 @@ static void on_focus_out(xcb_focus_out_event_t *event) return; printf("on_focus_out: xcb=%-8u mode=%d\n", event->event, event->mode); xcb_change_window_attributes(conn, event->event, - XCB_CW_BORDER_PIXEL, &colors[CLR_UNFOCUS]); + XCB_CW_BORDER_PIXEL, &clr_unfocus); if (event->mode == XCB_NOTIFY_MODE_NORMAL) send_event(EV_UNFOCUS, event->event); } @@ -698,6 +727,7 @@ static void on_unmap_notify(xcb_unmap_notify_event_t *event) event->window, win); if (!win) return; + win_del_strut(win); send_state(win, ST_HIDE); } @@ -719,10 +749,7 @@ static void on_map_request(xcb_map_request_event_t *event) if (!win) return; if (do_get_strut(win->sys->xcb, &win->sys->strut)) - printf("Map: Got a strut!\n"); - else - printf("Map: No struts here!\n"); - + win_add_strut(win); send_state(win, ST_SHOW); xcb_map_window(conn, win->sys->xcb); sys_move(win, win->x, win->y, win->w, win->h); @@ -1110,9 +1137,9 @@ void sys_init(void) error("cannot allocate key symbols"); /* Read color information */ - colors[CLR_FOCUS] = do_alloc_color(0xFF6060); - colors[CLR_UNFOCUS] = do_alloc_color(0xD8D8FF); - colors[CLR_URGENT] = do_alloc_color(0xFF0000); + clr_focus = do_alloc_color(0xFF6060); + clr_unfocus = do_alloc_color(0xD8D8FF); + clr_urgent = do_alloc_color(0xFF0000); } void sys_run(void) @@ -1129,6 +1156,8 @@ void sys_run(void) if (kids[i] == control) continue; win_t *win = win_new(kids[i]); + if (do_get_strut(win->sys->xcb, &win->sys->strut)) + win_add_strut(win); do_get_geometry(kids[i], &win->x, &win->y, &win->w, &win->h); do_get_window_attributes(kids[i], &override, &mapped); printf(" found %-8u %dx%d @ %d,%d --%s%s\n", kids[i],