X-Git-Url: https://jasonwoof.com/gitweb/?a=blobdiff_plain;f=spectrwm.c;h=a4c7ee1d4b833b9aea45a32c0e271c861ec883f1;hb=9a52bb6bc226793726ef4d814e09f08031e8d918;hp=2a1bf15bce1722ff1a7c83c949a6cec7e47bbe97;hpb=8ef91631e3941320568c33a90e16b78610dbe7b9;p=spectrwm.git diff --git a/spectrwm.c b/spectrwm.c index 2a1bf15..a4c7ee1 100644 --- a/spectrwm.c +++ b/spectrwm.c @@ -156,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 @@ -249,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; @@ -343,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; @@ -654,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) @@ -708,7 +717,7 @@ 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); @@ -747,7 +756,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); } @@ -764,9 +773,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) @@ -797,8 +805,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); } } @@ -818,7 +826,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)); @@ -843,7 +851,7 @@ ewmh_autoquirk(struct ws_win *win) 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, (~0L)); r = xcb_get_property_reply(conn, c, NULL); if (!r) return; @@ -925,8 +933,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 */ @@ -988,24 +995,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 @@ -1026,7 +1033,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, (~0L)); r = xcb_get_property_reply(conn, c, NULL); if (!r) return; @@ -1042,118 +1049,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) { @@ -1174,8 +1069,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", @@ -1189,8 +1084,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", @@ -1206,6 +1101,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 *); @@ -1308,8 +1204,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); @@ -1319,14 +1215,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; @@ -1468,7 +1362,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; @@ -1476,12 +1370,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 @@ -1570,7 +1464,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; @@ -1929,7 +1823,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(); } @@ -1998,10 +1892,10 @@ bar_setup(struct swm_region *r) 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); @@ -2037,7 +1931,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 @@ -2056,7 +1950,7 @@ getstate(xcb_window_t w) } DNPRINTF(SWM_D_MISC, "getstate property: win 0x%x state %u\n", w, -result); + result); return (result); } @@ -2089,7 +1983,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_EVENT_MASK_NO_EVENT, (const char *)&ev); } /* synthetic response to a ConfigureRequest when not making a change */ @@ -2213,7 +2107,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,7 +2135,7 @@ 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); + win->id, *keycode); bzero(&event, sizeof(event)); event.event = win->id; @@ -2258,11 +2152,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_EVENT_MASK_KEY_RELEASE, (char *)&event); } void @@ -2303,7 +2197,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", @@ -2534,10 +2428,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 @@ -2593,11 +2486,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; @@ -2605,7 +2498,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, @@ -2615,8 +2508,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(); @@ -2771,7 +2664,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); @@ -2781,7 +2674,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); } } @@ -3690,8 +3583,8 @@ 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(); @@ -3702,9 +3595,9 @@ void pressbutton(struct swm_region *r, union arg *args) { xcb_test_fake_input(conn, XCB_BUTTON_PRESS, args->id, - XCB_CURRENT_TIME, XCB_WINDOW_NONE, 0, 0, 0); + 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); + XCB_CURRENT_TIME, XCB_WINDOW_NONE, 0, 0, 0); } void @@ -4268,7 +4161,7 @@ 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; @@ -4277,6 +4170,7 @@ resize(struct ws_win *win, union arg *args) 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; @@ -4335,7 +4229,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; @@ -4359,13 +4253,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); @@ -4373,6 +4266,7 @@ resize(struct ws_win *win, union arg *args) return; } + xcb_flush(conn); buttonrelease = 0; while ((evt = xcb_poll_for_event(conn)) && buttonrelease != 1) { /* @@ -4432,8 +4326,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); } @@ -4444,7 +4338,7 @@ resize(struct ws_win *win, union arg *args) } free(evt); } - if (time) { + if (timestamp) { do_sync(); update_window(win); } @@ -4475,11 +4369,12 @@ resize_step(struct swm_region *r, union arg *args) void move(struct ws_win *win, union arg *args) { - xcb_timestamp_t time = 0; + xcb_timestamp_t timestamp = 0; int move_step = 0, buttonrelease; 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; @@ -4545,11 +4440,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); @@ -4566,6 +4460,7 @@ move(struct ws_win *win, union arg *args) return; } + xcb_flush(conn); buttonrelease = 0; while ((evt = xcb_poll_for_event(conn)) && buttonrelease != 1) { /* @@ -4584,8 +4479,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); } @@ -4596,7 +4491,7 @@ move(struct ws_win *win, union arg *args) } free(evt); } - if (time) { + if (timestamp) { do_sync(); update_window(win); } @@ -5503,17 +5398,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); } } @@ -5562,24 +5457,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[] = { @@ -6312,8 +6206,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; } @@ -6359,7 +6253,7 @@ 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); @@ -6440,7 +6334,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); @@ -6457,17 +6351,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); @@ -6479,8 +6373,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; @@ -6573,8 +6467,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); @@ -6582,8 +6476,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); @@ -6639,8 +6533,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); @@ -6659,9 +6552,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) @@ -6675,6 +6565,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 @@ -6697,7 +6588,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); @@ -6872,8 +6763,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(); @@ -7049,8 +6940,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) { @@ -7082,8 +6973,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) { @@ -7093,9 +6984,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); } } @@ -7374,9 +7264,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, @@ -7387,7 +7277,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; @@ -7423,12 +7313,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 */ @@ -7483,8 +7373,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; } @@ -7510,8 +7400,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); @@ -7575,11 +7465,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 */ @@ -7605,7 +7495,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); @@ -7655,32 +7545,53 @@ 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; - } - 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_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_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); #undef EVENT @@ -7703,6 +7614,8 @@ main(int argc, char *argv[]) struct sigaction sact; xcb_generic_event_t *evt; + time_started = time(NULL); + start_argv = argv; warnx("Welcome to spectrwm V%s Build: %s", SPECTRWM_VERSION, buildstr); if (!setlocale(LC_CTYPE, "") || !setlocale(LC_TIME, "") || @@ -7843,8 +7756,9 @@ noconfig: while (running) { while ((evt = xcb_poll_for_event(conn))) { - DNPRINTF(SWM_D_EVENT, "XCB Event: %s\n", - geteventname(evt)); + DNPRINTF(SWM_D_EVENT, "XCB Event: %s(%d)\n", + xcb_event_get_label(XCB_EVENT_RESPONSE_TYPE(evt)), + XCB_EVENT_RESPONSE_TYPE(evt)); if (running == 0) goto done; event_handle(evt); @@ -7862,8 +7776,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);