X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=utils.c;h=4773ffccfa4b9262f80af69feacfd3e2adf793ad;hb=24507288bfffcd4ad10d2c53fb370699ba96c387;hp=54fdfd0f42ffa896aed0c02ffd79797bce419783;hpb=a39a0ab2a30764877be55d0aad59c9a6b68db2d2;p=bspwm.git diff --git a/utils.c b/utils.c index 54fdfd0..4773ffc 100644 --- a/utils.c +++ b/utils.c @@ -1,166 +1,53 @@ #include #include #include +#include #include #include -#include "helpers.h" -#include "types.h" #include "bspwm.h" -#include "settings.h" #include "utils.h" void die(const char *errstr, ...) { va_list ap; - va_start(ap, errstr); vfprintf(stderr, errstr, ap); va_end(ap); exit(EXIT_FAILURE); } -Node *win_to_node(xcb_window_t win) -{ - Node *n; - Desktop *d = desk_head; - - if (d == NULL) - return NULL; - - while (d != NULL) { - n = d->head; - while (n != NULL) { - if (n->client->window == win) - return n; - n = n->next_leaf; - } - d = d->next; - } - - return NULL; -} - -uint32_t color_pixel(char *hex) -{ - char strgroups[3][3] = {{hex[1], hex[2], '\0'}, {hex[3], hex[4], '\0'}, {hex[5], hex[6], '\0'}}; - uint16_t rgb16[3] = {(strtol(strgroups[0], NULL, 16)), (strtol(strgroups[1], NULL, 16)), (strtol(strgroups[2], NULL, 16))}; - return (rgb16[0] << 16) + (rgb16[1] << 8) + rgb16[2]; -} - uint32_t get_color(char *col) { xcb_colormap_t map = screen->default_colormap; - xcb_alloc_color_reply_t *rpl; - uint32_t rgb, pxl; - uint16_t r, g, b; - - rgb = color_pixel(col); - r = rgb >> 16; - g = rgb >> 8 & 0xFF; - b = rgb & 0xFF; - rpl = xcb_alloc_color_reply(dpy, xcb_alloc_color(dpy, map, r * 257, g * 257, b * 257), NULL); - - if (!rpl) - die("error: cannot allocate color '%s'\n", col); + uint32_t pxl = 0; + + if (col[0] == '#') { + unsigned int red, green, blue; + if (sscanf(col + 1, "%02x%02x%02x", &red, &green, &blue) == 3) { + /* 2**16 - 1 == 0xffff and 0x101 * 0xij == 0xijij */ + red *= 0x101; + green *= 0x101; + blue *= 0x101; + xcb_alloc_color_reply_t *reply = xcb_alloc_color_reply(dpy, xcb_alloc_color(dpy, map, red, green, blue), NULL); + if (reply != NULL) { + pxl = reply->pixel; + free(reply); + } + } + } else { + xcb_alloc_named_color_reply_t *reply = xcb_alloc_named_color_reply(dpy, xcb_alloc_named_color(dpy, map, strlen(col), col), NULL); + if (reply != NULL) { + pxl = reply->pixel; + free(reply); + } + } - pxl = rpl->pixel; - free(rpl); return pxl; } -void draw_triple_border(Node *n, uint32_t main_border_color_pxl) +void transfer_rectangle(xcb_rectangle_t rect, uint32_t *a) { - if (border_width < 1) - return; - - xcb_window_t win = n->client->window; - xcb_get_geometry_reply_t *geom = xcb_get_geometry_reply(dpy, xcb_get_geometry(dpy, win), NULL); - - uint16_t width = geom->width; - uint16_t height = geom->height; - - uint8_t depth = geom->depth; - - uint16_t full_width = width + 2 * border_width; - uint16_t full_height = height + 2 * border_width; - - uint16_t split_pos; - - xcb_rectangle_t inner_rectangles[] = - { - { width, 0, 2 * border_width, height + 2 * border_width }, - { 0, height, width + 2 * border_width, 2 * border_width } - }; - - xcb_rectangle_t main_rectangles[] = - { - { width + inner_border_width, 0, 2 * (main_border_width + outer_border_width), height + 2 * border_width }, - { 0, height + inner_border_width, width + 2 * border_width, 2 * (main_border_width + outer_border_width) } - }; - - xcb_rectangle_t outer_rectangles[] = - { - { width + inner_border_width + main_border_width, 0, 2 * outer_border_width, height + 2 * border_width }, - { 0, height + inner_border_width + main_border_width, width + 2 * border_width, 2 * outer_border_width } - }; - - xcb_rectangle_t *presel_rectangles; - - xcb_pixmap_t pix = xcb_generate_id(dpy); - xcb_create_pixmap(dpy, depth, pix, win, full_width, full_height); - - xcb_gcontext_t gc = xcb_generate_id(dpy); - xcb_create_gc(dpy, gc, pix, 0, NULL); - - /* inner border */ - if (inner_border_width > 0) { - xcb_change_gc(dpy, gc, XCB_GC_FOREGROUND, &inner_border_color_pxl); - xcb_poly_fill_rectangle(dpy, pix, gc, LENGTH(inner_rectangles), inner_rectangles); - } - - /* main border */ - if (main_border_width > 0) { - xcb_change_gc(dpy, gc, XCB_GC_FOREGROUND, &main_border_color_pxl); - xcb_poly_fill_rectangle(dpy, pix, gc, LENGTH(main_rectangles), main_rectangles); - } - - /* outer border */ - if (outer_border_width > 0) { - xcb_change_gc(dpy, gc, XCB_GC_FOREGROUND, &outer_border_color_pxl); - xcb_poly_fill_rectangle(dpy, pix, gc, LENGTH(outer_rectangles), outer_rectangles); - } - - if (split_mode == MODE_MANUAL) { - split_pos = (int16_t) n->split_ratio * ((split_dir == DIR_UP || split_dir == DIR_DOWN) ? height : width); - printf("%i\n", split_pos); - presel_rectangles = malloc(2 * sizeof(xcb_rectangle_t)); - switch (split_dir) { - case DIR_UP: - presel_rectangles[0] = (xcb_rectangle_t) {width, 0, 2 * border_width, split_pos}; - presel_rectangles[1] = (xcb_rectangle_t) {0, height + border_width, full_width, border_width}; - break; - case DIR_DOWN: - presel_rectangles[0] = (xcb_rectangle_t) {width, split_pos + 1, 2 * border_width, height + border_width - (split_pos + 1)}; - presel_rectangles[1] = (xcb_rectangle_t) {0, height + border_width, full_width, border_width}; - break; - case DIR_LEFT: - presel_rectangles[0] = (xcb_rectangle_t) {0, height, split_pos, 2 * border_width}; - presel_rectangles[1] = (xcb_rectangle_t) {width + border_width, 0, border_width, full_height}; - break; - case DIR_RIGHT: - presel_rectangles[0] = (xcb_rectangle_t) {split_pos + 1, height, width + border_width - (split_pos + 1), 2 * border_width}; - presel_rectangles[1] = (xcb_rectangle_t) {width, 0, border_width, full_height}; - break; - } - xcb_change_gc(dpy, gc, XCB_GC_FOREGROUND, &presel_border_color_pxl); - xcb_poly_fill_rectangle(dpy, pix, gc, LENGTH(presel_rectangles), presel_rectangles); - free(presel_rectangles); - } - - - /* apply border pixmap */ - xcb_change_window_attributes(dpy, win, XCB_CW_BORDER_PIXMAP, &pix); - - free(geom); - xcb_free_gc(dpy, gc); - xcb_free_pixmap(dpy, pix); + a[0] = rect.x; + a[1] = rect.y; + a[2] = rect.width; + a[3] = rect.height; }