cmd_border: improve width selection

- 'border toggle' now accepts an optional pixel argument which will be
ignored when switching to BS_NONE.
- 'border pixel' now defaults to 1 pixel instead of 2.
- Calling 'border normal' or 'border pixel' will use the configured
default_border_width if one exists. Also applies to floating windows.
next
Orestis Floros 2018-04-21 15:21:04 +03:00
parent a40bcef438
commit bd7a5ee48a
No known key found for this signature in database
GPG Key ID: E9AD9F32E401E38F
4 changed files with 60 additions and 35 deletions

View File

@ -2476,7 +2476,9 @@ To change the border of the current client, you can use +border normal+ to use t
border (including window title), +border pixel 1+ to use a 1-pixel border (no window title)
and +border none+ to make the client borderless.
There is also +border toggle+ which will toggle the different border styles.
There is also +border toggle+ which will toggle the different border styles. The
optional pixel argument can be used to specify the border width when switching
to the normal and pixel styles.
Note that "pixel" refers to logical pixel. On HiDPI displays, a logical pixel
may be represented by multiple physical pixels, so +pixel 1+ might not
@ -2484,8 +2486,8 @@ necessarily translate into a single pixel row wide border.
*Syntax*:
-----------------------------------------------
border normal|pixel [<n>]
border none|toggle
border normal|pixel|toggle [<n>]
border none
# legacy syntax, equivalent to "border pixel 1"
border 1pixel

View File

@ -86,16 +86,16 @@ state DEBUGLOG:
# border normal|pixel [<n>]
# border none|1pixel|toggle
state BORDER:
border_style = 'normal', 'pixel'
border_style = 'normal', 'pixel', 'toggle'
-> BORDER_WIDTH
border_style = 'none', 'toggle'
border_style = 'none'
-> call cmd_border($border_style, 0)
border_style = '1pixel'
-> call cmd_border($border_style, 1)
'1pixel'
-> call cmd_border("pixel", 1)
state BORDER_WIDTH:
end
-> call cmd_border($border_style, 2)
-> call cmd_border($border_style, -1)
border_width = number
-> call cmd_border($border_style, &border_width)

View File

@ -718,6 +718,26 @@ void cmd_resize_set(I3_CMD, long cwidth, const char *mode_width, long cheight, c
ysuccess(success);
}
static int border_width_from_style(border_style_t border_style, long border_width, Con *con) {
if (border_style == BS_NONE) {
return 0;
}
if (border_width >= 0) {
return logical_px(border_width);
}
const bool is_floating = con_inside_floating(con) != NULL;
/* Load the configured defaults. */
if (is_floating && border_style == config.default_floating_border) {
return config.default_floating_border_width;
} else if (!is_floating && border_style == config.default_border) {
return config.default_border_width;
} else {
/* Use some hardcoded values. */
return logical_px(border_style == BS_NORMAL ? 2 : 1);
}
}
/*
* Implementation of 'border normal|pixel [<n>]', 'border none|1pixel|toggle'.
*
@ -730,36 +750,24 @@ void cmd_border(I3_CMD, const char *border_style_str, long border_width) {
TAILQ_FOREACH(current, &owindows, owindows) {
DLOG("matching: %p / %s\n", current->con, current->con->name);
int border_style = current->con->border_style;
int con_border_width = border_width;
border_style_t border_style;
if (strcmp(border_style_str, "toggle") == 0) {
border_style++;
border_style %= 3;
if (border_style == BS_NORMAL)
con_border_width = 2;
else if (border_style == BS_NONE)
con_border_width = 0;
else if (border_style == BS_PIXEL)
con_border_width = 1;
border_style = (current->con->border_style + 1) % 3;
} else if (strcmp(border_style_str, "normal") == 0) {
border_style = BS_NORMAL;
} else if (strcmp(border_style_str, "pixel") == 0) {
border_style = BS_PIXEL;
} else if (strcmp(border_style_str, "none") == 0) {
border_style = BS_NONE;
} else {
if (strcmp(border_style_str, "normal") == 0) {
border_style = BS_NORMAL;
} else if (strcmp(border_style_str, "pixel") == 0) {
border_style = BS_PIXEL;
} else if (strcmp(border_style_str, "1pixel") == 0) {
border_style = BS_PIXEL;
con_border_width = 1;
} else if (strcmp(border_style_str, "none") == 0) {
border_style = BS_NONE;
} else {
ELOG("BUG: called with border_style=%s\n", border_style_str);
ysuccess(false);
return;
}
ELOG("BUG: called with border_style=%s\n", border_style_str);
ysuccess(false);
return;
}
con_set_border_style(current->con, border_style, logical_px(con_border_width));
const int con_border_width = border_width_from_style(border_style, border_width, current->con);
con_set_border_style(current->con, border_style, con_border_width);
}
cmd_output->needs_tree_render = true;

View File

@ -28,7 +28,7 @@ is($nodes[0]->{border}, 'normal', 'border style normal');
cmd 'border 1pixel';
@nodes = @{get_ws_content($tmp)};
is($nodes[0]->{border}, 'pixel', 'border style 1pixel');
is($nodes[0]->{border}, 'pixel', 'border style pixel');
is($nodes[0]->{current_border_width}, 1, 'border width = 1px');
cmd 'border none';
@ -48,7 +48,7 @@ is($nodes[0]->{current_border_width}, 0, 'border width = 0px');
cmd 'border toggle';
@nodes = @{get_ws_content($tmp)};
is($nodes[0]->{border}, 'pixel', 'border style 1pixel');
is($nodes[0]->{border}, 'pixel', 'border style pixel');
is($nodes[0]->{current_border_width}, 1, 'border width = 1px');
cmd 'border toggle';
@ -56,4 +56,19 @@ cmd 'border toggle';
is($nodes[0]->{border}, 'normal', 'border style back to normal');
is($nodes[0]->{current_border_width}, 2, 'border width = 2px');
cmd 'border toggle 10';
@nodes = @{get_ws_content($tmp)};
is($nodes[0]->{border}, 'none', 'border style back to none even with width argument');
is($nodes[0]->{current_border_width}, 0, 'border width = 0px');
cmd 'border toggle 10';
@nodes = @{get_ws_content($tmp)};
is($nodes[0]->{border}, 'pixel', 'border style pixel');
is($nodes[0]->{current_border_width}, 10, 'border width = 10px');
cmd 'border toggle 10';
@nodes = @{get_ws_content($tmp)};
is($nodes[0]->{border}, 'normal', 'border style back to normal');
is($nodes[0]->{current_border_width}, 10, 'border width = 10px');
done_testing;