From 1b2e930cb916a90bec394dceb100487565c8a0d7 Mon Sep 17 00:00:00 2001 From: Sebastien Lavoie-Courchesne Date: Sun, 1 Mar 2026 17:55:50 -0500 Subject: [PATCH] swaybar: add option to show tray left of status --- include/sway/commands.h | 1 + include/sway/config.h | 1 + include/swaybar/config.h | 1 + sway/commands/bar.c | 1 + sway/commands/bar/tray_last.c | 29 +++++++++++++++++++++++++++++ sway/config/bar.c | 1 + sway/ipc-json.c | 1 + sway/meson.build | 1 + sway/sway-bar.5.scd | 3 +++ swaybar/config.c | 1 + swaybar/ipc.c | 6 +++++- swaybar/render.c | 11 +++++++++-- 12 files changed, 54 insertions(+), 3 deletions(-) create mode 100644 sway/commands/bar/tray_last.c diff --git a/include/sway/commands.h b/include/sway/commands.h index 389c382eb..5ee151580 100644 --- a/include/sway/commands.h +++ b/include/sway/commands.h @@ -226,6 +226,7 @@ sway_cmd bar_cmd_strip_workspace_name; sway_cmd bar_cmd_swaybar_command; sway_cmd bar_cmd_tray_bindcode; sway_cmd bar_cmd_tray_bindsym; +sway_cmd bar_cmd_tray_last; sway_cmd bar_cmd_tray_output; sway_cmd bar_cmd_tray_padding; sway_cmd bar_cmd_unbindcode; diff --git a/include/sway/config.h b/include/sway/config.h index 16b822fea..a431ce584 100644 --- a/include/sway/config.h +++ b/include/sway/config.h @@ -411,6 +411,7 @@ struct bar_config { struct wl_list tray_bindings; // struct tray_binding::link list_t *tray_outputs; // char * int tray_padding; + bool tray_last; #endif }; diff --git a/include/swaybar/config.h b/include/swaybar/config.h index ad58b3c3c..7a624a00c 100644 --- a/include/swaybar/config.h +++ b/include/swaybar/config.h @@ -79,6 +79,7 @@ struct swaybar_config { bool tray_hidden; list_t *tray_outputs; // char * int tray_padding; + bool tray_last; #endif }; diff --git a/sway/commands/bar.c b/sway/commands/bar.c index 635e895be..ecc73ee3a 100644 --- a/sway/commands/bar.c +++ b/sway/commands/bar.c @@ -30,6 +30,7 @@ static const struct cmd_handler bar_handlers[] = { { "strip_workspace_numbers", bar_cmd_strip_workspace_numbers }, { "tray_bindcode", bar_cmd_tray_bindcode }, { "tray_bindsym", bar_cmd_tray_bindsym }, + { "tray_last", bar_cmd_tray_last }, { "tray_output", bar_cmd_tray_output }, { "tray_padding", bar_cmd_tray_padding }, { "unbindcode", bar_cmd_unbindcode }, diff --git a/sway/commands/bar/tray_last.c b/sway/commands/bar/tray_last.c new file mode 100644 index 000000000..1c71c98c2 --- /dev/null +++ b/sway/commands/bar/tray_last.c @@ -0,0 +1,29 @@ +#include +#include +#include "sway/commands.h" +#include "log.h" +#include "util.h" + +struct cmd_results *bar_cmd_tray_last(int argc, char **argv) { + struct cmd_results *error = NULL; + sway_log(SWAY_DEBUG, "Checking tray_last command"); + if ((error = checkarg(argc, + "tray_last", EXPECTED_EQUAL_TO, 1))) { + return error; + } + + config->current_bar->tray_last = + parse_boolean(argv[0], config->current_bar->tray_last); + + if (config->current_bar->tray_last) { + config->current_bar->tray_last = true; + + sway_log(SWAY_DEBUG, "Making tray the last item on the bar: %s", + config->current_bar->id); + } else { + sway_log(SWAY_DEBUG, "Making tray the before last item on the bar: %s", + config->current_bar->id); + } + + return cmd_results_new(CMD_SUCCESS, NULL); +} diff --git a/sway/config/bar.c b/sway/config/bar.c index f4efb276c..1332f08d5 100644 --- a/sway/config/bar.c +++ b/sway/config/bar.c @@ -172,6 +172,7 @@ struct bar_config *default_bar_config(void) { #if HAVE_TRAY bar->tray_padding = 2; + bar->tray_last = true; wl_list_init(&bar->tray_bindings); #endif diff --git a/sway/ipc-json.c b/sway/ipc-json.c index 3b69ad384..180ec0573 100644 --- a/sway/ipc-json.c +++ b/sway/ipc-json.c @@ -1469,6 +1469,7 @@ json_object *ipc_json_describe_bar_config(struct bar_config *bar) { json_object_object_add(json, "tray_padding", json_object_new_int(bar->tray_padding)); + json_object_object_add(json, "tray_last", json_object_new_boolean(bar->tray_last)); #endif return json; } diff --git a/sway/meson.build b/sway/meson.build index cb03a4d28..381c5f86c 100644 --- a/sway/meson.build +++ b/sway/meson.build @@ -147,6 +147,7 @@ sway_sources = files( 'commands/bar/strip_workspace_name.c', 'commands/bar/swaybar_command.c', 'commands/bar/tray_bind.c', + 'commands/bar/tray_last.c', 'commands/bar/tray_output.c', 'commands/bar/tray_padding.c', 'commands/bar/workspace_buttons.c', diff --git a/sway/sway-bar.5.scd b/sway/sway-bar.5.scd index a1733aa2b..2a6f3a68e 100644 --- a/sway/sway-bar.5.scd +++ b/sway/sway-bar.5.scd @@ -168,6 +168,9 @@ ContextMenu|Activate|SecondaryActivate|ScrollDown|ScrollLeft|ScrollRight|ScrollU action (Activate for button1, ContextMenu for button2 and SecondaryActivate for button3). +*tray_last* yes|no + Sets the tray icons to appear as the last element in the bar. If _no_, the tray will appear to the left of the status command. Default is _yes_. + *tray_padding* [px] Sets the pixel padding of the system tray. This padding will surround the tray on all sides and between each item. The default value for _px_ is 2. diff --git a/swaybar/config.c b/swaybar/config.c index 55bfcb722..81921a43d 100644 --- a/swaybar/config.c +++ b/swaybar/config.c @@ -78,6 +78,7 @@ struct swaybar_config *init_config(void) { #if HAVE_TRAY config->tray_padding = 2; + config->tray_last = true; wl_list_init(&config->tray_bindings); #endif diff --git a/swaybar/ipc.c b/swaybar/ipc.c index 68d8dd32d..e2d859540 100644 --- a/swaybar/ipc.c +++ b/swaybar/ipc.c @@ -283,7 +283,7 @@ static bool ipc_parse_config( config->wrap_scroll = json_object_get_boolean(wrap_scroll); } #if HAVE_TRAY - json_object *tray_outputs, *tray_padding, *tray_bindings, *icon_theme; + json_object *tray_outputs, *tray_padding, *tray_last, *tray_bindings, *icon_theme; if (config->tray_outputs && config->tray_outputs->length) { list_free_items_and_destroy(config->tray_outputs); @@ -308,6 +308,10 @@ static bool ipc_parse_config( config->tray_padding = json_object_get_int(tray_padding); } + if ((json_object_object_get_ex(bar_config, "tray_last", &tray_last))) { + config->tray_last = json_object_get_boolean(tray_last); + } + struct tray_binding *tray_bind = NULL, *tmp_tray_bind = NULL; wl_list_for_each_safe(tray_bind, tmp_tray_bind, &config->tray_bindings, link) { diff --git a/swaybar/render.c b/swaybar/render.c index c51321f18..236ef3f89 100644 --- a/swaybar/render.c +++ b/swaybar/render.c @@ -675,16 +675,23 @@ static uint32_t render_to_cairo(struct render_context *ctx) { * utilize the available space. */ double x = output->width; + /* config->tray_last = false; */ #if HAVE_TRAY - if (bar->tray) { + if (bar->tray && config->tray_last) { uint32_t h = render_tray(cairo, output, &x); max_height = h > max_height ? h : max_height; } #endif - if (bar->status) { + if (bar->status) { uint32_t h = render_status_line(ctx, &x); max_height = h > max_height ? h : max_height; } +#if HAVE_TRAY + if (bar->tray && !config->tray_last) { + uint32_t h = render_tray(cairo, output, &x); + max_height = h > max_height ? h : max_height; + } +#endif x = 0; if (config->workspace_buttons) { struct swaybar_workspace *ws;