From: Orestis Floros Date: Sat, 21 Apr 2018 12:21:04 +0000 (+0300) Subject: cmd_border: improve width selection X-Git-Tag: 4.16~93^2 X-Git-Url: https://git.sur5r.net/?p=i3%2Fi3;a=commitdiff_plain;h=bd7a5ee48a4e6acba2a885508f0b26c6f4d963c3;ds=sidebyside 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. --- diff --git a/docs/userguide b/docs/userguide index 5fc36585..e8240390 100644 --- a/docs/userguide +++ b/docs/userguide @@ -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 [] -border none|toggle +border normal|pixel|toggle [] +border none # legacy syntax, equivalent to "border pixel 1" border 1pixel diff --git a/parser-specs/commands.spec b/parser-specs/commands.spec index 4048768e..106dac99 100644 --- a/parser-specs/commands.spec +++ b/parser-specs/commands.spec @@ -86,16 +86,16 @@ state DEBUGLOG: # border normal|pixel [] # 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) diff --git a/src/commands.c b/src/commands.c index d6733a30..e023cd8f 100644 --- a/src/commands.c +++ b/src/commands.c @@ -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 []', '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; diff --git a/testcases/t/169-border-toggle.t b/testcases/t/169-border-toggle.t index 51219ba6..4146fd79 100644 --- a/testcases/t/169-border-toggle.t +++ b/testcases/t/169-border-toggle.t @@ -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;