Merge pull request #3260 from orestisf1993/cmd_border

cmd_border: improve width selection
This commit is contained in:
Ingo Bürk 2018-04-21 17:55:51 +02:00 committed by GitHub
commit 4b95e2c1e0
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
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;