X-Git-Url: https://jasonwoof.com/gitweb/?a=blobdiff_plain;f=spectrwm.c;h=e202f9c11fb131598a827e99f636dbb87d6639c3;hb=35fc99381f4d978972ad89675038fba16cdd580e;hp=113452fd2240597de55ec74d38a1a1f51d351a49;hpb=157c555b7725e6977569c5206313240d3d448933;p=spectrwm.git diff --git a/spectrwm.c b/spectrwm.c index 113452f..e202f9c 100644 --- a/spectrwm.c +++ b/spectrwm.c @@ -285,8 +285,8 @@ xcb_atom_t a_takefocus; xcb_atom_t a_utf8_string; xcb_atom_t a_swm_iconic; xcb_atom_t a_swm_ws; -volatile sig_atomic_t running = 1; -volatile sig_atomic_t restart_wm = 0; +volatile sig_atomic_t running = 1; +volatile sig_atomic_t restart_wm = 0; xcb_timestamp_t last_event_time = 0; int outputs = 0; int other_wm; @@ -345,10 +345,10 @@ double dialog_ratio = 0.6; #define SWM_BAR_JUSTIFY_CENTER (1) #define SWM_BAR_JUSTIFY_RIGHT (2) #define SWM_BAR_OFFSET (4) -#define SWM_BAR_FONTS "-*-terminus-medium-*-*-*-12-*-*-*-*-*-*-*," \ - "-*-profont-*-*-*-*-12-*-*-*-*-*-*-*," \ - "-*-times-medium-r-*-*-12-*-*-*-*-*-*-*," \ - "-misc-fixed-medium-r-*-*-12-*-*-*-*-*-*-*," \ +#define SWM_BAR_FONTS "-*-terminus-medium-*-*-*-12-*-*-*-*-*-*-*,"\ + "-*-profont-*-*-*-*-12-*-*-*-*-*-*-*,"\ + "-*-times-medium-r-*-*-12-*-*-*-*-*-*-*,"\ + "-misc-fixed-medium-r-*-*-12-*-*-*-*-*-*-*,"\ "-*-*-*-r-*-*-*-*-*-*-*-*-*-*" #ifdef X_HAVE_UTF8_STRING @@ -672,33 +672,33 @@ struct ewmh_hint { char *name; xcb_atom_t atom; } ewmh[SWM_EWMH_HINT_MAX] = { - /* must be in same order as in the enum */ - {"_NET_ACTIVE_WINDOW", XCB_ATOM_NONE}, - {"_NET_CLOSE_WINDOW", XCB_ATOM_NONE}, - {"_NET_MOVERESIZE_WINDOW", XCB_ATOM_NONE}, - {"_NET_WM_ACTION_ABOVE", XCB_ATOM_NONE}, - {"_NET_WM_ACTION_CLOSE", XCB_ATOM_NONE}, - {"_NET_WM_ACTION_FULLSCREEN", XCB_ATOM_NONE}, - {"_NET_WM_ACTION_MOVE", XCB_ATOM_NONE}, - {"_NET_WM_ACTION_RESIZE", XCB_ATOM_NONE}, - {"_NET_WM_ALLOWED_ACTIONS", XCB_ATOM_NONE}, - {"_NET_WM_NAME", XCB_ATOM_NONE}, - {"_NET_WM_STATE", XCB_ATOM_NONE}, - {"_NET_WM_STATE_ABOVE", XCB_ATOM_NONE}, - {"_NET_WM_STATE_FULLSCREEN", XCB_ATOM_NONE}, - {"_NET_WM_STATE_HIDDEN", XCB_ATOM_NONE}, - {"_NET_WM_STATE_MAXIMIZED_HORZ", XCB_ATOM_NONE}, - {"_NET_WM_STATE_MAXIMIZED_VERT", XCB_ATOM_NONE}, - {"_NET_WM_STATE_SKIP_PAGER", XCB_ATOM_NONE}, - {"_NET_WM_STATE_SKIP_TASKBAR", XCB_ATOM_NONE}, - {"_NET_WM_WINDOW_TYPE", XCB_ATOM_NONE}, - {"_NET_WM_WINDOW_TYPE_DIALOG", XCB_ATOM_NONE}, - {"_NET_WM_WINDOW_TYPE_DOCK", XCB_ATOM_NONE}, - {"_NET_WM_WINDOW_TYPE_NORMAL", XCB_ATOM_NONE}, - {"_NET_WM_WINDOW_TYPE_SPLASH", XCB_ATOM_NONE}, - {"_NET_WM_WINDOW_TYPE_TOOLBAR", XCB_ATOM_NONE}, - {"_NET_WM_WINDOW_TYPE_UTILITY", XCB_ATOM_NONE}, - {"_SWM_WM_STATE_MANUAL", XCB_ATOM_NONE}, + /* must be in same order as in the enum */ + {"_NET_ACTIVE_WINDOW", XCB_ATOM_NONE}, + {"_NET_CLOSE_WINDOW", XCB_ATOM_NONE}, + {"_NET_MOVERESIZE_WINDOW", XCB_ATOM_NONE}, + {"_NET_WM_ACTION_ABOVE", XCB_ATOM_NONE}, + {"_NET_WM_ACTION_CLOSE", XCB_ATOM_NONE}, + {"_NET_WM_ACTION_FULLSCREEN", XCB_ATOM_NONE}, + {"_NET_WM_ACTION_MOVE", XCB_ATOM_NONE}, + {"_NET_WM_ACTION_RESIZE", XCB_ATOM_NONE}, + {"_NET_WM_ALLOWED_ACTIONS", XCB_ATOM_NONE}, + {"_NET_WM_NAME", XCB_ATOM_NONE}, + {"_NET_WM_STATE", XCB_ATOM_NONE}, + {"_NET_WM_STATE_ABOVE", XCB_ATOM_NONE}, + {"_NET_WM_STATE_FULLSCREEN", XCB_ATOM_NONE}, + {"_NET_WM_STATE_HIDDEN", XCB_ATOM_NONE}, + {"_NET_WM_STATE_MAXIMIZED_HORZ", XCB_ATOM_NONE}, + {"_NET_WM_STATE_MAXIMIZED_VERT", XCB_ATOM_NONE}, + {"_NET_WM_STATE_SKIP_PAGER", XCB_ATOM_NONE}, + {"_NET_WM_STATE_SKIP_TASKBAR", XCB_ATOM_NONE}, + {"_NET_WM_WINDOW_TYPE", XCB_ATOM_NONE}, + {"_NET_WM_WINDOW_TYPE_DIALOG", XCB_ATOM_NONE}, + {"_NET_WM_WINDOW_TYPE_DOCK", XCB_ATOM_NONE}, + {"_NET_WM_WINDOW_TYPE_NORMAL", XCB_ATOM_NONE}, + {"_NET_WM_WINDOW_TYPE_SPLASH", XCB_ATOM_NONE}, + {"_NET_WM_WINDOW_TYPE_TOOLBAR", XCB_ATOM_NONE}, + {"_NET_WM_WINDOW_TYPE_UTILITY", XCB_ATOM_NONE}, + {"_SWM_WM_STATE_MANUAL", XCB_ATOM_NONE}, }; /* Cursors */ @@ -860,242 +860,237 @@ enum keyfuncid { }; struct key { - RB_ENTRY(key) entry; - unsigned int mod; - KeySym keysym; - enum keyfuncid funcid; - char *spawn_name; + RB_ENTRY(key) entry; + unsigned int mod; + KeySym keysym; + enum keyfuncid funcid; + char *spawn_name; }; RB_HEAD(key_tree, key); /* function prototypes */ -void adjust_font(struct ws_win *); -void bar_cleanup(struct swm_region *); -void bar_extra_setup(void); -void bar_extra_stop(void); -int bar_extra_update(void); -void bar_fmt(const char *, char *, struct swm_region *, size_t); -void bar_fmt_expand(char *, size_t); -void bar_draw(void); -void bar_print(struct swm_region *, const char *); -void bar_print_legacy(struct swm_region *, const char *); -void bar_replace(char *, char *, struct swm_region *, size_t); -void bar_replace_pad(char *, int *, size_t); +void adjust_font(struct ws_win *); +char *argsep(char **); +void bar_cleanup(struct swm_region *); +void bar_extra_setup(void); +void bar_extra_stop(void); +int bar_extra_update(void); +void bar_fmt(const char *, char *, struct swm_region *, size_t); +void bar_fmt_expand(char *, size_t); +void bar_draw(void); +void bar_print(struct swm_region *, const char *); +void bar_print_legacy(struct swm_region *, const char *); +void bar_replace(char *, char *, struct swm_region *, size_t); +void bar_replace_pad(char *, int *, size_t); char *bar_replace_seq(char *, char *, struct swm_region *, size_t *, size_t); -void bar_setup(struct swm_region *); -void bar_toggle(struct swm_region *, union arg *); -void bar_urgent(char *, size_t); -void bar_window_class(char *, size_t, struct swm_region *); -void bar_window_class_instance(char *, size_t, struct swm_region *); -void bar_window_float(char *, size_t, struct swm_region *); -void bar_window_instance(char *, size_t, struct swm_region *); -void bar_window_name(char *, size_t, struct swm_region *); -void bar_workspace_name(char *, size_t, struct swm_region *); -void buttonpress(xcb_button_press_event_t *); -void check_conn(void); -void clear_keys(void); -void clientmessage(xcb_client_message_event_t *); -void client_msg(struct ws_win *, xcb_atom_t, xcb_timestamp_t); -int conf_load(const char *, int); -void configurenotify(xcb_configure_notify_event_t *); -void configurerequest(xcb_configure_request_event_t *); -void config_win(struct ws_win *, xcb_configure_request_event_t *); -void constrain_window(struct ws_win *, struct swm_geometry *, int *); -int count_win(struct workspace *, int); -void cursors_cleanup(void); -void cursors_load(void); -void custom_region(const char *); -void cyclerg(struct swm_region *, union arg *); -void cyclews(struct swm_region *, union arg *); -void cycle_layout(struct swm_region *, union arg *); -void destroynotify(xcb_destroy_notify_event_t *); -void dumpwins(struct swm_region *, union arg *); -int enable_wm(void); -void enternotify(xcb_enter_notify_event_t *); -void event_drain(uint8_t); -void event_error(xcb_generic_error_t *); -void event_handle(xcb_generic_event_t *); -void ewmh_autoquirk(struct ws_win *); -void ewmh_get_win_state(struct ws_win *); -int ewmh_set_win_fullscreen(struct ws_win *, int); -void ewmh_update_actions(struct ws_win *); -void ewmh_update_win_state(struct ws_win *, xcb_atom_t, long); +void bar_setup(struct swm_region *); +void bar_toggle(struct swm_region *, union arg *); +void bar_urgent(char *, size_t); +void bar_window_class(char *, size_t, struct swm_region *); +void bar_window_class_instance(char *, size_t, struct swm_region *); +void bar_window_float(char *, size_t, struct swm_region *); +void bar_window_instance(char *, size_t, struct swm_region *); +void bar_window_name(char *, size_t, struct swm_region *); +void bar_workspace_name(char *, size_t, struct swm_region *); +void buttonpress(xcb_button_press_event_t *); +void check_conn(void); +void clear_keys(void); +void clientmessage(xcb_client_message_event_t *); +void client_msg(struct ws_win *, xcb_atom_t, xcb_timestamp_t); +int conf_load(const char *, int); +void configurenotify(xcb_configure_notify_event_t *); +void configurerequest(xcb_configure_request_event_t *); +void config_win(struct ws_win *, xcb_configure_request_event_t *); +void constrain_window(struct ws_win *, struct swm_geometry *, int *); +int count_win(struct workspace *, int); +void cursors_cleanup(void); +void cursors_load(void); +void custom_region(const char *); +void cyclerg(struct swm_region *, union arg *); +void cyclews(struct swm_region *, union arg *); +void cycle_layout(struct swm_region *, union arg *); +void destroynotify(xcb_destroy_notify_event_t *); +void dumpwins(struct swm_region *, union arg *); +int enable_wm(void); +void enternotify(xcb_enter_notify_event_t *); +void event_drain(uint8_t); +void event_error(xcb_generic_error_t *); +void event_handle(xcb_generic_event_t *); +void ewmh_autoquirk(struct ws_win *); +void ewmh_get_win_state(struct ws_win *); +int ewmh_set_win_fullscreen(struct ws_win *, int); +void ewmh_update_actions(struct ws_win *); +void ewmh_update_win_state(struct ws_win *, xcb_atom_t, long); char *expand_tilde(const char *); -void expose(xcb_expose_event_t *); -void fake_keypress(struct ws_win *, xcb_keysym_t, uint16_t); +void expose(xcb_expose_event_t *); +void fake_keypress(struct ws_win *, xcb_keysym_t, uint16_t); +void floating_toggle(struct swm_region *, union arg *); +int floating_toggle_win(struct ws_win *); +void focus(struct swm_region *, union arg *); +void focus_flush(void); +void focus_region(struct swm_region *); +void focusrg(struct swm_region *, union arg *); +void focus_win(struct ws_win *); +void fontset_init(void); +void free_window(struct ws_win *); +void search_do_resp(void); +void search_resp_name_workspace(const char *, size_t); +void search_resp_search_window(const char *); +void search_resp_search_workspace(const char *); +void search_resp_uniconify(const char *, size_t); +void search_win(struct swm_region *, union arg *); +void search_win_cleanup(void); +void search_workspace(struct swm_region *, union arg *); +void send_to_rg(struct swm_region *, union arg *); +void send_to_ws(struct swm_region *, union arg *); +void set_region(struct swm_region *); +int setautorun(const char *, const char *, int); +int setconfbinding(const char *, const char *, int); +int setconfcolor(const char *, const char *, int); +int setconfmodkey(const char *, const char *, int); +int setconfquirk(const char *, const char *, int); +int setconfregion(const char *, const char *, int); +int setconfspawn(const char *, const char *, int); +int setconfvalue(const char *, const char *, int); +void setkeybinding(unsigned int, KeySym, enum keyfuncid, const char *); +int setkeymapping(const char *, const char *, int); +int setlayout(const char *, const char *, int); +void setquirk(const char *, const char *, const char *,unsigned long); +void setscreencolor(const char *, int, int); +void setspawn(const char *, const char *, int); +void setup_ewmh(void); +void setup_globals(void); +void setup_keys(void); +void setup_quirks(void); +void setup_screens(void); +void setup_spawn(void); +void set_child_transient(struct ws_win *, xcb_window_t *); +void set_swm_iconic(struct ws_win *, int); +void set_win_state(struct ws_win *, uint16_t); +void shutdown_cleanup(void); +void sighdlr(int); +void socket_setnonblock(int); +void sort_windows(struct ws_win_list *); +void spawn(int, union arg *, int); +void spawn_custom(struct swm_region *, union arg *, const char *); +int spawn_expand(struct swm_region *, union arg *, const char *, char ***); +void spawn_insert(const char *, const char *, int); +int32_t get_swm_iconic(struct ws_win *); +char *get_win_name(xcb_window_t); +void get_wm_protocols(struct ws_win *); +int get_ws_idx(xcb_window_t); +void grabbuttons(struct ws_win *); +void grabkeys(void); +void grab_windows(void); +void iconify(struct swm_region *, union arg *); +int isxlfd(char *); +void keypress(xcb_key_press_event_t *); +int key_cmp(struct key *, struct key *); +void key_insert(unsigned int, KeySym, enum keyfuncid, const char *); +void key_remove(struct key *); +void key_replace(struct key *, unsigned int, KeySym, enum keyfuncid, + const char *); +void kill_bar_extra_atexit(void); +void kill_refs(struct ws_win *); +void load_float_geom(struct ws_win *); +void map_window(struct ws_win *, xcb_window_t); +void mapnotify(xcb_map_notify_event_t *); +void mappingnotify(xcb_mapping_notify_event_t *); +void maprequest(xcb_map_request_event_t *); +void motionnotify(xcb_motion_notify_event_t *); +void move(struct ws_win *, union arg *); +void move_step(struct swm_region *, union arg *); +uint32_t name_to_pixel(int, const char *); +void name_workspace(struct swm_region *, union arg *); +void new_region(struct swm_screen *, int, int, int, int); +int parsekeys(const char *, unsigned int, unsigned int *, KeySym *); +int parsequirks(const char *, unsigned long *); +int parse_rgb(const char *, uint16_t *, uint16_t *, uint16_t *); +void pressbutton(struct swm_region *, union arg *); +void priorws(struct swm_region *, union arg *); +void propertynotify(xcb_property_notify_event_t *); +void quirk_free(struct quirk *); +void quirk_insert(const char *, const char *, const char *,unsigned long); +void quirk_remove(struct quirk *); +void quirk_replace(struct quirk *, const char *, const char *, const char *, + unsigned long); +void quit(struct swm_region *, union arg *); +void raise_toggle(struct swm_region *, union arg *); +void region_containment(struct ws_win *, struct swm_region *, int); +void regionize(struct ws_win *, int, int); +void resize(struct ws_win *, union arg *); +void resize_step(struct swm_region *, union arg *); +void restart(struct swm_region *, union arg *); +void screenchange(xcb_randr_screen_change_notify_event_t *); +void scan_xrandr(int); +void spawn_remove(struct spawn_prog *); +void spawn_replace(struct spawn_prog *, const char *, const char *, int); +void spawn_select(struct swm_region *, union arg *, const char *, int *); +void stack_config(struct swm_region *, union arg *); +void stack_floater(struct ws_win *, struct swm_region *); +void stack_master(struct workspace *, struct swm_geometry *, int, int); +void store_float_geom(struct ws_win *); +char *strdupsafe(const char *); +void swapwin(struct swm_region *, union arg *); +void switchws(struct swm_region *, union arg *); +void teardown_ewmh(void); +void unescape_selector(char *); +void unfocus_win(struct ws_win *); +void uniconify(struct swm_region *, union arg *); +void unmanage_window(struct ws_win *); +void unmapnotify(xcb_unmap_notify_event_t *); +void unmap_all(void); +void unmap_window(struct ws_win *); +void updatenumlockmask(void); +void update_modkey(unsigned int); +void update_window(struct ws_win *); +void validate_spawns(void); +int validate_win(struct ws_win *); +int validate_ws(struct workspace *); +void version(struct swm_region *, union arg *); +void win_to_ws(struct ws_win *, int, int); +pid_t window_get_pid(xcb_window_t); +void wkill(struct swm_region *, union arg *); +void workaround(void); +void xft_init(struct swm_region *); +void _add_startup_exception(const char *, va_list); +void add_startup_exception(const char *, ...); +#ifdef SWM_DEBUG +void focusin(xcb_focus_in_event_t *); +void focusout(xcb_focus_out_event_t *); +void leavenotify(xcb_leave_notify_event_t *); +void print_win_geom(xcb_window_t); +#endif + struct pid_e *find_pid(pid_t); struct ws_win *find_unmanaged_window(xcb_window_t); struct ws_win *find_window(xcb_window_t); -void floating_toggle(struct swm_region *, union arg *); -int floating_toggle_win(struct ws_win *); -void focus(struct swm_region *, union arg *); -#ifdef SWM_DEBUG -void focusin(xcb_focus_in_event_t *); -void focusout(xcb_focus_out_event_t *); -#endif -void focus_flush(void); -void focus_region(struct swm_region *); -void focusrg(struct swm_region *, union arg *); -void focus_win(struct ws_win *); -void fontset_init(void); -void free_window(struct ws_win *); -xcb_atom_t get_atom_from_string(const char *); -#ifdef SWM_DEBUG -char *get_atom_name(xcb_atom_t); -#endif -struct ws_win *get_focus_magic(struct ws_win *); -struct ws_win *get_focus_prev(struct ws_win *); -#ifdef SWM_DEBUG -char *get_notify_detail_label(uint8_t); -char *get_notify_mode_label(uint8_t); -#endif +struct ws_win *get_focus_magic(struct ws_win *); +struct ws_win *get_focus_prev(struct ws_win *); struct ws_win *get_pointer_win(xcb_window_t); struct ws_win *get_region_focus(struct swm_region *); -int get_region_index(struct swm_region *); +struct ws_win *manage_window(xcb_window_t, uint16_t); +int get_region_index(struct swm_region *); +xcb_atom_t get_atom_from_string(const char *); xcb_screen_t *get_screen(int); -xcb_window_t get_sibling(struct ws_win *, int); -int get_screen_count(void); -#ifdef SWM_DEBUG -char *get_stack_mode_name(uint8_t); -#endif -int32_t get_swm_iconic(struct ws_win *); -char *get_win_name(xcb_window_t); -void get_wm_protocols(struct ws_win *); -int get_ws_idx(xcb_window_t); -uint32_t getstate(xcb_window_t); -void grabbuttons(struct ws_win *); -void grabkeys(void); -void grab_windows(void); -void iconify(struct swm_region *, union arg *); -int isxlfd(char *); -void keypress(xcb_key_press_event_t *); -int key_cmp(struct key *, struct key *); -void key_insert(unsigned int, KeySym, enum keyfuncid, const char *); +xcb_window_t get_sibling(struct ws_win *, int); +int get_screen_count(void); +uint32_t getstate(xcb_window_t); struct key *key_lookup(unsigned int, KeySym); -void key_remove(struct key *); -void key_replace(struct key *, unsigned int, KeySym, enum keyfuncid, - const char *); -void kill_bar_extra_atexit(void); -void kill_refs(struct ws_win *); #ifdef SWM_DEBUG -void leavenotify(xcb_leave_notify_event_t *); +char *get_atom_name(xcb_atom_t); +char *get_notify_detail_label(uint8_t); +char *get_notify_mode_label(uint8_t); +char *get_stack_mode_name(uint8_t); #endif -void load_float_geom(struct ws_win *); -struct ws_win *manage_window(xcb_window_t, uint16_t); -void map_window(struct ws_win *, xcb_window_t); -void mapnotify(xcb_map_notify_event_t *); -void mappingnotify(xcb_mapping_notify_event_t *); -void maprequest(xcb_map_request_event_t *); -void motionnotify(xcb_motion_notify_event_t *); -void move(struct ws_win *, union arg *); -void move_step(struct swm_region *, union arg *); -uint32_t name_to_pixel(int, const char *); -void name_workspace(struct swm_region *, union arg *); -void new_region(struct swm_screen *, int, int, int, int); -int parsekeys(const char *, unsigned int, unsigned int *, KeySym *); -int parsequirks(const char *, unsigned long *); -int parse_rgb(const char *, uint16_t *, uint16_t *, uint16_t *); -void pressbutton(struct swm_region *, union arg *); -void priorws(struct swm_region *, union arg *); -#ifdef SWM_DEBUG -void print_win_geom(xcb_window_t); -#endif -void propertynotify(xcb_property_notify_event_t *); -void quirk_free(struct quirk *); -void quirk_insert(const char *, const char *, const char *,unsigned long); -void quirk_remove(struct quirk *); -void quirk_replace(struct quirk *, const char *, const char *, const char *, - unsigned long); -void quit(struct swm_region *, union arg *); -void raise_toggle(struct swm_region *, union arg *); -void region_containment(struct ws_win *, struct swm_region *, int); + struct swm_region *region_under(struct swm_screen *, int, int); -void regionize(struct ws_win *, int, int); -void resize(struct ws_win *, union arg *); -void resize_step(struct swm_region *, union arg *); -void restart(struct swm_region *, union arg *); struct swm_region *root_to_region(xcb_window_t, int); -void screenchange(xcb_randr_screen_change_notify_event_t *); -void scan_xrandr(int); -void search_do_resp(void); -void search_resp_name_workspace(const char *, size_t); -void search_resp_search_window(const char *); -void search_resp_search_workspace(const char *); -void search_resp_uniconify(const char *, size_t); -void search_win(struct swm_region *, union arg *); -void search_win_cleanup(void); -void search_workspace(struct swm_region *, union arg *); -void send_to_rg(struct swm_region *, union arg *); -void send_to_ws(struct swm_region *, union arg *); -void set_region(struct swm_region *); -int setautorun(const char *, const char *, int); -int setconfbinding(const char *, const char *, int); -int setconfcolor(const char *, const char *, int); -int setconfmodkey(const char *, const char *, int); -int setconfquirk(const char *, const char *, int); -int setconfregion(const char *, const char *, int); -int setconfspawn(const char *, const char *, int); -int setconfvalue(const char *, const char *, int); -void setkeybinding(unsigned int, KeySym, enum keyfuncid, const char *); -int setkeymapping(const char *, const char *, int); -int setlayout(const char *, const char *, int); -void setquirk(const char *, const char *, const char *,unsigned long); -void setscreencolor(const char *, int, int); -void setspawn(const char *, const char *, int); -void setup_ewmh(void); -void setup_globals(void); -void setup_keys(void); -void setup_quirks(void); -void setup_screens(void); -void setup_spawn(void); -void set_child_transient(struct ws_win *, xcb_window_t *); -void set_swm_iconic(struct ws_win *, int); -void set_win_state(struct ws_win *, uint16_t); -void shutdown_cleanup(void); -void sighdlr(int); -void socket_setnonblock(int); -void sort_windows(struct ws_win_list *); -void spawn(int, union arg *, int); -void spawn_custom(struct swm_region *, union arg *, const char *); -int spawn_expand(struct swm_region *, union arg *, const char *, char ***); -void spawn_insert(const char *, const char *, int); struct spawn_prog *spawn_find(const char *); -void spawn_remove(struct spawn_prog *); -void spawn_replace(struct spawn_prog *, const char *, const char *, int); -void spawn_select(struct swm_region *, union arg *, const char *, int *); -void stack_config(struct swm_region *, union arg *); -void stack_floater(struct ws_win *, struct swm_region *); -void stack_master(struct workspace *, struct swm_geometry *, int, int); -void store_float_geom(struct ws_win *); -char *strdupsafe(const char *); -void swapwin(struct swm_region *, union arg *); -void switchws(struct swm_region *, union arg *); -void teardown_ewmh(void); -void unescape_selector(char *); -void unfocus_win(struct ws_win *); -void uniconify(struct swm_region *, union arg *); -void unmanage_window(struct ws_win *); -void unmapnotify(xcb_unmap_notify_event_t *); -void unmap_all(void); -void unmap_window(struct ws_win *); -void updatenumlockmask(void); -void update_modkey(unsigned int); -void update_window(struct ws_win *); -void validate_spawns(void); -int validate_win(struct ws_win *); -int validate_ws(struct workspace *); -void version(struct swm_region *, union arg *); -void win_to_ws(struct ws_win *, int, int); -pid_t window_get_pid(xcb_window_t); -void wkill(struct swm_region *, union arg *); -void workaround(void); -void xft_init(struct swm_region *); -void _add_startup_exception(const char *, va_list); -void add_startup_exception(const char *, ...); RB_PROTOTYPE(key_tree, key, entry, key_cmp); RB_GENERATE(key_tree, key, entry, key_cmp); -struct key_tree keys; +struct key_tree keys; void cursors_load(void) @@ -1139,11 +1134,11 @@ cursors_cleanup(void) char * expand_tilde(const char *s) { - struct passwd *ppwd; - int i; + struct passwd *ppwd; + int i; long max; - char *user; - const char *sc = s; + char *user; + const char *sc = s; char *result; if (s == NULL) @@ -1476,9 +1471,9 @@ ewmh_update_actions(struct ws_win *win) ewmh[_NET_WM_ALLOWED_ACTIONS].atom, XCB_ATOM_ATOM, 32, 1, actions); } -#define _NET_WM_STATE_REMOVE 0 /* remove/unset property */ -#define _NET_WM_STATE_ADD 1 /* add/set property */ -#define _NET_WM_STATE_TOGGLE 2 /* toggle property */ +#define _NET_WM_STATE_REMOVE 0 /* remove/unset property */ +#define _NET_WM_STATE_ADD 1 /* add/set property */ +#define _NET_WM_STATE_TOGGLE 2 /* toggle property */ void ewmh_update_win_state(struct ws_win *win, xcb_atom_t state, long action) @@ -1913,12 +1908,12 @@ bar_print_legacy(struct swm_region *r, const char *s) void bar_print(struct swm_region *r, const char *s) { - size_t len; - xcb_rectangle_t rect; - uint32_t gcv[1]; - int32_t x = 0; - XGlyphInfo info; - XftDraw *draw; + size_t len; + xcb_rectangle_t rect; + uint32_t gcv[1]; + int32_t x = 0; + XGlyphInfo info; + XftDraw *draw; len = strlen(s); @@ -3679,7 +3674,7 @@ cyclews(struct swm_region *r, union arg *args) void priorws(struct swm_region *r, union arg *args) { - union arg a; + union arg a; (void)args; @@ -6255,24 +6250,73 @@ spawn_select(struct swm_region *r, union arg *args, const char *spawn_name, free(real_args); } +/* Argument tokenizer. */ +char * +argsep(char **sp) { + int single_quoted = 0, double_quoted = 0; + char *arg, *cp, *next; + + if (*sp == NULL) + return NULL; + + /* Eat and move characters until end of argument is found. */ + for (arg = next = cp = *sp; *cp != '\0'; ++cp) { + if (!double_quoted && *cp == '\'') { + /* Eat single-quote. */ + single_quoted = !single_quoted; + } else if (!single_quoted && *cp == '"') { + /* Eat double-quote. */ + double_quoted = !double_quoted; + } else if (!single_quoted && *cp == '\\' && *(cp + 1) == '"') { + /* Eat backslash; copy escaped character to arg. */ + *next++ = *(++cp); + } else if (!single_quoted && !double_quoted && *cp == '\\' && + (*(cp + 1) == '\'' || *(cp + 1) == ' ')) { + /* Eat backslash; move escaped character. */ + *next++ = *(++cp); + } else if (!single_quoted && !double_quoted && + (*cp == ' ' || *cp == '\t')) { + /* Terminate argument. */ + *next++ = '\0'; + /* Point sp to beginning of next argument. */ + *sp = ++cp; + break; + } else { + /* Move regular character. */ + *next++ = *cp; + } + } + + /* Terminate argument if end of string. */ + if (*cp == '\0') { + *next = '\0'; + *sp = NULL; + } + + return arg; +} + void spawn_insert(const char *name, const char *args, int flags) { - char *arg, *cp, *ptr; struct spawn_prog *sp; + char *arg, *dup, *ptr; - DNPRINTF(SWM_D_SPAWN, "spawn_insert: %s\n", name); + DNPRINTF(SWM_D_SPAWN, "spawn_insert: %s[%s]\n", name, args); + + if (args == NULL || *args == '\0') + return; if ((sp = calloc(1, sizeof *sp)) == NULL) err(1, "spawn_insert: calloc"); if ((sp->name = strdup(name)) == NULL) err(1, "spawn_insert: strdup"); - /* convert the arguments to an argument list */ - if ((ptr = cp = strdup(args)) == NULL) + /* Convert the arguments to an argument list. */ + if ((ptr = dup = strdup(args)) == NULL) err(1, "spawn_insert: strdup"); - while ((arg = strsep(&ptr, " \t")) != NULL) { - /* empty field; skip it */ + while ((arg = argsep(&ptr)) != NULL) { + /* Null argument; skip it. */ if (*arg == '\0') continue; @@ -6283,10 +6327,11 @@ spawn_insert(const char *name, const char *args, int flags) if ((sp->argv[sp->argc - 1] = strdup(arg)) == NULL) err(1, "spawn_insert: strdup"); } - free(cp); + free(dup); sp->flags = flags; + DNPRINTF(SWM_D_SPAWN, "arg %d: [%s]\n", sp->argc, sp->argv[sp->argc-1]); TAILQ_INSERT_TAIL(&spawns, sp, entry); DNPRINTF(SWM_D_SPAWN, "spawn_insert: leave\n"); } @@ -6347,6 +6392,9 @@ setconfspawn(const char *selector, const char *value, int flags) { char *args; + if (selector == NULL || strlen(selector) == 0) + return (1); + args = expand_tilde(value); DNPRINTF(SWM_D_SPAWN, "setconfspawn: [%s] [%s]\n", selector, args); @@ -6595,8 +6643,9 @@ setconfbinding(const char *selector, const char *value, int flags) /* suppress unused warning since var is needed */ (void)flags; - DNPRINTF(SWM_D_KEY, "setconfbinding: enter\n"); - if (selector == NULL) { + DNPRINTF(SWM_D_KEY, "setconfbinding: enter selector: [%s], " + "value: [%s]\n", selector, value); + if (selector == NULL || strlen(selector) == 0) { DNPRINTF(SWM_D_KEY, "setconfbinding: unbind %s\n", value); if (parsekeys(value, mod_key, &mod, &ks) == 0) { kfid = KF_INVALID; @@ -6818,9 +6867,11 @@ updatenumlockmask(void) + j]; keycode = xcb_key_symbols_get_keycode(syms, XK_Num_Lock); - if (kc == *keycode) - numlockmask = (1 << i); - free(keycode); + if (keycode) { + if (kc == *keycode) + numlockmask = (1 << i); + free(keycode); + } } } free(modmap_r); @@ -7111,7 +7162,7 @@ setconfquirk(const char *selector, const char *value, int flags) /* suppress unused warning since var is needed */ (void)flags; - if (selector == NULL) + if (selector == NULL || strlen(selector) == 0) return (0); if ((str = strdup(selector)) == NULL) @@ -7224,9 +7275,6 @@ setconfvalue(const char *selector, const char *value, int flags) int i, ws_id, num_screens; char *b, *str; - /* suppress unused warning since var is needed */ - (void)selector; - switch (flags) { case SWM_S_BAR_ACTION: free(bar_argv[0]); @@ -7466,7 +7514,9 @@ setconfmodkey(const char *selector, const char *value, int flags) int setconfcolor(const char *selector, const char *value, int flags) { - setscreencolor(value, ((selector == NULL)?-1:atoi(selector)), flags); + setscreencolor(value, + (selector == NULL || strlen(selector) == 0) ? -1 : atoi(selector), + flags); return (0); } @@ -7979,7 +8029,7 @@ manage_window(xcb_window_t id, uint16_t mapped) struct ws_win *win, *ww; int ws_idx; char ws_idx_str[SWM_PROPLEN]; - char *name; + char *class, *instance, *name; struct swm_region *r; struct pid_e *p; struct quirk *qp; @@ -8105,40 +8155,38 @@ manage_window(xcb_window_t id, uint16_t mapped) ewmh_autoquirk(win); /* Determine initial quirks. */ - if (xcb_icccm_get_wm_class_reply(conn, + xcb_icccm_get_wm_class_reply(conn, xcb_icccm_get_wm_class(conn, win->id), - &win->ch, NULL)) { - name = get_win_name(win->id); + &win->ch, NULL); - DNPRINTF(SWM_D_CLASS, "manage_window: class: %s, instance: %s, " - "name: %s\n", - win->ch.class_name, win->ch.instance_name, name); - - /* java is retarded so treat it special */ - if (strstr(win->ch.instance_name, "sun-awt")) { - DNPRINTF(SWM_D_CLASS, "manage_window: java window " - "detected.\n"); - win->java = 1; - } - - TAILQ_FOREACH(qp, &quirks, entry) { - if (regexec(&qp->regex_class, win->ch.class_name, 0, - NULL, 0) == 0 && regexec(&qp->regex_instance, - win->ch.instance_name, 0, NULL, 0) == 0 && - regexec(&qp->regex_name, name, 0, NULL, 0) == 0) { - DNPRINTF(SWM_D_CLASS, "manage_window: matched " - "quirk: %s:%s:%s mask: %#lx\n", qp->class, - qp->instance, qp->name, qp->quirk); - if (qp->quirk & SWM_Q_FLOAT) - win->floating = 1; - win->quirks = qp->quirk; - } + class = win->ch.class_name ? win->ch.class_name : ""; + instance = win->ch.instance_name ? win->ch.instance_name : ""; + name = get_win_name(win->id); - } + DNPRINTF(SWM_D_CLASS, "manage_window: class: %s, instance: %s, " + "name: %s\n", class, instance, name); - free(name); + /* java is retarded so treat it special */ + if (win->ch.instance_name && strstr(win->ch.instance_name, "sun-awt")) { + DNPRINTF(SWM_D_CLASS, "manage_window: java window detected.\n"); + win->java = 1; + } + + TAILQ_FOREACH(qp, &quirks, entry) { + if (regexec(&qp->regex_class, class, 0, NULL, 0) == 0 && + regexec(&qp->regex_instance, instance, 0, NULL, 0) == 0 && + regexec(&qp->regex_name, name, 0, NULL, 0) == 0) { + DNPRINTF(SWM_D_CLASS, "manage_window: matched " + "quirk: %s:%s:%s mask: %#lx\n", qp->class, + qp->instance, qp->name, qp->quirk); + if (qp->quirk & SWM_Q_FLOAT) + win->floating = 1; + win->quirks = qp->quirk; + } } + free(name); + /* Alter window position if quirky */ if (win->quirks & SWM_Q_ANYWHERE) win->manual = 1; @@ -8771,10 +8819,22 @@ mapnotify(xcb_map_notify_event_t *e) void mappingnotify(xcb_mapping_notify_event_t *e) { + struct ws_win *w; + int i, j, num_screens; + xcb_refresh_keyboard_mapping(syms, e); - if (e->request == XCB_MAPPING_KEYBOARD) + if (e->request == XCB_MAPPING_KEYBOARD) { grabkeys(); + + /* Regrab buttons on all managed windows. */ + num_screens = get_screen_count(); + for (i = 0; i < num_screens; i++) + for (j = 0; j < workspace_limit; j++) + TAILQ_FOREACH(w, &screens[i].ws[j].winlist, + entry) + grabbuttons(w); + } } void @@ -9056,7 +9116,7 @@ unmapnotify(xcb_unmap_notify_event_t *e) void clientmessage(xcb_client_message_event_t *e) { - struct ws_win *win; + struct ws_win *win; xcb_map_request_event_t mre; #ifdef SWM_DEBUG char *name; @@ -9525,10 +9585,10 @@ grab_windows(void) void setup_screens(void) { - int i, j, k, num_screens; - struct workspace *ws; - uint32_t gcv[1], wa[1]; - const xcb_query_extension_reply_t *qep; + int i, j, k, num_screens; + struct workspace *ws; + uint32_t gcv[1], wa[1]; + const xcb_query_extension_reply_t *qep; xcb_screen_t *screen; xcb_randr_query_version_cookie_t c; xcb_randr_query_version_reply_t *r; @@ -9781,7 +9841,7 @@ main(int argc, char *argv[]) int xfd, i, num_screens, startup = 1; struct sigaction sact; xcb_generic_event_t *evt; - struct timeval tv; + struct timeval tv; fd_set rd; int rd_max; int stdin_ready = 0;