mirror of
https://github.com/swaywm/sway.git
synced 2025-11-17 06:59:48 -05:00
bar_cmd_bind: utilize mouse button helpers
This modifies `bar_cmd_bindsym` to use `get_mouse_bindsym` for parsing mouse buttons. This also introduces `cmd_bar_bindcode`, which will use `get_mouse_bindcode` for parsing mouse buttons. Like sway bindings, the two commands are encapsulated in a single file with shared code. This also modifies swaybar to operate off of event codes rather than x11 button numbers, which allows for any mouse button to be used. This introduces two new IPC properties: - For `get_bar_config`, `event_code` has been added to the `bindings` section and will include to event code for the button. If the event code can be mapped to a x11 button, `input_code` will still be the x11 button number. Otherwise, `input_code` will be `0`. - Likewise for `click_events`, `event` has been added and will include the event code for the button clicked. If the event code can be mapped to a x11 button, `button` will still be the x11 button number. Otherwise, `button` will be `0`.
This commit is contained in:
parent
212baf2f75
commit
3d6440ec26
13 changed files with 208 additions and 114 deletions
|
|
@ -8,6 +8,7 @@
|
|||
|
||||
// Must be in alphabetical order for bsearch
|
||||
static struct cmd_handler bar_handlers[] = {
|
||||
{ "bindcode", bar_cmd_bindcode },
|
||||
{ "binding_mode_indicator", bar_cmd_binding_mode_indicator },
|
||||
{ "bindsym", bar_cmd_bindsym },
|
||||
{ "colors", bar_cmd_colors },
|
||||
|
|
|
|||
106
sway/commands/bar/bind.c
Normal file
106
sway/commands/bar/bind.c
Normal file
|
|
@ -0,0 +1,106 @@
|
|||
#include <libevdev/libevdev.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <strings.h>
|
||||
#include "sway/commands.h"
|
||||
#include "sway/config.h"
|
||||
#include "sway/input/cursor.h"
|
||||
#include "list.h"
|
||||
#include "log.h"
|
||||
#include "stringop.h"
|
||||
|
||||
static struct cmd_results *bar_cmd_bind(int argc, char **argv, bool code) {
|
||||
const char *command = code ? "bar bindcode" : "bar bindsym";
|
||||
struct cmd_results *error = NULL;
|
||||
if ((error = checkarg(argc, command, EXPECTED_AT_LEAST, 2))) {
|
||||
return error;
|
||||
}
|
||||
if (!config->current_bar) {
|
||||
return cmd_results_new(CMD_FAILURE, command, "No bar defined.");
|
||||
}
|
||||
|
||||
struct bar_binding *binding = calloc(1, sizeof(struct bar_binding));
|
||||
if (!binding) {
|
||||
return cmd_results_new(CMD_FAILURE, command,
|
||||
"Unable to allocate bar binding");
|
||||
}
|
||||
|
||||
binding->release = false;
|
||||
if (strcmp("--release", argv[0]) == 0) {
|
||||
binding->release = true;
|
||||
argv++;
|
||||
argc--;
|
||||
}
|
||||
|
||||
char *message = NULL;
|
||||
if (code) {
|
||||
binding->button = get_mouse_bindcode(argv[0], &message);
|
||||
} else {
|
||||
binding->button = get_mouse_bindsym(argv[0], &message);
|
||||
}
|
||||
if (message) {
|
||||
free_bar_binding(binding);
|
||||
error = cmd_results_new(CMD_INVALID, command, message);
|
||||
free(message);
|
||||
return error;
|
||||
} else if (!binding->button) {
|
||||
free_bar_binding(binding);
|
||||
return cmd_results_new(CMD_INVALID, command,
|
||||
"Unknown button %s", argv[0]);
|
||||
}
|
||||
|
||||
const char *name = libevdev_event_code_get_name(EV_KEY, binding->button);
|
||||
if (!name) {
|
||||
switch (binding->button) {
|
||||
case SWAY_SCROLL_UP:
|
||||
name = "SWAY_SCROLL_UP";
|
||||
break;
|
||||
case SWAY_SCROLL_DOWN:
|
||||
name = "SWAY_SCROLL_DOWN";
|
||||
break;
|
||||
case SWAY_SCROLL_LEFT:
|
||||
name = "SWAY_SCROLL_LEFT";
|
||||
break;
|
||||
case SWAY_SCROLL_RIGHT:
|
||||
name = "SWAY_SCROLL_RIGHT";
|
||||
break;
|
||||
default:
|
||||
// Unreachable
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
binding->command = join_args(argv + 1, argc - 1);
|
||||
|
||||
list_t *bindings = config->current_bar->bindings;
|
||||
bool overwritten = false;
|
||||
for (int i = 0; i < bindings->length; i++) {
|
||||
struct bar_binding *other = bindings->items[i];
|
||||
if (other->button == binding->button &&
|
||||
other->release == binding->release) {
|
||||
overwritten = true;
|
||||
bindings->items[i] = binding;
|
||||
free_bar_binding(other);
|
||||
wlr_log(WLR_DEBUG, "[bar %s] Updated binding for %u (%s)%s",
|
||||
config->current_bar->id, binding->button, name,
|
||||
binding->release ? " - release" : "");
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!overwritten) {
|
||||
list_add(bindings, binding);
|
||||
wlr_log(WLR_DEBUG, "[bar %s] Added binding for %u (%s)%s",
|
||||
config->current_bar->id, binding->button, name,
|
||||
binding->release ? " - release" : "");
|
||||
}
|
||||
|
||||
return cmd_results_new(CMD_SUCCESS, NULL, NULL);
|
||||
}
|
||||
|
||||
struct cmd_results *bar_cmd_bindcode(int argc, char **argv) {
|
||||
return bar_cmd_bind(argc, argv, true);
|
||||
}
|
||||
|
||||
struct cmd_results *bar_cmd_bindsym(int argc, char **argv) {
|
||||
return bar_cmd_bind(argc, argv, false);
|
||||
}
|
||||
|
|
@ -1,68 +0,0 @@
|
|||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <strings.h>
|
||||
#include "sway/commands.h"
|
||||
#include "sway/config.h"
|
||||
#include "list.h"
|
||||
#include "log.h"
|
||||
#include "stringop.h"
|
||||
|
||||
struct cmd_results *bar_cmd_bindsym(int argc, char **argv) {
|
||||
struct cmd_results *error = NULL;
|
||||
if ((error = checkarg(argc, "bar bindsym", EXPECTED_AT_LEAST, 2))) {
|
||||
return error;
|
||||
}
|
||||
if (!config->current_bar) {
|
||||
return cmd_results_new(CMD_FAILURE, "bar bindsym", "No bar defined.");
|
||||
}
|
||||
|
||||
struct bar_binding *binding = calloc(1, sizeof(struct bar_binding));
|
||||
if (!binding) {
|
||||
return cmd_results_new(CMD_FAILURE, "bar bindsym",
|
||||
"Unable to allocate bar binding");
|
||||
}
|
||||
|
||||
binding->release = false;
|
||||
if (strcmp("--release", argv[0]) == 0) {
|
||||
binding->release = true;
|
||||
argv++;
|
||||
argc--;
|
||||
}
|
||||
|
||||
binding->button = 0;
|
||||
if (strncasecmp(argv[0], "button", strlen("button")) == 0 &&
|
||||
strlen(argv[0]) == strlen("button0")) {
|
||||
binding->button = argv[0][strlen("button")] - '0';
|
||||
}
|
||||
if (binding->button < 1 || binding->button > 9) {
|
||||
free_bar_binding(binding);
|
||||
return cmd_results_new(CMD_FAILURE, "bar bindsym",
|
||||
"Only button<1-9> is supported");
|
||||
}
|
||||
|
||||
binding->command = join_args(argv + 1, argc - 1);
|
||||
|
||||
list_t *bindings = config->current_bar->bindings;
|
||||
bool overwritten = false;
|
||||
for (int i = 0; i < bindings->length; i++) {
|
||||
struct bar_binding *other = bindings->items[i];
|
||||
if (other->button == binding->button &&
|
||||
other->release == binding->release) {
|
||||
overwritten = true;
|
||||
bindings->items[i] = binding;
|
||||
free_bar_binding(other);
|
||||
wlr_log(WLR_DEBUG, "[bar %s] Updated binding for button%u%s",
|
||||
config->current_bar->id, binding->button,
|
||||
binding->release ? " (release)" : "");
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!overwritten) {
|
||||
list_add(bindings, binding);
|
||||
wlr_log(WLR_DEBUG, "[bar %s] Added binding for button%u%s",
|
||||
config->current_bar->id, binding->button,
|
||||
binding->release ? " (release)" : "");
|
||||
}
|
||||
|
||||
return cmd_results_new(CMD_SUCCESS, NULL, NULL);
|
||||
}
|
||||
|
|
@ -1,4 +1,5 @@
|
|||
#include <json-c/json.h>
|
||||
#include <libevdev/libevdev.h>
|
||||
#include <stdio.h>
|
||||
#include <ctype.h>
|
||||
#include "config.h"
|
||||
|
|
@ -10,6 +11,7 @@
|
|||
#include "sway/tree/workspace.h"
|
||||
#include "sway/output.h"
|
||||
#include "sway/input/input-manager.h"
|
||||
#include "sway/input/cursor.h"
|
||||
#include "sway/input/seat.h"
|
||||
#include <wlr/types/wlr_box.h>
|
||||
#include <wlr/types/wlr_output.h>
|
||||
|
|
@ -626,6 +628,31 @@ json_object *ipc_json_describe_seat(struct sway_seat *seat) {
|
|||
return object;
|
||||
}
|
||||
|
||||
static uint32_t event_to_x11_button(uint32_t event) {
|
||||
switch (event) {
|
||||
case BTN_LEFT:
|
||||
return 1;
|
||||
case BTN_MIDDLE:
|
||||
return 2;
|
||||
case BTN_RIGHT:
|
||||
return 3;
|
||||
case SWAY_SCROLL_UP:
|
||||
return 4;
|
||||
case SWAY_SCROLL_DOWN:
|
||||
return 5;
|
||||
case SWAY_SCROLL_LEFT:
|
||||
return 6;
|
||||
case SWAY_SCROLL_RIGHT:
|
||||
return 7;
|
||||
case BTN_SIDE:
|
||||
return 8;
|
||||
case BTN_EXTRA:
|
||||
return 9;
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
json_object *ipc_json_describe_bar_config(struct bar_config *bar) {
|
||||
if (!sway_assert(bar, "Bar must not be NULL")) {
|
||||
return NULL;
|
||||
|
|
@ -767,6 +794,8 @@ json_object *ipc_json_describe_bar_config(struct bar_config *bar) {
|
|||
struct bar_binding *binding = bar->bindings->items[i];
|
||||
json_object *bind = json_object_new_object();
|
||||
json_object_object_add(bind, "input_code",
|
||||
json_object_new_int(event_to_x11_button(binding->button)));
|
||||
json_object_object_add(bind, "event_code",
|
||||
json_object_new_int(binding->button));
|
||||
json_object_object_add(bind, "command",
|
||||
json_object_new_string(binding->command));
|
||||
|
|
|
|||
|
|
@ -100,8 +100,8 @@ sway_sources = files(
|
|||
'commands/workspace_layout.c',
|
||||
'commands/ws_auto_back_and_forth.c',
|
||||
|
||||
'commands/bar/bind.c',
|
||||
'commands/bar/binding_mode_indicator.c',
|
||||
'commands/bar/bindsym.c',
|
||||
'commands/bar/colors.c',
|
||||
'commands/bar/font.c',
|
||||
'commands/bar/gaps.c',
|
||||
|
|
|
|||
|
|
@ -71,10 +71,18 @@ Sway allows configuring swaybar in the sway configuration file.
|
|||
*height* <height>
|
||||
Sets the height of the bar. Default height will match the font size.
|
||||
|
||||
*bindsym* [--release] button<n> <command>
|
||||
Executes _command_ when mouse button _n_ has been pressed (or if _released_
|
||||
is given, when mouse button _n_ has been released). To disable the default
|
||||
behavior for a button, use the command _nop_.
|
||||
*bindcode* [--release] <event-code> <command>
|
||||
Executes _command_ when the mouse button has been pressed (or if _released_
|
||||
is given, when the button has been released). The buttons can be given as
|
||||
an event code, which can be obtaining from `libinput debug-events`. To
|
||||
disable the default behavior for a button, use the command _nop_.
|
||||
|
||||
*bindsym* [--release] button[1-9]|<event-name> <command>
|
||||
Executes _command_ when the mouse button has been pressed (or if _released_
|
||||
is given, when the button has been released). The buttons can be given as a
|
||||
x11 button number or an event name, which can be obtained from `libinput
|
||||
debug-events`. To disable the default behavior for a button, use the
|
||||
command _nop_.
|
||||
|
||||
*mode* dock|hide|invisible
|
||||
Specifies the visibility of the bar. In _dock_ mode, it is permanently
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue