aboutsummaryrefslogtreecommitdiff
path: root/sway
diff options
context:
space:
mode:
authorDrew DeVault <sir@cmpwn.com>2017-06-14 18:53:40 -0400
committerGitHub <noreply@github.com>2017-06-14 18:53:40 -0400
commit298f56353ef155f6a2ccc977c96b2ff5d971e65e (patch)
treedcb3b74f1dde93bce8657b7509662ffd7db667d0 /sway
parenta5c07dde6aba87584ddb6c6a2769472a6003623a (diff)
parenteb6e38c86d2deb37cc6f378f8644c4a530fd7448 (diff)
Merge branch 'master' into server-decoration
Diffstat (limited to 'sway')
-rw-r--r--sway/border.c2
-rw-r--r--sway/commands.c8
-rw-r--r--sway/commands/assign.c3
-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/commands/bind.c8
-rw-r--r--sway/commands/client.c24
-rw-r--r--sway/commands/layout.c4
-rw-r--r--sway/commands/set.c2
-rw-r--r--sway/config.c15
-rw-r--r--sway/container.c17
-rw-r--r--sway/criteria.c2
-rw-r--r--sway/handlers.c22
-rw-r--r--sway/input.c4
-rw-r--r--sway/ipc-json.c17
-rw-r--r--sway/main.c43
-rw-r--r--sway/security.c2
-rw-r--r--sway/sway-bar.5.txt36
-rw-r--r--sway/sway-input.5.txt2
-rw-r--r--sway/sway.5.txt5
24 files changed, 325 insertions, 54 deletions
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 <wlc/wlc-render.h>
#include <cairo/cairo.h>
#include <pango/pangocairo.h>
diff --git a/sway/commands.c b/sway/commands.c
index 01e5e6b5..f83b5287 100644
--- a/sway/commands.c
+++ b/sway/commands.c
@@ -1,4 +1,4 @@
-#define _XOPEN_SOURCE 500
+#define _XOPEN_SOURCE 700
#include <xkbcommon/xkbcommon.h>
#include <xkbcommon/xkbcommon-names.h>
#include <wlc/wlc.h>
@@ -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 },
@@ -250,7 +254,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/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 <stdio.h>
#include <string.h>
#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/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/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 <xkbcommon/xkbcommon.h>
#include <xkbcommon/xkbcommon-names.h>
+#include <strings.h>
#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/commands/client.c b/sway/commands/client.c
index 7954f670..f3d879cd 100644
--- a/sway/commands/client.c
+++ b/sway/commands/client.c
@@ -4,26 +4,30 @@
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];
+ if (argc < 5) {
+ border_colors->child_border = border_colors->background;
+ }
return cmd_results_new(CMD_SUCCESS, NULL, NULL);
}
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) {
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 <stdio.h>
#include <string.h>
#include <strings.h>
diff --git a/sway/config.c b/sway/config.c
index 19b1882f..e0b65615 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 <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
@@ -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);
@@ -527,7 +531,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");
@@ -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/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 <stdlib.h>
#include <stdio.h>
#include <stdbool.h>
diff --git a/sway/handlers.c b/sway/handlers.c
index 0aa35c26..39261e3d 100644
--- a/sway/handlers.c
+++ b/sway/handlers.c
@@ -609,6 +609,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);
}
}
@@ -927,6 +929,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:
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 <ctype.h>
#include <float.h>
#include <limits.h>
@@ -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/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/main.c b/sway/main.c
index b9549b12..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 <stdio.h>
#include <stdlib.h>
@@ -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;
@@ -288,6 +310,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");
@@ -317,6 +348,7 @@ int main(int argc, char **argv) {
return 0;
}
+ executable_sanity_check();
#ifdef __linux__
bool suid = false;
if (getuid() != geteuid() || getgid() != getegid()) {
@@ -329,14 +361,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();
@@ -409,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 <sys/types.h>
#include <sys/stat.h>
#include <string.h>
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
------
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** <identifier> dwt <enabled|disabled>::
Enables or disables disable-while-typing for the specified input device.
-**input** <identifier> events <enable|disabled>::
+**input** <identifier> events <enabled|disabled|disabled_on_external_mouse>::
Enables or disables send_events for specified input device.
(Disabling send_events disables the input device)
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** <yes|no>::
If set to _yes_, moving your mouse over a window will focus that window.
+**font** <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** <criteria> <command>::
Whenever a window that matches _criteria_ appears, run list of commands. See
**Criteria** section below.