X-Git-Url: https://jasonwoof.com/gitweb/?a=blobdiff_plain;f=spectrwm.c;h=4831ac046aee2713b2c771b0eb22a900e9aad75c;hb=69f5175f3545d830ffbadf8c9a35c3e0811f16b4;hp=d7c161fb3a75c4d106625402db99a11326dad812;hpb=dff26b17f5f5dd919e5bc528ae06f16c9678c4c9;p=spectrwm.git diff --git a/spectrwm.c b/spectrwm.c index d7c161f..4831ac0 100644 --- a/spectrwm.c +++ b/spectrwm.c @@ -97,6 +97,7 @@ #include #include #include +#include #include #include #include @@ -155,8 +156,16 @@ static const char *buildstr = SPECTRWM_VERSION; #define SWM_DEBUG #ifdef SWM_DEBUG -#define DPRINTF(x...) do { if (swm_debug) fprintf(stderr, x); } while (0) -#define DNPRINTF(n,x...) do { if (swm_debug & n) fprintf(stderr, x); } while (0) +#define DPRINTF(x...) do { \ + if (swm_debug) \ + fprintf(stderr, x); \ +} while (0) +#define DNPRINTF(n,x...) do { \ + if (swm_debug & n) { \ + fprintf(stderr, "%ld ", (long)(time(NULL) - time_started)); \ + fprintf(stderr, x); \ + } \ +} while (0) #define SWM_D_MISC 0x0001 #define SWM_D_EVENT 0x0002 #define SWM_D_WS 0x0004 @@ -248,7 +257,7 @@ xcb_atom_t a_swm_iconic; volatile sig_atomic_t running = 1; volatile sig_atomic_t restart_wm = 0; int outputs = 0; -int last_focus_event = FocusOut; +/*int last_focus_event = FocusOut;*/ int (*xerrorxlib)(Display *, XErrorEvent *); int other_wm; int ss_enabled = 0; @@ -342,6 +351,7 @@ int spawn_position = SWM_STACK_TOP; int disable_border = 0; int border_width = 1; int verbose_layout = 0; +time_t time_started; pid_t bar_pid; XFontSet bar_fs; XFontSetExtents *bar_fs_extents; @@ -415,7 +425,7 @@ TAILQ_HEAD(ws_win_list, ws_win); /* pid goo */ struct pid_e { TAILQ_ENTRY(pid_e) entry; - long pid; + pid_t pid; int ws; }; TAILQ_HEAD(pid_list, pid_e); @@ -653,11 +663,11 @@ void update_window(struct ws_win *); void spawn_select(struct swm_region *, union arg *, char *, int *); char *get_win_name(xcb_window_t); xcb_atom_t get_atom_from_string(const char *); -void map_window_raised(xcb_window_t); -void do_sync(void); +void map_window_raised(xcb_window_t); +void do_sync(void); xcb_screen_t *get_screen(int); -int parse_rgb(const char *, uint16_t *, uint16_t *, uint16_t *); -void event_handle(xcb_generic_event_t *); +int parse_rgb(const char *, uint16_t *, uint16_t *, uint16_t *); +void event_handle(xcb_generic_event_t *); int parse_rgb(const char *rgb, uint16_t *rr, uint16_t *gg, uint16_t *bb) @@ -707,10 +717,9 @@ map_window_raised(xcb_window_t win) uint32_t val = XCB_STACK_MODE_ABOVE; xcb_configure_window(conn, win, - XCB_CONFIG_WINDOW_STACK_MODE, &val); + XCB_CONFIG_WINDOW_STACK_MODE, &val); xcb_map_window(conn, win); - xcb_flush(conn); } xcb_atom_t @@ -746,7 +755,7 @@ update_iconic(struct ws_win *win, int newv) if (newv) xcb_change_property(conn, XCB_PROP_MODE_REPLACE, win->id, - iprop, XCB_ATOM_INTEGER, 32, 1, &v); + iprop, XCB_ATOM_INTEGER, 32, 1, &v); else xcb_delete_property(conn, win->id, iprop); } @@ -763,9 +772,8 @@ get_iconic(struct ws_win *win) goto out; pr = xcb_get_property_reply(conn, - xcb_get_property(conn, False, win->id, iprop, XCB_ATOM_INTEGER, - 0, 1), - NULL); + xcb_get_property(conn, False, win->id, iprop, XCB_ATOM_INTEGER, + 0, 1), NULL); if (!pr) goto out; if (pr->type != XCB_ATOM_INTEGER || pr->format != 32) @@ -796,8 +804,8 @@ setup_ewmh(void) xcb_delete_property(conn, screens[i].root, sup_list); for (j = 0; j < LENGTH(ewmh); j++) xcb_change_property(conn, XCB_PROP_MODE_APPEND, - screens[i].root, sup_list, XCB_ATOM_ATOM, 32, 1, - &ewmh[j].atom); + screens[i].root, sup_list, XCB_ATOM_ATOM, 32, 1, + &ewmh[j].atom); } } @@ -817,7 +825,7 @@ teardown_ewmh(void) for (i = 0; i < num_screens; i++) { /* Get the support check window and destroy it */ pc = xcb_get_property(conn, False, screens[i].root, sup_check, - XCB_ATOM_WINDOW, 0, 1); + XCB_ATOM_WINDOW, 0, 1); pr = xcb_get_property_reply(conn, pc, NULL); if (pr) { id = *((xcb_window_t *)xcb_get_property_value(pr)); @@ -834,33 +842,33 @@ teardown_ewmh(void) void ewmh_autoquirk(struct ws_win *win) { - int i; - unsigned long n; - xcb_atom_t type; + uint32_t i, n; + xcb_atom_t *type; xcb_get_property_cookie_t c; xcb_get_property_reply_t *r; c = xcb_get_property(conn, False, win->id, - ewmh[_NET_WM_WINDOW_TYPE].atom, XCB_ATOM_ATOM, 0, (~0L)); + ewmh[_NET_WM_WINDOW_TYPE].atom, XCB_ATOM_ATOM, 0, UINT32_MAX); r = xcb_get_property_reply(conn, c, NULL); if (!r) return; - n = xcb_get_property_value_length(r); + n = xcb_get_property_value_length(r); + type = xcb_get_property_value(r); + for (i = 0; i < n; i++) { - type = *((xcb_atom_t *)xcb_get_property_value(r)); - if (type == ewmh[_NET_WM_WINDOW_TYPE_NORMAL].atom) + if (type[i] == ewmh[_NET_WM_WINDOW_TYPE_NORMAL].atom) break; - if (type == ewmh[_NET_WM_WINDOW_TYPE_DOCK].atom || - type == ewmh[_NET_WM_WINDOW_TYPE_TOOLBAR].atom || - type == ewmh[_NET_WM_WINDOW_TYPE_UTILITY].atom) { + if (type[i] == ewmh[_NET_WM_WINDOW_TYPE_DOCK].atom || + type[i] == ewmh[_NET_WM_WINDOW_TYPE_TOOLBAR].atom || + type[i] == ewmh[_NET_WM_WINDOW_TYPE_UTILITY].atom) { win->floating = 1; win->quirks = SWM_Q_FLOAT | SWM_Q_ANYWHERE; break; } - if (type == ewmh[_NET_WM_WINDOW_TYPE_SPLASH].atom || - type == ewmh[_NET_WM_WINDOW_TYPE_DIALOG].atom) { + if (type[i] == ewmh[_NET_WM_WINDOW_TYPE_SPLASH].atom || + type[i] == ewmh[_NET_WM_WINDOW_TYPE_DIALOG].atom) { win->floating = 1; win->quirks = SWM_Q_FLOAT; break; @@ -924,8 +932,7 @@ ewmh_update_actions(struct ws_win *win) } xcb_change_property(conn, XCB_PROP_MODE_REPLACE, win->id, - ewmh[_NET_WM_ALLOWED_ACTIONS].atom, XCB_ATOM_ATOM, 32, 1, - actions); + ewmh[_NET_WM_ALLOWED_ACTIONS].atom, XCB_ATOM_ATOM, 32, 1, actions); } #define _NET_WM_STATE_REMOVE 0 /* remove/unset property */ @@ -987,24 +994,24 @@ ewmh_update_win_state(struct ws_win *win, long state, long action) if (win->ewmh_flags & EWMH_F_FULLSCREEN) xcb_change_property(conn, XCB_PROP_MODE_APPEND, win->id, - ewmh[_NET_WM_STATE].atom, XCB_ATOM_ATOM, 32, 1, - &ewmh[_NET_WM_STATE_FULLSCREEN].atom); + ewmh[_NET_WM_STATE].atom, XCB_ATOM_ATOM, 32, 1, + &ewmh[_NET_WM_STATE_FULLSCREEN].atom); if (win->ewmh_flags & EWMH_F_SKIP_PAGER) xcb_change_property(conn, XCB_PROP_MODE_APPEND, win->id, - ewmh[_NET_WM_STATE].atom, XCB_ATOM_ATOM, 32, 1, - &ewmh[_NET_WM_STATE_SKIP_PAGER].atom); + ewmh[_NET_WM_STATE].atom, XCB_ATOM_ATOM, 32, 1, + &ewmh[_NET_WM_STATE_SKIP_PAGER].atom); if (win->ewmh_flags & EWMH_F_SKIP_TASKBAR) xcb_change_property(conn, XCB_PROP_MODE_APPEND, win->id, - ewmh[_NET_WM_STATE].atom, XCB_ATOM_ATOM, 32, 1, - &ewmh[_NET_WM_STATE_SKIP_TASKBAR].atom); + ewmh[_NET_WM_STATE].atom, XCB_ATOM_ATOM, 32, 1, + &ewmh[_NET_WM_STATE_SKIP_TASKBAR].atom); if (win->ewmh_flags & EWMH_F_ABOVE) xcb_change_property(conn, XCB_PROP_MODE_APPEND, win->id, - ewmh[_NET_WM_STATE].atom, XCB_ATOM_ATOM, 32, 1, - &ewmh[_NET_WM_STATE_ABOVE].atom); + ewmh[_NET_WM_STATE].atom, XCB_ATOM_ATOM, 32, 1, + &ewmh[_NET_WM_STATE_ABOVE].atom); if (win->ewmh_flags & SWM_F_MANUAL) xcb_change_property(conn, XCB_PROP_MODE_APPEND, win->id, - ewmh[_NET_WM_STATE].atom, XCB_ATOM_ATOM, 32, 1, - &ewmh[_SWM_WM_STATE_MANUAL].atom); + ewmh[_NET_WM_STATE].atom, XCB_ATOM_ATOM, 32, 1, + &ewmh[_SWM_WM_STATE_MANUAL].atom); } void @@ -1025,7 +1032,7 @@ ewmh_get_win_state(struct ws_win *win) win->ewmh_flags |= SWM_F_MANUAL; c = xcb_get_property(conn, False, win->id, ewmh[_NET_WM_STATE].atom, - XCB_ATOM_ATOM, 0, (~0L)); + XCB_ATOM_ATOM, 0, UINT32_MAX); r = xcb_get_property_reply(conn, c, NULL); if (!r) return; @@ -1041,118 +1048,6 @@ ewmh_get_win_state(struct ws_win *win) /* events */ #ifdef SWM_DEBUG -char * -geteventname(xcb_generic_event_t *e) -{ - char *name = NULL; - - switch (XCB_EVENT_RESPONSE_TYPE(e)) { - case XCB_KEY_PRESS: - name = "KeyPress"; - break; - case XCB_KEY_RELEASE: - name = "KeyRelease"; - break; - case XCB_BUTTON_PRESS: - name = "ButtonPress"; - break; - case XCB_BUTTON_RELEASE: - name = "ButtonRelease"; - break; - case XCB_MOTION_NOTIFY: - name = "MotionNotify"; - break; - case XCB_ENTER_NOTIFY: - name = "EnterNotify"; - break; - case XCB_LEAVE_NOTIFY: - name = "LeaveNotify"; - break; - case XCB_FOCUS_IN: - name = "FocusIn"; - break; - case XCB_FOCUS_OUT: - name = "FocusOut"; - break; - case XCB_KEYMAP_NOTIFY: - name = "KeymapNotify"; - break; - case XCB_EXPOSE: - name = "Expose"; - break; - case XCB_GRAPHICS_EXPOSURE: - name = "GraphicsExposure"; - break; - case XCB_NO_EXPOSURE: - name = "NoExposure"; - break; - case XCB_VISIBILITY_NOTIFY: - name = "VisibilityNotify"; - break; - case XCB_CREATE_NOTIFY: - name = "CreateNotify"; - break; - case XCB_DESTROY_NOTIFY: - name = "DestroyNotify"; - break; - case XCB_UNMAP_NOTIFY: - name = "UnmapNotify"; - break; - case XCB_MAP_NOTIFY: - name = "MapNotify"; - break; - case XCB_MAP_REQUEST: - name = "MapRequest"; - break; - case XCB_REPARENT_NOTIFY: - name = "ReparentNotify"; - break; - case XCB_CONFIGURE_NOTIFY: - name = "ConfigureNotify"; - break; - case XCB_CONFIGURE_REQUEST: - name = "ConfigureRequest"; - break; - case XCB_GRAVITY_NOTIFY: - name = "GravityNotify"; - break; - case XCB_RESIZE_REQUEST: - name = "ResizeRequest"; - break; - case XCB_CIRCULATE_NOTIFY: - name = "CirculateNotify"; - break; - case XCB_CIRCULATE_REQUEST: - name = "CirculateRequest"; - break; - case XCB_PROPERTY_NOTIFY: - name = "PropertyNotify"; - break; - case XCB_SELECTION_CLEAR: - name = "SelectionClear"; - break; - case XCB_SELECTION_REQUEST: - name = "SelectionRequest"; - break; - case XCB_SELECTION_NOTIFY: - name = "SelectionNotify"; - break; - case XCB_COLORMAP_NOTIFY: - name = "ColormapNotify"; - break; - case XCB_CLIENT_MESSAGE: - name = "ClientMessage"; - break; - case XCB_MAPPING_NOTIFY: - name = "MappingNotify"; - break; - default: - name = "Unknown"; - } - - return (name); -} - void dumpwins(struct swm_region *r, union arg *args) { @@ -1173,8 +1068,8 @@ dumpwins(struct swm_region *r, union arg *args) wa = xcb_get_window_attributes_reply(conn, c, NULL); if (wa) { warnx("window: 0x%x, map_state: %d, state: %u, " - "transient: 0x%x", win->id, wa->map_state, - state, win->transient); + "transient: 0x%x", win->id, wa->map_state, + state, win->transient); free(wa); } else warnx("window: 0x%x, failed xcb_get_window_attributes", @@ -1188,8 +1083,8 @@ dumpwins(struct swm_region *r, union arg *args) wa = xcb_get_window_attributes_reply(conn, c, NULL); if (wa) { warnx("window: 0x%x, map_state: %d, state: %u, " - "transient: 0x%x", win->id, wa->map_state, - state, win->transient); + "transient: 0x%x", win->id, wa->map_state, + state, win->transient); free(wa); } else warnx("window: 0x%x, failed xcb_get_window_attributes", @@ -1205,6 +1100,7 @@ dumpwins(struct swm_region *r, union arg *args) } #endif /* SWM_DEBUG */ +void event_error(xcb_generic_error_t *); void expose(xcb_expose_event_t *); void keypress(xcb_key_press_event_t *); void buttonpress(xcb_button_press_event_t *); @@ -1217,7 +1113,7 @@ void mappingnotify(xcb_mapping_notify_event_t *); void maprequest(xcb_map_request_event_t *); void propertynotify(xcb_property_notify_event_t *); void unmapnotify(xcb_unmap_notify_event_t *); -void visibilitynotify(xcb_visibility_notify_event_t *); +/*void visibilitynotify(xcb_visibility_notify_event_t *);*/ void clientmessage(xcb_client_message_event_t *); void screenchange(xcb_randr_screen_change_notify_event_t *); @@ -1270,11 +1166,11 @@ sighdlr(int sig) } struct pid_e * -find_pid(long pid) +find_pid(pid_t pid) { struct pid_e *p = NULL; - DNPRINTF(SWM_D_MISC, "find_pid: %lu\n", pid); + DNPRINTF(SWM_D_MISC, "find_pid: %d\n", pid); if (pid == 0) return (NULL); @@ -1307,8 +1203,8 @@ name_to_color(const char *colorname) warnx("could not parse rgb %s", colorname); else { cr = xcb_alloc_color_reply(conn, - xcb_alloc_color(conn, cmap, rr, gg, bb), - NULL); + xcb_alloc_color(conn, cmap, rr, gg, bb), + NULL); if (cr) { result = cr->pixel; free(cr); @@ -1318,14 +1214,12 @@ name_to_color(const char *colorname) } else { nr = xcb_alloc_named_color_reply(conn, xcb_alloc_named_color(conn, cmap, strlen(colorname), - colorname), - NULL); + colorname), NULL); if (!nr) { strlcat(cname, colorname + 2, sizeof cname - 1); nr = xcb_alloc_named_color_reply(conn, - xcb_alloc_named_color(conn, cmap, strlen(cname), - cname), - NULL); + xcb_alloc_named_color(conn, cmap, strlen(cname), + cname), NULL); } if (nr) { result = nr->pixel; @@ -1467,7 +1361,7 @@ bar_print(struct swm_region *r, const char *s) gcv[0] = r->s->c[SWM_S_COLOR_BAR].color; xcb_change_gc(conn, r->s->bar_gc, XCB_GC_FOREGROUND, gcv); xcb_poly_fill_rectangle(conn, r->bar->buffer, r->s->bar_gc, - sizeof(rect), &rect); + sizeof(rect), &rect); /* draw back buffer */ gcv[0] = r->s->c[SWM_S_COLOR_BAR].color; @@ -1475,12 +1369,12 @@ bar_print(struct swm_region *r, const char *s) gcv[0] = r->s->c[SWM_S_COLOR_BAR_FONT].color; xcb_change_gc(conn, r->s->bar_gc, XCB_GC_FOREGROUND, gcv); xcb_image_text_8(conn, len, r->bar->buffer, r->s->bar_gc, x, - (bar_fs_extents->max_logical_extent.height - lbox.height) / 2 - - lbox.y, s); + (bar_fs_extents->max_logical_extent.height - lbox.height) / 2 - + lbox.y, s); /* blt */ xcb_copy_area(conn, r->bar->buffer, r->bar->id, r->s->bar_gc, 0, 0, - 0, 0, WIDTH(r->bar), HEIGHT(r->bar)); + 0, 0, WIDTH(r->bar), HEIGHT(r->bar)); } void @@ -1569,7 +1463,7 @@ bar_urgent(char *s, size_t sz) TAILQ_FOREACH(win, &screens[i].ws[j].winlist, entry) { c = xcb_icccm_get_wm_hints(conn, win->id); if (xcb_icccm_get_wm_hints_reply(conn, c, - &hints, NULL) == 0) + &hints, NULL) == 0) continue; if (hints.flags & XCB_ICCCM_WM_HINT_X_URGENCY) urgent[j] = 1; @@ -1882,6 +1776,8 @@ bar_toggle(struct swm_region *r, union arg *args) stack(); /* must be after stack */ bar_update(); + + xcb_flush(conn); } void @@ -1928,7 +1824,7 @@ bar_refresh(void) wa[0] = screens[i].c[SWM_S_COLOR_BAR].color; wa[1] = screens[i].c[SWM_S_COLOR_BAR_BORDER].color; xcb_change_window_attributes(conn, r->bar->id, - XCB_CW_BACK_PIXEL | XCB_CW_BORDER_PIXEL, wa); + XCB_CW_BACK_PIXEL | XCB_CW_BORDER_PIXEL, wa); } bar_update(); } @@ -1941,7 +1837,7 @@ bar_setup(struct swm_region *r) int num_missing_charsets = 0; int i; xcb_screen_t *screen = get_screen(r->s->idx); - uint32_t wa[2]; + uint32_t wa[3]; if (bar_fs) { XFreeFontSet(display, bar_fs); @@ -1990,17 +1886,19 @@ bar_setup(struct swm_region *r) r->bar->id = xcb_generate_id(conn); wa[0] = r->s->c[SWM_S_COLOR_BAR].color; wa[1] = r->s->c[SWM_S_COLOR_BAR_BORDER].color; + wa[2] = XCB_EVENT_MASK_EXPOSURE; xcb_create_window(conn, XCB_COPY_FROM_PARENT, r->bar->id, r->s->root, X(r->bar), Y(r->bar), WIDTH(r->bar), HEIGHT(r->bar), bar_border_width, XCB_WINDOW_CLASS_INPUT_OUTPUT, - XCB_COPY_FROM_PARENT, XCB_CW_BACK_PIXEL | XCB_CW_BORDER_PIXEL, wa); + XCB_COPY_FROM_PARENT, XCB_CW_BACK_PIXEL | XCB_CW_BORDER_PIXEL + | XCB_CW_EVENT_MASK, wa); r->bar->buffer = xcb_generate_id(conn); xcb_create_pixmap(conn, screen->root_depth, r->bar->buffer, r->bar->id, - WIDTH(r->bar), HEIGHT(r->bar)); + WIDTH(r->bar), HEIGHT(r->bar)); xcb_randr_select_input(conn, r->bar->id, - XCB_RANDR_NOTIFY_MASK_OUTPUT_CHANGE); + XCB_RANDR_NOTIFY_MASK_OUTPUT_CHANGE); if (bar_enabled) map_window_raised(r->bar->id); @@ -2036,7 +1934,7 @@ set_win_state(struct ws_win *win, uint16_t state) return; xcb_change_property(conn, XCB_PROP_MODE_REPLACE, win->id, astate, - astate, 32, 2, data); + astate, 32, 2, data); } uint16_t @@ -2055,7 +1953,7 @@ getstate(xcb_window_t w) } DNPRINTF(SWM_D_MISC, "getstate property: win 0x%x state %u\n", w, -result); + result); return (result); } @@ -2069,6 +1967,8 @@ version(struct swm_region *r, union arg *args) else strlcpy(bar_vertext, "", sizeof bar_vertext); bar_update(); + + xcb_flush(conn); } void @@ -2088,8 +1988,7 @@ client_msg(struct ws_win *win, xcb_atom_t a) ev.data.data32[1] = XCB_CURRENT_TIME; xcb_send_event(conn, False, win->id, - XCB_EVENT_MASK_NO_EVENT, (const char *)&ev); - xcb_flush(conn); + XCB_EVENT_MASK_NO_EVENT, (const char *)&ev); } /* synthetic response to a ConfigureRequest when not making a change */ @@ -2170,7 +2069,6 @@ config_win(struct ws_win *win, xcb_configure_request_event_t *ev) xcb_send_event(conn, False, win->id, XCB_EVENT_MASK_STRUCTURE_NOTIFY, (char *)&ce); - xcb_flush(conn); } int @@ -2214,7 +2112,7 @@ unmap_window(struct ws_win *win) xcb_unmap_window(conn, win->id); xcb_change_window_attributes(conn, win->id, - XCB_CW_BORDER_PIXEL, &win->s->c[SWM_S_COLOR_UNFOCUS].color); + XCB_CW_BORDER_PIXEL, &win->s->c[SWM_S_COLOR_UNFOCUS].color); } void @@ -2241,6 +2139,10 @@ fake_keypress(struct ws_win *win, xcb_keysym_t keysym, uint16_t modifiers) keycode = xcb_key_symbols_get_keycode(syms, keysym); + DNPRINTF(SWM_D_MISC, "fake_keypress: win 0x%x keycode %u\n", + win->id, *keycode); + + bzero(&event, sizeof(event)); event.event = win->id; event.root = win->s->root; event.child = XCB_WINDOW_NONE; @@ -2255,12 +2157,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, (char *)&event); event.response_type = XCB_KEY_RELEASE; xcb_send_event(conn, True, win->id, - XCB_EVENT_MASK_KEY_RELEASE, (char *)&event); - xcb_flush(conn); + XCB_EVENT_MASK_KEY_RELEASE, (char *)&event); } void @@ -2301,7 +2202,7 @@ root_to_region(xcb_window_t root) break; qpr = xcb_query_pointer_reply(conn, xcb_query_pointer(conn, - screens[i].root), NULL); + screens[i].root), NULL); if (qpr) { DNPRINTF(SWM_D_MISC, "root_to_region: pointer: (%d,%d)\n", @@ -2532,10 +2433,9 @@ unfocus_win(struct ws_win *win) grabbuttons(win, 0); xcb_change_window_attributes(conn, win->id, XCB_CW_BORDER_PIXEL, - &win->ws->r->s->c[SWM_S_COLOR_UNFOCUS].color); + &win->ws->r->s->c[SWM_S_COLOR_UNFOCUS].color); xcb_change_property(conn, XCB_PROP_MODE_REPLACE, win->s->root, - ewmh[_NET_ACTIVE_WINDOW].atom, XCB_ATOM_WINDOW, 32, 1, - &none); + ewmh[_NET_ACTIVE_WINDOW].atom, XCB_ATOM_WINDOW, 32, 1, &none); } void @@ -2591,11 +2491,11 @@ focus_win(struct ws_win *win) unfocus_win(cfw); else { /* use larger hammer since the window was killed somehow */ - TAILQ_FOREACH(cfw, &win->ws->winlist, entry) + /* TAILQ_FOREACH(cfw, &win->ws->winlist, entry) if (cfw->ws && cfw->ws->r && cfw->ws->r->s) xcb_change_window_attributes(conn, cfw->id, - XCB_CW_BORDER_PIXEL, - &cfw->ws->r->s->c[SWM_S_COLOR_UNFOCUS].color); + XCB_CW_BORDER_PIXEL, + &cfw->ws->r->s->c[SWM_S_COLOR_UNFOCUS].color);*/ } win->ws->focus = win; @@ -2603,7 +2503,7 @@ focus_win(struct ws_win *win) if (win->ws->r != NULL) { if (win->java == 0) xcb_set_input_focus(conn, XCB_INPUT_FOCUS_PARENT, - win->id, XCB_CURRENT_TIME); + win->id, XCB_CURRENT_TIME); grabbuttons(win, 1); xcb_change_window_attributes(conn, win->id, XCB_CW_BORDER_PIXEL, @@ -2613,8 +2513,8 @@ focus_win(struct ws_win *win) map_window_raised(win->id); xcb_change_property(conn, XCB_PROP_MODE_REPLACE, win->s->root, - ewmh[_NET_ACTIVE_WINDOW].atom, XCB_ATOM_WINDOW, 32, 1, - &win->id); + ewmh[_NET_ACTIVE_WINDOW].atom, XCB_ATOM_WINDOW, 32, 1, + &win->id); } bar_update(); @@ -2673,6 +2573,8 @@ switchws(struct swm_region *r, union arg *args) if (unmap_old) TAILQ_FOREACH(win, &old_ws->winlist, entry) unmap_window(win); + + xcb_flush(conn); } void @@ -2769,7 +2671,7 @@ cyclescr(struct swm_region *r, union arg *args) x = X(rr) + 1; y = Y(rr) + 1 + (bar_enabled ? bar_height : 0); xcb_warp_pointer(conn, XCB_WINDOW_NONE, rr->s[i].root, 0, 0, 0, 0, - x, y); + x, y); a.id = SWM_ARG_ID_FOCUSCUR; focus(rr, &a); @@ -2779,7 +2681,7 @@ cyclescr(struct swm_region *r, union arg *args) x = X(rr->ws->focus) + 1; y = Y(rr->ws->focus) + 1; xcb_warp_pointer(conn, XCB_WINDOW_NONE, rr->s[i].root, 0, 0, 0, - 0, x, y); + 0, x, y); } } @@ -2877,6 +2779,8 @@ swapwin(struct swm_region *r, union arg *args) sort_windows(wl); stack(); + + xcb_flush(conn); } void @@ -3065,6 +2969,8 @@ focus(struct swm_region *r, union arg *args) } focus_magic(winfocus); + + xcb_flush(conn); } void @@ -3688,19 +3594,23 @@ send_to_ws(struct swm_region *r, union arg *args) DNPRINTF(SWM_D_PROP, "send_to_ws: set property: _SWM_WS: %s\n", ws_idx_str); xcb_change_property(conn, XCB_PROP_MODE_REPLACE, win->id, - ws_idx_atom, XCB_ATOM_STRING, 8, strlen(ws_idx_str), - ws_idx_str); + ws_idx_atom, XCB_ATOM_STRING, 8, strlen(ws_idx_str), + ws_idx_str); } stack(); bar_update(); + + xcb_flush(conn); } void pressbutton(struct swm_region *r, union arg *args) { - XTestFakeButtonEvent(display, args->id, True, CurrentTime); - XTestFakeButtonEvent(display, args->id, False, CurrentTime); + xcb_test_fake_input(conn, XCB_BUTTON_PRESS, args->id, + XCB_CURRENT_TIME, XCB_WINDOW_NONE, 0, 0, 0); + xcb_test_fake_input(conn, XCB_BUTTON_RELEASE, args->id, + XCB_CURRENT_TIME, XCB_WINDOW_NONE, 0, 0, 0); } void @@ -3714,6 +3624,8 @@ raise_toggle(struct swm_region *r, union arg *args) /* bring floaters back to top */ if (r->ws->always_raise == 0) stack(); + + xcb_flush(conn); } void @@ -3730,6 +3642,8 @@ iconify(struct swm_region *r, union arg *args) r->ws->focus = NULL; a.id = SWM_ARG_ID_FOCUSCUR; focus(r, &a); + + xcb_flush(conn); } char * @@ -3802,6 +3716,7 @@ uniconify(struct swm_region *r, union arg *args) } fclose(lfile); + xcb_flush(conn); } void @@ -3944,6 +3859,8 @@ search_win(struct swm_region *r, union arg *args) } fclose(lfile); + + xcb_flush(conn); } void @@ -4136,6 +4053,8 @@ wkill(struct swm_region *r, union arg *args) else if (r->ws->focus->can_delete) client_msg(r->ws->focus, adelete); + + xcb_flush(conn); } @@ -4196,6 +4115,8 @@ floating_toggle(struct swm_region *r, union arg *args) a.id = SWM_ARG_ID_FOCUSCUR; focus(win->ws->r, &a); } + + xcb_flush(conn); } void @@ -4264,15 +4185,16 @@ update_window(struct ws_win *win) void resize(struct ws_win *win, union arg *args) { - xcb_timestamp_t time = 0; + xcb_timestamp_t timestamp = 0; struct swm_region *r = NULL; int resize_step = 0; struct swm_geometry g; - int top = 0, left = 0, buttonrelease; + int top = 0, left = 0, resizing; int dx, dy; unsigned int shape; /* cursor style */ xcb_cursor_t cursor; xcb_font_t cursor_font; + xcb_grab_pointer_cookie_t gpc; xcb_grab_pointer_reply_t *gpr; xcb_query_pointer_reply_t *xpr; xcb_generic_event_t *evt; @@ -4285,7 +4207,7 @@ resize(struct ws_win *win, union arg *args) if (win->ewmh_flags & EWMH_F_FULLSCREEN) return; - DNPRINTF(SWM_D_MOUSE, "resize: window: 0x%x, floating: %s, " + DNPRINTF(SWM_D_EVENT, "resize: window: 0x%x, floating: %s, " "transient: 0x%x\n", win->id, YESNO(win->floating), win->transient); @@ -4331,7 +4253,7 @@ resize(struct ws_win *win, union arg *args) /* get cursor offset from window root */ xpr = xcb_query_pointer_reply(conn, xcb_query_pointer(conn, win->id), - NULL); + NULL); if (!xpr) return; @@ -4355,13 +4277,12 @@ resize(struct ws_win *win, union arg *args) cursor = xcb_generate_id(conn); xcb_create_glyph_cursor(conn, cursor, cursor_font, cursor_font, - shape, shape + 1, 0, 0, 0, 0xffff, 0xffff, 0xffff); + shape, shape + 1, 0, 0, 0, 0xffff, 0xffff, 0xffff); - gpr = xcb_grab_pointer_reply(conn, - xcb_grab_pointer(conn, False, win->id, MOUSEMASK, - XCB_GRAB_MODE_ASYNC, XCB_GRAB_MODE_ASYNC, XCB_WINDOW_NONE, - cursor, XCB_CURRENT_TIME), - NULL); + gpc = xcb_grab_pointer(conn, False, win->id, MOUSEMASK, + XCB_GRAB_MODE_ASYNC, XCB_GRAB_MODE_ASYNC, XCB_WINDOW_NONE, cursor, + XCB_CURRENT_TIME), + gpr = xcb_grab_pointer_reply(conn, gpc, NULL); if (!gpr) { xcb_free_cursor(conn, cursor); xcb_close_font(conn, cursor_font); @@ -4369,15 +4290,17 @@ resize(struct ws_win *win, union arg *args) return; } - buttonrelease = 0; - while ((evt = xcb_poll_for_event(conn)) && buttonrelease != 1) { + xcb_flush(conn); + resizing = 1; + while ((evt = xcb_wait_for_event(conn)) && resizing) { /* XMaskEvent(display, MOUSEMASK | ExposureMask | SubstructureRedirectMask, &ev); */ switch (XCB_EVENT_RESPONSE_TYPE(evt)) { case XCB_BUTTON_RELEASE: - buttonrelease = 1; + DNPRINTF(SWM_D_EVENT, "resize: BUTTON_RELEASE\n"); + resizing = 0; break; case XCB_MOTION_NOTIFY: mne = (xcb_motion_notify_event_t *)evt; @@ -4428,8 +4351,8 @@ resize(struct ws_win *win, union arg *args) constrain_window(win, r, 1); /* not free, don't sync more than 120 times / second */ - if ((mne->time - time) > (1000 / 120) ) { - time = mne->time; + if ((mne->time - timestamp) > (1000 / 120) ) { + timestamp = mne->time; do_sync(); update_window(win); } @@ -4440,7 +4363,7 @@ resize(struct ws_win *win, union arg *args) } free(evt); } - if (time) { + if (timestamp) { do_sync(); update_window(win); } @@ -4451,6 +4374,7 @@ resize(struct ws_win *win, union arg *args) xcb_close_font(conn, cursor_font); free(gpr); free(xpr); + DNPRINTF(SWM_D_EVENT, "resize: done\n"); } void @@ -4471,11 +4395,12 @@ resize_step(struct swm_region *r, union arg *args) void move(struct ws_win *win, union arg *args) { - xcb_timestamp_t time = 0; - int move_step = 0, buttonrelease; + xcb_timestamp_t timestamp = 0; + int move_step = 0, moving; struct swm_region *r = NULL; xcb_font_t cursor_font; xcb_cursor_t cursor; + xcb_grab_pointer_cookie_t gpc; xcb_grab_pointer_reply_t *gpr; xcb_query_pointer_reply_t *qpr; xcb_generic_event_t *evt; @@ -4488,7 +4413,7 @@ move(struct ws_win *win, union arg *args) if (win->ewmh_flags & EWMH_F_FULLSCREEN) return; - DNPRINTF(SWM_D_MOUSE, "move: window: 0x%x, floating: %s, transient: " + DNPRINTF(SWM_D_EVENT, "move: window: 0x%x, floating: %s, transient: " "0x%x\n", win->id, YESNO(win->floating), win->transient); /* in max_stack mode should only move transients */ @@ -4541,11 +4466,10 @@ move(struct ws_win *win, union arg *args) xcb_create_glyph_cursor(conn, cursor, cursor_font, cursor_font, XC_fleur, XC_fleur + 1, 0, 0, 0, 0xffff, 0xffff, 0xffff); - gpr = xcb_grab_pointer_reply(conn, - xcb_grab_pointer(conn, False, win->id, MOUSEMASK, - XCB_GRAB_MODE_ASYNC, XCB_GRAB_MODE_ASYNC, - XCB_WINDOW_NONE, cursor, XCB_CURRENT_TIME), - NULL); + gpc = xcb_grab_pointer(conn, False, win->id, MOUSEMASK, + XCB_GRAB_MODE_ASYNC, XCB_GRAB_MODE_ASYNC, + XCB_WINDOW_NONE, cursor, XCB_CURRENT_TIME); + gpr = xcb_grab_pointer_reply(conn, gpc, NULL); if (!gpr) { xcb_free_cursor(conn, cursor); xcb_close_font(conn, cursor_font); @@ -4562,15 +4486,13 @@ move(struct ws_win *win, union arg *args) return; } - buttonrelease = 0; - while ((evt = xcb_poll_for_event(conn)) && buttonrelease != 1) { - /* - XMaskEvent(display, MOUSEMASK | ExposureMask | - SubstructureRedirectMask, &ev); - */ + xcb_flush(conn); + moving = 1; + while ((evt = xcb_wait_for_event(conn)) && moving) { switch (XCB_EVENT_RESPONSE_TYPE(evt)) { case XCB_BUTTON_RELEASE: - buttonrelease = 1; + DNPRINTF(SWM_D_EVENT, "move: BUTTON_RELEASE\n"); + moving = 0; break; case XCB_MOTION_NOTIFY: mne = (xcb_motion_notify_event_t *)evt; @@ -4580,8 +4502,8 @@ move(struct ws_win *win, union arg *args) constrain_window(win, r, 0); /* not free, don't sync more than 120 times / second */ - if ((mne->time - time) > (1000 / 120) ) { - time = mne->time; + if ((mne->time - timestamp) > (1000 / 120) ) { + timestamp = mne->time; do_sync(); update_window(win); } @@ -4592,7 +4514,7 @@ move(struct ws_win *win, union arg *args) } free(evt); } - if (time) { + if (timestamp) { do_sync(); update_window(win); } @@ -4601,6 +4523,7 @@ move(struct ws_win *win, union arg *args) xcb_free_cursor(conn, cursor); xcb_close_font(conn, cursor_font); xcb_ungrab_pointer(conn, XCB_CURRENT_TIME); + DNPRINTF(SWM_D_EVENT, "move: done\n"); } void @@ -5499,17 +5422,17 @@ updatenumlockmask(void) numlockmask = 0; modmap_r = xcb_get_modifier_mapping_reply(conn, - xcb_get_modifier_mapping(conn), - NULL); + xcb_get_modifier_mapping(conn), + NULL); if (modmap_r) { modmap = xcb_get_modifier_mapping_keycodes(modmap_r); for (i = 0; i < 8; i++) { for (j = 0; j < modmap_r->keycodes_per_modifier; j++) { kc = modmap[i * modmap_r->keycodes_per_modifier - + j]; + + j]; if (kc == *((xcb_keycode_t *)xcb_key_symbols_get_keycode(syms, - XK_Num_Lock))) + XK_Num_Lock))) numlockmask = (1 << i); } } @@ -5558,24 +5481,23 @@ grabbuttons(struct ws_win *win, int focused) updatenumlockmask(); xcb_ungrab_button(conn, XCB_BUTTON_INDEX_ANY, win->id, - XCB_BUTTON_MASK_ANY); + XCB_BUTTON_MASK_ANY); if (focused) { for (i = 0; i < LENGTH(buttons); i++) if (buttons[i].action == client_click) for (j = 0; j < LENGTH(modifiers); j++) xcb_grab_button(conn, False, win->id, - BUTTONMASK, - XCB_GRAB_MODE_ASYNC, - XCB_GRAB_MODE_SYNC, - XCB_WINDOW_NONE, - XCB_CURSOR_NONE, - buttons[i].button, - buttons[i].mask); + BUTTONMASK, + XCB_GRAB_MODE_ASYNC, + XCB_GRAB_MODE_SYNC, + XCB_WINDOW_NONE, + XCB_CURSOR_NONE, + buttons[i].button, + buttons[i].mask); } else xcb_grab_button(conn, False, win->id, BUTTONMASK, - XCB_GRAB_MODE_ASYNC, XCB_GRAB_MODE_SYNC, - XCB_WINDOW_NONE, XCB_CURSOR_NONE, XCB_BUTTON_INDEX_ANY, - XCB_BUTTON_MASK_ANY); + XCB_GRAB_MODE_ASYNC, XCB_GRAB_MODE_SYNC, XCB_WINDOW_NONE, + XCB_CURSOR_NONE, XCB_BUTTON_INDEX_ANY, XCB_BUTTON_MASK_ANY); } const char *quirkname[] = { @@ -5986,7 +5908,7 @@ setautorun(char *selector, char *value, int flags) char *ap, *sp = s; union arg a; int argc = 0; - long pid; + pid_t pid; struct pid_e *p; if (getenv("SWM_STARTED")) @@ -6308,8 +6230,8 @@ set_child_transient(struct ws_win *win, xcb_window_t *trans) /* parent doen't exist in our window list */ TAILQ_FOREACH(w, &ws->winlist, entry) { if (xcb_icccm_get_wm_hints_reply(conn, - xcb_icccm_get_wm_hints(conn, w->id), - &wmh, NULL) != 1) { + xcb_icccm_get_wm_hints(conn, w->id), + &wmh, NULL) != 1) { warnx("can't get hints for 0x%x", w->id); continue; } @@ -6327,10 +6249,10 @@ set_child_transient(struct ws_win *win, xcb_window_t *trans) } } -long +pid_t window_get_pid(xcb_window_t win) { - long ret = 0; + pid_t ret = 0; const char *errstr; xcb_atom_t apid; xcb_get_property_cookie_t pc; @@ -6344,10 +6266,12 @@ window_get_pid(xcb_window_t win) pr = xcb_get_property_reply(conn, pc, NULL); if (!pr) goto tryharder; - if (pr->type != XCB_ATOM_CARDINAL) + if (pr->type != XCB_ATOM_CARDINAL) { + free(pr); goto tryharder; + } - ret = *(long *)xcb_get_property_value(pr); + ret = *((pid_t *)xcb_get_property_value(pr)); free(pr); return (ret); @@ -6355,13 +6279,15 @@ window_get_pid(xcb_window_t win) tryharder: apid = get_atom_from_string("_SWM_PID"); pc = xcb_get_property(conn, False, win, apid, XCB_ATOM_STRING, - 0, SWM_PROPLEN); + 0, SWM_PROPLEN); pr = xcb_get_property_reply(conn, pc, NULL); if (!pr) return (0); - if (pr->type != XCB_ATOM_STRING) + if (pr->type != XCB_ATOM_STRING) { free(pr); return (0); + } + ret = strtonum(xcb_get_property_value(pr), 0, UINT_MAX, &errstr); free(pr); @@ -6436,7 +6362,7 @@ manage_window(xcb_window_t id) if (ws_idx_atom) { gpr = xcb_get_property_reply(conn, xcb_get_property(conn, False, id, ws_idx_atom, - XCB_ATOM_STRING, 0, SWM_PROPLEN), + XCB_ATOM_STRING, 0, SWM_PROPLEN), NULL); if (gpr) { proplen = xcb_get_property_value_length(gpr); @@ -6453,17 +6379,17 @@ manage_window(xcb_window_t id) } } win->wa = xcb_get_geometry_reply(conn, - xcb_get_geometry(conn, id), - NULL); + xcb_get_geometry(conn, id), + NULL); xcb_icccm_get_wm_normal_hints_reply(conn, - xcb_icccm_get_wm_normal_hints(conn, id), - &win->sh, NULL); + xcb_icccm_get_wm_normal_hints(conn, id), + &win->sh, NULL); xcb_icccm_get_wm_hints_reply(conn, - xcb_icccm_get_wm_hints(conn, id), - &win->hints, NULL); + xcb_icccm_get_wm_hints(conn, id), + &win->hints, NULL); xcb_icccm_get_wm_transient_for_reply(conn, - xcb_icccm_get_wm_transient_for(conn, id), - &trans, NULL); + xcb_icccm_get_wm_transient_for(conn, id), + &trans, NULL); if (trans) { win->transient = trans; set_child_transient(win, &trans); @@ -6475,8 +6401,8 @@ manage_window(xcb_window_t id) /* get supported protocols */ if (xcb_icccm_get_wm_protocols_reply(conn, - xcb_icccm_get_wm_protocols(conn, id, prot), - &wpr, NULL)) { + xcb_icccm_get_wm_protocols(conn, id, prot), + &wpr, NULL)) { for (i = 0; i < wpr.atoms_len; i++) { if (wpr.atoms[i] == takefocus) win->take_focus = 1; @@ -6569,8 +6495,8 @@ manage_window(xcb_window_t id) DNPRINTF(SWM_D_PROP, "manage_window: set _SWM_WS: %s\n", ws_idx_str); xcb_change_property(conn, XCB_PROP_MODE_REPLACE, win->id, - ws_idx_atom, XCB_ATOM_STRING, 8, strlen(ws_idx_str), - ws_idx_str); + ws_idx_atom, XCB_ATOM_STRING, 8, strlen(ws_idx_str), + ws_idx_str); } if (prop) free(prop); @@ -6578,8 +6504,8 @@ manage_window(xcb_window_t id) ewmh_autoquirk(win); if (xcb_icccm_get_wm_class_reply(conn, - xcb_icccm_get_wm_class(conn, win->id), - &win->ch, NULL)) { + xcb_icccm_get_wm_class(conn, win->id), + &win->ch, NULL)) { DNPRINTF(SWM_D_CLASS, "manage_window: class: %s, name: %s\n", win->ch.class_name, win->ch.instance_name); @@ -6635,8 +6561,7 @@ manage_window(xcb_window_t id) } event_mask = XCB_EVENT_MASK_ENTER_WINDOW | XCB_EVENT_MASK_FOCUS_CHANGE | - XCB_EVENT_MASK_PROPERTY_CHANGE | - XCB_EVENT_MASK_STRUCTURE_NOTIFY; + XCB_EVENT_MASK_PROPERTY_CHANGE | XCB_EVENT_MASK_STRUCTURE_NOTIFY; xcb_change_window_attributes(conn, id, XCB_CW_EVENT_MASK, &event_mask); @@ -6655,9 +6580,6 @@ free_window(struct ws_win *win) if (win == NULL) return; - /* needed for restart wm */ - set_win_state(win, XCB_ICCCM_WM_STATE_WITHDRAWN); - TAILQ_REMOVE(&win->ws->unmanagedlist, win, entry); if (win->wa) @@ -6671,6 +6593,7 @@ free_window(struct ws_win *win) memset(win, 0xff, sizeof *win); /* XXX kill later */ free(win); + DNPRINTF(SWM_D_MISC, "free_window: done\n"); } void @@ -6693,7 +6616,7 @@ unmanage_window(struct ws_win *win) /* focus on root just in case */ screen = xcb_setup_roots_iterator(xcb_get_setup(conn)).data; xcb_set_input_focus(conn, XCB_INPUT_FOCUS_POINTER_ROOT, - screen->root, XCB_CURRENT_TIME); + screen->root, XCB_CURRENT_TIME); focus_prev(win); @@ -6742,7 +6665,18 @@ focus_magic(struct ws_win *win) void expose(xcb_expose_event_t *e) { + int i, num_screens; + struct swm_region *r; + DNPRINTF(SWM_D_EVENT, "expose: window: 0x%x\n", e->window); + + num_screens = xcb_setup_roots_length(xcb_get_setup(conn)); + for (i = 0; i < num_screens; i++) + TAILQ_FOREACH(r, &screens[i].rl, entry) + if (e->window == WINID(r->bar)) + bar_update(); + + xcb_flush(conn); } void @@ -6753,6 +6687,9 @@ keypress(xcb_key_press_event_t *e) struct swm_region *r; keysym = XkbKeycodeToKeysym(display, (KeyCode)e->detail, 0, 0); + + DNPRINTF(SWM_D_EVENT, "keypress: %u\n", e->detail); + if ((kp = key_lookup(CLEANMASK(e->state), keysym)) == NULL) return; if (keyfuncs[kp->funcid].func == NULL) @@ -6771,7 +6708,8 @@ buttonpress(xcb_button_press_event_t *e) struct ws_win *win; int i, action; - DNPRINTF(SWM_D_EVENT, "buttonpress: window 0x%x\n", e->event); + DNPRINTF(SWM_D_EVENT, "buttonpress: window 0x%x, detail: %u\n", + e->event, e->detail); if ((win = find_window(e->event)) == NULL) return; @@ -6792,7 +6730,7 @@ configurerequest(xcb_configure_request_event_t *e) struct ws_win *win; int new = 0, i = 0; uint16_t mask = 0; - uint32_t wc[7]; + uint32_t wc[7] = {0}; if ((win = find_window(e->window)) == NULL) if ((win = find_unmanaged_window(e->window)) == NULL) @@ -6865,8 +6803,8 @@ configurenotify(xcb_configure_notify_event_t *e) win = find_window(e->window); if (win) { xcb_icccm_get_wm_normal_hints_reply(conn, - xcb_icccm_get_wm_normal_hints(conn, win->id), - &win->sh, NULL); + xcb_icccm_get_wm_normal_hints(conn, win->id), + &win->sh, NULL); adjust_font(win); if (font_adjusted) stack(); @@ -7042,8 +6980,8 @@ maprequest(xcb_map_request_event_t *e) e->window); war = xcb_get_window_attributes_reply(conn, - xcb_get_window_attributes(conn, e->window), - NULL); + xcb_get_window_attributes(conn, e->window), + NULL); if (!war) return; if (war->override_redirect) { @@ -7075,8 +7013,8 @@ propertynotify(xcb_property_notify_event_t *e) xcb_get_atom_name_reply_t *r; r = xcb_get_atom_name_reply(conn, - xcb_get_atom_name(conn, e->atom), - NULL); + xcb_get_atom_name(conn, e->atom), + NULL); if (r) { len = xcb_get_atom_name_name_length(r); if (len > 0) { @@ -7086,9 +7024,8 @@ propertynotify(xcb_property_notify_event_t *e) name[len] = '\0'; DNPRINTF(SWM_D_EVENT, - "propertynotify: window: 0x%x, " - "atom: %s\n", - e->window, name); + "propertynotify: window: 0x%x, atom: %s\n", + e->window, name); free(name); } } @@ -7150,26 +7087,16 @@ unmapnotify(xcb_unmap_notify_event_t *e) /* resend unmap because we ated it */ xcb_unmap_window(conn, e->window); + xcb_flush(conn); } } -void +/*void visibilitynotify(xcb_visibility_notify_event_t *e) { - int i, num_screens; - struct swm_region *r; - DNPRINTF(SWM_D_EVENT, "visibilitynotify: window: 0x%x\n", e->window); - - if (e->state == XCB_VISIBILITY_UNOBSCURED) { - num_screens = xcb_setup_roots_length(xcb_get_setup(conn)); - for (i = 0; i < num_screens; i++) - TAILQ_FOREACH(r, &screens[i].rl, entry) - if (e->window == WINID(r->bar)) - bar_update(); - } -} +}*/ void clientmessage(xcb_client_message_event_t *e) @@ -7182,20 +7109,20 @@ clientmessage(xcb_client_message_event_t *e) } DNPRINTF(SWM_D_EVENT, "clientmessage: window: 0x%x, type: %u\n", - e->window, e->response_type); + e->window, e->type); - if (e->response_type == ewmh[_NET_ACTIVE_WINDOW].atom) { + if (e->type == ewmh[_NET_ACTIVE_WINDOW].atom) { DNPRINTF(SWM_D_EVENT, "clientmessage: _NET_ACTIVE_WINDOW\n"); focus_win(win); } - if (e->response_type == ewmh[_NET_CLOSE_WINDOW].atom) { + 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); else xcb_kill_client(conn, win->id); } - if (e->response_type == ewmh[_NET_MOVERESIZE_WINDOW].atom) { + if (e->type == ewmh[_NET_MOVERESIZE_WINDOW].atom) { DNPRINTF(SWM_D_EVENT, "clientmessage: _NET_MOVERESIZE_WINDOW\n"); if (win->floating) { @@ -7216,7 +7143,7 @@ clientmessage(xcb_client_message_event_t *e) config_win(win, NULL); } } - if (e->response_type == ewmh[_NET_WM_STATE].atom) { + if (e->type == ewmh[_NET_WM_STATE].atom) { DNPRINTF(SWM_D_EVENT, "clientmessage: _NET_WM_STATE\n"); ewmh_update_win_state(win, e->data.data32[1], e->data.data32[0]); if (e->data.data32[2]) @@ -7367,9 +7294,9 @@ scan_xrandr(int i) #ifdef SWM_XRR_HAS_CRTC if (xrandr_support) { src = xcb_randr_get_screen_resources_current(conn, - screens[i].root); + screens[i].root); srr = xcb_randr_get_screen_resources_current_reply(conn, src, - NULL); + NULL); if (srr == NULL) { new_region(&screens[i], 0, 0, screen->width_in_pixels, @@ -7380,7 +7307,7 @@ scan_xrandr(int i) for (c = 0; c < ncrtc; c++) { crtc = xcb_randr_get_screen_resources_current_crtcs(srr); cic = xcb_randr_get_crtc_info(conn, crtc[c], - XCB_CURRENT_TIME); + XCB_CURRENT_TIME); cir = xcb_randr_get_crtc_info_reply(conn, cic, NULL); if (cir == NULL) continue; @@ -7416,12 +7343,12 @@ screenchange(xcb_randr_screen_change_notify_event_t *e) DNPRINTF(SWM_D_EVENT, "screenchange: root: 0x%x\n", e->root); if (e->rotation & (XCB_RANDR_ROTATION_ROTATE_90 - | XCB_RANDR_ROTATION_ROTATE_270)) + | XCB_RANDR_ROTATION_ROTATE_270)) xcb_randr_set_screen_size(conn, e->root, e->height, - e->width, e->mheight, e->mwidth); + e->width, e->mheight, e->mwidth); else xcb_randr_set_screen_size(conn, e->root, e->width, - e->height, e->mwidth, e->mheight); + e->height, e->mwidth, e->mheight); num_screens = xcb_setup_roots_length(xcb_get_setup(conn)); /* silly event doesn't include the screen index */ @@ -7476,8 +7403,8 @@ grab_windows(void) } pc = xcb_icccm_get_wm_transient_for(conn, wins[j]); - if (xcb_icccm_get_wm_transient_for_reply(conn, pc, &wins[j], - NULL)) { + if (xcb_icccm_get_wm_transient_for_reply(conn, pc, + &wins[j], NULL)) { free(r); continue; } @@ -7503,8 +7430,8 @@ grab_windows(void) state = getstate(wins[j]); manage = state == XCB_ICCCM_WM_STATE_ICONIC; pc = xcb_icccm_get_wm_transient_for(conn, wins[j]); - if (xcb_icccm_get_wm_transient_for_reply(conn, pc, &wins[j], - NULL) && manage) + if (xcb_icccm_get_wm_transient_for_reply(conn, pc, + &wins[j], NULL) && manage) manage_window(wins[j]); } free(qtr); @@ -7568,11 +7495,11 @@ setup_screens(void) screens[i].bar_gc = xcb_generate_id(conn); gcv[0] = 0; xcb_create_gc(conn, screens[i].bar_gc, screens[i].root, - XCB_GC_GRAPHICS_EXPOSURES, gcv); + XCB_GC_GRAPHICS_EXPOSURES, gcv); /* set default cursor */ xcb_change_window_attributes(conn, screens[i].root, - XCB_CW_CURSOR, wa); + XCB_CW_CURSOR, wa); /* init all workspaces */ /* XXX these should be dynamically allocated too */ @@ -7598,7 +7525,7 @@ setup_screens(void) if (xrandr_support) xcb_randr_select_input(conn, screens[i].root, - XCB_RANDR_NOTIFY_MASK_SCREEN_CHANGE); + XCB_RANDR_NOTIFY_MASK_SCREEN_CHANGE); } xcb_free_cursor(conn, cursor); xcb_close_font(conn, cursor_font); @@ -7648,34 +7575,60 @@ workaround(void) } void +event_error(xcb_generic_error_t *e) +{ + DNPRINTF(SWM_D_EVENT, "event_error: %s(%u) from %s(%u), sequence: %u, " + "resource_id: %u, minor_code: %u\n", + xcb_event_get_error_label(e->error_code), e->error_code, + xcb_event_get_request_label(e->major_code), e->major_code, + e->sequence, e->resource_id, e->minor_code); +} + +void event_handle(xcb_generic_event_t *evt) { uint8_t type = XCB_EVENT_RESPONSE_TYPE(evt); - if (type == 0) - { - /* XXX - handle error */ - return; - } + DNPRINTF(SWM_D_EVENT, "XCB Event: %s(%d)\n", + xcb_event_get_label(XCB_EVENT_RESPONSE_TYPE(evt)), + XCB_EVENT_RESPONSE_TYPE(evt)); switch (type) { #define EVENT(type, callback) case type: callback((void *)evt); return + EVENT(0, event_error); EVENT(XCB_BUTTON_PRESS, buttonpress); - EVENT(XCB_BUTTON_RELEASE, buttonpress); + /*EVENT(XCB_BUTTON_RELEASE, buttonpress);*/ + /*EVENT(XCB_CIRCULATE_NOTIFY, );*/ + /*EVENT(XCB_CIRCULATE_REQUEST, );*/ EVENT(XCB_CLIENT_MESSAGE, clientmessage); + /*EVENT(XCB_COLORMAP_NOTIFY, );*/ EVENT(XCB_CONFIGURE_NOTIFY, configurenotify); EVENT(XCB_CONFIGURE_REQUEST, configurerequest); + /*EVENT(XCB_CREATE_NOTIFY, );*/ EVENT(XCB_DESTROY_NOTIFY, destroynotify); EVENT(XCB_ENTER_NOTIFY, enternotify); EVENT(XCB_EXPOSE, expose); + /*EVENT(XCB_FOCUS_IN, );*/ + /*EVENT(XCB_FOCUS_OUT, );*/ + /*EVENT(XCB_GRAPHICS_EXPOSURE, );*/ + /*EVENT(XCB_GRAVITY_NOTIFY, );*/ EVENT(XCB_KEY_PRESS, keypress); - EVENT(XCB_KEY_RELEASE, keypress); + /*EVENT(XCB_KEY_RELEASE, keypress);*/ + /*EVENT(XCB_KEYMAP_NOTIFY, );*/ + /*EVENT(XCB_LEAVE_NOTIFY, );*/ EVENT(XCB_MAP_NOTIFY, mapnotify); EVENT(XCB_MAP_REQUEST, maprequest); EVENT(XCB_MAPPING_NOTIFY, mappingnotify); + /*EVENT(XCB_MOTION_NOTIFY, );*/ + /*EVENT(XCB_NO_EXPOSURE, );*/ EVENT(XCB_PROPERTY_NOTIFY, propertynotify); + /*EVENT(XCB_REPARENT_NOTIFY, );*/ + /*EVENT(XCB_RESIZE_REQUEST, );*/ + /*EVENT(XCB_SELECTION_CLEAR, );*/ + /*EVENT(XCB_SELECTION_NOTIFY, );*/ + /*EVENT(XCB_SELECTION_REQUEST, );*/ EVENT(XCB_UNMAP_NOTIFY, unmapnotify); - EVENT(XCB_VISIBILITY_NOTIFY, visibilitynotify); + /*EVENT(XCB_VISIBILITY_NOTIFY, visibilitynotify);*/ #undef EVENT } if (type - xrandr_eventbase == XCB_RANDR_SCREEN_CHANGE_NOTIFY) @@ -7687,14 +7640,18 @@ main(int argc, char *argv[]) { struct swm_region *r, *rr; struct ws_win *winfocus = NULL; - struct timeval tv; union arg a; char conf[PATH_MAX], *cfile = NULL; struct stat sb; int xfd, i, num_screens; - fd_set rd; struct sigaction sact; xcb_generic_event_t *evt; +#if 0 + struct timeval tv; + fd_set rd; +#endif + + time_started = time(NULL); start_argv = argv; warnx("Welcome to spectrwm V%s Build: %s", SPECTRWM_VERSION, buildstr); @@ -7751,8 +7708,7 @@ main(int argc, char *argv[]) /* flush all events */ while ((evt = xcb_poll_for_event(conn))) { - uint8_t type = XCB_EVENT_RESPONSE_TYPE(evt); - if (type == 0) + if (XCB_EVENT_RESPONSE_TYPE(evt) == 0) event_handle(evt); free(evt); } @@ -7836,8 +7792,6 @@ noconfig: while (running) { while ((evt = xcb_poll_for_event(conn))) { - DNPRINTF(SWM_D_EVENT, "XCB Event: %s\n", - geteventname(evt)); if (running == 0) goto done; event_handle(evt); @@ -7855,8 +7809,8 @@ noconfig: /* move pointer to first screen if multi screen */ if (num_screens > 1 || outputs > 1) xcb_warp_pointer(conn, XCB_WINDOW_NONE, - rr->s[0].root, 0, 0, 0, 0, X(rr), - Y(rr) + (bar_enabled ? bar_height : 0)); + rr->s[0].root, 0, 0, 0, 0, X(rr), + Y(rr) + (bar_enabled ? bar_height : 0)); a.id = SWM_ARG_ID_FOCUSCUR; focus(rr, &a); @@ -7864,6 +7818,7 @@ noconfig: continue; } +#if 0 FD_ZERO(&rd); FD_SET(xfd, &rd); tv.tv_sec = 1; @@ -7871,6 +7826,7 @@ noconfig: if (select(xfd + 1, &rd, NULL, NULL, &tv) == -1) if (errno != EINTR) DNPRINTF(SWM_D_MISC, "select failed"); +#endif if (restart_wm == 1) restart(NULL, NULL); if (search_resp == 1)