X-Git-Url: https://jasonwoof.com/gitweb/?a=blobdiff_plain;f=spectrwm.c;h=0d8242e42dc6c15212fee0238b7b500753ebaf60;hb=fb93824e11a6d7bf319c685fcfa7a6913c4d83d5;hp=dc418dedf94f76b6e3914b5f42d78d319d6ad6f7;hpb=2f2bd34ace8b99b40a06fac76f47a85384a903aa;p=spectrwm.git diff --git a/spectrwm.c b/spectrwm.c index dc418de..0d8242e 100644 --- a/spectrwm.c +++ b/spectrwm.c @@ -92,6 +92,7 @@ #include #include #include +#include #include #include #include @@ -638,6 +639,22 @@ xcb_atom_t get_atom_from_string(const char *); void map_window_raised(xcb_window_t); void do_sync(void); xcb_screen_t *get_screen(int); +int parse_rgb(const char *, uint16_t *, uint16_t *, uint16_t *); + +int +parse_rgb(const char *rgb, uint16_t *rr, uint16_t *gg, uint16_t *bb) +{ + unsigned int tmpr, tmpg, tmpb; + + if (sscanf(rgb, "rgb:%x/%x/%x", &tmpr, &tmpg, &tmpb) != 3) + return (-1); + + *rr = tmpr << 8; + *gg = tmpg << 8; + *bb = tmpb << 8; + + return (0); +} xcb_screen_t * get_screen(int screen) @@ -1295,28 +1312,45 @@ name_to_color(const char *colorname) 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; + xcb_alloc_color_reply_t *cr; + xcb_alloc_named_color_reply_t *nr; + uint16_t rr, gg, bb; - /* 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); - c = xcb_alloc_named_color(conn, cmap, strlen(cname), - cname); - r = xcb_alloc_named_color_reply(conn, c, NULL); + /* color is in format rgb://rr/gg/bb */ + if (strncmp(colorname, "rgb:", 4) == 0) { + if (parse_rgb(colorname, &rr, &gg, &bb) == -1) + warnx("could not parse rgb %s", colorname); + else { + cr = xcb_alloc_color_reply(conn, + xcb_alloc_color(conn, cmap, rr, gg, bb), + NULL); + if (cr) { + result = cr->pixel; + free(cr); + } else + warnx("color '%s' not found", colorname); + } + } else { + nr = xcb_alloc_named_color_reply(conn, + xcb_alloc_named_color(conn, cmap, strlen(colorname), + colorname), + NULL); + if (!nr) { + strlcat(cname, colorname + 2, sizeof cname - 1); + nr = xcb_alloc_named_color_reply(conn, + xcb_alloc_named_color(conn, cmap, strlen(cname), + cname), + NULL); + } + if (nr) { + result = nr->pixel; + free(nr); + } else + warnx("color '%s' not found", colorname); } - if (r) { - result = r->pixel; - free(r); - } else - warnx("color '%s' not found", colorname); return (result); } @@ -6273,7 +6307,7 @@ out: } void -set_child_transient(struct ws_win *win, Window *trans) +set_child_transient(struct ws_win *win, xcb_window_t *trans) { struct ws_win *parent, *w; struct swm_region *r; @@ -6304,7 +6338,7 @@ set_child_transient(struct ws_win *win, Window *trans) w->child_trans = win; win->transient = w->id; *trans = w->id; - DNPRINTF(SWM_D_MISC, "set_child_transient: asjusting " + DNPRINTF(SWM_D_MISC, "set_child_transient: adjusting " "transient to 0x%x\n", win->transient); break; } @@ -6355,19 +6389,20 @@ tryharder: struct ws_win * manage_window(xcb_window_t id) { - Window trans = 0; + xcb_window_t trans = XCB_WINDOW_NONE; struct workspace *ws; struct ws_win *win, *ww; - int format, i, ws_idx, n, border_me = 0; + int format, i, ws_idx, border_me = 0; unsigned long nitems, bytes; Atom ws_idx_atom = 0, type; - Atom *prot = NULL, *pp; unsigned char ws_idx_str[SWM_PROPLEN], *prop = NULL; struct swm_region *r; const char *errstr; struct pid_e *p; struct quirk *qp; uint32_t event_mask; + xcb_atom_t prot; + xcb_get_wm_protocols_reply_t wpr; if ((win = find_window(id)) != NULL) return (win); /* already being managed */ @@ -6424,7 +6459,9 @@ manage_window(xcb_window_t id) xcb_icccm_get_wm_hints_reply(conn, xcb_icccm_get_wm_hints(conn, id), &win->hints, NULL); - XGetTransientForHint(display, id, &trans); + xcb_get_wm_transient_for_reply(conn, + xcb_get_wm_transient_for(conn, id), + &trans, NULL); if (trans) { win->transient = trans; set_child_transient(win, &trans); @@ -6432,16 +6469,21 @@ manage_window(xcb_window_t id) "transient: 0x%x\n", win->id, win->transient); } + prot = xcb_atom_get_fast_reply(conn, + xcb_atom_get_fast(conn, False, strlen("WM_PROTOCOLS"), + "WM_PROTOCOLS"), + NULL); /* get supported protocols */ - if (XGetWMProtocols(display, id, &prot, &n)) { - for (i = 0, pp = prot; i < n; i++, pp++) { - if (*pp == takefocus) + if (xcb_get_wm_protocols_reply(conn, + xcb_get_wm_protocols(conn, id, prot), + &wpr, NULL)) { + for (i = 0; i < wpr.atoms_len; i++) { + if (wpr.atoms[i] == takefocus) win->take_focus = 1; - if (*pp == adelete) + if (wpr.atoms[i] == adelete) win->can_delete = 1; } - if (prot) - XFree(prot); + xcb_get_wm_protocols_reply_wipe(&wpr); } win->iconic = get_iconic(win);