X-Git-Url: https://jasonwoof.com/gitweb/?a=blobdiff_plain;f=spectrwm.c;h=07c3d74057413ea64ffffded0df6d4661fa1054f;hb=cee196007501b8ef81b6713d284eef09fa929b6e;hp=15187b3505649e40be9973d92d8ba3cde826ef27;hpb=a0b5fd0279684bedd34f240174907cbe02d53517;p=spectrwm.git diff --git a/spectrwm.c b/spectrwm.c index 15187b3..07c3d74 100644 --- a/spectrwm.c +++ b/spectrwm.c @@ -54,21 +54,7 @@ * DEALINGS IN THE SOFTWARE. */ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - +/* kernel includes */ #include #include #include @@ -86,29 +72,41 @@ #include "tree.h" #endif +/* /usr/includes */ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include #include #include -#include -#include -#include -#include +#include +#include +#include +#include #include #include #include #include #include #include -#include -#include -#include -#include +#include +/* local includes */ +#include "version.h" #ifdef __OSX__ #include #endif -#include "version.h" - #ifdef SPECTRWM_BUILDSTR static const char *buildstr = SPECTRWM_BUILDSTR; #else @@ -204,7 +202,7 @@ u_int32_t swm_debug = 0 #define DNPRINTF(n,x...) #endif -#define LENGTH(x) (sizeof x / sizeof x[0]) +#define LENGTH(x) (int)(sizeof x / sizeof x[0]) #define MODKEY Mod1Mask #define CLEANMASK(mask) (mask & ~(numlockmask | LockMask)) #define BUTTONMASK (ButtonPressMask|ButtonReleaseMask) @@ -245,10 +243,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; @@ -258,13 +256,11 @@ volatile sig_atomic_t running = 1; volatile sig_atomic_t restart_wm = 0; int outputs = 0; /*int last_focus_event = FocusOut;*/ -int (*xerrorxlib)(Display *, XErrorEvent *); int other_wm; int ss_enabled = 0; int xrandr_support; int xrandr_eventbase; unsigned int numlockmask = 0; -Display *display; xcb_connection_t *conn; xcb_key_symbols_t *syms; @@ -353,8 +349,10 @@ int border_width = 1; int verbose_layout = 0; time_t time_started; pid_t bar_pid; +#if 0 XFontSet bar_fs; XFontSetExtents *bar_fs_extents; +#endif char *bar_fonts; struct passwd *pwd; @@ -441,15 +439,6 @@ void max_stack(struct workspace *, struct swm_geometry *); void plain_stacker(struct workspace *); void fancy_stacker(struct workspace *); -struct ws_win *find_window(xcb_window_t); - -void grabbuttons(struct ws_win *, int); -void new_region(struct swm_screen *, int, int, int, int); -void unmanage_window(struct ws_win *); -uint16_t getstate(xcb_window_t); - -int conf_load(char *, int); - struct layout { void (*l_stack)(struct workspace *, struct swm_geometry *); void (*l_config)(struct workspace *, int); @@ -574,9 +563,6 @@ union arg { char **argv; }; -void focus(struct swm_region *, union arg *); -void focus_magic(struct ws_win *); - /* quirks */ struct quirk { TAILQ_ENTRY(quirk) entry; @@ -656,19 +642,29 @@ struct ewmh_hint { {"_SWM_WM_STATE_MANUAL", XCB_ATOM_NONE}, }; -void store_float_geom(struct ws_win *, struct swm_region *); -int floating_toggle_win(struct ws_win *); -void constrain_window(struct ws_win *, struct swm_region *, int); -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); +/* function prototypes */ +int conf_load(char *, int); +void constrain_window(struct ws_win *, struct swm_region *, int); +void do_sync(void); +void event_handle(xcb_generic_event_t *); +struct ws_win *find_window(xcb_window_t); +int floating_toggle_win(struct ws_win *); +void focus(struct swm_region *, union arg *); +void focus_magic(struct ws_win *); +xcb_atom_t get_atom_from_string(const char *); xcb_screen_t *get_screen(int); -int parse_rgb(const char *, uint16_t *, uint16_t *, uint16_t *); -void event_handle(xcb_generic_event_t *); - +char *get_win_name(xcb_window_t); +uint16_t getstate(xcb_window_t); +void grabbuttons(struct ws_win *, int); +void map_window_raised(xcb_window_t); +void new_region(struct swm_screen *, int, int, int, int); +int parse_rgb(const char *, uint16_t *, uint16_t *, uint16_t *); +void spawn_select(struct swm_region *, union arg *, char *, int *); +void store_float_geom(struct ws_win *, struct swm_region *); +void unmanage_window(struct ws_win *); +void update_window(struct ws_win *); + +/* function definitions */ int parse_rgb(const char *rgb, uint16_t *rr, uint16_t *gg, uint16_t *bb) { @@ -844,7 +840,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; @@ -856,7 +851,7 @@ ewmh_autoquirk(struct ws_win *win) n = xcb_get_property_value_length(r); type = xcb_get_property_value(r); - + for (i = 0; i < n; i++) { if (type[i] == ewmh[_NET_WM_WINDOW_TYPE_NORMAL].atom) break; @@ -1335,6 +1330,8 @@ bar_print(struct swm_region *r, const char *s) XRectangle ibox, lbox; len = strlen(s); + /* FIXME fix bar font position calculations */ +#if 0 XmbTextExtents(bar_fs, s, len, &ibox, &lbox); switch (bar_justify) { @@ -1351,6 +1348,7 @@ bar_print(struct swm_region *r, const char *s) if (x < SWM_BAR_OFFSET) x = SWM_BAR_OFFSET; +#endif rect.x = 0; rect.y = 0; @@ -1368,9 +1366,14 @@ bar_print(struct swm_region *r, const char *s) xcb_change_gc(conn, r->s->bar_gc, XCB_GC_BACKGROUND, gcv); gcv[0] = r->s->c[SWM_S_COLOR_BAR_FONT].color; xcb_change_gc(conn, r->s->bar_gc, XCB_GC_FOREGROUND, gcv); +#if 0 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); +#else + /* workaround */ + xcb_image_text_8(conn, len, r->bar->buffer, r->s->bar_gc, 4, 14, s); +#endif /* blt */ xcb_copy_area(conn, r->bar->buffer, r->bar->id, r->s->bar_gc, 0, 0, @@ -1839,18 +1842,20 @@ bar_setup(struct swm_region *r) xcb_screen_t *screen = get_screen(r->s->idx); uint32_t wa[3]; +#if 0 if (bar_fs) { XFreeFontSet(display, bar_fs); bar_fs = NULL; } +#endif if ((r->bar = calloc(1, sizeof(struct swm_bar))) == NULL) err(1, "bar_setup: calloc: failed to allocate memory."); - +#if 0 DNPRINTF(SWM_D_BAR, "bar_setup: loading bar_fonts: %s\n", bar_fonts); bar_fs = XCreateFontSet(display, bar_fonts, &missing_charsets, - &num_missing_charsets, &default_string); + &num_missing_charsets, &default_string);*/ if (num_missing_charsets > 0) { warnx("Unable to load charset(s):"); @@ -1877,7 +1882,10 @@ bar_setup(struct swm_region *r) if (bar_height < 1) bar_height = 1; - +#else + /* workaround */ + bar_height = 24; +#endif X(r->bar) = X(r); Y(r->bar) = bar_at_bottom ? (Y(r) + HEIGHT(r) - bar_height) : Y(r); WIDTH(r->bar) = WIDTH(r) - 2 * bar_border_width; @@ -1887,6 +1895,8 @@ bar_setup(struct swm_region *r) 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; + DNPRINTF(SWM_D_BAR, "bar_setup: create_window: (x,y) w x h: (%d,%d) " + "%d x %d\n", X(r->bar), Y(r->bar), WIDTH(r->bar), HEIGHT(r->bar)); 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, @@ -1933,8 +1943,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 @@ -1944,7 +1954,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) { @@ -1982,7 +1992,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; @@ -2157,11 +2167,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 @@ -2190,8 +2200,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); @@ -2242,7 +2252,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)); @@ -2252,8 +2261,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); @@ -2282,8 +2290,7 @@ spawn(int ws_idx, union arg *args, int close_fd) DNPRINTF(SWM_D_MISC, "spawn: %s\n", args->argv[0]); - if (display) - close(xcb_get_file_descriptor(conn)); + close(xcb_get_file_descriptor(conn)); setenv("LD_PRELOAD", SWM_LIB, 1); @@ -2457,7 +2464,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; @@ -2481,8 +2487,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); @@ -2521,6 +2526,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; @@ -2574,7 +2593,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 @@ -2986,9 +3008,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); } @@ -3046,6 +3071,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"); } @@ -3716,6 +3744,7 @@ uniconify(struct swm_region *r, union arg *args) } fclose(lfile); + xcb_flush(conn); } @@ -3797,6 +3826,7 @@ search_win(struct swm_region *r, union arg *args) FILE *lfile; size_t len; XRectangle ibox, lbox; + DNPRINTF(SWM_D_MISC, "search_win\n"); search_r = r; @@ -3827,15 +3857,26 @@ search_win(struct swm_region *r, union arg *args) snprintf(s, sizeof s, "%d", i); len = strlen(s); + /* FIXME fix calculations */ +#if 0 XmbTextExtents(bar_fs, s, len, &ibox, &lbox); +#endif w = xcb_generate_id(conn); wa[0] = r->s->c[SWM_S_COLOR_FOCUS].color; wa[1] = r->s->c[SWM_S_COLOR_UNFOCUS].color; +#if 0 xcb_create_window(conn, XCB_COPY_FROM_PARENT, w, win->id, 0, 0, lbox.width + 4, bar_fs_extents->max_logical_extent.height, 1, XCB_WINDOW_CLASS_INPUT_OUTPUT, XCB_COPY_FROM_PARENT, XCB_CW_BACK_PIXEL | XCB_CW_BORDER_PIXEL, wa); +#else + /* workaround */ + xcb_create_window(conn, XCB_COPY_FROM_PARENT, w, win->id, 0, 0, + 22, 20, 1, XCB_WINDOW_CLASS_INPUT_OUTPUT, + XCB_COPY_FROM_PARENT, XCB_CW_BACK_PIXEL | + XCB_CW_BORDER_PIXEL, wa); +#endif sw->indicator = w; TAILQ_INSERT_TAIL(&search_wl, sw, entry); @@ -3848,9 +3889,14 @@ search_win(struct swm_region *r, union arg *args) XCB_GC_BACKGROUND | XCB_GC_GRAPHICS_EXPOSURES, gcv); map_window_raised(w); +#if 0 xcb_image_text_8(conn, len, w, sw->gc, 2, (bar_fs_extents->max_logical_extent.height - lbox.height) / 2 - lbox.y, s); +#else + /* workaround */ + xcb_image_text_8(conn, len, w, sw->gc, 6, 14, s); +#endif DNPRINTF(SWM_D_MISC, "search_win: mapped window: 0x%x\n", w); @@ -4052,7 +4098,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 +4163,7 @@ floating_toggle(struct swm_region *r, union arg *args) } xcb_flush(conn); + event_drain(XCB_ENTER_NOTIFY); } void @@ -4293,10 +4340,6 @@ resize(struct ws_win *win, union arg *args) 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: DNPRINTF(SWM_D_EVENT, "resize: BUTTON_RELEASE\n"); @@ -4545,128 +4588,168 @@ move_step(struct swm_region *r, union arg *args) /* user/key callable function IDs */ enum keyfuncid { - kf_cycle_layout, - kf_flip_layout, - kf_stack_reset, - kf_master_shrink, - kf_master_grow, - kf_master_add, - kf_master_del, - kf_stack_inc, - kf_stack_dec, - kf_swap_main, - kf_focus_next, - kf_focus_prev, - kf_swap_next, - kf_swap_prev, - kf_quit, - kf_restart, - kf_focus_main, - kf_ws_1, - kf_ws_2, - kf_ws_3, - kf_ws_4, - kf_ws_5, - kf_ws_6, - kf_ws_7, - kf_ws_8, - kf_ws_9, - kf_ws_10, - kf_ws_11, - kf_ws_12, - kf_ws_13, - kf_ws_14, - kf_ws_15, - kf_ws_16, - kf_ws_17, - kf_ws_18, - kf_ws_19, - kf_ws_20, - kf_ws_21, - kf_ws_22, - kf_ws_next, - kf_ws_prev, - kf_ws_next_all, - kf_ws_prev_all, - kf_ws_prior, - kf_screen_next, - kf_screen_prev, - kf_mvws_1, - kf_mvws_2, - kf_mvws_3, - kf_mvws_4, - kf_mvws_5, - kf_mvws_6, - kf_mvws_7, - kf_mvws_8, - kf_mvws_9, - kf_mvws_10, - kf_mvws_11, - kf_mvws_12, - kf_mvws_13, - kf_mvws_14, - kf_mvws_15, - kf_mvws_16, - kf_mvws_17, - kf_mvws_18, - kf_mvws_19, - kf_mvws_20, - kf_mvws_21, - kf_mvws_22, - kf_bar_toggle, - kf_wind_kill, - kf_wind_del, - kf_float_toggle, - kf_version, - kf_spawn_custom, - kf_iconify, - kf_uniconify, - kf_raise_toggle, - kf_button2, - kf_width_shrink, - kf_width_grow, - kf_height_shrink, - kf_height_grow, - kf_move_left, - kf_move_right, - kf_move_up, - kf_move_down, - kf_name_workspace, - kf_search_workspace, - kf_search_win, - kf_dumpwins, /* MUST BE LAST */ - kf_invalid + KF_BAR_TOGGLE, + KF_BUTTON2, + KF_CYCLE_LAYOUT, + KF_FLIP_LAYOUT, + KF_FLOAT_TOGGLE, + KF_FOCUS_MAIN, + KF_FOCUS_NEXT, + KF_FOCUS_PREV, + KF_HEIGHT_GROW, + KF_HEIGHT_SHRINK, + KF_ICONIFY, + KF_MASTER_SHRINK, + KF_MASTER_GROW, + KF_MASTER_ADD, + KF_MASTER_DEL, + KF_MOVE_DOWN, + KF_MOVE_LEFT, + KF_MOVE_RIGHT, + KF_MOVE_UP, + KF_MVWS_1, + KF_MVWS_2, + KF_MVWS_3, + KF_MVWS_4, + KF_MVWS_5, + KF_MVWS_6, + KF_MVWS_7, + KF_MVWS_8, + KF_MVWS_9, + KF_MVWS_10, + KF_MVWS_11, + KF_MVWS_12, + KF_MVWS_13, + KF_MVWS_14, + KF_MVWS_15, + KF_MVWS_16, + KF_MVWS_17, + KF_MVWS_18, + KF_MVWS_19, + KF_MVWS_20, + KF_MVWS_21, + KF_MVWS_22, + KF_NAME_WORKSPACE, + KF_QUIT, + KF_RAISE_TOGGLE, + KF_RESTART, + KF_SCREEN_NEXT, + KF_SCREEN_PREV, + KF_SEARCH_WIN, + KF_SEARCH_WORKSPACE, + KF_SPAWN_CUSTOM, + KF_STACK_INC, + KF_STACK_DEC, + KF_STACK_RESET, + KF_SWAP_MAIN, + KF_SWAP_NEXT, + KF_SWAP_PREV, + KF_UNICONIFY, + KF_VERSION, + KF_WIDTH_GROW, + KF_WIDTH_SHRINK, + KF_WIND_DEL, + KF_WIND_KILL, + KF_WS_1, + KF_WS_2, + KF_WS_3, + KF_WS_4, + KF_WS_5, + KF_WS_6, + KF_WS_7, + KF_WS_8, + KF_WS_9, + KF_WS_10, + KF_WS_11, + KF_WS_12, + KF_WS_13, + KF_WS_14, + KF_WS_15, + KF_WS_16, + KF_WS_17, + KF_WS_18, + KF_WS_19, + KF_WS_20, + KF_WS_21, + KF_WS_22, + KF_WS_NEXT, + KF_WS_NEXT_ALL, + KF_WS_PREV, + KF_WS_PREV_ALL, + KF_WS_PRIOR, + KF_DUMPWINS, /* MUST BE LAST */ + KF_INVALID }; /* key definitions */ -void -dummykeyfunc(struct swm_region *r, union arg *args) -{ -}; - struct keyfunc { char name[SWM_FUNCNAME_LEN]; void (*func)(struct swm_region *r, union arg *); union arg args; -} keyfuncs[kf_invalid + 1] = { +} keyfuncs[KF_INVALID + 1] = { /* name function argument */ + { "bar_toggle", bar_toggle, {0} }, + { "button2", pressbutton, {2} }, { "cycle_layout", cycle_layout, {0} }, { "flip_layout", stack_config, {.id = SWM_ARG_ID_FLIPLAYOUT} }, - { "stack_reset", stack_config, {.id = SWM_ARG_ID_STACKRESET} }, + { "float_toggle", floating_toggle,{0} }, + { "focus_main", focus, {.id = SWM_ARG_ID_FOCUSMAIN} }, + { "focus_next", focus, {.id = SWM_ARG_ID_FOCUSNEXT} }, + { "focus_prev", focus, {.id = SWM_ARG_ID_FOCUSPREV} }, + { "height_grow", resize_step, {.id = SWM_ARG_ID_HEIGHTGROW} }, + { "height_shrink", resize_step, {.id = SWM_ARG_ID_HEIGHTSHRINK} }, + { "iconify", iconify, {0} }, { "master_shrink", stack_config, {.id = SWM_ARG_ID_MASTERSHRINK} }, { "master_grow", stack_config, {.id = SWM_ARG_ID_MASTERGROW} }, { "master_add", stack_config, {.id = SWM_ARG_ID_MASTERADD} }, { "master_del", stack_config, {.id = SWM_ARG_ID_MASTERDEL} }, + { "move_down", move_step, {.id = SWM_ARG_ID_MOVEDOWN} }, + { "move_left", move_step, {.id = SWM_ARG_ID_MOVELEFT} }, + { "move_right", move_step, {.id = SWM_ARG_ID_MOVERIGHT} }, + { "move_up", move_step, {.id = SWM_ARG_ID_MOVEUP} }, + { "mvws_1", send_to_ws, {.id = 0} }, + { "mvws_2", send_to_ws, {.id = 1} }, + { "mvws_3", send_to_ws, {.id = 2} }, + { "mvws_4", send_to_ws, {.id = 3} }, + { "mvws_5", send_to_ws, {.id = 4} }, + { "mvws_6", send_to_ws, {.id = 5} }, + { "mvws_7", send_to_ws, {.id = 6} }, + { "mvws_8", send_to_ws, {.id = 7} }, + { "mvws_9", send_to_ws, {.id = 8} }, + { "mvws_10", send_to_ws, {.id = 9} }, + { "mvws_11", send_to_ws, {.id = 10} }, + { "mvws_12", send_to_ws, {.id = 11} }, + { "mvws_13", send_to_ws, {.id = 12} }, + { "mvws_14", send_to_ws, {.id = 13} }, + { "mvws_15", send_to_ws, {.id = 14} }, + { "mvws_16", send_to_ws, {.id = 15} }, + { "mvws_17", send_to_ws, {.id = 16} }, + { "mvws_18", send_to_ws, {.id = 17} }, + { "mvws_19", send_to_ws, {.id = 18} }, + { "mvws_20", send_to_ws, {.id = 19} }, + { "mvws_21", send_to_ws, {.id = 20} }, + { "mvws_22", send_to_ws, {.id = 21} }, + { "name_workspace", name_workspace, {0} }, + { "quit", quit, {0} }, + { "raise_toggle", raise_toggle, {0} }, + { "restart", restart, {0} }, + { "screen_next", cyclescr, {.id = SWM_ARG_ID_CYCLESC_UP} }, + { "screen_prev", cyclescr, {.id = SWM_ARG_ID_CYCLESC_DOWN} }, + { "search_win", search_win, {0} }, + { "search_workspace", search_workspace, {0} }, + { "spawn_custom", NULL, {0} }, { "stack_inc", stack_config, {.id = SWM_ARG_ID_STACKINC} }, { "stack_dec", stack_config, {.id = SWM_ARG_ID_STACKDEC} }, + { "stack_reset", stack_config, {.id = SWM_ARG_ID_STACKRESET} }, { "swap_main", swapwin, {.id = SWM_ARG_ID_SWAPMAIN} }, - { "focus_next", focus, {.id = SWM_ARG_ID_FOCUSNEXT} }, - { "focus_prev", focus, {.id = SWM_ARG_ID_FOCUSPREV} }, { "swap_next", swapwin, {.id = SWM_ARG_ID_SWAPNEXT} }, { "swap_prev", swapwin, {.id = SWM_ARG_ID_SWAPPREV} }, - { "quit", quit, {0} }, - { "restart", restart, {0} }, - { "focus_main", focus, {.id = SWM_ARG_ID_FOCUSMAIN} }, + { "uniconify", uniconify, {0} }, + { "version", version, {0} }, + { "width_grow", resize_step, {.id = SWM_ARG_ID_WIDTHGROW} }, + { "width_shrink", resize_step, {.id = SWM_ARG_ID_WIDTHSHRINK} }, + { "wind_del", wkill, {.id = SWM_ARG_ID_DELETEWINDOW} }, + { "wind_kill", wkill, {.id = SWM_ARG_ID_KILLWINDOW} }, { "ws_1", switchws, {.id = 0} }, { "ws_2", switchws, {.id = 1} }, { "ws_3", switchws, {.id = 2} }, @@ -4690,55 +4773,10 @@ struct keyfunc { { "ws_21", switchws, {.id = 20} }, { "ws_22", switchws, {.id = 21} }, { "ws_next", cyclews, {.id = SWM_ARG_ID_CYCLEWS_UP} }, - { "ws_prev", cyclews, {.id = SWM_ARG_ID_CYCLEWS_DOWN} }, { "ws_next_all", cyclews, {.id = SWM_ARG_ID_CYCLEWS_UP_ALL} }, + { "ws_prev", cyclews, {.id = SWM_ARG_ID_CYCLEWS_DOWN} }, { "ws_prev_all", cyclews, {.id = SWM_ARG_ID_CYCLEWS_DOWN_ALL} }, { "ws_prior", priorws, {0} }, - { "screen_next", cyclescr, {.id = SWM_ARG_ID_CYCLESC_UP} }, - { "screen_prev", cyclescr, {.id = SWM_ARG_ID_CYCLESC_DOWN} }, - { "mvws_1", send_to_ws, {.id = 0} }, - { "mvws_2", send_to_ws, {.id = 1} }, - { "mvws_3", send_to_ws, {.id = 2} }, - { "mvws_4", send_to_ws, {.id = 3} }, - { "mvws_5", send_to_ws, {.id = 4} }, - { "mvws_6", send_to_ws, {.id = 5} }, - { "mvws_7", send_to_ws, {.id = 6} }, - { "mvws_8", send_to_ws, {.id = 7} }, - { "mvws_9", send_to_ws, {.id = 8} }, - { "mvws_10", send_to_ws, {.id = 9} }, - { "mvws_11", send_to_ws, {.id = 10} }, - { "mvws_12", send_to_ws, {.id = 11} }, - { "mvws_13", send_to_ws, {.id = 12} }, - { "mvws_14", send_to_ws, {.id = 13} }, - { "mvws_15", send_to_ws, {.id = 14} }, - { "mvws_16", send_to_ws, {.id = 15} }, - { "mvws_17", send_to_ws, {.id = 16} }, - { "mvws_18", send_to_ws, {.id = 17} }, - { "mvws_19", send_to_ws, {.id = 18} }, - { "mvws_20", send_to_ws, {.id = 19} }, - { "mvws_21", send_to_ws, {.id = 20} }, - { "mvws_22", send_to_ws, {.id = 21} }, - { "bar_toggle", bar_toggle, {0} }, - { "wind_kill", wkill, {.id = SWM_ARG_ID_KILLWINDOW} }, - { "wind_del", wkill, {.id = SWM_ARG_ID_DELETEWINDOW} }, - { "float_toggle", floating_toggle,{0} }, - { "version", version, {0} }, - { "spawn_custom", dummykeyfunc, {0} }, - { "iconify", iconify, {0} }, - { "uniconify", uniconify, {0} }, - { "raise_toggle", raise_toggle, {0} }, - { "button2", pressbutton, {2} }, - { "width_shrink", resize_step, {.id = SWM_ARG_ID_WIDTHSHRINK} }, - { "width_grow", resize_step, {.id = SWM_ARG_ID_WIDTHGROW} }, - { "height_shrink", resize_step, {.id = SWM_ARG_ID_HEIGHTSHRINK} }, - { "height_grow", resize_step, {.id = SWM_ARG_ID_HEIGHTGROW} }, - { "move_left", move_step, {.id = SWM_ARG_ID_MOVELEFT} }, - { "move_right", move_step, {.id = SWM_ARG_ID_MOVERIGHT} }, - { "move_up", move_step, {.id = SWM_ARG_ID_MOVEUP} }, - { "move_down", move_step, {.id = SWM_ARG_ID_MOVEDOWN} }, - { "name_workspace", name_workspace, {0} }, - { "search_workspace", search_workspace, {0} }, - { "search_win", search_win, {0} }, { "dumpwins", dumpwins, {0} }, /* MUST BE LAST */ { "invalid key func", NULL, {0} }, }; @@ -5102,7 +5140,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); @@ -5125,7 +5163,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); @@ -5212,14 +5250,14 @@ setkeybinding(unsigned int mod, KeySym ks, enum keyfuncid kfid, keyfuncs[kfid].name, spawn_name); if ((kp = key_lookup(mod, ks)) != NULL) { - if (kfid == kf_invalid) + if (kfid == KF_INVALID) key_remove(kp); else key_replace(kp, mod, ks, kfid, spawn_name); DNPRINTF(SWM_D_KEY, "setkeybinding: leave\n"); return; } - if (kfid == kf_invalid) { + if (kfid == KF_INVALID) { warnx("error: setkeybinding: cannot find mod/key combination"); DNPRINTF(SWM_D_KEY, "setkeybinding: leave\n"); return; @@ -5240,14 +5278,14 @@ setconfbinding(char *selector, char *value, int flags) if (selector == NULL) { DNPRINTF(SWM_D_KEY, "setconfbinding: unbind %s\n", value); if (parsekeys(value, mod_key, &mod, &ks) == 0) { - kfid = kf_invalid; + kfid = KF_INVALID; setkeybinding(mod, ks, kfid, NULL); return (0); } else return (1); } /* search by key function name */ - for (kfid = 0; kfid < kf_invalid; (kfid)++) { + for (kfid = 0; kfid < KF_INVALID; (kfid)++) { if (strncasecmp(selector, keyfuncs[kfid].name, SWM_FUNCNAME_LEN) == 0) { DNPRINTF(SWM_D_KEY, "setconfbinding: %s: match\n", @@ -5265,7 +5303,7 @@ setconfbinding(char *selector, char *value, int flags) DNPRINTF(SWM_D_KEY, "setconfbinding: %s: match\n", selector); if (parsekeys(value, mod_key, &mod, &ks) == 0) { - setkeybinding(mod, ks, kf_spawn_custom, + setkeybinding(mod, ks, KF_SPAWN_CUSTOM, sp->name); return (0); } else @@ -5279,104 +5317,104 @@ setconfbinding(char *selector, char *value, int flags) void setup_keys(void) { - setkeybinding(MODKEY, XK_space, kf_cycle_layout,NULL); - setkeybinding(MODKEY|ShiftMask, XK_backslash, kf_flip_layout, NULL); - setkeybinding(MODKEY|ShiftMask, XK_space, kf_stack_reset, NULL); - setkeybinding(MODKEY, XK_h, kf_master_shrink,NULL); - setkeybinding(MODKEY, XK_l, kf_master_grow, NULL); - setkeybinding(MODKEY, XK_comma, kf_master_add, NULL); - setkeybinding(MODKEY, XK_period, kf_master_del, NULL); - setkeybinding(MODKEY|ShiftMask, XK_comma, kf_stack_inc, NULL); - setkeybinding(MODKEY|ShiftMask, XK_period, kf_stack_dec, NULL); - setkeybinding(MODKEY, XK_Return, kf_swap_main, NULL); - setkeybinding(MODKEY, XK_j, kf_focus_next, NULL); - setkeybinding(MODKEY, XK_k, kf_focus_prev, NULL); - setkeybinding(MODKEY|ShiftMask, XK_j, kf_swap_next, NULL); - setkeybinding(MODKEY|ShiftMask, XK_k, kf_swap_prev, NULL); - setkeybinding(MODKEY|ShiftMask, XK_Return, kf_spawn_custom,"term"); - setkeybinding(MODKEY, XK_p, kf_spawn_custom,"menu"); - setkeybinding(MODKEY|ShiftMask, XK_q, kf_quit, NULL); - setkeybinding(MODKEY, XK_q, kf_restart, NULL); - setkeybinding(MODKEY, XK_m, kf_focus_main, NULL); - setkeybinding(MODKEY, XK_1, kf_ws_1, NULL); - setkeybinding(MODKEY, XK_2, kf_ws_2, NULL); - setkeybinding(MODKEY, XK_3, kf_ws_3, NULL); - setkeybinding(MODKEY, XK_4, kf_ws_4, NULL); - setkeybinding(MODKEY, XK_5, kf_ws_5, NULL); - setkeybinding(MODKEY, XK_6, kf_ws_6, NULL); - setkeybinding(MODKEY, XK_7, kf_ws_7, NULL); - setkeybinding(MODKEY, XK_8, kf_ws_8, NULL); - setkeybinding(MODKEY, XK_9, kf_ws_9, NULL); - setkeybinding(MODKEY, XK_0, kf_ws_10, NULL); - setkeybinding(MODKEY, XK_F1, kf_ws_11, NULL); - setkeybinding(MODKEY, XK_F2, kf_ws_12, NULL); - setkeybinding(MODKEY, XK_F3, kf_ws_13, NULL); - setkeybinding(MODKEY, XK_F4, kf_ws_14, NULL); - setkeybinding(MODKEY, XK_F5, kf_ws_15, NULL); - setkeybinding(MODKEY, XK_F6, kf_ws_16, NULL); - setkeybinding(MODKEY, XK_F7, kf_ws_17, NULL); - setkeybinding(MODKEY, XK_F8, kf_ws_18, NULL); - setkeybinding(MODKEY, XK_F9, kf_ws_19, NULL); - setkeybinding(MODKEY, XK_F10, kf_ws_20, NULL); - setkeybinding(MODKEY, XK_F11, kf_ws_21, NULL); - setkeybinding(MODKEY, XK_F12, kf_ws_22, NULL); - setkeybinding(MODKEY, XK_Right, kf_ws_next, NULL); - setkeybinding(MODKEY, XK_Left, kf_ws_prev, NULL); - setkeybinding(MODKEY, XK_Up, kf_ws_next_all, NULL); - setkeybinding(MODKEY, XK_Down, kf_ws_prev_all, NULL); - setkeybinding(MODKEY, XK_a, kf_ws_prior, NULL); - setkeybinding(MODKEY|ShiftMask, XK_Right, kf_screen_next, NULL); - setkeybinding(MODKEY|ShiftMask, XK_Left, kf_screen_prev, NULL); - setkeybinding(MODKEY|ShiftMask, XK_1, kf_mvws_1, NULL); - setkeybinding(MODKEY|ShiftMask, XK_2, kf_mvws_2, NULL); - setkeybinding(MODKEY|ShiftMask, XK_3, kf_mvws_3, NULL); - setkeybinding(MODKEY|ShiftMask, XK_4, kf_mvws_4, NULL); - setkeybinding(MODKEY|ShiftMask, XK_5, kf_mvws_5, NULL); - setkeybinding(MODKEY|ShiftMask, XK_6, kf_mvws_6, NULL); - setkeybinding(MODKEY|ShiftMask, XK_7, kf_mvws_7, NULL); - setkeybinding(MODKEY|ShiftMask, XK_8, kf_mvws_8, NULL); - setkeybinding(MODKEY|ShiftMask, XK_9, kf_mvws_9, NULL); - setkeybinding(MODKEY|ShiftMask, XK_0, kf_mvws_10, NULL); - setkeybinding(MODKEY|ShiftMask, XK_F1, kf_mvws_11, NULL); - setkeybinding(MODKEY|ShiftMask, XK_F2, kf_mvws_12, NULL); - setkeybinding(MODKEY|ShiftMask, XK_F3, kf_mvws_13, NULL); - setkeybinding(MODKEY|ShiftMask, XK_F4, kf_mvws_14, NULL); - setkeybinding(MODKEY|ShiftMask, XK_F5, kf_mvws_15, NULL); - setkeybinding(MODKEY|ShiftMask, XK_F6, kf_mvws_16, NULL); - setkeybinding(MODKEY|ShiftMask, XK_F7, kf_mvws_17, NULL); - setkeybinding(MODKEY|ShiftMask, XK_F8, kf_mvws_18, NULL); - setkeybinding(MODKEY|ShiftMask, XK_F9, kf_mvws_19, NULL); - setkeybinding(MODKEY|ShiftMask, XK_F10, kf_mvws_20, NULL); - setkeybinding(MODKEY|ShiftMask, XK_F11, kf_mvws_21, NULL); - setkeybinding(MODKEY|ShiftMask, XK_F12, kf_mvws_22, NULL); - setkeybinding(MODKEY, XK_b, kf_bar_toggle, NULL); - setkeybinding(MODKEY, XK_Tab, kf_focus_next, NULL); - setkeybinding(MODKEY|ShiftMask, XK_Tab, kf_focus_prev, NULL); - setkeybinding(MODKEY|ShiftMask, XK_x, kf_wind_kill, NULL); - setkeybinding(MODKEY, XK_x, kf_wind_del, NULL); - setkeybinding(MODKEY, XK_s, kf_spawn_custom,"screenshot_all"); - setkeybinding(MODKEY|ShiftMask, XK_s, kf_spawn_custom,"screenshot_wind"); - setkeybinding(MODKEY, XK_t, kf_float_toggle,NULL); - setkeybinding(MODKEY|ShiftMask, XK_v, kf_version, NULL); - setkeybinding(MODKEY|ShiftMask, XK_Delete, kf_spawn_custom,"lock"); - setkeybinding(MODKEY|ShiftMask, XK_i, kf_spawn_custom,"initscr"); - setkeybinding(MODKEY, XK_w, kf_iconify, NULL); - setkeybinding(MODKEY|ShiftMask, XK_w, kf_uniconify, NULL); - setkeybinding(MODKEY|ShiftMask, XK_r, kf_raise_toggle,NULL); - setkeybinding(MODKEY, XK_v, kf_button2, NULL); - setkeybinding(MODKEY, XK_equal, kf_width_grow, NULL); - setkeybinding(MODKEY, XK_minus, kf_width_shrink,NULL); - setkeybinding(MODKEY|ShiftMask, XK_equal, kf_height_grow, NULL); - setkeybinding(MODKEY|ShiftMask, XK_minus, kf_height_shrink,NULL); - setkeybinding(MODKEY, XK_bracketleft, kf_move_left, NULL); - setkeybinding(MODKEY, XK_bracketright,kf_move_right, NULL); - setkeybinding(MODKEY|ShiftMask, XK_bracketleft, kf_move_up, NULL); - setkeybinding(MODKEY|ShiftMask, XK_bracketright,kf_move_down, NULL); - setkeybinding(MODKEY|ShiftMask, XK_slash, kf_name_workspace,NULL); - setkeybinding(MODKEY, XK_slash, kf_search_workspace,NULL); - setkeybinding(MODKEY, XK_f, kf_search_win, NULL); + setkeybinding(MODKEY, XK_space, KF_CYCLE_LAYOUT,NULL); + setkeybinding(MODKEY|ShiftMask, XK_backslash, KF_FLIP_LAYOUT, NULL); + setkeybinding(MODKEY|ShiftMask, XK_space, KF_STACK_RESET, NULL); + setkeybinding(MODKEY, XK_h, KF_MASTER_SHRINK, NULL); + setkeybinding(MODKEY, XK_l, KF_MASTER_GROW, NULL); + setkeybinding(MODKEY, XK_comma, KF_MASTER_ADD, NULL); + setkeybinding(MODKEY, XK_period, KF_MASTER_DEL, NULL); + setkeybinding(MODKEY|ShiftMask, XK_comma, KF_STACK_INC, NULL); + setkeybinding(MODKEY|ShiftMask, XK_period, KF_STACK_DEC, NULL); + setkeybinding(MODKEY, XK_Return, KF_SWAP_MAIN, NULL); + setkeybinding(MODKEY, XK_j, KF_FOCUS_NEXT, NULL); + setkeybinding(MODKEY, XK_k, KF_FOCUS_PREV, NULL); + setkeybinding(MODKEY|ShiftMask, XK_j, KF_SWAP_NEXT, NULL); + setkeybinding(MODKEY|ShiftMask, XK_k, KF_SWAP_PREV, NULL); + setkeybinding(MODKEY|ShiftMask, XK_Return, KF_SPAWN_CUSTOM,"term"); + setkeybinding(MODKEY, XK_p, KF_SPAWN_CUSTOM,"menu"); + setkeybinding(MODKEY|ShiftMask, XK_q, KF_QUIT, NULL); + setkeybinding(MODKEY, XK_q, KF_RESTART, NULL); + setkeybinding(MODKEY, XK_m, KF_FOCUS_MAIN, NULL); + setkeybinding(MODKEY, XK_1, KF_WS_1, NULL); + setkeybinding(MODKEY, XK_2, KF_WS_2, NULL); + setkeybinding(MODKEY, XK_3, KF_WS_3, NULL); + setkeybinding(MODKEY, XK_4, KF_WS_4, NULL); + setkeybinding(MODKEY, XK_5, KF_WS_5, NULL); + setkeybinding(MODKEY, XK_6, KF_WS_6, NULL); + setkeybinding(MODKEY, XK_7, KF_WS_7, NULL); + setkeybinding(MODKEY, XK_8, KF_WS_8, NULL); + setkeybinding(MODKEY, XK_9, KF_WS_9, NULL); + setkeybinding(MODKEY, XK_0, KF_WS_10, NULL); + setkeybinding(MODKEY, XK_F1, KF_WS_11, NULL); + setkeybinding(MODKEY, XK_F2, KF_WS_12, NULL); + setkeybinding(MODKEY, XK_F3, KF_WS_13, NULL); + setkeybinding(MODKEY, XK_F4, KF_WS_14, NULL); + setkeybinding(MODKEY, XK_F5, KF_WS_15, NULL); + setkeybinding(MODKEY, XK_F6, KF_WS_16, NULL); + setkeybinding(MODKEY, XK_F7, KF_WS_17, NULL); + setkeybinding(MODKEY, XK_F8, KF_WS_18, NULL); + setkeybinding(MODKEY, XK_F9, KF_WS_19, NULL); + setkeybinding(MODKEY, XK_F10, KF_WS_20, NULL); + setkeybinding(MODKEY, XK_F11, KF_WS_21, NULL); + setkeybinding(MODKEY, XK_F12, KF_WS_22, NULL); + setkeybinding(MODKEY, XK_Right, KF_WS_NEXT, NULL); + setkeybinding(MODKEY, XK_Left, KF_WS_PREV, NULL); + setkeybinding(MODKEY, XK_Up, KF_WS_NEXT_ALL, NULL); + setkeybinding(MODKEY, XK_Down, KF_WS_PREV_ALL, NULL); + setkeybinding(MODKEY, XK_a, KF_WS_PRIOR, NULL); + setkeybinding(MODKEY|ShiftMask, XK_Right, KF_SCREEN_NEXT, NULL); + setkeybinding(MODKEY|ShiftMask, XK_Left, KF_SCREEN_PREV, NULL); + setkeybinding(MODKEY|ShiftMask, XK_1, KF_MVWS_1, NULL); + setkeybinding(MODKEY|ShiftMask, XK_2, KF_MVWS_2, NULL); + setkeybinding(MODKEY|ShiftMask, XK_3, KF_MVWS_3, NULL); + setkeybinding(MODKEY|ShiftMask, XK_4, KF_MVWS_4, NULL); + setkeybinding(MODKEY|ShiftMask, XK_5, KF_MVWS_5, NULL); + setkeybinding(MODKEY|ShiftMask, XK_6, KF_MVWS_6, NULL); + setkeybinding(MODKEY|ShiftMask, XK_7, KF_MVWS_7, NULL); + setkeybinding(MODKEY|ShiftMask, XK_8, KF_MVWS_8, NULL); + setkeybinding(MODKEY|ShiftMask, XK_9, KF_MVWS_9, NULL); + setkeybinding(MODKEY|ShiftMask, XK_0, KF_MVWS_10, NULL); + setkeybinding(MODKEY|ShiftMask, XK_F1, KF_MVWS_11, NULL); + setkeybinding(MODKEY|ShiftMask, XK_F2, KF_MVWS_12, NULL); + setkeybinding(MODKEY|ShiftMask, XK_F3, KF_MVWS_13, NULL); + setkeybinding(MODKEY|ShiftMask, XK_F4, KF_MVWS_14, NULL); + setkeybinding(MODKEY|ShiftMask, XK_F5, KF_MVWS_15, NULL); + setkeybinding(MODKEY|ShiftMask, XK_F6, KF_MVWS_16, NULL); + setkeybinding(MODKEY|ShiftMask, XK_F7, KF_MVWS_17, NULL); + setkeybinding(MODKEY|ShiftMask, XK_F8, KF_MVWS_18, NULL); + setkeybinding(MODKEY|ShiftMask, XK_F9, KF_MVWS_19, NULL); + setkeybinding(MODKEY|ShiftMask, XK_F10, KF_MVWS_20, NULL); + setkeybinding(MODKEY|ShiftMask, XK_F11, KF_MVWS_21, NULL); + setkeybinding(MODKEY|ShiftMask, XK_F12, KF_MVWS_22, NULL); + setkeybinding(MODKEY, XK_b, KF_BAR_TOGGLE, NULL); + setkeybinding(MODKEY, XK_Tab, KF_FOCUS_NEXT, NULL); + setkeybinding(MODKEY|ShiftMask, XK_Tab, KF_FOCUS_PREV, NULL); + setkeybinding(MODKEY|ShiftMask, XK_x, KF_WIND_KILL, NULL); + setkeybinding(MODKEY, XK_x, KF_WIND_DEL, NULL); + setkeybinding(MODKEY, XK_s, KF_SPAWN_CUSTOM,"screenshot_all"); + setkeybinding(MODKEY|ShiftMask, XK_s, KF_SPAWN_CUSTOM,"screenshot_wind"); + setkeybinding(MODKEY, XK_t, KF_FLOAT_TOGGLE,NULL); + setkeybinding(MODKEY|ShiftMask, XK_v, KF_VERSION, NULL); + setkeybinding(MODKEY|ShiftMask, XK_Delete, KF_SPAWN_CUSTOM,"lock"); + setkeybinding(MODKEY|ShiftMask, XK_i, KF_SPAWN_CUSTOM,"initscr"); + setkeybinding(MODKEY, XK_w, KF_ICONIFY, NULL); + setkeybinding(MODKEY|ShiftMask, XK_w, KF_UNICONIFY, NULL); + setkeybinding(MODKEY|ShiftMask, XK_r, KF_RAISE_TOGGLE,NULL); + setkeybinding(MODKEY, XK_v, KF_BUTTON2, NULL); + setkeybinding(MODKEY, XK_equal, KF_WIDTH_GROW, NULL); + setkeybinding(MODKEY, XK_minus, KF_WIDTH_SHRINK,NULL); + setkeybinding(MODKEY|ShiftMask, XK_equal, KF_HEIGHT_GROW,NULL); + setkeybinding(MODKEY|ShiftMask, XK_minus, KF_HEIGHT_SHRINK,NULL); + setkeybinding(MODKEY, XK_bracketleft, KF_MOVE_LEFT,NULL); + setkeybinding(MODKEY, XK_bracketright,KF_MOVE_RIGHT,NULL); + setkeybinding(MODKEY|ShiftMask, XK_bracketleft, KF_MOVE_UP, NULL); + setkeybinding(MODKEY|ShiftMask, XK_bracketright,KF_MOVE_DOWN,NULL); + setkeybinding(MODKEY|ShiftMask, XK_slash, KF_NAME_WORKSPACE,NULL); + setkeybinding(MODKEY, XK_slash, KF_SEARCH_WORKSPACE,NULL); + setkeybinding(MODKEY, XK_f, KF_SEARCH_WIN, NULL); #ifdef SWM_DEBUG - setkeybinding(MODKEY|ShiftMask, XK_d, kf_dumpwins, NULL); + setkeybinding(MODKEY|ShiftMask, XK_d, KF_DUMPWINS, NULL); #endif } @@ -6404,9 +6442,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); @@ -6640,25 +6678,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); } } @@ -6682,24 +6721,22 @@ expose(xcb_expose_event_t *e) void keypress(xcb_key_press_event_t *e) { - KeySym keysym; + xcb_keysym_t keysym; struct key *kp; - struct swm_region *r; - keysym = XkbKeycodeToKeysym(display, (KeyCode)e->detail, 0, 0); + keysym = xcb_key_press_lookup_keysym(syms, e, 0); - DNPRINTF(SWM_D_EVENT, "keypress: %u\n", e->detail); + DNPRINTF(SWM_D_EVENT, "keypress: %u %u\n", e->detail, keysym); if ((kp = key_lookup(CLEANMASK(e->state), keysym)) == NULL) return; - if (keyfuncs[kp->funcid].func == NULL) - return; - r = root_to_region(e->root); - if (kp->funcid == kf_spawn_custom) - spawn_custom(r, &(keyfuncs[kp->funcid].args), kp->spawn_name); - else - keyfuncs[kp->funcid].func(r, &(keyfuncs[kp->funcid].args)); + if (kp->funcid == KF_SPAWN_CUSTOM) + spawn_custom(root_to_region(e->root), + &(keyfuncs[kp->funcid].args), kp->spawn_name); + else if (keyfuncs[kp->funcid].func) + keyfuncs[kp->funcid].func(root_to_region(e->root), + &(keyfuncs[kp->funcid].args)); } void @@ -6722,6 +6759,8 @@ buttonpress(xcb_button_press_event_t *e) buttons[i].button == e->detail && CLEANMASK(buttons[i].mask) == CLEANMASK(e->state)) buttons[i].func(win, &buttons[i].args); + + xcb_flush(conn); } void @@ -6790,6 +6829,8 @@ configurerequest(xcb_configure_request_event_t *e) } else { config_win(win, e); } + + xcb_flush(conn); } void @@ -6837,11 +6878,6 @@ void enternotify(xcb_enter_notify_event_t *e) { struct ws_win *win; -#if 0 - struct ws_win *w; - Window focus_return; - int revert_to_return; -#endif DNPRINTF(SWM_D_FOCUS, "enternotify: window: 0x%x, mode: %d, detail: " "%d, root: 0x%x, subwindow: 0x%x, same_screen_focus: %s, " "state: %d\n", e->event, e->mode, e->detail, e->root, @@ -6859,74 +6895,6 @@ enternotify(xcb_enter_notify_event_t *e) case SWM_FOCUS_FOLLOW: break; case SWM_FOCUS_SYNERGY: -#if 0 - /* - * all these checks need to be in this order because the - * XCheckTypedWindowEvent relies on weeding out the previous events - * - * making this code an option would enable a follow mouse for focus - * feature - */ - - /* - * state is set when we are switching workspaces and focus is set when - * the window or a subwindow already has focus (occurs during restart). - * - * Only honor the focus flag if last_focus_event is not FocusOut, - * this allows spectrwm to continue to control focus when another - * program is also playing with it. - */ - if (ev->state || (ev->focus && last_focus_event != FocusOut)) { - DNPRINTF(SWM_D_EVENT, "ignoring enternotify: focus\n"); - return; - } - - /* - * happens when a window is created or destroyed and the border - * crosses the mouse pointer and when switching ws - * - * we need the subwindow test to see if we came from root in order - * to give focus to floaters - */ - if (ev->mode == NotifyNormal && ev->detail == NotifyVirtual && - ev->subwindow == 0) { - DNPRINTF(SWM_D_EVENT, "ignoring enternotify: NotifyVirtual\n"); - return; - } - - /* this window already has focus */ - if (ev->mode == NotifyNormal && ev->detail == NotifyInferior) { - DNPRINTF(SWM_D_EVENT, "ignoring enternotify: win has focus\n"); - return; - } - - /* this window is being deleted or moved to another ws */ - if (XCheckTypedWindowEvent(display, ev->window, ConfigureNotify, - &cne) == True) { - DNPRINTF(SWM_D_EVENT, "ignoring enternotify: configurenotify\n"); - XPutBackEvent(display, &cne); - return; - } - - if ((win = find_window(ev->window)) == NULL) { - DNPRINTF(SWM_D_EVENT, "ignoring enternotify: win == NULL\n"); - return; - } - - /* - * In fullstack kill all enters unless they come from a different ws - * (i.e. another region) or focus has been grabbed externally. - */ - if (win->ws->cur_layout->flags & SWM_L_FOCUSPREV && - last_focus_event != FocusOut) { - XGetInputFocus(display, &focus_return, &revert_to_return); - if ((w = find_window(focus_return)) == NULL || - w->ws == win->ws) { - DNPRINTF(SWM_D_EVENT, "ignoring event: fullstack\n"); - return; - } - } -#endif break; } @@ -6936,6 +6904,8 @@ enternotify(xcb_enter_notify_event_t *e) } focus_magic(win); + + xcb_flush(conn); } /* lets us use one switch statement for arbitrary mode/detail combinations */ @@ -7046,20 +7016,6 @@ propertynotify(xcb_property_notify_event_t *e) } switch (e->atom) { -#if 0 - case XCB_ATOM_WM_NORMAL_HINTS: - xcb_icccm_get_wm_normal_hints(conn, - xcb_iccom_get_wm_normal_hints(conn, win->id), - &win->sh, NULL); - warnx("normal hints: flag 0x%x", win->sh.flags); - if (win->sh.flags & XCB_SIZE_HINT_P_MIN_SIZE) { - WIDTH(win) = win->sh.min_width; - HEIGHT(win) = win->sh.min_height; - warnx("min %d %d", WIDTH(win), HEIGHT(win)); - } - XMoveResizeWindow(display, win->id, - X(win), Y(win), WIDTH(win), HEIGHT(win)); -#endif case XCB_ATOM_WM_CLASS: case XCB_ATOM_WM_NAME: bar_update(); @@ -7118,7 +7074,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); } @@ -7152,38 +7108,24 @@ clientmessage(xcb_client_message_event_t *e) stack(); } -} -int -xerror_start(Display *d, XErrorEvent *ee) -{ - other_wm = 1; - return (-1); -} - -int -xerror(Display *d, XErrorEvent *ee) -{ - /* warnx("error: %p %p", display, ee); */ - return (-1); + xcb_flush(conn); } -int +void active_wm(void) { - other_wm = 0; - xerrorxlib = XSetErrorHandler(xerror_start); + int num_screens, i; + const uint32_t val = XCB_EVENT_MASK_SUBSTRUCTURE_REDIRECT; + xcb_screen_t *sc; /* this causes an error if some other window manager is running */ - XSelectInput(display, DefaultRootWindow(display), - SubstructureRedirectMask); - do_sync(); - if (other_wm) - return (1); - - XSetErrorHandler(xerror); - do_sync(); - return (0); + num_screens = xcb_setup_roots_length(xcb_get_setup(conn)); + for (i = 0; i < num_screens; i++) { + sc = get_screen(i); + xcb_change_window_attributes(conn, sc->root, + XCB_CW_EVENT_MASK, &val); + } } void @@ -7482,7 +7424,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); @@ -7539,6 +7481,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 @@ -7646,25 +7601,16 @@ main(int argc, char *argv[]) int xfd, i, num_screens; 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); - if (!setlocale(LC_CTYPE, "") || !setlocale(LC_TIME, "") || - !XSupportsLocale()) + if (!setlocale(LC_CTYPE, "") || !setlocale(LC_TIME, "")) warnx("no locale support"); - if (!X_HAVE_UTF8_STRING) - warnx("no UTF-8 support"); - - if (!(display = XOpenDisplay(0))) - errx(1, "can not open display"); - /* handle some signals */ bzero(&sact, sizeof(sact)); sigemptyset(&sact.sa_mask); @@ -7679,24 +7625,12 @@ main(int argc, char *argv[]) sact.sa_flags = SA_NOCLDSTOP; sigaction(SIGCHLD, &sact, NULL); - conn = XGetXCBConnection(display); + conn = xcb_connect(NULL, NULL); if (xcb_connection_has_error(conn)) errx(1, "can not get XCB connection"); + xcb_prefetch_extension_data(conn, &xcb_randr_id); 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()); @@ -7713,11 +7647,12 @@ main(int argc, char *argv[]) free(evt); } - if (active_wm()) - errx(1, "other wm running"); - + active_wm(); xcb_aux_sync(conn); + if (xcb_poll_for_event(conn) != NULL) + errx(1, "another window manager is currently running"); + setup_globals(); setup_screens(); setup_keys(); @@ -7818,7 +7753,6 @@ noconfig: continue; } -#if 0 FD_ZERO(&rd); FD_SET(xfd, &rd); tv.tv_sec = 1; @@ -7826,7 +7760,6 @@ 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) @@ -7845,8 +7778,9 @@ done: for (i = 0; i < num_screens; ++i) if (screens[i].bar_gc != 0) xcb_free_gc(conn, screens[i].bar_gc); +#if 0 XFreeFontSet(display, bar_fs); - +#endif xcb_key_symbols_free(syms); xcb_disconnect(conn);