Implement bar gaps

Adds the bar subcommand `gaps <amount>|<horizontal> <vertical>|<top>
<right> <bottom> <left>` to set gaps for swaybar. Due to restrictions on
margins for a layer_surface, only the sides that are anchored to an edge
of the screen can have gaps. Since there is support for per-side outer
gaps for workspaces, those should be able to be used instead for the
last side.
This commit is contained in:
Brian Ashworth 2018-11-28 11:23:48 -05:00
parent 5341e034df
commit 1bd8463481
11 changed files with 141 additions and 1 deletions

View file

@ -188,6 +188,7 @@ sway_cmd bar_cmd_bindsym;
sway_cmd bar_cmd_colors; sway_cmd bar_cmd_colors;
sway_cmd bar_cmd_context_button; sway_cmd bar_cmd_context_button;
sway_cmd bar_cmd_font; sway_cmd bar_cmd_font;
sway_cmd bar_cmd_gaps;
sway_cmd bar_cmd_mode; sway_cmd bar_cmd_mode;
sway_cmd bar_cmd_modifier; sway_cmd bar_cmd_modifier;
sway_cmd bar_cmd_output; sway_cmd bar_cmd_output;

View file

@ -227,6 +227,7 @@ struct bar_config {
bool strip_workspace_name; bool strip_workspace_name;
bool binding_mode_indicator; bool binding_mode_indicator;
bool verbose; bool verbose;
struct side_gaps gaps;
pid_t pid; pid_t pid;
struct { struct {
char *background; char *background;

View file

@ -42,6 +42,12 @@ struct swaybar_config {
struct wl_list outputs; // config_output::link struct wl_list outputs; // config_output::link
bool all_outputs; bool all_outputs;
int height; int height;
struct {
int top;
int right;
int bottom;
int left;
} gaps;
struct { struct {
uint32_t background; uint32_t background;

View file

@ -14,6 +14,7 @@ static struct cmd_handler bar_handlers[] = {
{ "colors", bar_cmd_colors }, { "colors", bar_cmd_colors },
{ "context_button", bar_cmd_context_button }, { "context_button", bar_cmd_context_button },
{ "font", bar_cmd_font }, { "font", bar_cmd_font },
{ "gaps", bar_cmd_gaps },
{ "height", bar_cmd_height }, { "height", bar_cmd_height },
{ "hidden_state", bar_cmd_hidden_state }, { "hidden_state", bar_cmd_hidden_state },
{ "icon_theme", bar_cmd_icon_theme }, { "icon_theme", bar_cmd_icon_theme },

60
sway/commands/bar/gaps.c Normal file
View file

@ -0,0 +1,60 @@
#include <stdlib.h>
#include <string.h>
#include <strings.h>
#include "sway/commands.h"
#include "sway/ipc-server.h"
#include "log.h"
struct cmd_results *bar_cmd_gaps(int argc, char **argv) {
struct cmd_results *error = NULL;
if ((error = checkarg(argc, "gaps", EXPECTED_AT_LEAST, 1))) {
return error;
}
if ((error = checkarg(argc, "gaps", EXPECTED_AT_MOST, 4))) {
return error;
}
if (!config->current_bar) {
return cmd_results_new(CMD_FAILURE, "bar gaps", "No bar defined.");
}
int top = 0, right = 0, bottom = 0, left = 0;
for (int i = 0; i < argc; i++) {
char *end;
int amount = strtol(argv[i], &end, 10);
if (strlen(end) && strcasecmp(end, "px") != 0) {
return cmd_results_new(CMD_INVALID, "bar gaps",
"Expected 'bar [<bar-id>] gaps <all> | <horizonal> "
"<vertical> | <top> <right> <bottom> <left>'");
}
if (i == 0) {
top = amount;
}
if (i == 0 || i == 1) {
right = amount;
}
if (i == 0 || i == 2) {
bottom = amount;
}
if (i == 0 || i == 1 || i == 3) {
left = amount;
}
}
config->current_bar->gaps.top = top;
config->current_bar->gaps.right = right;
config->current_bar->gaps.bottom = bottom;
config->current_bar->gaps.left = left;
wlr_log(WLR_DEBUG, "Setting bar gaps to %d %d %d %d on bar: %s",
config->current_bar->gaps.top, config->current_bar->gaps.right,
config->current_bar->gaps.bottom, config->current_bar->gaps.left,
config->current_bar->id);
if (!config->reading) {
ipc_event_barconfig_update(config->current_bar);
}
return cmd_results_new(CMD_SUCCESS, NULL, NULL);
}

View file

@ -638,6 +638,18 @@ json_object *ipc_json_describe_bar_config(struct bar_config *bar) {
json_object_new_string(bar->status_command) : NULL); json_object_new_string(bar->status_command) : NULL);
json_object_object_add(json, "font", json_object_object_add(json, "font",
json_object_new_string((bar->font) ? bar->font : config->font)); json_object_new_string((bar->font) ? bar->font : config->font));
json_object *gaps = json_object_new_object();
json_object_object_add(gaps, "top",
json_object_new_int(bar->gaps.top));
json_object_object_add(gaps, "right",
json_object_new_int(bar->gaps.right));
json_object_object_add(gaps, "bottom",
json_object_new_int(bar->gaps.bottom));
json_object_object_add(gaps, "left",
json_object_new_int(bar->gaps.left));
json_object_object_add(json, "gaps", gaps);
if (bar->separator_symbol) { if (bar->separator_symbol) {
json_object_object_add(json, "separator_symbol", json_object_object_add(json, "separator_symbol",
json_object_new_string(bar->separator_symbol)); json_object_new_string(bar->separator_symbol));

View file

@ -104,6 +104,7 @@ sway_sources = files(
'commands/bar/colors.c', 'commands/bar/colors.c',
'commands/bar/context_button.c', 'commands/bar/context_button.c',
'commands/bar/font.c', 'commands/bar/font.c',
'commands/bar/gaps.c',
'commands/bar/height.c', 'commands/bar/height.c',
'commands/bar/hidden_state.c', 'commands/bar/hidden_state.c',
'commands/bar/icon_theme.c', 'commands/bar/icon_theme.c',

View file

@ -61,6 +61,13 @@ Sway allows configuring swaybar in the sway configuration file.
*binding\_mode\_indicator* yes|no *binding\_mode\_indicator* yes|no
Enable or disable binding mode indicator. Default is _yes_. Enable or disable binding mode indicator. Default is _yes_.
*gaps* <all> | <horizontal> <vertical> | <top> <right> <bottom> <left>
Sets the gaps from the edge of the screen for the bar. Gaps can either be
set all at once, per direction, or per side. Note that only sides that
touch an edge of the screen can have gaps. For the side that does not
touch an edge of the screen, per-side outer gaps for workspaces may be of
use.
*height* <height> *height* <height>
Sets the height of the bar. Default height will match the font size. Sets the height of the bar. Default height will match the font size.

View file

@ -40,6 +40,12 @@ struct swaybar_config *init_config(void) {
/* height */ /* height */
config->height = 0; config->height = 0;
/* gaps */
config->gaps.top = 0;
config->gaps.right = 0;
config->gaps.bottom = 0;
config->gaps.left = 0;
/* colors */ /* colors */
config->colors.background = 0x000000FF; config->colors.background = 0x000000FF;
config->colors.focused_background = 0x000000FF; config->colors.focused_background = 0x000000FF;

View file

@ -153,7 +153,7 @@ static bool ipc_parse_config(
return false; return false;
} }
json_object *markup, *mode, *hidden_state, *position, *status_command; json_object *markup, *mode, *hidden_state, *position, *status_command;
json_object *font, *bar_height, *wrap_scroll, *workspace_buttons; json_object *font, *gaps, *bar_height, *wrap_scroll, *workspace_buttons;
json_object *strip_workspace_numbers, *strip_workspace_name; json_object *strip_workspace_numbers, *strip_workspace_name;
json_object *binding_mode_indicator, *verbose, *colors, *sep_symbol; json_object *binding_mode_indicator, *verbose, *colors, *sep_symbol;
json_object *outputs, *bindings; json_object *outputs, *bindings;
@ -162,6 +162,7 @@ static bool ipc_parse_config(
json_object_object_get_ex(bar_config, "position", &position); json_object_object_get_ex(bar_config, "position", &position);
json_object_object_get_ex(bar_config, "status_command", &status_command); json_object_object_get_ex(bar_config, "status_command", &status_command);
json_object_object_get_ex(bar_config, "font", &font); json_object_object_get_ex(bar_config, "font", &font);
json_object_object_get_ex(bar_config, "gaps", &gaps);
json_object_object_get_ex(bar_config, "bar_height", &bar_height); json_object_object_get_ex(bar_config, "bar_height", &bar_height);
json_object_object_get_ex(bar_config, "wrap_scroll", &wrap_scroll); json_object_object_get_ex(bar_config, "wrap_scroll", &wrap_scroll);
json_object_object_get_ex(bar_config, "workspace_buttons", &workspace_buttons); json_object_object_get_ex(bar_config, "workspace_buttons", &workspace_buttons);
@ -207,6 +208,24 @@ static bool ipc_parse_config(
if (bar_height) { if (bar_height) {
config->height = json_object_get_int(bar_height); config->height = json_object_get_int(bar_height);
} }
if (gaps) {
json_object *top = json_object_object_get(gaps, "top");
if (top) {
config->gaps.top = json_object_get_int(top);
}
json_object *right = json_object_object_get(gaps, "right");
if (right) {
config->gaps.right = json_object_get_int(right);
}
json_object *bottom = json_object_object_get(gaps, "bottom");
if (bottom) {
config->gaps.bottom = json_object_get_int(bottom);
}
json_object *left = json_object_object_get(gaps, "left");
if (left) {
config->gaps.left = json_object_get_int(left);
}
}
if (markup) { if (markup) {
config->pango_markup = json_object_get_boolean(markup); config->pango_markup = json_object_get_boolean(markup);
} }
@ -446,6 +465,27 @@ static bool handle_barconfig_update(struct swaybar *bar,
config->mode = strdup(json_object_get_string(json_mode)); config->mode = strdup(json_object_get_string(json_mode));
wlr_log(WLR_DEBUG, "Changing bar mode to %s", config->mode); wlr_log(WLR_DEBUG, "Changing bar mode to %s", config->mode);
json_object *gaps;
json_object_object_get_ex(json_config, "gaps", &gaps);
if (gaps) {
json_object *top = json_object_object_get(gaps, "top");
if (top) {
config->gaps.top = json_object_get_int(top);
}
json_object *right = json_object_object_get(gaps, "right");
if (right) {
config->gaps.right = json_object_get_int(right);
}
json_object *bottom = json_object_object_get(gaps, "bottom");
if (bottom) {
config->gaps.bottom = json_object_get_int(bottom);
}
json_object *left = json_object_object_get(gaps, "left");
if (left) {
config->gaps.left = json_object_get_int(left);
}
}
return determine_bar_visibility(bar, true); return determine_bar_visibility(bar, true);
} }

View file

@ -506,6 +506,11 @@ void render_frame(struct swaybar_output *output) {
if (height != output->height || output->width == 0) { if (height != output->height || output->width == 0) {
// Reconfigure surface // Reconfigure surface
zwlr_layer_surface_v1_set_size(output->layer_surface, 0, height); zwlr_layer_surface_v1_set_size(output->layer_surface, 0, height);
zwlr_layer_surface_v1_set_margin(output->layer_surface,
output->bar->config->gaps.top,
output->bar->config->gaps.right,
output->bar->config->gaps.bottom,
output->bar->config->gaps.left);
if (strcmp(output->bar->config->mode, "dock") == 0) { if (strcmp(output->bar->config->mode, "dock") == 0) {
zwlr_layer_surface_v1_set_exclusive_zone(output->layer_surface, height); zwlr_layer_surface_v1_set_exclusive_zone(output->layer_surface, height);
} }