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
*Syntax*:
-----------------------------------------------
-border normal|pixel [<n>]
-border none|toggle
+border normal|pixel|toggle [<n>]
+border none
# legacy syntax, equivalent to "border pixel 1"
border 1pixel
# 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)
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'.
*
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;
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';
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';
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;