JasonWoof Got questions, comments, patches, etc.? Contact Jason Woofenden
oops - don't xcb_disconnect() on restart.
[spectrwm.git] / spectrwm.c
index 496feb2..8bdecf1 100644 (file)
@@ -1251,26 +1251,34 @@ find_pid(long pid)
        return (NULL);
 }
 
-unsigned long
-name_to_color(char *colorname)
-{
-       Colormap                cmap;
-       Status                  status;
-       XColor                  screen_def, exact_def;
-       unsigned long           result = 0;
-       char                    cname[32] = "#";
-
-       cmap = DefaultColormap(display, screens[0].idx);
-       status = XAllocNamedColor(display, cmap, colorname,
-           &screen_def, &exact_def);
-       if (!status) {
+uint32_t
+name_to_color(const char *colorname)
+{
+       uint32_t                        result = 0;
+       char                            cname[32] = "#";
+       xcb_screen_t                    *screen;
+       xcb_colormap_t                  cmap;
+       xcb_alloc_named_color_cookie_t  c;
+       xcb_alloc_named_color_reply_t   *r;
+
+       /* XXX - does not support rgb:/RR/GG/BB
+        *       will need to use xcb_alloc_color
+        */
+       screen = xcb_setup_roots_iterator(xcb_get_setup(conn)).data;
+       cmap = screen->default_colormap;
+
+       c = xcb_alloc_named_color(conn, cmap, strlen(colorname), colorname);
+       r = xcb_alloc_named_color_reply(conn, c, NULL);
+       if (!r) {
                strlcat(cname, colorname + 2, sizeof cname - 1);
-               status = XAllocNamedColor(display, cmap, cname, &screen_def,
-                   &exact_def);
+               c = xcb_alloc_named_color(conn, cmap, strlen(cname),
+                       cname);
+               r = xcb_alloc_named_color_reply(conn, c, NULL);
        }
-       if (status)
-               result = screen_def.pixel;
-       else
+       if (r) {
+               result = r->pixel;
+               free(r);
+       } else
                warnx("color '%s' not found", colorname);
 
        return (result);
@@ -1814,8 +1822,8 @@ bar_toggle(struct swm_region *r, union arg *args)
 void
 bar_refresh(void)
 {
-       XSetWindowAttributes    wa;
        struct swm_region       *r;
+       uint32_t                wa[2];
        int                     i, num_screens;
 
        /* do this here because the conf file is in memory */
@@ -1847,18 +1855,15 @@ bar_refresh(void)
                }
        }
 
-       bzero(&wa, sizeof wa);
        num_screens = xcb_setup_roots_length(xcb_get_setup(conn));
        for (i = 0; i < num_screens; i++)
                TAILQ_FOREACH(r, &screens[i].rl, entry) {
                        if (r->bar == NULL)
                                continue;
-                       wa.border_pixel =
-                           screens[i].c[SWM_S_COLOR_BAR_BORDER].color;
-                       wa.background_pixel =
-                           screens[i].c[SWM_S_COLOR_BAR].color;
-                       XChangeWindowAttributes(display, r->bar->id,
-                           CWBackPixel | CWBorderPixel, &wa);
+                       wa[0] = screens[i].c[SWM_S_COLOR_BAR].color;
+                       wa[1] = screens[i].c[SWM_S_COLOR_BAR_BORDER].color;
+                       xcb_change_window_attributes(conn, r->bar->id,
+                               XCB_CW_BACK_PIXEL | XCB_CW_BORDER_PIXEL, wa);
                }
        bar_update();
 }
@@ -2199,7 +2204,6 @@ restart(struct swm_region *r, union arg *args)
        bar_extra_stop();
        bar_extra = 1;
        unmap_all();
-       xcb_disconnect(conn);
        XCloseDisplay(display);
        execvp(start_argv[0], start_argv);
        warn("execvp failed");