swaybar: add status_edge_padding command

This adds the bar subcommand `status_edge_padding <padding>` to set the
padding used when the status line is on the right edge of the bar.
This commit is contained in:
Brian Ashworth 2019-01-11 00:12:24 -05:00
parent c0f92cb2fb
commit ca0a75d540
12 changed files with 44 additions and 4 deletions

View file

@ -198,6 +198,7 @@ sway_cmd bar_cmd_id;
sway_cmd bar_cmd_position; sway_cmd bar_cmd_position;
sway_cmd bar_cmd_separator_symbol; sway_cmd bar_cmd_separator_symbol;
sway_cmd bar_cmd_status_command; sway_cmd bar_cmd_status_command;
sway_cmd bar_cmd_status_edge_padding;
sway_cmd bar_cmd_status_padding; sway_cmd bar_cmd_status_padding;
sway_cmd bar_cmd_pango_markup; sway_cmd bar_cmd_pango_markup;
sway_cmd bar_cmd_strip_workspace_numbers; sway_cmd bar_cmd_strip_workspace_numbers;

View file

@ -233,6 +233,7 @@ struct bar_config {
struct side_gaps gaps; struct side_gaps gaps;
pid_t pid; pid_t pid;
int status_padding; int status_padding;
int status_edge_padding;
struct { struct {
char *background; char *background;
char *statusline; char *statusline;

View file

@ -44,6 +44,7 @@ struct swaybar_config {
bool all_outputs; bool all_outputs;
int height; int height;
int status_padding; int status_padding;
int status_edge_padding;
struct { struct {
int top; int top;
int right; int right;

View file

@ -23,6 +23,7 @@ static struct cmd_handler bar_handlers[] = {
{ "position", bar_cmd_position }, { "position", bar_cmd_position },
{ "separator_symbol", bar_cmd_separator_symbol }, { "separator_symbol", bar_cmd_separator_symbol },
{ "status_command", bar_cmd_status_command }, { "status_command", bar_cmd_status_command },
{ "status_edge_padding", bar_cmd_status_edge_padding },
{ "status_padding", bar_cmd_status_padding }, { "status_padding", bar_cmd_status_padding },
{ "strip_workspace_name", bar_cmd_strip_workspace_name }, { "strip_workspace_name", bar_cmd_strip_workspace_name },
{ "strip_workspace_numbers", bar_cmd_strip_workspace_numbers }, { "strip_workspace_numbers", bar_cmd_strip_workspace_numbers },

View file

@ -0,0 +1,21 @@
#include <stdlib.h>
#include <string.h>
#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);
}

View file

@ -107,6 +107,7 @@ struct bar_config *default_bar_config(void) {
bar->pid = 0; bar->pid = 0;
bar->modifier = get_modifier_mask_by_name("Mod4"); bar->modifier = get_modifier_mask_by_name("Mod4");
bar->status_padding = 1; bar->status_padding = 1;
bar->status_edge_padding = 3;
if (!(bar->mode = strdup("dock"))) { if (!(bar->mode = strdup("dock"))) {
goto cleanup; goto cleanup;
} }

View file

@ -662,6 +662,8 @@ json_object *ipc_json_describe_bar_config(struct bar_config *bar) {
json_object_new_int(bar->height)); json_object_new_int(bar->height));
json_object_object_add(json, "status_padding", json_object_object_add(json, "status_padding",
json_object_new_int(bar->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_object_add(json, "wrap_scroll",
json_object_new_boolean(bar->wrap_scroll)); json_object_new_boolean(bar->wrap_scroll));
json_object_object_add(json, "workspace_buttons", json_object_object_add(json, "workspace_buttons",

View file

@ -116,6 +116,7 @@ sway_sources = files(
'commands/bar/position.c', 'commands/bar/position.c',
'commands/bar/separator_symbol.c', 'commands/bar/separator_symbol.c',
'commands/bar/status_command.c', 'commands/bar/status_command.c',
'commands/bar/status_edge_padding.c',
'commands/bar/status_padding.c', 'commands/bar/status_padding.c',
'commands/bar/strip_workspace_numbers.c', 'commands/bar/strip_workspace_numbers.c',
'commands/bar/strip_workspace_name.c', 'commands/bar/strip_workspace_name.c',

View file

@ -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 _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. the bar. This value will be multiplied by the output scale.
*status\_edge\_padding* <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 ## TRAY
Swaybar provides a system tray where third-party applications may place icons. Swaybar provides a system tray where third-party applications may place icons.

View file

@ -38,6 +38,7 @@ struct swaybar_config *init_config(void) {
config->bindings = create_list(); config->bindings = create_list();
wl_list_init(&config->outputs); wl_list_init(&config->outputs);
config->status_padding = 1; config->status_padding = 1;
config->status_edge_padding = 3;
/* height */ /* height */
config->height = 0; config->height = 0;

View file

@ -157,7 +157,7 @@ static bool ipc_parse_config(
json_object *font, *gaps, *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, *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, "mode", &mode);
json_object_object_get_ex(bar_config, "hidden_state", &hidden_state); json_object_object_get_ex(bar_config, "hidden_state", &hidden_state);
json_object_object_get_ex(bar_config, "position", &position); 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, "pango_markup", &markup);
json_object_object_get_ex(bar_config, "bindings", &bindings); 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_padding", &status_padding);
json_object_object_get_ex(bar_config, "status_edge_padding",
&status_edge_padding);
if (status_command) { if (status_command) {
free(config->status_command); free(config->status_command);
config->status_command = strdup(json_object_get_string(status_command)); config->status_command = strdup(json_object_get_string(status_command));
@ -213,6 +215,9 @@ static bool ipc_parse_config(
if (status_padding) { if (status_padding) {
config->status_padding = json_object_get_int(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) { if (gaps) {
json_object *top = json_object_object_get(gaps, "top"); json_object *top = json_object_object_get(gaps, "top");
if (top) { if (top) {

View file

@ -194,8 +194,8 @@ static uint32_t render_status_block(cairo_t *cairo,
} }
} }
*x -= sep_block_width; *x -= sep_block_width;
} else { } else if (config->status_edge_padding) {
*x -= margin; *x -= config->status_edge_padding * output->scale;
} }
uint32_t height = output->height * 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, static uint32_t render_status_line_i3bar(cairo_t *cairo,
struct swaybar_output *output, double *x) { struct swaybar_output *output, double *x) {
uint32_t max_height = 0; uint32_t max_height = 0;
bool edge = true; bool edge = *x == output->width * output->scale;
struct i3bar_block *block; struct i3bar_block *block;
wl_list_for_each(block, &output->bar->status->blocks, link) { wl_list_for_each(block, &output->bar->status->blocks, link) {
uint32_t h = render_status_block(cairo, output, block, x, edge); uint32_t h = render_status_block(cairo, output, block, x, edge);