]> code.delx.au - spectrwm/commitdiff
Add get_screen_count function that handles the result of xcb_get_setup.
authorReginald Kennedy <rk@rejii.com>
Wed, 19 Dec 2012 04:47:45 +0000 (12:47 +0800)
committerReginald Kennedy <rk@rejii.com>
Thu, 20 Dec 2012 03:56:51 +0000 (11:56 +0800)
spectrwm.c

index 059c2ac5182ab271ca5d3a6f71feca0b7fed9b5c..a47f3b0e496e4c2cb29ae72cc674dd048bfbc709 100644 (file)
@@ -932,6 +932,7 @@ 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 *);
 xcb_screen_t   *get_screen(int);
+int     get_screen_count(void);
 #ifdef SWM_DEBUG
 char   *get_stack_mode_name(uint8_t);
 #endif
@@ -965,7 +966,7 @@ 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(const char *);
+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(char *, unsigned int, unsigned int *, KeySym *);
@@ -1186,6 +1187,19 @@ get_screen(int screen)
        return (NULL);
 }
 
+int
+get_screen_count(void)
+{
+       const xcb_setup_t       *r;
+
+       if ((r = xcb_get_setup(conn)) == NULL) {
+               DNPRINTF(SWM_D_MISC, "get_screen_count: xcb_get_setup\n");
+               check_conn();
+       }
+
+       return xcb_setup_roots_length(r);
+}
+
 int
 get_region_index(struct swm_region *r)
 {
@@ -1280,7 +1294,7 @@ setup_ewmh(void)
        for (i = 0; i < LENGTH(ewmh); i++)
                ewmh[i].atom = get_atom_from_string(ewmh[i].name);
 
-       num_screens = xcb_setup_roots_length(xcb_get_setup(conn));
+       num_screens = get_screen_count();
        for (i = 0; i < num_screens; i++) {
                /* Support check window will be created by workaround(). */
 
@@ -1304,7 +1318,7 @@ teardown_ewmh(void)
 
        sup_check = get_atom_from_string("_NET_SUPPORTING_WM_CHECK");
        sup_list = get_atom_from_string("_NET_SUPPORTED");
-       num_screens = xcb_setup_roots_length(xcb_get_setup(conn));
+       num_screens = get_screen_count();
 
        for (i = 0; i < num_screens; i++) {
                /* Get the support check window and destroy it */
@@ -1653,7 +1667,7 @@ find_pid(pid_t pid)
 }
 
 uint32_t
-name_to_pixel(const char *colorname)
+name_to_pixel(int sidx, const char *colorname)
 {
        uint32_t                        result = 0;
        char                            cname[32] = "#";
@@ -1663,7 +1677,7 @@ name_to_pixel(const char *colorname)
        xcb_alloc_named_color_reply_t   *nr;
        uint16_t                        rr, gg, bb;
 
-       screen = xcb_setup_roots_iterator(xcb_get_setup(conn)).data;
+       screen = get_screen(sidx);
        cmap = screen->default_colormap;
 
        /* color is in format rgb://rr/gg/bb */
@@ -1705,15 +1719,15 @@ setscreencolor(char *val, int i, int c)
 {
        int     num_screens;
 
-       num_screens = xcb_setup_roots_length(xcb_get_setup(conn));
+       num_screens = get_screen_count();
        if (i > 0 && i <= num_screens) {
-               screens[i - 1].c[c].pixel = name_to_pixel(val);
+               screens[i - 1].c[c].pixel = name_to_pixel(i - 1, val);
                free(screens[i - 1].c[c].name);
                if ((screens[i - 1].c[c].name = strdup(val)) == NULL)
                        err(1, "strdup");
        } else if (i == -1) {
                for (i = 0; i < num_screens; i++) {
-                       screens[i].c[c].pixel = name_to_pixel(val);
+                       screens[i].c[c].pixel = name_to_pixel(0, val);
                        free(screens[i].c[c].name);
                        if ((screens[i].c[c].name = strdup(val)) == NULL)
                                err(1, "strdup");
@@ -1756,7 +1770,7 @@ custom_region(char *val)
        int                             sidx, num_screens;
        xcb_screen_t                    *screen;
 
-       num_screens = xcb_setup_roots_length(xcb_get_setup(conn));
+       num_screens = get_screen_count();
        if (sscanf(val, "screen[%d]:%ux%u+%u+%u", &sidx, &w, &h, &x, &y) != 5)
                errx(1, "invalid custom region, "
                    "should be 'screen[<n>]:<n>x<n>+<n>+<n>");
@@ -1984,7 +1998,7 @@ bar_urgent(char *s, size_t sz)
        for (i = 0; i < workspace_limit; i++)
                urgent[i] = 0;
 
-       num_screens = xcb_setup_roots_length(xcb_get_setup(conn));
+       num_screens = get_screen_count();
        for (i = 0; i < num_screens; i++)
                for (j = 0; j < workspace_limit; j++)
                        TAILQ_FOREACH(win, &screens[i].ws[j].winlist, entry) {
@@ -2234,7 +2248,7 @@ bar_draw(void)
        /* expand the format by first passing it through strftime(3) */
        bar_fmt_expand(fmtexp, sizeof fmtexp);
 
-       num_screens = xcb_setup_roots_length(xcb_get_setup(conn));
+       num_screens = get_screen_count();
        for (i = 0; i < num_screens; i++) {
                TAILQ_FOREACH(r, &screens[i].rl, entry) {
                        if (r->bar == NULL)
@@ -2338,7 +2352,7 @@ bar_toggle(struct swm_region *r, union arg *args)
        }
 
        /* update bars as necessary */
-       num_screens = xcb_setup_roots_length(xcb_get_setup(conn));
+       num_screens = get_screen_count();
        for (i = 0; i < num_screens; i++)
                TAILQ_FOREACH(tmpr, &screens[i].rl, entry)
                        if (tmpr->bar) {
@@ -2823,7 +2837,7 @@ unmap_all(void)
        struct ws_win           *win;
        int                     i, j, num_screens;
 
-       num_screens = xcb_setup_roots_length(xcb_get_setup(conn));
+       num_screens = get_screen_count();
        for (i = 0; i < num_screens; i++)
                for (j = 0; j < workspace_limit; j++)
                        TAILQ_FOREACH(win, &screens[i].ws[j].winlist, entry)
@@ -2918,7 +2932,7 @@ root_to_region(xcb_window_t root, int check)
 
        DNPRINTF(SWM_D_MISC, "root_to_region: window: 0x%x\n", root);
 
-       num_screens = xcb_setup_roots_length(xcb_get_setup(conn));
+       num_screens = get_screen_count();
        for (i = 0; i < num_screens; i++)
                if (screens[i].root == root)
                        break;
@@ -2970,7 +2984,7 @@ find_unmanaged_window(xcb_window_t id)
        struct ws_win           *win;
        int                     i, j, num_screens;
 
-       num_screens = xcb_setup_roots_length(xcb_get_setup(conn));
+       num_screens = get_screen_count();
        for (i = 0; i < num_screens; i++)
                for (j = 0; j < workspace_limit; j++)
                        TAILQ_FOREACH(win, &screens[i].ws[j].unmanagedlist,
@@ -2987,7 +3001,7 @@ find_window(xcb_window_t id)
        int                     i, j, num_screens;
        xcb_query_tree_reply_t  *r;
 
-       num_screens = xcb_setup_roots_length(xcb_get_setup(conn));
+       num_screens = get_screen_count();
        for (i = 0; i < num_screens; i++)
                for (j = 0; j < workspace_limit; j++)
                        TAILQ_FOREACH(win, &screens[i].ws[j].winlist, entry)
@@ -3082,7 +3096,7 @@ kill_refs(struct ws_win *win)
        if (win == NULL)
                return;
 
-       num_screens = xcb_setup_roots_length(xcb_get_setup(conn));
+       num_screens = get_screen_count();
        for (i = 0; i < num_screens; i++)
                TAILQ_FOREACH(r, &screens[i].rl, entry)
                        for (x = 0; x < workspace_limit; x++) {
@@ -3105,7 +3119,7 @@ validate_win(struct ws_win *testwin)
        if (testwin == NULL)
                return (0);
 
-       num_screens = xcb_setup_roots_length(xcb_get_setup(conn));
+       num_screens = get_screen_count();
        for (i = 0; i < num_screens; i++)
                TAILQ_FOREACH(r, &screens[i].rl, entry)
                        for (x = 0; x < workspace_limit; x++) {
@@ -3125,7 +3139,7 @@ validate_ws(struct workspace *testws)
        int                     i, x, num_screens;
 
        /* validate all ws */
-       num_screens = xcb_setup_roots_length(xcb_get_setup(conn));
+       num_screens = get_screen_count();
        for (i = 0; i < num_screens; i++)
                TAILQ_FOREACH(r, &screens[i].rl, entry)
                        for (x = 0; x < workspace_limit; x++) {
@@ -3545,7 +3559,7 @@ focusrg(struct swm_region *r, union arg *args)
        int                     ridx = args->id, i, num_screens;
        struct swm_region       *rr = NULL;
 
-       num_screens = xcb_setup_roots_length(xcb_get_setup(conn));
+       num_screens = get_screen_count();
        /* do nothing if we don't have more than one screen */
        if (!(num_screens > 1 || outputs > 1))
                return;
@@ -3569,7 +3583,7 @@ cyclerg(struct swm_region *r, union arg *args)
        struct swm_region       *rr = NULL;
        int                     i, num_screens;
 
-       num_screens = xcb_setup_roots_length(xcb_get_setup(conn));
+       num_screens = get_screen_count();
        /* do nothing if we don't have more than one screen */
        if (!(num_screens > 1 || outputs > 1))
                return;
@@ -3972,7 +3986,7 @@ stack(void) {
 
        DNPRINTF(SWM_D_STACK, "stack: begin\n");
 
-       num_screens = xcb_setup_roots_length(xcb_get_setup(conn));
+       num_screens = get_screen_count();
        for (i = 0; i < num_screens; i++) {
 #ifdef SWM_DEBUG
                j = 0;
@@ -4547,7 +4561,7 @@ send_to_rg(struct swm_region *r, union arg *args)
        struct swm_region       *rr = NULL;
        union arg               a;
 
-       num_screens = xcb_setup_roots_length(xcb_get_setup(conn));
+       num_screens = get_screen_count();
        /* do nothing if we don't have more than one screen */
        if (!(num_screens > 1 || outputs > 1))
                return;
@@ -6528,7 +6542,7 @@ grabkeys(void)
        modifiers[2] = XCB_MOD_MASK_LOCK;
        modifiers[3] = numlockmask | XCB_MOD_MASK_LOCK;
 
-       num_screens = xcb_setup_roots_length(xcb_get_setup(conn));
+       num_screens = get_screen_count();
        for (k = 0; k < num_screens; k++) {
                if (TAILQ_EMPTY(&screens[k].rl))
                        continue;
@@ -6814,7 +6828,7 @@ setconfvalue(char *selector, char *value, int flags)
                        errx(1, "setconfvalue: bar_enabled_ws: invalid "
                            "workspace %d.", ws_id + 1);
 
-               num_screens = xcb_setup_roots_length(xcb_get_setup(conn));
+               num_screens = get_screen_count();
                for (i = 0; i < num_screens; i++) {
                        ws = (struct workspace *)&screens[i].ws;
                        ws[ws_id].bar_enabled = atoi(value);
@@ -7145,7 +7159,7 @@ setlayout(char *selector, char *value, int flags)
                    "<master_grow>:<master_add>:<stack_inc>:<always_raise>:"
                    "<type>'");
 
-       num_screens = xcb_setup_roots_length(xcb_get_setup(conn));
+       num_screens = get_screen_count();
        for (i = 0; i < num_screens; i++) {
                ws = (struct workspace *)&screens[i].ws;
                ws[ws_id].cur_layout = &layouts[st];
@@ -7793,7 +7807,7 @@ expose(xcb_expose_event_t *e)
 
        DNPRINTF(SWM_D_EVENT, "expose: window: 0x%x\n", e->window);
 
-       num_screens = xcb_setup_roots_length(xcb_get_setup(conn));
+       num_screens = get_screen_count();
        for (i = 0; i < num_screens; i++)
                TAILQ_FOREACH(r, &screens[i].rl, entry)
                        if (e->window == WINID(r->bar))
@@ -8401,7 +8415,7 @@ motionnotify(xcb_motion_notify_event_t *e)
 
        last_event_time = e->time;
 
-       num_screens = xcb_setup_roots_length(xcb_get_setup(conn));
+       num_screens = get_screen_count();
        for (i = 0; i < num_screens; i++)
                if (screens[i].root == e->root)
                        break;
@@ -8693,7 +8707,7 @@ enable_wm(void)
        xcb_generic_error_t     *error;
 
        /* this causes an error if some other window manager is running */
-       num_screens = xcb_setup_roots_length(xcb_get_setup(conn));
+       num_screens = get_screen_count();
        for (i = 0; i < num_screens; i++) {
                if ((sc = get_screen(i)) == NULL)
                        errx(1, "ERROR: can't get screen %d.", i);
@@ -8825,7 +8839,7 @@ scan_xrandr(int i)
        if ((screen = get_screen(i)) == NULL)
                errx(1, "ERROR: can't get screen %d.", i);
 
-       num_screens = xcb_setup_roots_length(xcb_get_setup(conn));
+       num_screens = get_screen_count();
        if (i >= num_screens)
                errx(1, "scan_xrandr: invalid screen");
 
@@ -8906,7 +8920,7 @@ screenchange(xcb_randr_screen_change_notify_event_t *e)
 
        DNPRINTF(SWM_D_EVENT, "screenchange: root: 0x%x\n", e->root);
 
-       num_screens = xcb_setup_roots_length(xcb_get_setup(conn));
+       num_screens = get_screen_count();
        /* silly event doesn't include the screen index */
        for (i = 0; i < num_screens; i++)
                if (screens[i].root == e->root)
@@ -8957,7 +8971,7 @@ grab_windows(void)
        xcb_get_property_cookie_t               pc;
 
        DNPRINTF(SWM_D_INIT, "grab_windows: begin\n");
-       num_screens = xcb_setup_roots_length(xcb_get_setup(conn));
+       num_screens = get_screen_count();
        for (i = 0; i < num_screens; i++) {
                qtc = xcb_query_tree(conn, screens[i].root);
                qtr = xcb_query_tree_reply(conn, qtc, NULL);
@@ -9055,7 +9069,7 @@ setup_screens(void)
        xcb_randr_query_version_cookie_t        c;
        xcb_randr_query_version_reply_t         *r;
 
-       num_screens = xcb_setup_roots_length(xcb_get_setup(conn));
+       num_screens = get_screen_count();
        if ((screens = calloc(num_screens,
             sizeof(struct swm_screen))) == NULL)
                err(1, "setup_screens: calloc: failed to allocate memory for "
@@ -9174,7 +9188,7 @@ workaround(void)
        /* work around sun jdk bugs, code from wmname */
        netwmcheck = get_atom_from_string("_NET_SUPPORTING_WM_CHECK");
 
-       num_screens = xcb_setup_roots_length(xcb_get_setup(conn));
+       num_screens = get_screen_count();
        for (i = 0; i < num_screens; i++) {
                root = screens[i].root;
 
@@ -9209,7 +9223,7 @@ shutdown_cleanup(void)
 
        teardown_ewmh();
 
-       num_screens = xcb_setup_roots_length(xcb_get_setup(conn));
+       num_screens = get_screen_count();
        for (i = 0; i < num_screens; ++i) {
                if (screens[i].bar_gc != 0)
                        xcb_free_gc(conn, screens[i].bar_gc);
@@ -9428,7 +9442,7 @@ noconfig:
                setenv("SWM_STARTED", "YES", 1);
 
        /* setup all bars */
-       num_screens = xcb_setup_roots_length(xcb_get_setup(conn));
+       num_screens = get_screen_count();
        for (i = 0; i < num_screens; i++)
                TAILQ_FOREACH(r, &screens[i].rl, entry)
                        bar_setup(r);