mirror of
https://github.com/swaywm/sway.git
synced 2025-11-18 06:59:48 -05:00
Merge branch 'master' into server-decoration
This commit is contained in:
commit
298f56353e
58 changed files with 2928 additions and 137 deletions
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
|||
26
sway/commands/bar/activate_button.c
Normal file
26
sway/commands/bar/activate_button.c
Normal file
|
|
@ -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
|
||||
}
|
||||
26
sway/commands/bar/context_button.c
Normal file
26
sway/commands/bar/context_button.c
Normal file
|
|
@ -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
|
||||
}
|
||||
25
sway/commands/bar/icon_theme.c
Normal file
25
sway/commands/bar/icon_theme.c
Normal file
|
|
@ -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
|
||||
}
|
||||
26
sway/commands/bar/secondary_button.c
Normal file
26
sway/commands/bar/secondary_button.c
Normal file
|
|
@ -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
|
||||
}
|
||||
|
|
@ -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
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
#define _XOPEN_SOURCE 500
|
||||
#define _XOPEN_SOURCE 700
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <strings.h>
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
#define _XOPEN_SOURCE 500
|
||||
#define _XOPEN_SOURCE 700
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <stdbool.h>
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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)));
|
||||
|
|
|
|||
43
sway/main.c
43
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;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
#define _XOPEN_SOURCE 500
|
||||
#define _XOPEN_SOURCE 700
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include <string.h>
|
||||
|
|
|
|||
|
|
@ -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
|
||||
------
|
||||
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue