X-Git-Url: https://jasonwoof.com/gitweb/?a=blobdiff_plain;f=spectrwm.c;h=993abfd52380806e6b0ecdb3b624f61b83580775;hb=09729fd71575cdd663856f441ba8671f4032feb1;hp=d7a43293f619fca2d0859739b22c5b2132a6d75c;hpb=b2b0c8fcf2e3570f88713a999dcba0db6cf51552;p=spectrwm.git diff --git a/spectrwm.c b/spectrwm.c index d7a4329..993abfd 100644 --- a/spectrwm.c +++ b/spectrwm.c @@ -699,44 +699,224 @@ struct cursors { {"top_right_corner", XC_top_right_corner, XCB_CURSOR_NONE}, }; +/* spawn */ +struct spawn_prog { + TAILQ_ENTRY(spawn_prog) entry; + char *name; + int argc; + char **argv; +}; +TAILQ_HEAD(spawn_list, spawn_prog); +struct spawn_list spawns = TAILQ_HEAD_INITIALIZER(spawns); + +/* user/key callable function IDs */ +enum keyfuncid { + 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 +}; + +struct key { + 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_class_name(char *, size_t, struct swm_region *); +void bar_class_title_name(char *, size_t, struct swm_region *); +void bar_cleanup(struct swm_region *); +void bar_extra_stop(void); +void bar_fmt(const char *, char *, struct swm_region *, size_t); +void bar_fmt_expand(char *, size_t); +void bar_fmt_print(void); +void bar_print(struct swm_region *, const char *); +void bar_print_legacy(struct swm_region *, const char *); +void bar_refresh(void); +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_signal(int); +void bar_title_name(char *, size_t, struct swm_region *); +void bar_toggle(struct swm_region *, union arg *); +void bar_update(void); +void bar_urgent(char *, size_t); +void bar_window_float(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 *); -int conf_load(char *, int); +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_region *, int); +int count_win(struct workspace *, int); +void cursors_cleanup(void); +void cursors_load(void); +void custom_region(char *); +void cyclescr(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 *); -char *expand_tilde(char *); +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); +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 *); -void focus_flush(void); -struct ws_win *get_focus_magic(struct ws_win *); -struct ws_win *get_focus_prev(struct ws_win *); -void focus_win(struct ws_win *); #ifdef SWM_DEBUG void focusin(xcb_focus_in_event_t *); +void focusout(xcb_focus_out_event_t *); #endif +void focus_flush(void); +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_pointer_win(xcb_window_t); struct ws_win *get_region_focus(struct swm_region *); xcb_screen_t *get_screen(int); +#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); +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 *); +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_refs(struct ws_win *); #ifdef SWM_DEBUG void leavenotify(xcb_leave_notify_event_t *); #endif @@ -746,18 +926,104 @@ void map_window(struct ws_win *); void mapnotify(xcb_map_notify_event_t *); void mappingnotify(xcb_mapping_notify_event_t *); void maprequest(xcb_map_request_event_t *); +void move(struct ws_win *, union arg *); +void move_step(struct swm_region *, union arg *); +uint32_t name_to_pixel(const char *); +void name_workspace(struct swm_region *, union arg *); void new_region(struct swm_screen *, int, int, int, int); +int parsekeys(char *, unsigned int, unsigned int *, KeySym *); +int parsequirks(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 spawn_select(struct swm_region *, union arg *, char *, int *); +void quirk_insert(const char *, const char *, unsigned long); +void quirk_remove(struct quirk *); +void quirk_replace(struct quirk *, const char *, const char *, + unsigned long); +void quit(struct swm_region *, union arg *); +void raise_toggle(struct swm_region *, union arg *); +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 *, unsigned long); +void search_resp_search_window(const char *); +void search_resp_search_workspace(const char *); +void search_resp_uniconify(const char *, unsigned long); +void search_win(struct swm_region *, union arg *); +void search_win_cleanup(void); +void search_workspace(struct swm_region *, union arg *); +void send_to_ws(struct swm_region *, union arg *); +int setautorun(char *, char *, int); +int setconfbinding(char *, char *, int); +int setconfcolor(char *, char *, int); +int setconfmodkey(char *, char *, int); +int setconfquirk(char *, char *, int); +int setconfregion(char *, char *, int); +int setconfspawn(char *, char *, int); +int setconfvalue(char *, char *, int); +void setkeybinding(unsigned int, KeySym, enum keyfuncid, const char *); +int setkeymapping(char *, char *, int); +int setlayout(char *, char *, int); +void setquirk(const char *, const char *, unsigned long); +void setscreencolor(char *, int, int); +void setspawn(const char *, const char *); +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 *); +void spawn_remove(struct spawn_prog *); +void spawn_replace(struct spawn_prog *, const char *, const char *); +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 *, struct swm_region *); +char * strdupsafe(const char *); +void swapwin(struct swm_region *, union arg *); +void switchws(struct swm_region *, union arg *); +void teardown_ewmh(void); +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 unfocus_win(struct ws_win *); +void unmap_all(void); +void unmap_window(struct ws_win *); +void updatenumlockmask(void); +void update_modkey(unsigned int); void update_window(struct ws_win *); +int validate_win(struct ws_win *); +int validate_ws(struct workspace *); /*void visibilitynotify(xcb_visibility_notify_event_t *);*/ +void version(struct swm_region *, union arg *); +pid_t window_get_pid(xcb_window_t); +void wkill(struct swm_region *, union arg *); +void workaround(void); +void xft_init(struct swm_region *); + +RB_PROTOTYPE(key_tree, key, entry, key_cmp); +RB_GENERATE(key_tree, key, entry, key_cmp); +struct key_tree keys; void cursors_load(void) @@ -799,7 +1065,7 @@ cursors_cleanup(void) } char * -expand_tilde(char *s) +expand_tilde(const char *s) { struct passwd *ppwd; int i, max; @@ -829,6 +1095,8 @@ expand_tilde(char *s) s = &s[i]; ppwd = strlen(user) == 0 ? getpwuid(getuid()) : getpwnam(user); + free(user); + if (ppwd == NULL) result = strdup(sc); else @@ -2049,7 +2317,7 @@ isxlfd(char *s) } void -fontset_init() +fontset_init(void) { char *default_string; char **missing_charsets; @@ -4237,7 +4505,7 @@ get_win_name(xcb_window_t win) xcb_get_property_value_length(r)); free(r); - return name; + return (name); } void @@ -4462,7 +4730,7 @@ search_win(struct swm_region *r, union arg *args) } void -search_resp_uniconify(char *resp, unsigned long len) +search_resp_uniconify(const char *resp, unsigned long len) { char *name; struct ws_win *win; @@ -4492,7 +4760,7 @@ search_resp_uniconify(char *resp, unsigned long len) } void -search_resp_name_workspace(char *resp, unsigned long len) +search_resp_name_workspace(const char *resp, unsigned long len) { struct workspace *ws; @@ -4518,7 +4786,7 @@ search_resp_name_workspace(char *resp, unsigned long len) } void -search_resp_search_workspace(char *resp) +search_resp_search_workspace(const char *resp) { char *p, *q; int ws_idx; @@ -4549,7 +4817,7 @@ search_resp_search_workspace(char *resp) } void -search_resp_search_window(char *resp) +search_resp_search_window(const char *resp) { char *s; int idx; @@ -4783,7 +5051,7 @@ resize(struct ws_win *win, union arg *args) { xcb_timestamp_t timestamp = 0; struct swm_region *r = NULL; - int resize_step = 0; + int resize_stp = 0; struct swm_geometry g; int top = 0, left = 0, resizing; int dx, dy; @@ -4821,24 +5089,24 @@ resize(struct ws_win *win, union arg *args) switch (args->id) { case SWM_ARG_ID_WIDTHSHRINK: WIDTH(win) -= SWM_RESIZE_STEPS; - resize_step = 1; + resize_stp = 1; break; case SWM_ARG_ID_WIDTHGROW: WIDTH(win) += SWM_RESIZE_STEPS; - resize_step = 1; + resize_stp = 1; break; case SWM_ARG_ID_HEIGHTSHRINK: HEIGHT(win) -= SWM_RESIZE_STEPS; - resize_step = 1; + resize_stp = 1; break; case SWM_ARG_ID_HEIGHTGROW: HEIGHT(win) += SWM_RESIZE_STEPS; - resize_step = 1; + resize_stp = 1; break; default: break; } - if (resize_step) { + if (resize_stp) { constrain_window(win, r, 1); update_window(win); store_float_geom(win,r); @@ -4972,7 +5240,7 @@ void move(struct ws_win *win, union arg *args) { xcb_timestamp_t timestamp = 0; - int move_step = 0, moving; + int move_stp = 0, moving; struct swm_region *r = NULL; xcb_query_pointer_reply_t *qpr; xcb_generic_event_t *evt; @@ -5005,28 +5273,28 @@ move(struct ws_win *win, union arg *args) focus_flush(); - move_step = 0; + move_stp = 0; switch (args->id) { case SWM_ARG_ID_MOVELEFT: X(win) -= (SWM_MOVE_STEPS - border_width); - move_step = 1; + move_stp = 1; break; case SWM_ARG_ID_MOVERIGHT: X(win) += (SWM_MOVE_STEPS - border_width); - move_step = 1; + move_stp = 1; break; case SWM_ARG_ID_MOVEUP: Y(win) -= (SWM_MOVE_STEPS - border_width); - move_step = 1; + move_stp = 1; break; case SWM_ARG_ID_MOVEDOWN: Y(win) += (SWM_MOVE_STEPS - border_width); - move_step = 1; + move_stp = 1; break; default: break; } - if (move_step) { + if (move_stp) { constrain_window(win, r, 0); update_window(win); store_float_geom(win, r); @@ -5100,101 +5368,6 @@ move_step(struct swm_region *r, union arg *args) focus_flush(); } -/* user/key callable function IDs */ -enum keyfuncid { - 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 */ struct keyfunc { char name[SWM_FUNCNAME_LEN]; @@ -5294,14 +5467,6 @@ struct keyfunc { { "dumpwins", dumpwins, {0} }, /* MUST BE LAST */ { "invalid key func", NULL, {0} }, }; -struct key { - RB_ENTRY(key) entry; - unsigned int mod; - KeySym keysym; - enum keyfuncid funcid; - char *spawn_name; -}; -RB_HEAD(key_tree, key); int key_cmp(struct key *kp1, struct key *kp2) @@ -5319,9 +5484,6 @@ key_cmp(struct key *kp1, struct key *kp2) return (0); } -RB_GENERATE(key_tree, key, entry, key_cmp); -struct key_tree keys; - /* mouse */ enum { client_click, root_click }; struct button { @@ -5359,18 +5521,8 @@ update_modkey(unsigned int mod) buttons[i].mask = mod; } -/* spawn */ -struct spawn_prog { - TAILQ_ENTRY(spawn_prog) entry; - char *name; - int argc; - char **argv; -}; -TAILQ_HEAD(spawn_list, spawn_prog); -struct spawn_list spawns = TAILQ_HEAD_INITIALIZER(spawns); - int -spawn_expand(struct swm_region *r, union arg *args, char *spawn_name, +spawn_expand(struct swm_region *r, union arg *args, const char *spawn_name, char ***ret_args) { struct spawn_prog *prog = NULL; @@ -5449,7 +5601,7 @@ spawn_expand(struct swm_region *r, union arg *args, char *spawn_name, } void -spawn_custom(struct swm_region *r, union arg *args, char *spawn_name) +spawn_custom(struct swm_region *r, union arg *args, const char *spawn_name) { union arg a; char **real_args; @@ -5467,7 +5619,8 @@ spawn_custom(struct swm_region *r, union arg *args, char *spawn_name) } void -spawn_select(struct swm_region *r, union arg *args, char *spawn_name, int *pid) +spawn_select(struct swm_region *r, union arg *args, const char *spawn_name, + int *pid) { union arg a; char **real_args; @@ -5509,7 +5662,7 @@ spawn_select(struct swm_region *r, union arg *args, char *spawn_name, int *pid) } void -spawn_insert(char *name, char *args) +spawn_insert(const char *name, const char *args) { char *arg, *cp, *ptr; struct spawn_prog *sp; @@ -5560,7 +5713,7 @@ spawn_remove(struct spawn_prog *sp) } void -spawn_replace(struct spawn_prog *sp, char *name, char *args) +spawn_replace(struct spawn_prog *sp, const char *name, const char *args) { DNPRINTF(SWM_D_SPAWN, "spawn_replace: %s [%s]\n", sp->name, name); @@ -5571,7 +5724,7 @@ spawn_replace(struct spawn_prog *sp, char *name, char *args) } void -setspawn(char *name, char *args) +setspawn(const char *name, const char *args) { struct spawn_prog *sp; @@ -5703,7 +5856,7 @@ parsekeys(char *keystr, unsigned int currmod, unsigned int *mod, KeySym *ks) } char * -strdupsafe(char *str) +strdupsafe(const char *str) { if (str == NULL) return (NULL); @@ -5712,7 +5865,8 @@ strdupsafe(char *str) } void -key_insert(unsigned int mod, KeySym ks, enum keyfuncid kfid, char *spawn_name) +key_insert(unsigned int mod, KeySym ks, enum keyfuncid kfid, + const char *spawn_name) { struct key *kp; @@ -5756,7 +5910,7 @@ key_remove(struct key *kp) void key_replace(struct key *kp, unsigned int mod, KeySym ks, enum keyfuncid kfid, - char *spawn_name) + const char *spawn_name) { DNPRINTF(SWM_D_KEY, "key_replace: %s [%s]\n", keyfuncs[kp->funcid].name, spawn_name); @@ -5769,7 +5923,7 @@ key_replace(struct key *kp, unsigned int mod, KeySym ks, enum keyfuncid kfid, void setkeybinding(unsigned int mod, KeySym ks, enum keyfuncid kfid, - char *spawn_name) + const char *spawn_name) { struct key *kp; @@ -6171,6 +6325,7 @@ setquirk(const char *class, const char *name, unsigned long quirk) DNPRINTF(SWM_D_QUIRK, "setquirk: enter %s:%s [%lu]\n", class, name, quirk); + /* Remove/replace existing quirk. */ TAILQ_FOREACH(qp, &quirks, entry) { if (!strcmp(qp->class, class) && !strcmp(qp->name, name)) { if (!quirk) @@ -6181,12 +6336,11 @@ setquirk(const char *class, const char *name, unsigned long quirk) return; } } - if (!quirk) { - warnx("error: setquirk: cannot find class/name combination"); - return; - } - quirk_insert(class, name, quirk); + /* Only insert if quirk is not NONE. */ + if (quirk) + quirk_insert(class, name, quirk); + DNPRINTF(SWM_D_QUIRK, "setquirk: leave\n"); } @@ -6502,7 +6656,7 @@ setautorun(char *selector, char *value, int flags) { int ws_id; char s[1024]; - char *ap, *sp = s; + char *ap, *sp; union arg a; int argc = 0; pid_t pid; @@ -6522,6 +6676,8 @@ setautorun(char *selector, char *value, int flags) if (ws_id < 0 || ws_id >= workspace_limit) errx(1, "autorun: invalid workspace %d", ws_id + 1); + sp = expand_tilde((char *)&s); + /* * This is a little intricate * @@ -6539,6 +6695,7 @@ setautorun(char *selector, char *value, int flags) err(1, "setautorun: realloc"); a.argv[argc - 1] = ap; } + free(sp); if ((a.argv = realloc(a.argv, (argc + 1) * sizeof(char *))) == NULL) err(1, "setautorun: realloc"); @@ -6705,7 +6862,7 @@ struct config_option configopt[] = { }; int -conf_load(char *filename, int keymapping) +conf_load(const char *filename, int keymapping) { FILE *config; char *line, *cp, *optsub, *optval; @@ -8170,6 +8327,8 @@ scan_xrandr(int i) xcb_randr_crtc_t *crtc; xcb_screen_t *screen; + DNPRINTF(SWM_D_MISC, "scan_xrandr: screen: %d\n", i); + if ((screen = get_screen(i)) == NULL) errx(1, "ERROR: can't get screen %d.", i); @@ -8197,7 +8356,7 @@ scan_xrandr(int i) new_region(&screens[i], 0, 0, screen->width_in_pixels, screen->height_in_pixels); - return; + goto out; } else ncrtc = srr->num_crtcs; @@ -8223,12 +8382,16 @@ scan_xrandr(int i) free(cir); } free(srr); - } else + } #endif /* SWM_XRR_HAS_CRTC */ - { + + /* If detection failed, create a single region that spans the screen. */ + if (TAILQ_EMPTY(&screens[i].rl)) new_region(&screens[i], 0, 0, screen->width_in_pixels, screen->height_in_pixels); - } + +out: + DNPRINTF(SWM_D_MISC, "scan_xrandr: done.\n"); } void @@ -8333,7 +8496,6 @@ grab_windows(void) free(r); continue; } - free(r); state = getstate(wins[j]); manage = state != XCB_ICCCM_WM_STATE_WITHDRAWN; @@ -8342,6 +8504,7 @@ grab_windows(void) if (xcb_icccm_get_wm_transient_for_reply(conn, pc, &trans, NULL) && manage) manage_window(wins[j], mapped); + free(r); } free(qtr); }