Merge branch 'master' into server-decoration

This commit is contained in:
Drew DeVault 2017-06-14 18:53:40 -04:00 committed by GitHub
commit 298f56353e
58 changed files with 2928 additions and 137 deletions

View file

@ -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>

View file

@ -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);
}

View file

@ -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);
}

View 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
}

View 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
}

View 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
}

View 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
}

View file

@ -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
}

View file

@ -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
}

View file

@ -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);

View file

@ -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);
}

View file

@ -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) {

View file

@ -1,4 +1,4 @@
#define _XOPEN_SOURCE 500
#define _XOPEN_SOURCE 700
#include <stdio.h>
#include <string.h>
#include <strings.h>

View file

@ -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

View file

@ -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) {

View file

@ -1,4 +1,4 @@
#define _XOPEN_SOURCE 500
#define _XOPEN_SOURCE 700
#include <stdlib.h>
#include <stdio.h>
#include <stdbool.h>

View file

@ -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:

View file

@ -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;
}

View file

@ -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)));

View file

@ -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;
}

View file

@ -1,4 +1,4 @@
#define _XOPEN_SOURCE 500
#define _XOPEN_SOURCE 700
#include <sys/types.h>
#include <sys/stat.h>
#include <string.h>

View file

@ -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
------

View file

@ -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)

View file

@ -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.