]> code.delx.au - spectrwm/blobdiff - spectrwm.c
print_win_geom is SWM_DEBUG only
[spectrwm] / spectrwm.c
index f92cbf07a7c44cd1c164381d13a425b4148af291..f9974421deac6447e9dfa905342f3068eaab12f5 100644 (file)
@@ -699,44 +699,114 @@ 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);
+
 /* 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 *);
+void    kill_refs(struct ws_win *);
 #ifdef SWM_DEBUG
 void    leavenotify(xcb_leave_notify_event_t *);
 #endif
@@ -746,18 +816,99 @@ 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);
+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 *);
 
 void
 cursors_load(void)
@@ -799,7 +950,7 @@ cursors_cleanup(void)
 }
 
 char *
-expand_tilde(char *s)
+expand_tilde(const char *s)
 {
        struct passwd           *ppwd;
        int                     i, max;
@@ -2051,7 +2202,7 @@ isxlfd(char *s)
 }
 
 void
-fontset_init()
+fontset_init(void)
 {
        char                    *default_string;
        char                    **missing_charsets;
@@ -4239,7 +4390,7 @@ get_win_name(xcb_window_t win)
                    xcb_get_property_value_length(r));
 
        free(r);
-       return name;
+       return (name);
 }
 
 void
@@ -4464,7 +4615,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;
@@ -4494,7 +4645,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;
 
@@ -4520,7 +4671,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;
@@ -4551,7 +4702,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;
@@ -5361,18 +5512,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;
@@ -5451,7 +5592,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;
@@ -5469,7 +5610,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;
@@ -5511,7 +5653,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;
@@ -5562,7 +5704,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);
 
@@ -5573,7 +5715,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;
 
@@ -5705,7 +5847,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);
@@ -5714,7 +5856,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;
 
@@ -5758,7 +5901,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);
@@ -5771,7 +5914,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;
 
@@ -6504,7 +6647,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;
@@ -6524,6 +6667,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
         *
@@ -6541,6 +6686,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");
@@ -6707,7 +6853,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;
@@ -8172,6 +8318,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);
 
@@ -8199,7 +8347,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;
 
@@ -8225,12 +8373,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