Merge pull request #3208 from RedSoxFan/bar-gaps

Implement bar gaps
master
emersion 6 years ago committed by GitHub
commit 2c31e82675
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -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;

@ -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;

@ -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;

@ -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 },

@ -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);
}

@ -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));

@ -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',

@ -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.

@ -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;

@ -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);
} }

@ -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);
} }

Loading…
Cancel
Save