Add new bar.binding_mode_indicator configuration.
i3 current behavior hides the binding mode indicator when workspace buttons are disabled. This patch adds a new configuration for i3bar called 'binding_mode_indicator' which acts like the workspace_buttons. It is now possible to configure i3bar to hide the workspace buttons and keep showing the binding mode indicator. This should make the hide workspace buttons configuration more convenient for those who are heavily using binding modes. Default value for binding_mode_indicator is true.
This commit is contained in:
parent
97b086efd9
commit
7098ef602b
3
docs/ipc
3
docs/ipc
|
@ -494,6 +494,8 @@ font (string)::
|
||||||
The font to use for text on the bar.
|
The font to use for text on the bar.
|
||||||
workspace_buttons (boolean)::
|
workspace_buttons (boolean)::
|
||||||
Display workspace buttons or not? Defaults to true.
|
Display workspace buttons or not? Defaults to true.
|
||||||
|
binding_mode_indicator (boolean)::
|
||||||
|
Display the mode indicator or not? Defaults to true.
|
||||||
verbose (boolean)::
|
verbose (boolean)::
|
||||||
Should the bar enable verbose output for debugging? Defaults to false.
|
Should the bar enable verbose output for debugging? Defaults to false.
|
||||||
colors (map)::
|
colors (map)::
|
||||||
|
@ -539,6 +541,7 @@ urgent_workspace_text/urgent_workspace_bar::
|
||||||
"status_command": "i3status",
|
"status_command": "i3status",
|
||||||
"font": "-misc-fixed-medium-r-normal--13-120-75-75-C-70-iso10646-1",
|
"font": "-misc-fixed-medium-r-normal--13-120-75-75-C-70-iso10646-1",
|
||||||
"workspace_buttons": true,
|
"workspace_buttons": true,
|
||||||
|
"binding_mode_indicator": true,
|
||||||
"verbose": false,
|
"verbose": false,
|
||||||
"colors": {
|
"colors": {
|
||||||
"background": "#c0c0c0",
|
"background": "#c0c0c0",
|
||||||
|
|
|
@ -1180,11 +1180,32 @@ workspace_buttons <yes|no>
|
||||||
--------------------------
|
--------------------------
|
||||||
|
|
||||||
*Example*:
|
*Example*:
|
||||||
--------------------
|
------------------------
|
||||||
bar {
|
bar {
|
||||||
workspace_buttons no
|
workspace_buttons no
|
||||||
}
|
}
|
||||||
--------------------
|
------------------------
|
||||||
|
|
||||||
|
=== Binding Mode indicator
|
||||||
|
|
||||||
|
Specifies whether the current binding mode indicator should be shown or not.
|
||||||
|
This is useful if you want to hide the workspace buttons but still be able
|
||||||
|
to see the current binding mode indicator.
|
||||||
|
For an example of a +mode+ definition, see <<resizingconfig>>.
|
||||||
|
|
||||||
|
The default is to show the mode indicator.
|
||||||
|
|
||||||
|
*Syntax*:
|
||||||
|
-------------------------------
|
||||||
|
binding_mode_indicator <yes|no>
|
||||||
|
-------------------------------
|
||||||
|
|
||||||
|
*Example*:
|
||||||
|
-----------------------------
|
||||||
|
bar {
|
||||||
|
binding_mode_indicator no
|
||||||
|
}
|
||||||
|
-----------------------------
|
||||||
|
|
||||||
=== Colors
|
=== Colors
|
||||||
|
|
||||||
|
|
|
@ -23,7 +23,8 @@ typedef struct config_t {
|
||||||
position_t position;
|
position_t position;
|
||||||
int verbose;
|
int verbose;
|
||||||
struct xcb_color_strings_t colors;
|
struct xcb_color_strings_t colors;
|
||||||
int disable_ws;
|
bool disable_binding_mode_indicator;
|
||||||
|
bool disable_ws;
|
||||||
char *bar_id;
|
char *bar_id;
|
||||||
char *command;
|
char *command;
|
||||||
char *fontname;
|
char *fontname;
|
||||||
|
|
|
@ -193,6 +193,12 @@ static int config_string_cb(void *params_, const unsigned char *val, unsigned in
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
static int config_boolean_cb(void *params_, int val) {
|
static int config_boolean_cb(void *params_, int val) {
|
||||||
|
if (!strcmp(cur_key, "binding_mode_indicator")) {
|
||||||
|
DLOG("binding_mode_indicator = %d\n", val);
|
||||||
|
config.disable_binding_mode_indicator = !val;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
if (!strcmp(cur_key, "workspace_buttons")) {
|
if (!strcmp(cur_key, "workspace_buttons")) {
|
||||||
DLOG("workspace_buttons = %d\n", val);
|
DLOG("workspace_buttons = %d\n", val);
|
||||||
config.disable_ws = !val;
|
config.disable_ws = !val;
|
||||||
|
|
|
@ -1670,14 +1670,11 @@ void draw_bars(bool unhide) {
|
||||||
MIN(outputs_walk->rect.w - traypx - 4, statusline_width), font.height + 2);
|
MIN(outputs_walk->rect.w - traypx - 4, statusline_width), font.height + 2);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (config.disable_ws) {
|
if (!config.disable_ws) {
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
i3_ws *ws_walk;
|
i3_ws *ws_walk;
|
||||||
|
|
||||||
TAILQ_FOREACH(ws_walk, outputs_walk->workspaces, tailq) {
|
TAILQ_FOREACH(ws_walk, outputs_walk->workspaces, tailq) {
|
||||||
DLOG("Drawing Button for WS %s at x = %d, len = %d\n", i3string_as_utf8(ws_walk->name), i, ws_walk->name_width);
|
DLOG("Drawing Button for WS %s at x = %d, len = %d\n",
|
||||||
|
i3string_as_utf8(ws_walk->name), i, ws_walk->name_width);
|
||||||
uint32_t fg_color = colors.inactive_ws_fg;
|
uint32_t fg_color = colors.inactive_ws_fg;
|
||||||
uint32_t bg_color = colors.inactive_ws_bg;
|
uint32_t bg_color = colors.inactive_ws_bg;
|
||||||
uint32_t border_color = colors.inactive_ws_border;
|
uint32_t border_color = colors.inactive_ws_border;
|
||||||
|
@ -1690,7 +1687,8 @@ void draw_bars(bool unhide) {
|
||||||
fg_color = colors.focus_ws_fg;
|
fg_color = colors.focus_ws_fg;
|
||||||
bg_color = colors.focus_ws_bg;
|
bg_color = colors.focus_ws_bg;
|
||||||
border_color = colors.focus_ws_border;
|
border_color = colors.focus_ws_border;
|
||||||
if (last_urgent_ws && strcmp(i3string_as_utf8(ws_walk->name), last_urgent_ws) == 0)
|
if (last_urgent_ws && strcmp(i3string_as_utf8(ws_walk->name),
|
||||||
|
last_urgent_ws) == 0)
|
||||||
walks_away = false;
|
walks_away = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1729,13 +1727,14 @@ void draw_bars(bool unhide) {
|
||||||
1,
|
1,
|
||||||
&rect);
|
&rect);
|
||||||
set_font_colors(outputs_walk->bargc, fg_color, bg_color);
|
set_font_colors(outputs_walk->bargc, fg_color, bg_color);
|
||||||
draw_text(ws_walk->name, outputs_walk->buffer, outputs_walk->bargc, i + 5, 3, ws_walk->name_width);
|
draw_text(ws_walk->name, outputs_walk->buffer, outputs_walk->bargc,
|
||||||
|
i + 5, 3, ws_walk->name_width);
|
||||||
i += 10 + ws_walk->name_width + 1;
|
i += 10 + ws_walk->name_width + 1;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (binding.name) {
|
if (binding.name && !config.disable_binding_mode_indicator) {
|
||||||
|
|
||||||
uint32_t fg_color = colors.urgent_ws_fg;
|
uint32_t fg_color = colors.urgent_ws_fg;
|
||||||
uint32_t bg_color = colors.urgent_ws_bg;
|
uint32_t bg_color = colors.urgent_ws_bg;
|
||||||
uint32_t mask = XCB_GC_FOREGROUND | XCB_GC_BACKGROUND;
|
uint32_t mask = XCB_GC_FOREGROUND | XCB_GC_BACKGROUND;
|
||||||
|
|
|
@ -267,6 +267,10 @@ struct Barconfig {
|
||||||
* zero. */
|
* zero. */
|
||||||
bool hide_workspace_buttons;
|
bool hide_workspace_buttons;
|
||||||
|
|
||||||
|
/** Hide mode button? Configuration option is 'binding_mode_indicator no'
|
||||||
|
* but we invert the bool for the same reason as hide_workspace_buttons.*/
|
||||||
|
bool hide_binding_mode_indicator;
|
||||||
|
|
||||||
/** Enable verbose mode? Useful for debugging purposes. */
|
/** Enable verbose mode? Useful for debugging purposes. */
|
||||||
bool verbose;
|
bool verbose;
|
||||||
|
|
||||||
|
|
|
@ -74,6 +74,7 @@ CFGFUN(bar_socket_path, const char *socket_path);
|
||||||
CFGFUN(bar_tray_output, const char *output);
|
CFGFUN(bar_tray_output, const char *output);
|
||||||
CFGFUN(bar_color_single, const char *colorclass, const char *color);
|
CFGFUN(bar_color_single, const char *colorclass, const char *color);
|
||||||
CFGFUN(bar_status_command, const char *command);
|
CFGFUN(bar_status_command, const char *command);
|
||||||
|
CFGFUN(bar_binding_mode_indicator, const char *value);
|
||||||
CFGFUN(bar_workspace_buttons, const char *value);
|
CFGFUN(bar_workspace_buttons, const char *value);
|
||||||
CFGFUN(bar_finish);
|
CFGFUN(bar_finish);
|
||||||
|
|
||||||
|
|
|
@ -356,6 +356,7 @@ state BAR:
|
||||||
'output' -> BAR_OUTPUT
|
'output' -> BAR_OUTPUT
|
||||||
'tray_output' -> BAR_TRAY_OUTPUT
|
'tray_output' -> BAR_TRAY_OUTPUT
|
||||||
'font' -> BAR_FONT
|
'font' -> BAR_FONT
|
||||||
|
'binding_mode_indicator' -> BAR_BINDING_MODE_INDICATOR
|
||||||
'workspace_buttons' -> BAR_WORKSPACE_BUTTONS
|
'workspace_buttons' -> BAR_WORKSPACE_BUTTONS
|
||||||
'verbose' -> BAR_VERBOSE
|
'verbose' -> BAR_VERBOSE
|
||||||
'colors' -> BAR_COLORS_BRACE
|
'colors' -> BAR_COLORS_BRACE
|
||||||
|
@ -411,6 +412,10 @@ state BAR_FONT:
|
||||||
font = string
|
font = string
|
||||||
-> call cfg_bar_font($font); BAR
|
-> call cfg_bar_font($font); BAR
|
||||||
|
|
||||||
|
state BAR_BINDING_MODE_INDICATOR:
|
||||||
|
value = word
|
||||||
|
-> call cfg_bar_binding_mode_indicator($value); BAR
|
||||||
|
|
||||||
state BAR_WORKSPACE_BUTTONS:
|
state BAR_WORKSPACE_BUTTONS:
|
||||||
value = word
|
value = word
|
||||||
-> call cfg_bar_workspace_buttons($value); BAR
|
-> call cfg_bar_workspace_buttons($value); BAR
|
||||||
|
|
|
@ -550,6 +550,10 @@ CFGFUN(bar_status_command, const char *command) {
|
||||||
current_bar.status_command = sstrdup(command);
|
current_bar.status_command = sstrdup(command);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
CFGFUN(bar_binding_mode_indicator, const char *value) {
|
||||||
|
current_bar.hide_binding_mode_indicator = !eval_boolstr(value);
|
||||||
|
}
|
||||||
|
|
||||||
CFGFUN(bar_workspace_buttons, const char *value) {
|
CFGFUN(bar_workspace_buttons, const char *value) {
|
||||||
current_bar.hide_workspace_buttons = !eval_boolstr(value);
|
current_bar.hide_workspace_buttons = !eval_boolstr(value);
|
||||||
}
|
}
|
||||||
|
|
|
@ -686,6 +686,9 @@ IPC_HANDLER(get_bar_config) {
|
||||||
ystr("workspace_buttons");
|
ystr("workspace_buttons");
|
||||||
y(bool, !config->hide_workspace_buttons);
|
y(bool, !config->hide_workspace_buttons);
|
||||||
|
|
||||||
|
ystr("binding_mode_indicator");
|
||||||
|
y(bool, !config->hide_binding_mode_indicator);
|
||||||
|
|
||||||
ystr("verbose");
|
ystr("verbose");
|
||||||
y(bool, config->verbose);
|
y(bool, config->verbose);
|
||||||
|
|
||||||
|
|
|
@ -63,6 +63,7 @@ my $bar_config = $i3->get_bar_config($bar_id)->recv;
|
||||||
is($bar_config->{status_command}, 'i3status --foo', 'status_command correct');
|
is($bar_config->{status_command}, 'i3status --foo', 'status_command correct');
|
||||||
ok(!$bar_config->{verbose}, 'verbose off by default');
|
ok(!$bar_config->{verbose}, 'verbose off by default');
|
||||||
ok($bar_config->{workspace_buttons}, 'workspace buttons enabled per default');
|
ok($bar_config->{workspace_buttons}, 'workspace buttons enabled per default');
|
||||||
|
ok($bar_config->{binding_mode_indicator}, 'mode indicator enabled per default');
|
||||||
is($bar_config->{mode}, 'dock', 'dock mode by default');
|
is($bar_config->{mode}, 'dock', 'dock mode by default');
|
||||||
is($bar_config->{position}, 'bottom', 'position bottom by default');
|
is($bar_config->{position}, 'bottom', 'position bottom by default');
|
||||||
|
|
||||||
|
@ -85,7 +86,8 @@ $config = <<EOT;
|
||||||
font -misc-fixed-medium-r-normal--13-120-75-75-C-70-iso10646-1
|
font -misc-fixed-medium-r-normal--13-120-75-75-C-70-iso10646-1
|
||||||
|
|
||||||
bar {
|
bar {
|
||||||
# Start a default instance of i3bar which provides workspace buttons.
|
# Start a default instance of i3bar which does not provide
|
||||||
|
# workspace buttons.
|
||||||
# Additionally, i3status will provide a statusline.
|
# Additionally, i3status will provide a statusline.
|
||||||
status_command i3status --bar
|
status_command i3status --bar
|
||||||
|
|
||||||
|
@ -98,6 +100,7 @@ bar {
|
||||||
mode dock
|
mode dock
|
||||||
font Terminus
|
font Terminus
|
||||||
workspace_buttons no
|
workspace_buttons no
|
||||||
|
binding_mode_indicator no
|
||||||
verbose yes
|
verbose yes
|
||||||
socket_path /tmp/foobar
|
socket_path /tmp/foobar
|
||||||
|
|
||||||
|
@ -125,6 +128,7 @@ $bar_config = $i3->get_bar_config($bar_id)->recv;
|
||||||
is($bar_config->{status_command}, 'i3status --bar', 'status_command correct');
|
is($bar_config->{status_command}, 'i3status --bar', 'status_command correct');
|
||||||
ok($bar_config->{verbose}, 'verbose on');
|
ok($bar_config->{verbose}, 'verbose on');
|
||||||
ok(!$bar_config->{workspace_buttons}, 'workspace buttons disabled');
|
ok(!$bar_config->{workspace_buttons}, 'workspace buttons disabled');
|
||||||
|
ok(!$bar_config->{binding_mode_indicator}, 'mode indicator disabled');
|
||||||
is($bar_config->{mode}, 'dock', 'dock mode');
|
is($bar_config->{mode}, 'dock', 'dock mode');
|
||||||
is($bar_config->{position}, 'top', 'position top');
|
is($bar_config->{position}, 'top', 'position top');
|
||||||
is_deeply($bar_config->{outputs}, [ 'HDMI1', 'HDMI2' ], 'outputs ok');
|
is_deeply($bar_config->{outputs}, [ 'HDMI1', 'HDMI2' ], 'outputs ok');
|
||||||
|
@ -230,7 +234,8 @@ $config = <<EOT;
|
||||||
font -misc-fixed-medium-r-normal--13-120-75-75-C-70-iso10646-1
|
font -misc-fixed-medium-r-normal--13-120-75-75-C-70-iso10646-1
|
||||||
|
|
||||||
bar {
|
bar {
|
||||||
# Start a default instance of i3bar which provides workspace buttons.
|
# Start a default instance of i3bar which does not provide
|
||||||
|
# workspace buttons.
|
||||||
# Additionally, i3status will provide a statusline.
|
# Additionally, i3status will provide a statusline.
|
||||||
status_command i3status --bar
|
status_command i3status --bar
|
||||||
|
|
||||||
|
@ -243,6 +248,7 @@ bar {
|
||||||
mode dock
|
mode dock
|
||||||
font Terminus
|
font Terminus
|
||||||
workspace_buttons no
|
workspace_buttons no
|
||||||
|
binding_mode_indicator yes
|
||||||
verbose yes
|
verbose yes
|
||||||
socket_path /tmp/foobar
|
socket_path /tmp/foobar
|
||||||
|
|
||||||
|
@ -271,6 +277,7 @@ $bar_config = $i3->get_bar_config($bar_id)->recv;
|
||||||
is($bar_config->{status_command}, 'i3status --bar', 'status_command correct');
|
is($bar_config->{status_command}, 'i3status --bar', 'status_command correct');
|
||||||
ok($bar_config->{verbose}, 'verbose on');
|
ok($bar_config->{verbose}, 'verbose on');
|
||||||
ok(!$bar_config->{workspace_buttons}, 'workspace buttons disabled');
|
ok(!$bar_config->{workspace_buttons}, 'workspace buttons disabled');
|
||||||
|
ok($bar_config->{binding_mode_indicator}, 'mode indicator enabled');
|
||||||
is($bar_config->{mode}, 'dock', 'dock mode');
|
is($bar_config->{mode}, 'dock', 'dock mode');
|
||||||
is($bar_config->{position}, 'top', 'position top');
|
is($bar_config->{position}, 'top', 'position top');
|
||||||
is_deeply($bar_config->{outputs}, [ 'HDMI1', 'HDMI2' ], 'outputs ok');
|
is_deeply($bar_config->{outputs}, [ 'HDMI1', 'HDMI2' ], 'outputs ok');
|
||||||
|
|
|
@ -627,7 +627,7 @@ EOT
|
||||||
|
|
||||||
$expected = <<'EOT';
|
$expected = <<'EOT';
|
||||||
cfg_bar_output(LVDS-1)
|
cfg_bar_output(LVDS-1)
|
||||||
ERROR: CONFIG: Expected one of these tokens: <end>, '#', 'set', 'i3bar_command', 'status_command', 'socket_path', 'mode', 'hidden_state', 'id', 'modifier', 'position', 'output', 'tray_output', 'font', 'workspace_buttons', 'verbose', 'colors', '}'
|
ERROR: CONFIG: Expected one of these tokens: <end>, '#', 'set', 'i3bar_command', 'status_command', 'socket_path', 'mode', 'hidden_state', 'id', 'modifier', 'position', 'output', 'tray_output', 'font', 'binding_mode_indicator', 'workspace_buttons', 'verbose', 'colors', '}'
|
||||||
ERROR: CONFIG: (in file <stdin>)
|
ERROR: CONFIG: (in file <stdin>)
|
||||||
ERROR: CONFIG: Line 1: bar {
|
ERROR: CONFIG: Line 1: bar {
|
||||||
ERROR: CONFIG: Line 2: output LVDS-1
|
ERROR: CONFIG: Line 2: output LVDS-1
|
||||||
|
|
Loading…
Reference in New Issue