From 02812a2e4da9f274c5957975fdbb4a4a58b20a69 Mon Sep 17 00:00:00 2001 From: Drew DeVault Date: Sat, 29 Apr 2017 09:56:07 -0400 Subject: Support specifying fewer than 5 colors This doesn't work, I'm not sure why. The color structs definitely get changed but if you specify fewer than 5, it renders with the defaults. --- sway/commands.c | 2 +- sway/commands/client.c | 22 +++++++++++----------- 2 files changed, 12 insertions(+), 12 deletions(-) (limited to 'sway') diff --git a/sway/commands.c b/sway/commands.c index 01e5e6b5..509fd1a8 100644 --- a/sway/commands.c +++ b/sway/commands.c @@ -250,7 +250,7 @@ static struct cmd_handler bar_handlers[] = { */ struct cmd_results *add_color(const char *name, char *buffer, const char *color) { int len = strlen(color); - if (len != 7 && len != 9 ) { + if (len != 7 && len != 9) { return cmd_results_new(CMD_INVALID, name, "Invalid color definition %s", color); } diff --git a/sway/commands/client.c b/sway/commands/client.c index 7954f670..30f9137e 100644 --- a/sway/commands/client.c +++ b/sway/commands/client.c @@ -4,27 +4,27 @@ static struct cmd_results *parse_border_color(struct border_colors *border_colors, const char *cmd_name, int argc, char **argv) { struct cmd_results *error = NULL; - if (argc != 5) { - return cmd_results_new(CMD_INVALID, cmd_name, "Requires exactly five color values"); + if (argc < 3 || argc > 5) { + return cmd_results_new(CMD_INVALID, cmd_name, "Requires between three and five color values"); } - uint32_t colors[5]; + uint32_t *colors[5] = { + &border_colors->border, + &border_colors->background, + &border_colors->text, + &border_colors->indicator, + &border_colors->child_border + }; int i; - for (i = 0; i < 5; i++) { + for (i = 0; i < argc; i++) { char buffer[10]; error = add_color(cmd_name, buffer, argv[i]); if (error) { return error; } - colors[i] = strtoul(buffer+1, NULL, 16); + *colors[i] = strtoul(buffer + 1, NULL, 16); } - border_colors->border = colors[0]; - border_colors->background = colors[1]; - border_colors->text = colors[2]; - border_colors->indicator = colors[3]; - border_colors->child_border = colors[4]; - return cmd_results_new(CMD_SUCCESS, NULL, NULL); } -- cgit v1.2.3 From 816ceddcbdd6c98648784e85559b495b63613b7b Mon Sep 17 00:00:00 2001 From: Drew DeVault Date: Sat, 29 Apr 2017 10:07:18 -0400 Subject: Set child border to background if not specified --- sway/commands/client.c | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'sway') diff --git a/sway/commands/client.c b/sway/commands/client.c index 30f9137e..f3d879cd 100644 --- a/sway/commands/client.c +++ b/sway/commands/client.c @@ -25,6 +25,10 @@ static struct cmd_results *parse_border_color(struct border_colors *border_color *colors[i] = strtoul(buffer + 1, NULL, 16); } + if (argc < 5) { + border_colors->child_border = border_colors->background; + } + return cmd_results_new(CMD_SUCCESS, NULL, NULL); } -- cgit v1.2.3 From f65a88e68d1ddd606f1a596ed697887c3b3888d0 Mon Sep 17 00:00:00 2001 From: Zandr Martin Date: Sat, 29 Apr 2017 14:02:07 -0400 Subject: prevent crash when `layout auto` is missing args --- sway/commands/layout.c | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'sway') diff --git a/sway/commands/layout.c b/sway/commands/layout.c index 40ebd590..57a86565 100644 --- a/sway/commands/layout.c +++ b/sway/commands/layout.c @@ -85,6 +85,10 @@ static struct cmd_results *cmd_layout_auto(swayc_t *container, int argc, char ** enum swayc_layouts old_layout = container->layout; enum swayc_layouts layout = old_layout; + if ((error = checkarg(argc, "layout auto", EXPECTED_MORE_THAN, 1))) { + return error; + } + if (strcasecmp(argv[1], "left") == 0) { layout = L_AUTO_LEFT; } else if (strcasecmp(argv[1], "right") == 0) { -- cgit v1.2.3 From 51ce752ebf490d9cb62e89f3a2d2b95252105156 Mon Sep 17 00:00:00 2001 From: Zandr Martin Date: Mon, 1 May 2017 12:53:07 -0400 Subject: document font command --- sway/sway.5.txt | 5 +++++ 1 file changed, 5 insertions(+) (limited to 'sway') diff --git a/sway/sway.5.txt b/sway/sway.5.txt index 1fa0b856..131780e2 100644 --- a/sway/sway.5.txt +++ b/sway/sway.5.txt @@ -276,6 +276,11 @@ The default colors are: **focus_follows_mouse** :: If set to _yes_, moving your mouse over a window will focus that window. +**font** :: + Sets font for use in title bars. Generally the format is something like "Name + Style Size" e.g. "Deja Vu Sans Book 12". You can also use Pango font + descriptions with "pango:font". + **for_window** :: Whenever a window that matches _criteria_ appears, run list of commands. See **Criteria** section below. -- cgit v1.2.3 From 400998d6d2bf311f3402faf092154ee8ceac2bf9 Mon Sep 17 00:00:00 2001 From: Josip Janzic Date: Thu, 4 May 2017 22:42:50 +0200 Subject: Add mouse button bindings Adds support for bindings like: bindsym button3 floating toggle bindsym $mod+button3 floating toggle --- sway/commands/bind.c | 8 ++++++++ sway/handlers.c | 20 ++++++++++++++++++++ 2 files changed, 28 insertions(+) (limited to 'sway') diff --git a/sway/commands/bind.c b/sway/commands/bind.c index 8282277b..af5a01e5 100644 --- a/sway/commands/bind.c +++ b/sway/commands/bind.c @@ -1,7 +1,9 @@ #include #include +#include #include "sway/commands.h" #include "sway/config.h" +#include "sway/input_state.h" #include "list.h" #include "log.h" #include "stringop.h" @@ -52,6 +54,12 @@ struct cmd_results *cmd_bindsym(int argc, char **argv) { // Check for xkb key xkb_keysym_t sym = xkb_keysym_from_name(split->items[i], XKB_KEYSYM_CASE_INSENSITIVE); + + // Check for mouse binding + if (strncasecmp(split->items[i], "button", strlen("button")) == 0 && + strlen(split->items[i]) == strlen("button0")) { + sym = ((char *)split->items[i])[strlen("button")] - '1' + M_LEFT_CLICK; + } if (!sym) { free_sway_binding(binding); free_flat_list(split); diff --git a/sway/handlers.c b/sway/handlers.c index da765d6d..e1b90a07 100644 --- a/sway/handlers.c +++ b/sway/handlers.c @@ -917,6 +917,26 @@ static bool handle_pointer_button(wlc_handle view, uint32_t time, const struct w // Update view pointer is on pointer_state.view = container_under_pointer(); + struct sway_mode *mode = config->current_mode; + // handle bindings + for (int i = 0; i < mode->bindings->length; ++i) { + struct sway_binding *binding = mode->bindings->items[i]; + if ((modifiers->mods ^ binding->modifiers) == 0) { + switch (state) { + case WLC_BUTTON_STATE_PRESSED: { + if (!binding->release && handle_bindsym(binding, button, 0)) { + return EVENT_HANDLED; + } + } + case WLC_BUTTON_STATE_RELEASED: + if (binding->release && handle_bindsym(binding, button, 0)) { + return EVENT_HANDLED; + } + break; + } + } + } + // Update pointer_state switch (button) { case M_LEFT_CLICK: -- cgit v1.2.3 From 264a9ee9d8da6634775b49a07be4694b8507ce63 Mon Sep 17 00:00:00 2001 From: wdbw Date: Sat, 6 May 2017 10:45:17 +0100 Subject: Add missing send-event mode to sway-input(5) Also, fix a small typo. --- sway/sway-input.5.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'sway') diff --git a/sway/sway-input.5.txt b/sway/sway-input.5.txt index e92b523a..f44a3179 100644 --- a/sway/sway-input.5.txt +++ b/sway/sway-input.5.txt @@ -30,7 +30,7 @@ Commands **input** dwt :: Enables or disables disable-while-typing for the specified input device. -**input** events :: +**input** events :: Enables or disables send_events for specified input device. (Disabling send_events disables the input device) -- cgit v1.2.3 From f736198c315bb91bfa7faff095181a3e8e89df94 Mon Sep 17 00:00:00 2001 From: Mykyta Holubakha Date: Thu, 11 May 2017 19:29:10 +0300 Subject: Initialise logging earlier --- sway/main.c | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) (limited to 'sway') diff --git a/sway/main.c b/sway/main.c index b9549b12..3d2d6c68 100644 --- a/sway/main.c +++ b/sway/main.c @@ -288,6 +288,15 @@ int main(int argc, char **argv) { } } + // we need to setup logging before wlc_init in case it fails. + if (debug) { + init_log(L_DEBUG); + } else if (verbose || validate) { + init_log(L_INFO); + } else { + init_log(L_ERROR); + } + if (optind < argc) { // Behave as IPC client if(optind != 1) { sway_log(L_ERROR, "Don't use options with the IPC client"); @@ -329,14 +338,6 @@ int main(int argc, char **argv) { } #endif - // we need to setup logging before wlc_init in case it fails. - if (debug) { - init_log(L_DEBUG); - } else if (verbose || validate) { - init_log(L_INFO); - } else { - init_log(L_ERROR); - } wlc_log_set_handler(wlc_log_handler); log_kernel(); log_distro(); -- cgit v1.2.3 From 93cf21fb9afd8205f01399ed2d8dcbe16b522fa4 Mon Sep 17 00:00:00 2001 From: Mykyta Holubakha Date: Wed, 10 May 2017 02:51:28 +0300 Subject: Terminate when both suid bit and filecaps are set --- sway/main.c | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) (limited to 'sway') diff --git a/sway/main.c b/sway/main.c index 3d2d6c68..819788b1 100644 --- a/sway/main.c +++ b/sway/main.c @@ -27,6 +27,7 @@ #include "stringop.h" #include "sway.h" #include "log.h" +#include "util.h" static bool terminate_request = false; static int exit_value = 0; @@ -209,6 +210,27 @@ static void security_sanity_check() { #endif } +static void executable_sanity_check() { +#ifdef __linux__ + struct stat sb; + char *exe = realpath("/proc/self/exe", NULL); + stat(exe, &sb); + // We assume that cap_get_file returning NULL implies ENODATA + if (sb.st_mode & (S_ISUID|S_ISGID) && cap_get_file(exe)) { + sway_log(L_ERROR, + "sway executable has both the s(g)uid bit AND file caps set."); + sway_log(L_ERROR, + "This is strongly discouraged (and completely broken)."); + sway_log(L_ERROR, + "Please clear one of them (either the suid bit, or the file caps)."); + sway_log(L_ERROR, + "If unsure, strip the file caps."); + exit(EXIT_FAILURE); + } + free(exe); +#endif +} + int main(int argc, char **argv) { static int verbose = 0, debug = 0, validate = 0; @@ -326,6 +348,7 @@ int main(int argc, char **argv) { return 0; } + executable_sanity_check(); #ifdef __linux__ bool suid = false; if (getuid() != geteuid() || getgid() != getegid()) { -- cgit v1.2.3 From 7fef2830446e1f98a02f8d8a3bba866b7edd5bd0 Mon Sep 17 00:00:00 2001 From: johalun Date: Mon, 5 Jun 2017 13:44:29 +0200 Subject: FreeBSD fixes Increase _POSIX_SOURCE value where needed. Increase _XOPEN_SOURCE value where needed. Conditionally link to libcap (only on Linux). Possibly some trailing whitespace fixes (automatic). --- sway/border.c | 2 +- sway/commands.c | 2 +- sway/commands/assign.c | 3 +-- sway/commands/set.c | 2 +- sway/config.c | 4 ++-- sway/criteria.c | 2 +- sway/input.c | 4 ++-- sway/main.c | 3 +-- sway/security.c | 2 +- 9 files changed, 11 insertions(+), 13 deletions(-) (limited to 'sway') diff --git a/sway/border.c b/sway/border.c index 10ad92c2..df0022ce 100644 --- a/sway/border.c +++ b/sway/border.c @@ -1,4 +1,4 @@ -#define _XOPEN_SOURCE 500 +#define _XOPEN_SOURCE 700 #include #include #include diff --git a/sway/commands.c b/sway/commands.c index 509fd1a8..34218491 100644 --- a/sway/commands.c +++ b/sway/commands.c @@ -1,4 +1,4 @@ -#define _XOPEN_SOURCE 500 +#define _XOPEN_SOURCE 700 #include #include #include diff --git a/sway/commands/assign.c b/sway/commands/assign.c index ec262bb8..c3b03bbc 100644 --- a/sway/commands/assign.c +++ b/sway/commands/assign.c @@ -1,4 +1,4 @@ -#define _XOPEN_SOURCE 500 +#define _XOPEN_SOURCE 700 #include #include #include "sway/commands.h" @@ -55,4 +55,3 @@ struct cmd_results *cmd_assign(int argc, char **argv) { } return error ? error : cmd_results_new(CMD_SUCCESS, NULL, NULL); } - diff --git a/sway/commands/set.c b/sway/commands/set.c index 1d6bce04..e3d08dd3 100644 --- a/sway/commands/set.c +++ b/sway/commands/set.c @@ -1,4 +1,4 @@ -#define _XOPEN_SOURCE 500 +#define _XOPEN_SOURCE 700 #include #include #include diff --git a/sway/config.c b/sway/config.c index 19b1882f..85823953 100644 --- a/sway/config.c +++ b/sway/config.c @@ -1,5 +1,5 @@ #define _POSIX_C_SOURCE 200809L -#define _XOPEN_SOURCE 500 +#define _XOPEN_SOURCE 700 #include #include #include @@ -527,7 +527,7 @@ bool load_main_config(const char *file, bool is_active) { list_add(config->config_chain, path); config->reading = true; - + // Read security configs bool success = true; DIR *dir = opendir(SYSCONFDIR "/sway/security.d"); diff --git a/sway/criteria.c b/sway/criteria.c index 1ea8311e..04683f66 100644 --- a/sway/criteria.c +++ b/sway/criteria.c @@ -1,4 +1,4 @@ -#define _XOPEN_SOURCE 500 +#define _XOPEN_SOURCE 700 #include #include #include diff --git a/sway/input.c b/sway/input.c index 4f1ef760..6263f79f 100644 --- a/sway/input.c +++ b/sway/input.c @@ -1,4 +1,4 @@ -#define _XOPEN_SOURCE 500 +#define _XOPEN_SOURCE 700 #include #include #include @@ -60,7 +60,7 @@ char *libinput_dev_unique_id(struct libinput_device *device) { } const char *fmt = "%d:%d:%s"; - snprintf(identifier, len, fmt, vendor, product, name); + snprintf(identifier, len, fmt, vendor, product, name); free(name); return identifier; } diff --git a/sway/main.c b/sway/main.c index 819788b1..82375e0b 100644 --- a/sway/main.c +++ b/sway/main.c @@ -1,4 +1,4 @@ -#define _XOPEN_SOURCE 500 +#define _XOPEN_SOURCE 700 #define _POSIX_C_SOURCE 200112L #include #include @@ -433,4 +433,3 @@ int main(int argc, char **argv) { return exit_value; } - diff --git a/sway/security.c b/sway/security.c index 8eab6126..92de06c1 100644 --- a/sway/security.c +++ b/sway/security.c @@ -1,4 +1,4 @@ -#define _XOPEN_SOURCE 500 +#define _XOPEN_SOURCE 700 #include #include #include -- cgit v1.2.3 From 843ad38b3c427adb0bf319e9613d9813c8d9246c Mon Sep 17 00:00:00 2001 From: Calvin Lee Date: Wed, 7 Jun 2017 16:45:28 -0700 Subject: Implement Tray Icons This commit implements the StatusNotifierItem protocol, and enables swaybar to show tray icons. It also uses `xembedsniproxy` in order to communicate with xembed applications. The tray is completely optional, and can be disabled on compile time with the `enable-tray` option. Or on runtime with the bar config option `tray_output none`. Overview of changes: In swaybar very little is changed outside the tray subfolder except that all events are now polled in `event_loop.c`, this creates no functional difference. Six bar configuration options were added, these are detailed in sway-bar(5) The tray subfolder is where all protocol implementation takes place and is organised as follows: tray/sni_watcher.c: This file contains the StatusNotifierWatcher. It keeps track of items and hosts and reports when they come or go. tray/tray.c This file contains the StatusNotifierHost. It keeps track of sway's version of the items and represents the tray itself. tray/sni.c This file contains the StatusNotifierItem struct and all communication with individual items. tray/icon.c This file implements the icon theme protocol. It allows for finding icons by name, rather than by pixmap. tray/dbus.c This file allows for asynchronous DBus communication. See #986 #343 --- sway/commands.c | 4 ++++ sway/commands/bar/activate_button.c | 26 ++++++++++++++++++++++++++ sway/commands/bar/context_button.c | 26 ++++++++++++++++++++++++++ sway/commands/bar/icon_theme.c | 25 +++++++++++++++++++++++++ sway/commands/bar/secondary_button.c | 26 ++++++++++++++++++++++++++ sway/commands/bar/tray_output.c | 26 ++++++++++++++++++++++++-- sway/commands/bar/tray_padding.c | 34 +++++++++++++++++++--------------- sway/config.c | 11 +++++++++++ sway/ipc-json.c | 17 ++++++++++++++++- sway/sway-bar.5.txt | 36 ++++++++++++++++++++++++++++++++++++ 10 files changed, 213 insertions(+), 18 deletions(-) create mode 100644 sway/commands/bar/activate_button.c create mode 100644 sway/commands/bar/context_button.c create mode 100644 sway/commands/bar/icon_theme.c create mode 100644 sway/commands/bar/secondary_button.c (limited to 'sway') diff --git a/sway/commands.c b/sway/commands.c index 34218491..f83b5287 100644 --- a/sway/commands.c +++ b/sway/commands.c @@ -221,18 +221,22 @@ static struct cmd_handler handlers[] = { }; static struct cmd_handler bar_handlers[] = { + { "activate_button", bar_cmd_activate_button }, { "binding_mode_indicator", bar_cmd_binding_mode_indicator }, { "bindsym", bar_cmd_bindsym }, { "colors", bar_cmd_colors }, + { "context_button", bar_cmd_context_button }, { "font", bar_cmd_font }, { "height", bar_cmd_height }, { "hidden_state", bar_cmd_hidden_state }, + { "icon_theme", bar_cmd_icon_theme }, { "id", bar_cmd_id }, { "mode", bar_cmd_mode }, { "modifier", bar_cmd_modifier }, { "output", bar_cmd_output }, { "pango_markup", bar_cmd_pango_markup }, { "position", bar_cmd_position }, + { "secondary_button", bar_cmd_secondary_button }, { "separator_symbol", bar_cmd_separator_symbol }, { "status_command", bar_cmd_status_command }, { "strip_workspace_numbers", bar_cmd_strip_workspace_numbers }, diff --git a/sway/commands/bar/activate_button.c b/sway/commands/bar/activate_button.c new file mode 100644 index 00000000..32a1d3e5 --- /dev/null +++ b/sway/commands/bar/activate_button.c @@ -0,0 +1,26 @@ +#include +#include "sway/commands.h" +#include "log.h" + +struct cmd_results *bar_cmd_activate_button(int argc, char **argv) { + const char *cmd_name = "activate_button"; +#ifndef ENABLE_TRAY + return cmd_results_new(CMD_INVALID, cmd_name, "Invalid %s command " + "%s called, but sway was compiled without tray support", + cmd_name, cmd_name); +#else + struct cmd_results *error = NULL; + if ((error = checkarg(argc, cmd_name, EXPECTED_EQUAL_TO, 1))) { + return error; + } + + if (!config->current_bar) { + return cmd_results_new(CMD_FAILURE, cmd_name, "No bar defined."); + } + + // User should be able to prefix with 0x or whatever they want + config->current_bar->secondary_button = strtoul(argv[0], NULL, 0); + + return cmd_results_new(CMD_SUCCESS, NULL, NULL); +#endif +} diff --git a/sway/commands/bar/context_button.c b/sway/commands/bar/context_button.c new file mode 100644 index 00000000..6d7d7aec --- /dev/null +++ b/sway/commands/bar/context_button.c @@ -0,0 +1,26 @@ +#include +#include "sway/commands.h" +#include "log.h" + +struct cmd_results *bar_cmd_context_button(int argc, char **argv) { + const char *cmd_name = "context_button"; +#ifndef ENABLE_TRAY + return cmd_results_new(CMD_INVALID, cmd_name, "Invalid %s command " + "%s called, but sway was compiled without tray support", + cmd_name, cmd_name); +#else + struct cmd_results *error = NULL; + if ((error = checkarg(argc, cmd_name, EXPECTED_EQUAL_TO, 1))) { + return error; + } + + if (!config->current_bar) { + return cmd_results_new(CMD_FAILURE, cmd_name, "No bar defined."); + } + + // User should be able to prefix with 0x or whatever they want + config->current_bar->context_button = strtoul(argv[0], NULL, 0); + + return cmd_results_new(CMD_SUCCESS, NULL, NULL); +#endif +} diff --git a/sway/commands/bar/icon_theme.c b/sway/commands/bar/icon_theme.c new file mode 100644 index 00000000..cbfc0be5 --- /dev/null +++ b/sway/commands/bar/icon_theme.c @@ -0,0 +1,25 @@ +#define _XOPEN_SOURCE 500 +#include +#include "sway/commands.h" + +struct cmd_results *bar_cmd_icon_theme(int argc, char **argv) { + const char *cmd_name = "tray_output"; +#ifndef ENABLE_TRAY + return cmd_results_new(CMD_INVALID, cmd_name, "Invalid %s command " + "%s called, but sway was compiled without tray support", + cmd_name, cmd_name); +#else + struct cmd_results *error = NULL; + if ((error = checkarg(argc, cmd_name, EXPECTED_EQUAL_TO, 1))) { + return error; + } + + if (!config->current_bar) { + return cmd_results_new(CMD_FAILURE, cmd_name, "No bar defined."); + } + + config->current_bar->icon_theme = strdup(argv[0]); + + return cmd_results_new(CMD_SUCCESS, NULL, NULL); +#endif +} diff --git a/sway/commands/bar/secondary_button.c b/sway/commands/bar/secondary_button.c new file mode 100644 index 00000000..745045c5 --- /dev/null +++ b/sway/commands/bar/secondary_button.c @@ -0,0 +1,26 @@ +#include +#include "sway/commands.h" +#include "log.h" + +struct cmd_results *bar_cmd_secondary_button(int argc, char **argv) { + const char *cmd_name = "secondary_button"; +#ifndef ENABLE_TRAY + return cmd_results_new(CMD_INVALID, cmd_name, "Invalid %s command " + "%s called, but sway was compiled without tray support", + cmd_name, cmd_name); +#else + struct cmd_results *error = NULL; + if ((error = checkarg(argc, cmd_name, EXPECTED_EQUAL_TO, 1))) { + return error; + } + + if (!config->current_bar) { + return cmd_results_new(CMD_FAILURE, cmd_name, "No bar defined."); + } + + // User should be able to prefix with 0x or whatever they want + config->current_bar->secondary_button = strtoul(argv[0], NULL, 0); + + return cmd_results_new(CMD_SUCCESS, NULL, NULL); +#endif +} diff --git a/sway/commands/bar/tray_output.c b/sway/commands/bar/tray_output.c index 8a1b5d35..012304a9 100644 --- a/sway/commands/bar/tray_output.c +++ b/sway/commands/bar/tray_output.c @@ -1,7 +1,29 @@ +#define _XOPEN_SOURCE 500 +#include #include "sway/commands.h" -#include "log.h" struct cmd_results *bar_cmd_tray_output(int argc, char **argv) { - sway_log(L_ERROR, "Warning: tray_output is not supported on wayland"); + const char *cmd_name = "tray_output"; +#ifndef ENABLE_TRAY + return cmd_results_new(CMD_INVALID, cmd_name, "Invalid %s command " + "%s called, but sway was compiled without tray support", + cmd_name, cmd_name); +#else + struct cmd_results *error = NULL; + if ((error = checkarg(argc, cmd_name, EXPECTED_EQUAL_TO, 1))) { + return error; + } + + if (!config->current_bar) { + return cmd_results_new(CMD_FAILURE, cmd_name, "No bar defined."); + } + + if (strcmp(argv[0], "all") == 0) { + // Default behaviour + return cmd_results_new(CMD_SUCCESS, NULL, NULL); + } + config->current_bar->tray_output = strdup(argv[0]); + return cmd_results_new(CMD_SUCCESS, NULL, NULL); +#endif } diff --git a/sway/commands/bar/tray_padding.c b/sway/commands/bar/tray_padding.c index 8c559f65..ac0572ce 100644 --- a/sway/commands/bar/tray_padding.c +++ b/sway/commands/bar/tray_padding.c @@ -1,30 +1,34 @@ #include -#include #include #include "sway/commands.h" #include "log.h" struct cmd_results *bar_cmd_tray_padding(int argc, char **argv) { + const char *cmd_name = "tray_padding"; +#ifndef ENABLE_TRAY + return cmd_results_new(CMD_INVALID, cmd_name, "Invalid %s command" + "%s called, but sway was compiled without tray support", + cmd_name, cmd_name); +#else struct cmd_results *error = NULL; - if ((error = checkarg(argc, "tray_padding", EXPECTED_AT_LEAST, 1))) { + if ((error = checkarg(argc, cmd_name, EXPECTED_AT_LEAST, 1))) { return error; } if (!config->current_bar) { - return cmd_results_new(CMD_FAILURE, "tray_padding", "No bar defined."); + return cmd_results_new(CMD_FAILURE, cmd_name, "No bar defined."); } - int padding = atoi(argv[0]); - if (padding < 0) { - return cmd_results_new(CMD_INVALID, "tray_padding", - "Invalid padding value %s, minimum is 0", argv[0]); + if (argc == 1 || (argc == 2 && strcasecmp("px", argv[1]) == 0)) { + char *inv; + uint32_t padding = strtoul(argv[0], &inv, 10); + if (*inv == '\0' || strcasecmp(inv, "px") == 0) { + config->current_bar->tray_padding = padding; + sway_log(L_DEBUG, "Enabling tray padding of %d px on bar: %s", padding, config->current_bar->id); + return cmd_results_new(CMD_SUCCESS, NULL, NULL); + } } - - if (argc > 1 && strcasecmp("px", argv[1]) != 0) { - return cmd_results_new(CMD_INVALID, "tray_padding", - "Unknown unit %s", argv[1]); - } - config->current_bar->tray_padding = padding; - sway_log(L_DEBUG, "Enabling tray padding of %d px on bar: %s", padding, config->current_bar->id); - return cmd_results_new(CMD_SUCCESS, NULL, NULL); + return cmd_results_new(CMD_FAILURE, cmd_name, + "Expected 'tray_padding [px]'"); +#endif } diff --git a/sway/config.c b/sway/config.c index 85823953..e0b65615 100644 --- a/sway/config.c +++ b/sway/config.c @@ -69,6 +69,10 @@ static void free_bar(struct bar_config *bar) { } free(bar->mode); free(bar->hidden_state); +#ifdef ENABLE_TRAY + free(bar->tray_output); + free(bar->icon_theme); +#endif free(bar->status_command); free(bar->font); free(bar->separator_symbol); @@ -1386,7 +1390,14 @@ struct bar_config *default_bar_config(void) { bar->separator_symbol = NULL; bar->strip_workspace_numbers = false; bar->binding_mode_indicator = true; +#ifdef ENABLE_TRAY + bar->tray_output = NULL; + bar->icon_theme = NULL; bar->tray_padding = 2; + bar->activate_button = 0x110; /* BTN_LEFT */ + bar->context_button = 0x111; /* BTN_RIGHT */ + bar->secondary_button = 0x112; /* BTN_MIDDLE */ +#endif bar->verbose = false; bar->pid = 0; // set default colors diff --git a/sway/ipc-json.c b/sway/ipc-json.c index 512144a4..31de53f0 100644 --- a/sway/ipc-json.c +++ b/sway/ipc-json.c @@ -327,7 +327,22 @@ json_object *ipc_json_describe_bar_config(struct bar_config *bar) { json_object *json = json_object_new_object(); json_object_object_add(json, "id", json_object_new_string(bar->id)); - json_object_object_add(json, "tray_output", NULL); +#ifdef ENABLE_TRAY + if (bar->tray_output) { + json_object_object_add(json, "tray_output", json_object_new_string(bar->tray_output)); + } else { + json_object_object_add(json, "tray_output", NULL); + } + if (bar->icon_theme) { + json_object_object_add(json, "icon_theme", json_object_new_string(bar->icon_theme)); + } else { + json_object_object_add(json, "icon_theme", NULL); + } + json_object_object_add(json, "tray_padding", json_object_new_int(bar->tray_padding)); + json_object_object_add(json, "activate_button", json_object_new_int(bar->activate_button)); + json_object_object_add(json, "context_button", json_object_new_int(bar->context_button)); + json_object_object_add(json, "secondary_button", json_object_new_int(bar->secondary_button)); +#endif json_object_object_add(json, "mode", json_object_new_string(bar->mode)); json_object_object_add(json, "hidden_state", json_object_new_string(bar->hidden_state)); json_object_object_add(json, "modifier", json_object_new_string(get_modifier_name_by_mask(bar->modifier))); diff --git a/sway/sway-bar.5.txt b/sway/sway-bar.5.txt index 5a52e7db..29487662 100644 --- a/sway/sway-bar.5.txt +++ b/sway/sway-bar.5.txt @@ -65,6 +65,42 @@ Commands **height** :: Sets the height of the bar. Default height will match the font size. +Tray +---- + +Swaybar provides a system tray where programs such as NetworkManager, VLC, +Pidgin, etc. can place little icons. The following commands configure +interaction with the tray or individual icons. +The _button_ argument in all following commands is a Linux input event code as +defined in linux/input-event-codes.h. This is because wayland defines button +codes in this manner. + +**activate_button**