X-Git-Url: https://jasonwoof.com/gitweb/?a=blobdiff_plain;f=spectrwm.c;h=29849f5bc04237d763e5e44ee4cac54a9d4ad56d;hb=404594c487e291270831d1b08f5f30599b53e084;hp=93040fee35ababf24526f4cd333a8e13bbf4928c;hpb=a53bbb5e6d641b2d09f64142d990118a46785b11;p=spectrwm.git diff --git a/spectrwm.c b/spectrwm.c index 93040fe..29849f5 100644 --- a/spectrwm.c +++ b/spectrwm.c @@ -246,10 +246,10 @@ u_int32_t swm_debug = 0 #endif char **start_argv; -xcb_atom_t astate; -xcb_atom_t aprot; -xcb_atom_t adelete; -xcb_atom_t takefocus; +xcb_atom_t a_state; +xcb_atom_t a_prot; +xcb_atom_t a_delete; +xcb_atom_t a_takefocus; xcb_atom_t a_wmname; xcb_atom_t a_netwmname; xcb_atom_t a_utf8_string; @@ -843,7 +843,6 @@ ewmh_autoquirk(struct ws_win *win) { uint32_t i, n; xcb_atom_t *type; - xcb_get_property_cookie_t c; xcb_get_property_reply_t *r; @@ -1932,8 +1931,8 @@ set_win_state(struct ws_win *win, uint16_t state) if (win == NULL) return; - xcb_change_property(conn, XCB_PROP_MODE_REPLACE, win->id, astate, - astate, 32, 2, data); + xcb_change_property(conn, XCB_PROP_MODE_REPLACE, win->id, a_state, + a_state, 32, 2, data); } uint16_t @@ -1943,7 +1942,7 @@ getstate(xcb_window_t w) xcb_get_property_cookie_t c; xcb_get_property_reply_t *r; - c = xcb_get_property(conn, False, w, astate, astate, 0L, 2L); + c = xcb_get_property(conn, False, w, a_state, a_state, 0L, 2L); r = xcb_get_property_reply(conn, c, NULL); if (r) { @@ -1981,7 +1980,7 @@ client_msg(struct ws_win *win, xcb_atom_t a) bzero(&ev, sizeof ev); ev.response_type = XCB_CLIENT_MESSAGE; ev.window = win->id; - ev.type = aprot; + ev.type = a_prot; ev.format = 32; ev.data.data32[0] = a; ev.data.data32[1] = XCB_CURRENT_TIME; @@ -2156,11 +2155,11 @@ fake_keypress(struct ws_win *win, xcb_keysym_t keysym, uint16_t modifiers) event.response_type = XCB_KEY_PRESS; xcb_send_event(conn, True, win->id, - XCB_EVENT_MASK_KEY_PRESS, (char *)&event); + XCB_EVENT_MASK_KEY_PRESS, (const char *)&event); event.response_type = XCB_KEY_RELEASE; xcb_send_event(conn, True, win->id, - XCB_EVENT_MASK_KEY_RELEASE, (char *)&event); + XCB_EVENT_MASK_KEY_RELEASE, (const char *)&event); } void @@ -2189,8 +2188,8 @@ restart(struct swm_region *r, union arg *args) struct swm_region * root_to_region(xcb_window_t root) { - struct swm_region *r = NULL; - int i, num_screens; + struct swm_region *r = NULL; + int i, num_screens; xcb_query_pointer_reply_t *qpr; DNPRINTF(SWM_D_MISC, "root_to_region: window: 0x%x\n", root); @@ -2241,7 +2240,6 @@ find_window(xcb_window_t id) { struct ws_win *win; int i, j, num_screens; - xcb_query_tree_cookie_t c; xcb_query_tree_reply_t *r; num_screens = xcb_setup_roots_length(xcb_get_setup(conn)); @@ -2251,8 +2249,7 @@ find_window(xcb_window_t id) if (id == win->id) return (win); - c = xcb_query_tree(conn, id); - r = xcb_query_tree_reply(conn, c, NULL); + r = xcb_query_tree_reply(conn, xcb_query_tree(conn, id), NULL); if (!r) return (NULL); @@ -2456,7 +2453,6 @@ void focus_win(struct ws_win *win) { struct ws_win *cfw = NULL; - xcb_get_input_focus_cookie_t c; xcb_get_input_focus_reply_t *r; xcb_window_t cur_focus = XCB_WINDOW_NONE; @@ -2480,8 +2476,7 @@ focus_win(struct ws_win *win) return; } - c = xcb_get_input_focus(conn); - r = xcb_get_input_focus_reply(conn, c, NULL); + r = xcb_get_input_focus_reply(conn, xcb_get_input_focus(conn), NULL); if (r) { cur_focus = r->focus; free(r); @@ -2520,6 +2515,20 @@ focus_win(struct ws_win *win) } void +event_drain(uint8_t rt) +{ + xcb_generic_event_t *evt; + + xcb_flush(conn); + while ((evt = xcb_poll_for_event(conn))) { + if (XCB_EVENT_RESPONSE_TYPE(evt) != rt) + event_handle(evt); + + free(evt); + } +} + +void switchws(struct swm_region *r, union arg *args) { int wsid = args->id, unmap_old = 0; @@ -2573,7 +2582,10 @@ switchws(struct swm_region *r, union arg *args) TAILQ_FOREACH(win, &old_ws->winlist, entry) unmap_window(win); - xcb_flush(conn); + if (focus_mode == SWM_FOCUS_DEFAULT) + event_drain(XCB_ENTER_NOTIFY); + else + xcb_flush(conn); } void @@ -2985,9 +2997,12 @@ cycle_layout(struct swm_region *r, union arg *args) ws->cur_layout = &layouts[0]; stack(); + bar_update(); - a.id = SWM_ARG_ID_FOCUSCUR; + if (focus_mode == SWM_FOCUS_DEFAULT) + event_drain(XCB_ENTER_NOTIFY); + a.id = SWM_ARG_ID_FOCUSCUR; focus(r, &a); } @@ -3045,6 +3060,9 @@ stack(void) { if (font_adjusted) font_adjusted--; + if (focus_mode == SWM_FOCUS_DEFAULT) + event_drain(XCB_ENTER_NOTIFY); + DNPRINTF(SWM_D_STACK, "stack: end\n"); } @@ -4052,7 +4070,7 @@ wkill(struct swm_region *r, union arg *args) xcb_kill_client(conn, r->ws->focus->id); else if (r->ws->focus->can_delete) - client_msg(r->ws->focus, adelete); + client_msg(r->ws->focus, a_delete); xcb_flush(conn); } @@ -4117,6 +4135,7 @@ floating_toggle(struct swm_region *r, union arg *args) } xcb_flush(conn); + event_drain(XCB_ENTER_NOTIFY); } void @@ -5097,7 +5116,7 @@ parsekeys(char *keystr, unsigned int currmod, unsigned int *mod, KeySym *ks) return (1); } cp = keystr; - *ks = NoSymbol; + *ks = XCB_NO_SYMBOL; *mod = 0; while ((name = strsep(&cp, SWM_KEY_WS)) != NULL) { DNPRINTF(SWM_D_KEY, "parsekeys: key [%s]\n", name); @@ -5120,7 +5139,7 @@ parsekeys(char *keystr, unsigned int currmod, unsigned int *mod, KeySym *ks) else { *ks = XStringToKeysym(name); XConvertCase(*ks, ks, &uks); - if (ks == NoSymbol) { + if (ks == XCB_NO_SYMBOL) { DNPRINTF(SWM_D_KEY, "parsekeys: invalid key %s\n", name); @@ -6399,9 +6418,9 @@ manage_window(xcb_window_t id) xcb_icccm_get_wm_protocols(conn, id, prot), &wpr, NULL)) { for (i = 0; i < wpr.atoms_len; i++) { - if (wpr.atoms[i] == takefocus) + if (wpr.atoms[i] == a_takefocus) win->take_focus = 1; - if (wpr.atoms[i] == adelete) + if (wpr.atoms[i] == a_delete) win->can_delete = 1; } xcb_icccm_get_wm_protocols_reply_wipe(&wpr); @@ -6635,25 +6654,26 @@ focus_magic(struct ws_win *win) if (win->java) { focus_win(win->child_trans); if (win->child_trans->take_focus) - client_msg(win, takefocus); + client_msg(win, a_takefocus); } else { /* make sure transient hasn't disappeared */ if (validate_win(win->child_trans) == 0) { focus_win(win->child_trans); if (win->child_trans->take_focus) - client_msg(win->child_trans, takefocus); + client_msg(win->child_trans, + a_takefocus); } else { win->child_trans = NULL; focus_win(win); if (win->take_focus) - client_msg(win, takefocus); + client_msg(win, a_takefocus); } } } else { /* regular focus */ focus_win(win); if (win->take_focus) - client_msg(win, takefocus); + client_msg(win, a_takefocus); } } @@ -7030,7 +7050,7 @@ clientmessage(xcb_client_message_event_t *e) if (e->type == ewmh[_NET_CLOSE_WINDOW].atom) { DNPRINTF(SWM_D_EVENT, "clientmessage: _NET_CLOSE_WINDOW\n"); if (win->can_delete) - client_msg(win, adelete); + client_msg(win, a_delete); else xcb_kill_client(conn, win->id); } @@ -7396,7 +7416,7 @@ setup_screens(void) screens[i].idx = i; TAILQ_INIT(&screens[i].rl); TAILQ_INIT(&screens[i].orl); - screens[i].root = RootWindow(display, i); + screens[i].root = get_screen(i)->root; /* set default colors */ setscreencolor("red", i + 1, SWM_S_COLOR_FOCUS); @@ -7453,6 +7473,19 @@ setup_globals(void) if ((clock_format = strdup("%a %b %d %R %Z %Y")) == NULL) err(1, "setup_globals: strdup: failed to allocate memory."); + + if ((syms = xcb_key_symbols_alloc(conn)) == NULL) + errx(1, "unable to allocate key symbols"); + + a_state = get_atom_from_string("WM_STATE"); + a_prot = get_atom_from_string("WM_PROTOCOLS"); + a_delete = get_atom_from_string("WM_DELETE_WINDOW"); + a_takefocus = get_atom_from_string("WM_TAKE_FOCUS"); + a_wmname = get_atom_from_string("WM_NAME"); + a_netwmname = get_atom_from_string("_NET_WM_NAME"); + a_utf8_string = get_atom_from_string("UTF8_STRING"); + a_string = get_atom_from_string("STRING"); + a_swm_iconic = get_atom_from_string("_SWM_ICONIC"); } void @@ -7596,19 +7629,6 @@ main(int argc, char *argv[]) errx(1, "can not get XCB connection"); xfd = xcb_get_file_descriptor(conn); - syms = xcb_key_symbols_alloc(conn); - if (!syms) - errx(1, "unable to allocate key symbols"); - - astate = get_atom_from_string("WM_STATE"); - aprot = get_atom_from_string("WM_PROTOCOLS"); - adelete = get_atom_from_string("WM_DELETE_WINDOW"); - takefocus = get_atom_from_string("WM_TAKE_FOCUS"); - a_wmname = get_atom_from_string("WM_NAME"); - a_netwmname = get_atom_from_string("_NET_WM_NAME"); - a_utf8_string = get_atom_from_string("UTF8_STRING"); - a_string = get_atom_from_string("STRING"); - a_swm_iconic = get_atom_from_string("_SWM_ICONIC"); /* look for local and global conf file */ pwd = getpwuid(getuid());