diff --git a/bspwm.c b/bspwm.c index c0c1c51..7743a2d 100644 --- a/bspwm.c +++ b/bspwm.c @@ -61,7 +61,6 @@ void setup(int default_screen) xcb_atom_t net_atoms[] = {ewmh._NET_SUPPORTED, ewmh._NET_WM_STATE_FULLSCREEN, ewmh._NET_WM_STATE, ewmh._NET_ACTIVE_WINDOW}; xcb_ewmh_set_supported(&ewmh, default_screen, LENGTH(net_atoms), net_atoms); - xcb_ewmh_set_wm_name(&ewmh, screen->root, LENGTH(WM_NAME), WM_NAME); desk = make_desktop(DESK_NAME); last_desk = NULL; @@ -119,6 +118,7 @@ int main(void) load_settings(); run_autostart(); + ewmh_update_wm_name(); update_root_dimensions(); xcb_flush(dpy); diff --git a/ewmh.c b/ewmh.c index 57dec2c..e948d43 100644 --- a/ewmh.c +++ b/ewmh.c @@ -1,6 +1,8 @@ +#include #include #include "types.h" #include "bspwm.h" +#include "settings.h" #include "ewmh.h" void ewmh_init(void) @@ -9,3 +11,9 @@ void ewmh_init(void) ewmh_cookies = xcb_ewmh_init_atoms(dpy, &ewmh); xcb_ewmh_init_atoms_replies(&ewmh, ewmh_cookies, NULL); } + +void ewmh_update_wm_name(void) +{ + if (wm_name != NULL) + xcb_ewmh_set_wm_name(&ewmh, screen->root, strlen(wm_name), wm_name); +} diff --git a/ewmh.h b/ewmh.h index 97107ec..ab789d9 100644 --- a/ewmh.h +++ b/ewmh.h @@ -6,5 +6,6 @@ xcb_ewmh_connection_t ewmh; void ewmh_init(void); +void ewmh_update_wm_name(void); #endif diff --git a/messages.c b/messages.c index ecb0567..2b1571d 100644 --- a/messages.c +++ b/messages.c @@ -20,24 +20,26 @@ void process_message(char *msg, char *rsp) if (strcmp(cmd, "get") == 0) { char *name = strtok(NULL, TOKEN_SEP); get_setting(name, rsp); + return; } else if (strcmp(cmd, "set") == 0) { char *name = strtok(NULL, TOKEN_SEP); char *value = strtok(NULL, TOKEN_SEP); set_setting(name, value); + return; } else if (strcmp(cmd, "dump") == 0) { dump_tree(desk, desk->root, rsp, 0); + return; } else if (strcmp(cmd, "list") == 0) { list_desktops(rsp); + return; } else if (strcmp(cmd, "close") == 0) { remove_node(desk, desk->focus); - apply_layout(desk, desk->root, root_rect); } else if (strcmp(cmd, "rotate") == 0) { char *deg = strtok(NULL, TOKEN_SEP); if (deg != NULL) { rotate_t r; if (parse_rotate(deg, &r)) { rotate_tree(desk->root, r); - apply_layout(desk, desk->root, root_rect); } } } else if (strcmp(cmd, "layout") == 0) { @@ -46,7 +48,6 @@ void process_message(char *msg, char *rsp) layout_t l; if (parse_layout(lyt, &l)) { desk->layout = l; - apply_layout(desk, desk->root, root_rect); } } } else if (strcmp(cmd, "insert") == 0) { @@ -55,7 +56,6 @@ void process_message(char *msg, char *rsp) node_t *n = make_node(); n->client = c; insert_node(desk, n); - apply_layout(desk, desk->root, root_rect); } else if (strcmp(cmd, "ratio") == 0) { char *value = strtok(NULL, TOKEN_SEP); if (value != NULL && desk->focus != NULL) @@ -70,6 +70,7 @@ void process_message(char *msg, char *rsp) /* draw_triple_border(desk->focus, active_border_color_pxl); */ } } + return; } else if (strcmp(cmd, "push") == 0 || strcmp(cmd, "pull") == 0) { char *dir = strtok(NULL, TOKEN_SEP); if (dir != NULL) { @@ -77,7 +78,6 @@ void process_message(char *msg, char *rsp) direction_t d; if (parse_fence_move(cmd, &m) && parse_direction(dir, &d)) { move_fence(desk->focus, d, m); - apply_layout(desk, desk->root, root_rect); } } } else if (strcmp(cmd, "send_to") == 0) { @@ -85,7 +85,6 @@ void process_message(char *msg, char *rsp) if (name != NULL) { desktop_t *d = find_desktop(name); transfer_node(desk, d, desk->focus); - apply_layout(desk, desk->root, root_rect); } } else if (strcmp(cmd, "use") == 0) { char *name = strtok(NULL, TOKEN_SEP); @@ -104,6 +103,7 @@ void process_message(char *msg, char *rsp) cycle_leaf(desk, desk->focus, d, k); } } + return; } else if (strcmp(cmd, "alternate") == 0) { alternate_desktop(); } else if (strcmp(cmd, "add") == 0) { @@ -111,6 +111,7 @@ void process_message(char *msg, char *rsp) if (name != NULL) { add_desktop(name); } + return; } else if (strcmp(cmd, "focus") == 0) { char *dir = strtok(NULL, TOKEN_SEP); if (dir != NULL) { @@ -120,54 +121,16 @@ void process_message(char *msg, char *rsp) focus_node(desk, n); } } + return; } else if (strcmp(cmd, "quit") == 0) { quit(); + return; } else { sprintf(rsp, "unknown command: %s\n", cmd); - } -} - -void get_setting(char *name, char* rsp) -{ - if (name == NULL) return; + } - if (strcmp(name, "inner_border_width") == 0) - sprintf(rsp, "%u\n", inner_border_width); - else if (strcmp(name, "main_border_width") == 0) - sprintf(rsp, "%u\n", main_border_width); - else if (strcmp(name, "outer_border_width") == 0) - sprintf(rsp, "%u\n", outer_border_width); - else if (strcmp(name, "border_width") == 0) - sprintf(rsp, "%u\n", border_width); - else if (strcmp(name, "window_gap") == 0) - sprintf(rsp, "%i\n", window_gap); - else if (strcmp(name, "left_padding") == 0) - sprintf(rsp, "%i\n", left_padding); - else if (strcmp(name, "right_padding") == 0) - sprintf(rsp, "%i\n", right_padding); - else if (strcmp(name, "top_padding") == 0) - sprintf(rsp, "%i\n", top_padding); - else if (strcmp(name, "bottom_padding") == 0) - sprintf(rsp, "%i\n", bottom_padding); - else if (strcmp(name, "normal_border_color") == 0) - sprintf(rsp, "%s (0x%06X)\n", normal_border_color, normal_border_color_pxl); - else if (strcmp(name, "active_border_color") == 0) - sprintf(rsp, "%s (0x%06X)\n", active_border_color, active_border_color_pxl); - else if (strcmp(name, "inner_border_color") == 0) - sprintf(rsp, "%s (0x%06X)\n", inner_border_color, inner_border_color_pxl); - else if (strcmp(name, "outer_border_color") == 0) - sprintf(rsp, "%s (0x%06X)\n", outer_border_color, outer_border_color_pxl); - else if (strcmp(name, "presel_border_color") == 0) - sprintf(rsp, "%s (0x%06X)\n", presel_border_color, presel_border_color_pxl); - else if (strcmp(name, "locked_border_color") == 0) - sprintf(rsp, "%s (0x%06X)\n", locked_border_color, locked_border_color_pxl); - else if (strcmp(name, "wm_name") == 0) - sprintf(rsp, "%s\n", wm_name); - else if (strcmp(name, "adaptive_window_border") == 0) - sprintf(rsp, "%s\n", BOOLSTR(adaptive_window_border)); - else if (strcmp(name, "adaptive_window_gap") == 0) - sprintf(rsp, "%s\n", BOOLSTR(adaptive_window_gap)); + apply_layout(desk, desk->root, root_rect); } void set_setting(char *name, char *value) @@ -220,10 +183,6 @@ void set_setting(char *name, char *value) bool b; if (parse_bool(value, &b)) adaptive_window_border = b; - } else if (strcmp(name, "adaptive_window_gap") == 0) { - bool b; - if (parse_bool(value, &b)) - adaptive_window_gap = b; } else if (strcmp(name, "wm_name") == 0) { strcpy(wm_name, value); return; @@ -232,6 +191,48 @@ void set_setting(char *name, char *value) apply_layout(desk, desk->root, root_rect); } +void get_setting(char *name, char* rsp) +{ + if (name == NULL) + return; + + if (strcmp(name, "inner_border_width") == 0) + sprintf(rsp, "%u\n", inner_border_width); + else if (strcmp(name, "main_border_width") == 0) + sprintf(rsp, "%u\n", main_border_width); + else if (strcmp(name, "outer_border_width") == 0) + sprintf(rsp, "%u\n", outer_border_width); + else if (strcmp(name, "border_width") == 0) + sprintf(rsp, "%u\n", border_width); + else if (strcmp(name, "window_gap") == 0) + sprintf(rsp, "%i\n", window_gap); + else if (strcmp(name, "left_padding") == 0) + sprintf(rsp, "%i\n", left_padding); + else if (strcmp(name, "right_padding") == 0) + sprintf(rsp, "%i\n", right_padding); + else if (strcmp(name, "top_padding") == 0) + sprintf(rsp, "%i\n", top_padding); + else if (strcmp(name, "bottom_padding") == 0) + sprintf(rsp, "%i\n", bottom_padding); + else if (strcmp(name, "normal_border_color") == 0) + sprintf(rsp, "%s (0x%06X)\n", normal_border_color, normal_border_color_pxl); + else if (strcmp(name, "active_border_color") == 0) + sprintf(rsp, "%s (0x%06X)\n", active_border_color, active_border_color_pxl); + else if (strcmp(name, "inner_border_color") == 0) + sprintf(rsp, "%s (0x%06X)\n", inner_border_color, inner_border_color_pxl); + else if (strcmp(name, "outer_border_color") == 0) + sprintf(rsp, "%s (0x%06X)\n", outer_border_color, outer_border_color_pxl); + else if (strcmp(name, "presel_border_color") == 0) + sprintf(rsp, "%s (0x%06X)\n", presel_border_color, presel_border_color_pxl); + else if (strcmp(name, "locked_border_color") == 0) + sprintf(rsp, "%s (0x%06X)\n", locked_border_color, locked_border_color_pxl); + else if (strcmp(name, "wm_name") == 0) + sprintf(rsp, "%s\n", wm_name); + else if (strcmp(name, "adaptive_window_border") == 0) + sprintf(rsp, "%s\n", BOOLSTR(adaptive_window_border)); +} + + bool parse_bool(char *value, bool *b) { if (strcmp(value, "true") == 0) { diff --git a/settings.c b/settings.c index 7b44326..4f6e988 100644 --- a/settings.c +++ b/settings.c @@ -73,7 +73,6 @@ void apply_settings(lua_State *L) string_expr(L, wm_name, "wm_name", WM_NAME); adaptive_window_border = bool_expr(L, "adaptive_window_border", ADAPTIVE_WINDOW_BORDER); - adaptive_window_gap = bool_expr(L, "adaptive_window_gap", ADAPTIVE_WINDOW_GAP); inner_border_width = int_expr(L, "inner_border_width", INNER_BORDER_WIDTH); main_border_width = int_expr(L, "main_border_width", MAIN_BORDER_WIDTH); diff --git a/settings.h b/settings.h index b92c044..06d2e35 100644 --- a/settings.h +++ b/settings.h @@ -23,7 +23,6 @@ #define LEFT_PADDING 0 #define RIGHT_PADDING 0 -#define ADAPTIVE_WINDOW_GAP true #define ADAPTIVE_WINDOW_BORDER true #define NORMAL_BORDER_COLOR "slategray" @@ -63,7 +62,6 @@ int left_padding; int right_padding; bool adaptive_window_border; -bool adaptive_window_gap; void load_settings(void); void run_autostart(void); diff --git a/utils.c b/utils.c index 5ada67f..e20a2e0 100644 --- a/utils.c +++ b/utils.c @@ -59,42 +59,32 @@ bool is_managed(xcb_window_t w) return (l.desktop != NULL && l.node != 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; - xcb_alloc_named_color_reply_t *rpln; - uint32_t rgb, pxl; - uint16_t r, g, b; + uint32_t pxl = 0; if (col[0] == '#') { - 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 != NULL) { - pxl = rpl->pixel; - free(rpl); + 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 { - rpln = xcb_alloc_named_color_reply(dpy, xcb_alloc_named_color(dpy, map, strlen(col), col), NULL); - if (rpln != NULL) { - pxl = rpln->pixel; - free(rpln); + 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); } } - /* if (!rpl) */ - /* die("error: cannot allocate color '%s'\n", col); */ - return pxl; }