aboutsummaryrefslogtreecommitdiff
path: root/sway
diff options
context:
space:
mode:
authorDrew DeVault <sir@cmpwn.com>2017-06-14 18:53:32 -0400
committerGitHub <noreply@github.com>2017-06-14 18:53:32 -0400
commiteb6e38c86d2deb37cc6f378f8644c4a530fd7448 (patch)
treee3c567c4684faf0f9a7f77494f1bf638171d5349 /sway
parent16e20ec251b027c5a8dbc5e85804012f2602629d (diff)
parent0fc9628f03984caa04e200a1dc458d1cf7fc6d6c (diff)
downloadsway-eb6e38c86d2deb37cc6f378f8644c4a530fd7448.tar.xz
Merge pull request #1234 from 4e554c4c/tray
Implement Tray Icons
Diffstat (limited to 'sway')
-rw-r--r--sway/commands.c4
-rw-r--r--sway/commands/bar/activate_button.c26
-rw-r--r--sway/commands/bar/context_button.c26
-rw-r--r--sway/commands/bar/icon_theme.c25
-rw-r--r--sway/commands/bar/secondary_button.c26
-rw-r--r--sway/commands/bar/tray_output.c26
-rw-r--r--sway/commands/bar/tray_padding.c34
-rw-r--r--sway/config.c11
-rw-r--r--sway/container.c17
-rw-r--r--sway/handlers.c2
-rw-r--r--sway/ipc-json.c17
-rw-r--r--sway/sway-bar.5.txt36
12 files changed, 229 insertions, 21 deletions
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 <stdlib.h>
+#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 <stdlib.h>
+#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 <string.h>
+#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 <stdlib.h>
+#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 <string.h>
#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 <stdlib.h>
-#include <string.h>
#include <strings.h>
#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 <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/container.c b/sway/container.c
index 08aa77a8..358ba767 100644
--- a/sway/container.c
+++ b/sway/container.c
@@ -699,12 +699,12 @@ static bool pointer_test(swayc_t *view, void *_origin) {
swayc_t *container_under_pointer(void) {
// root.output->workspace
- if (!root_container.focused || !root_container.focused->focused) {
+ if (!root_container.focused) {
return NULL;
}
- swayc_t *lookup = root_container.focused->focused;
+ swayc_t *lookup = root_container.focused;
// Case of empty workspace
- if (lookup->children == 0) {
+ if (lookup->children && !lookup->unmanaged) {
return NULL;
}
struct wlc_point origin;
@@ -712,6 +712,17 @@ swayc_t *container_under_pointer(void) {
while (lookup && lookup->type != C_VIEW) {
int i;
int len;
+ for (int _i = 0; lookup->unmanaged && _i < lookup->unmanaged->length; ++_i) {
+ wlc_handle *handle = lookup->unmanaged->items[_i];
+ const struct wlc_geometry *geo = wlc_view_get_geometry(*handle);
+ if (origin.x >= geo->origin.x && origin.y >= geo->origin.y
+ && origin.x < geo->origin.x + (int)geo->size.w
+ && origin.y < geo->origin.y + (int)geo->size.h) {
+ // Hack: we force focus upon unmanaged views here
+ wlc_view_focus(*handle);
+ return NULL;
+ }
+ }
// if tabbed/stacked go directly to focused container, otherwise search
// children
if (lookup->layout == L_TABBED || lookup->layout == L_STACKED) {
diff --git a/sway/handlers.c b/sway/handlers.c
index e1b90a07..a912b991 100644
--- a/sway/handlers.c
+++ b/sway/handlers.c
@@ -599,6 +599,8 @@ static void handle_view_geometry_request(wlc_handle handle, const struct wlc_geo
view->y = geometry->origin.y;
update_geometry(view);
}
+ } else {
+ wlc_view_set_geometry(handle, 0, geometry);
}
}
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** <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** <button>::
+ Sets the button to be used for the _activate_ (primary click) tray item
+ event. By default is BTN_LEFT (0x110).
+
+**context_button** <button>::
+ Sets the button to be used for the _context menu_ (right click) tray item
+ event. By default is BTN_RIGHT (0x111).
+
+**secondary_button** <button>::
+ Sets the button to be used for the _secondary_ (middle click) tray item
+ event. By default is BTN_MIDDLE (0x112).
+
+**tray_output** none|all|<name>::
+ Sets the output that the tray will appear on or none. Unlike i3bar, swaybar
+ should be able to show icons on any number of bars and outputs without
+ races. Because of this, the default value for this is _all_.
+
+**tray_padding** <px> [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.
+
+**icon_theme** <name>::
+ Sets the icon theme that sway will look for item icons in. This option has
+ no default value, because sway will always default to the fallback theme,
+ hicolor.
+
Colors
------