mirror of
https://github.com/vale981/bspwm
synced 2025-03-06 02:01:42 -05:00
Preselection feedback in draw_triple_border
This commit is contained in:
parent
73cbaa495f
commit
750124edd6
5 changed files with 77 additions and 27 deletions
28
settings.c
28
settings.c
|
@ -37,9 +37,16 @@ void apply_settings(lua_State *L)
|
|||
active_border_color = string_expr(L, "active_border_color", ACTIVE_BORDER_COLOR);
|
||||
inner_border_color = string_expr(L, "inner_border_color", INNER_BORDER_COLOR);
|
||||
outer_border_color = string_expr(L, "outer_border_color", OUTER_BORDER_COLOR);
|
||||
preselect_border_color = string_expr(L, "preselect_border_color", PRESELECT_BORDER_COLOR);
|
||||
presel_border_color = string_expr(L, "presel_border_color", PRESELECT_BORDER_COLOR);
|
||||
locked_border_color = string_expr(L, "locked_border_color", LOCKED_BORDER_COLOR);
|
||||
|
||||
normal_border_color_pxl = get_color(normal_border_color);
|
||||
active_border_color_pxl = get_color(active_border_color);
|
||||
inner_border_color_pxl = get_color(inner_border_color);
|
||||
outer_border_color_pxl = get_color(outer_border_color);
|
||||
presel_border_color_pxl = get_color(presel_border_color);
|
||||
locked_border_color_pxl = get_color(locked_border_color);
|
||||
|
||||
smart_window_border = bool_expr(L, "smart_window_border", SMART_WINDOW_BORDER);
|
||||
smart_window_gap = bool_expr(L, "smart_window_gap", SMART_WINDOW_GAP);
|
||||
|
||||
|
@ -80,8 +87,8 @@ void get_setting(lua_State *L, char* rsp)
|
|||
sprintf(rsp, "%s\n", inner_border_color);
|
||||
else if (strcmp(name, "outer_border_color") == 0)
|
||||
sprintf(rsp, "%s\n", outer_border_color);
|
||||
else if (strcmp(name, "preselect_border_color") == 0)
|
||||
sprintf(rsp, "%s\n", preselect_border_color);
|
||||
else if (strcmp(name, "presel_border_color") == 0)
|
||||
sprintf(rsp, "%s\n", presel_border_color);
|
||||
else if (strcmp(name, "locked_border_color") == 0)
|
||||
sprintf(rsp, "%s\n", locked_border_color);
|
||||
else if (strcmp(name, "smart_window_border") == 0)
|
||||
|
@ -115,26 +122,33 @@ void set_setting(lua_State *L)
|
|||
backup = strdup(normal_border_color);
|
||||
free(normal_border_color);
|
||||
normal_border_color = string_expr(L, "set.value", backup);
|
||||
normal_border_color_pxl = get_color(normal_border_color);
|
||||
} else if (strcmp(name, "active_border_color") == 0) {
|
||||
backup = strdup(active_border_color);
|
||||
free(active_border_color);
|
||||
active_border_color = string_expr(L, "set.value", backup);
|
||||
active_border_color_pxl = get_color(active_border_color);
|
||||
} else if (strcmp(name, "inner_border_color") == 0) {
|
||||
backup = strdup(inner_border_color);
|
||||
free(inner_border_color);
|
||||
inner_border_color = string_expr(L, "set.value", backup);
|
||||
inner_border_color_pxl = get_color(inner_border_color);
|
||||
} else if (strcmp(name, "outer_border_color") == 0) {
|
||||
backup = strdup(outer_border_color);
|
||||
free(outer_border_color);
|
||||
outer_border_color = string_expr(L, "set.value", backup);
|
||||
} else if (strcmp(name, "preselect_border_color") == 0) {
|
||||
backup = strdup(preselect_border_color);
|
||||
free(preselect_border_color);
|
||||
preselect_border_color = string_expr(L, "set.value", backup);
|
||||
outer_border_color_pxl = get_color(outer_border_color);
|
||||
} else if (strcmp(name, "outer_border_color") == 0) {
|
||||
} else if (strcmp(name, "presel_border_color") == 0) {
|
||||
backup = strdup(presel_border_color);
|
||||
free(presel_border_color);
|
||||
presel_border_color = string_expr(L, "set.value", backup);
|
||||
presel_border_color_pxl = get_color(presel_border_color);
|
||||
} else if (strcmp(name, "locked_border_color") == 0) {
|
||||
backup = strdup(locked_border_color);
|
||||
free(locked_border_color);
|
||||
locked_border_color = string_expr(L, "set.value", backup);
|
||||
locked_border_color_pxl = get_color(locked_border_color);
|
||||
} else if (strcmp(name, "smart_window_border") == 0) {
|
||||
smart_window_border = bool_expr(L, "set.value", smart_window_border);
|
||||
} else if (strcmp(name, "smart_window_gap") == 0) {
|
||||
|
|
|
@ -29,14 +29,14 @@ char *normal_border_color;
|
|||
char *active_border_color;
|
||||
char *inner_border_color;
|
||||
char *outer_border_color;
|
||||
char *preselect_border_color;
|
||||
char *presel_border_color;
|
||||
char *locked_border_color;
|
||||
|
||||
uint32_t normal_border_color_pxl;
|
||||
uint32_t active_border_color_pxl;
|
||||
uint32_t inner_border_color_pxl;
|
||||
uint32_t outer_border_color_pxl;
|
||||
uint32_t preselect_border_color_pxl;
|
||||
uint32_t presel_border_color_pxl;
|
||||
uint32_t locked_border_color_pxl;
|
||||
|
||||
int inner_border_width;
|
||||
|
|
12
types.h
12
types.h
|
@ -58,25 +58,23 @@ struct Node {
|
|||
Client *client; /* equals NULL except for leaves */
|
||||
};
|
||||
|
||||
typedef struct {
|
||||
Node *root;
|
||||
Node *focus;
|
||||
Node *prev_focus;
|
||||
} Layer;
|
||||
|
||||
typedef struct Rule Rule;
|
||||
struct Rule {
|
||||
char *class_name;
|
||||
char *desk_name;
|
||||
bool floating;
|
||||
bool maximized;
|
||||
bool fullscreen;
|
||||
bool locked;
|
||||
Rule *next;
|
||||
};
|
||||
|
||||
typedef struct Desktop Desktop;
|
||||
struct Desktop {
|
||||
char *name;
|
||||
Layer layer;
|
||||
Node *root;
|
||||
Node *focus;
|
||||
Node *prev_focus;
|
||||
Desktop *previous;
|
||||
Desktop *next;
|
||||
};
|
||||
|
|
57
utils.c
57
utils.c
|
@ -46,38 +46,47 @@ uint32_t get_color(char *col)
|
|||
return pxl;
|
||||
}
|
||||
|
||||
void draw_triple_border(xcb_connection_t *dpy, xcb_window_t win)
|
||||
void draw_triple_border(Node *n, uint32_t main_border_color_pxl)
|
||||
{
|
||||
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);
|
||||
|
||||
int width = geom->width;
|
||||
int height = geom->height;
|
||||
uint16_t width = geom->width;
|
||||
uint16_t height = geom->height;
|
||||
|
||||
unsigned int depth = geom->depth;
|
||||
uint8_t depth = geom->depth;
|
||||
|
||||
int full_width = width + 2 * border_width;
|
||||
int full_height = height + 2 * border_width;
|
||||
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 },
|
||||
{ 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) },
|
||||
{ 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 },
|
||||
{ 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);
|
||||
|
||||
|
@ -89,7 +98,7 @@ void draw_triple_border(xcb_connection_t *dpy, xcb_window_t win)
|
|||
|
||||
/* main border */
|
||||
if (main_border_width > 0) {
|
||||
xcb_change_gc(dpy, gc, XCB_GC_FOREGROUND, &normal_border_color_pxl);
|
||||
xcb_change_gc(dpy, gc, XCB_GC_FOREGROUND, &main_border_color_pxl);
|
||||
xcb_poly_fill_rectangle(dpy, pix, gc, LENGTH(main_rectangles), main_rectangles);
|
||||
}
|
||||
|
||||
|
@ -99,6 +108,34 @@ void draw_triple_border(xcb_connection_t *dpy, xcb_window_t win)
|
|||
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);
|
||||
|
||||
|
|
3
utils.h
3
utils.h
|
@ -4,10 +4,11 @@
|
|||
#include <stdarg.h>
|
||||
#include <xcb/xcb.h>
|
||||
#include <xcb/xcb_event.h>
|
||||
#include "types.h"
|
||||
|
||||
void die(const char *, ...);
|
||||
uint32_t color_pixel(char *);
|
||||
uint32_t get_color(char *);
|
||||
void draw_triple_border(xcb_connection_t *, xcb_window_t);
|
||||
void draw_triple_border(Node *, uint32_t);
|
||||
|
||||
#endif
|
||||
|
|
Loading…
Add table
Reference in a new issue