diff --git a/include/sway/commands.h b/include/sway/commands.h index 95f34140..04f93ba9 100644 --- a/include/sway/commands.h +++ b/include/sway/commands.h @@ -198,6 +198,7 @@ sway_cmd bar_cmd_id; sway_cmd bar_cmd_position; sway_cmd bar_cmd_separator_symbol; sway_cmd bar_cmd_status_command; +sway_cmd bar_cmd_status_edge_padding; sway_cmd bar_cmd_status_padding; sway_cmd bar_cmd_pango_markup; sway_cmd bar_cmd_strip_workspace_numbers; diff --git a/include/sway/config.h b/include/sway/config.h index c49d4ccf..a667984d 100644 --- a/include/sway/config.h +++ b/include/sway/config.h @@ -233,6 +233,7 @@ struct bar_config { struct side_gaps gaps; pid_t pid; int status_padding; + int status_edge_padding; struct { char *background; char *statusline; diff --git a/include/swaybar/config.h b/include/swaybar/config.h index ce0dd4c9..add0a1cf 100644 --- a/include/swaybar/config.h +++ b/include/swaybar/config.h @@ -44,6 +44,7 @@ struct swaybar_config { bool all_outputs; int height; int status_padding; + int status_edge_padding; struct { int top; int right; diff --git a/sway/commands/bar.c b/sway/commands/bar.c index 81d84331..3e7c1b0f 100644 --- a/sway/commands/bar.c +++ b/sway/commands/bar.c @@ -23,6 +23,7 @@ static struct cmd_handler bar_handlers[] = { { "position", bar_cmd_position }, { "separator_symbol", bar_cmd_separator_symbol }, { "status_command", bar_cmd_status_command }, + { "status_edge_padding", bar_cmd_status_edge_padding }, { "status_padding", bar_cmd_status_padding }, { "strip_workspace_name", bar_cmd_strip_workspace_name }, { "strip_workspace_numbers", bar_cmd_strip_workspace_numbers }, diff --git a/sway/commands/bar/status_edge_padding.c b/sway/commands/bar/status_edge_padding.c new file mode 100644 index 00000000..f3b10631 --- /dev/null +++ b/sway/commands/bar/status_edge_padding.c @@ -0,0 +1,21 @@ +#include +#include +#include "sway/commands.h" +#include "log.h" + +struct cmd_results *bar_cmd_status_edge_padding(int argc, char **argv) { + struct cmd_results *error = NULL; + if ((error = checkarg(argc, "status_edge_padding", EXPECTED_EQUAL_TO, 1))) { + return error; + } + char *end; + int padding = strtol(argv[0], &end, 10); + if (strlen(end) || padding < 0) { + return cmd_results_new(CMD_INVALID, "status_edge_padding", + "Padding must be a positive integer"); + } + config->current_bar->status_edge_padding = padding; + wlr_log(WLR_DEBUG, "Status edge padding on bar %s: %d", + config->current_bar->id, config->current_bar->status_edge_padding); + return cmd_results_new(CMD_SUCCESS, NULL, NULL); +} diff --git a/sway/config/bar.c b/sway/config/bar.c index ebe81cab..101562d1 100644 --- a/sway/config/bar.c +++ b/sway/config/bar.c @@ -107,6 +107,7 @@ struct bar_config *default_bar_config(void) { bar->pid = 0; bar->modifier = get_modifier_mask_by_name("Mod4"); bar->status_padding = 1; + bar->status_edge_padding = 3; if (!(bar->mode = strdup("dock"))) { goto cleanup; } diff --git a/sway/ipc-json.c b/sway/ipc-json.c index a21fb4f6..09b65e8d 100644 --- a/sway/ipc-json.c +++ b/sway/ipc-json.c @@ -662,6 +662,8 @@ json_object *ipc_json_describe_bar_config(struct bar_config *bar) { json_object_new_int(bar->height)); json_object_object_add(json, "status_padding", json_object_new_int(bar->status_padding)); + json_object_object_add(json, "status_edge_padding", + json_object_new_int(bar->status_edge_padding)); json_object_object_add(json, "wrap_scroll", json_object_new_boolean(bar->wrap_scroll)); json_object_object_add(json, "workspace_buttons", diff --git a/sway/meson.build b/sway/meson.build index 1f7ae060..ab5862c5 100644 --- a/sway/meson.build +++ b/sway/meson.build @@ -116,6 +116,7 @@ sway_sources = files( 'commands/bar/position.c', 'commands/bar/separator_symbol.c', 'commands/bar/status_command.c', + 'commands/bar/status_edge_padding.c', 'commands/bar/status_padding.c', 'commands/bar/strip_workspace_numbers.c', 'commands/bar/strip_workspace_name.c', diff --git a/sway/sway-bar.5.scd b/sway/sway-bar.5.scd index 4448e3e8..b345b392 100644 --- a/sway/sway-bar.5.scd +++ b/sway/sway-bar.5.scd @@ -97,6 +97,11 @@ Sway allows configuring swaybar in the sway configuration file. _1_. If _padding_ is _0_, blocks will be able to take up the full height of the bar. This value will be multiplied by the output scale. +*status\_edge\_padding* + Sets the padding that is used when the status line is at the right edge of + the bar. This value will be multiplied by the output scale. The default is + _3_. + ## TRAY Swaybar provides a system tray where third-party applications may place icons. diff --git a/swaybar/config.c b/swaybar/config.c index 86a76a7f..d4cc9b1a 100644 --- a/swaybar/config.c +++ b/swaybar/config.c @@ -38,6 +38,7 @@ struct swaybar_config *init_config(void) { config->bindings = create_list(); wl_list_init(&config->outputs); config->status_padding = 1; + config->status_edge_padding = 3; /* height */ config->height = 0; diff --git a/swaybar/ipc.c b/swaybar/ipc.c index 77e1b94e..bc5c28b4 100644 --- a/swaybar/ipc.c +++ b/swaybar/ipc.c @@ -157,7 +157,7 @@ static bool ipc_parse_config( json_object *font, *gaps, *bar_height, *wrap_scroll, *workspace_buttons; json_object *strip_workspace_numbers, *strip_workspace_name; json_object *binding_mode_indicator, *verbose, *colors, *sep_symbol; - json_object *outputs, *bindings, *status_padding; + json_object *outputs, *bindings, *status_padding, *status_edge_padding; json_object_object_get_ex(bar_config, "mode", &mode); json_object_object_get_ex(bar_config, "hidden_state", &hidden_state); json_object_object_get_ex(bar_config, "position", &position); @@ -177,6 +177,8 @@ static bool ipc_parse_config( json_object_object_get_ex(bar_config, "pango_markup", &markup); json_object_object_get_ex(bar_config, "bindings", &bindings); json_object_object_get_ex(bar_config, "status_padding", &status_padding); + json_object_object_get_ex(bar_config, "status_edge_padding", + &status_edge_padding); if (status_command) { free(config->status_command); config->status_command = strdup(json_object_get_string(status_command)); @@ -213,6 +215,9 @@ static bool ipc_parse_config( if (status_padding) { config->status_padding = json_object_get_int(status_padding); } + if (status_edge_padding) { + config->status_edge_padding = json_object_get_int(status_edge_padding); + } if (gaps) { json_object *top = json_object_object_get(gaps, "top"); if (top) { diff --git a/swaybar/render.c b/swaybar/render.c index edc97e77..993c8228 100644 --- a/swaybar/render.c +++ b/swaybar/render.c @@ -194,8 +194,8 @@ static uint32_t render_status_block(cairo_t *cairo, } } *x -= sep_block_width; - } else { - *x -= margin; + } else if (config->status_edge_padding) { + *x -= config->status_edge_padding * output->scale; } uint32_t height = output->height * output->scale; @@ -287,7 +287,7 @@ static uint32_t render_status_block(cairo_t *cairo, static uint32_t render_status_line_i3bar(cairo_t *cairo, struct swaybar_output *output, double *x) { uint32_t max_height = 0; - bool edge = true; + bool edge = *x == output->width * output->scale; struct i3bar_block *block; wl_list_for_each(block, &output->bar->status->blocks, link) { uint32_t h = render_status_block(cairo, output, block, x, edge);