From c32a507303e38c7bf0b8054108bec45ff67e92c2 Mon Sep 17 00:00:00 2001 From: Aidan Dang Date: Wed, 16 Mar 2022 22:22:41 +0000 Subject: [PATCH] Add `primary_selection` config option See: https://github.com/swaywm/sway/issues/4511 Adds a bool config option `primary_selection`, which explicitly enables/disables the primary selection clipboard. Defaults to enabled. This is implemented as a launch-only option which enables or disables the creation of the `zwp_primary_selection_device_manager_v1` global. Co-authored-by: Tilde Rose --- include/sway/commands.h | 1 + include/sway/config.h | 3 ++- sway/commands.c | 1 + sway/commands/primary_selection.c | 23 +++++++++++++++++++++++ sway/config.c | 1 + sway/meson.build | 1 + sway/server.c | 5 ++++- sway/sway.5.scd | 4 ++++ 8 files changed, 37 insertions(+), 2 deletions(-) create mode 100644 sway/commands/primary_selection.c diff --git a/include/sway/commands.h b/include/sway/commands.h index 7fad26a1..ddd2f219 100644 --- a/include/sway/commands.h +++ b/include/sway/commands.h @@ -165,6 +165,7 @@ sway_cmd cmd_no_focus; sway_cmd cmd_output; sway_cmd cmd_permit; sway_cmd cmd_popup_during_fullscreen; +sway_cmd cmd_primary_selection; sway_cmd cmd_reject; sway_cmd cmd_reload; sway_cmd cmd_rename; diff --git a/include/sway/config.h b/include/sway/config.h index 190ab13b..ce2b8502 100644 --- a/include/sway/config.h +++ b/include/sway/config.h @@ -530,6 +530,7 @@ struct sway_config { bool auto_back_and_forth; bool show_marks; enum alignment title_align; + bool primary_selection; bool tiling_drag; int tiling_drag_threshold; @@ -719,7 +720,7 @@ void free_workspace_config(struct workspace_config *wsc); /** * Updates the value of config->font_height based on the metrics for title's * font as reported by pango. - * + * * If the height has changed, all containers will be rearranged to take on the * new size. */ diff --git a/sway/commands.c b/sway/commands.c index 2160a970..041da7ea 100644 --- a/sway/commands.c +++ b/sway/commands.c @@ -82,6 +82,7 @@ static const struct cmd_handler handlers[] = { { "no_focus", cmd_no_focus }, { "output", cmd_output }, { "popup_during_fullscreen", cmd_popup_during_fullscreen }, + { "primary_selection", cmd_primary_selection }, { "seat", cmd_seat }, { "set", cmd_set }, { "show_marks", cmd_show_marks }, diff --git a/sway/commands/primary_selection.c b/sway/commands/primary_selection.c new file mode 100644 index 00000000..585b079d --- /dev/null +++ b/sway/commands/primary_selection.c @@ -0,0 +1,23 @@ +#include +#include +#include "sway/config.h" +#include "sway/commands.h" +#include "util.h" + +struct cmd_results *cmd_primary_selection(int argc, char **argv) { + struct cmd_results *error = NULL; + if ((error = checkarg(argc, "primary_selection", EXPECTED_EQUAL_TO, 1))) { + return error; + } + + bool primary_selection = parse_boolean(argv[0], true); + + if (config->reloading && config->primary_selection != primary_selection) { + return cmd_results_new(CMD_FAILURE, + "primary_selection can only be enabled/disabled at launch"); + } + + config->primary_selection = parse_boolean(argv[0], true); + + return cmd_results_new(CMD_SUCCESS, NULL); +} diff --git a/sway/config.c b/sway/config.c index b41dd871..1f2bb686 100644 --- a/sway/config.c +++ b/sway/config.c @@ -273,6 +273,7 @@ static void config_defaults(struct sway_config *config) { config->title_align = ALIGN_LEFT; config->tiling_drag = true; config->tiling_drag_threshold = 9; + config->primary_selection = true; config->smart_gaps = SMART_GAPS_OFF; config->gaps_inner = 0; diff --git a/sway/meson.build b/sway/meson.build index de10e14f..b2412d5e 100644 --- a/sway/meson.build +++ b/sway/meson.build @@ -86,6 +86,7 @@ sway_sources = files( 'commands/nop.c', 'commands/output.c', 'commands/popup_during_fullscreen.c', + 'commands/primary_selection.c', 'commands/reload.c', 'commands/rename.c', 'commands/resize.c', diff --git a/sway/server.c b/sway/server.c index 2db069a2..43ff8cfb 100644 --- a/sway/server.c +++ b/sway/server.c @@ -210,7 +210,6 @@ bool server_init(struct sway_server *server) { wlr_export_dmabuf_manager_v1_create(server->wl_display); wlr_screencopy_manager_v1_create(server->wl_display); wlr_data_control_manager_v1_create(server->wl_display); - wlr_primary_selection_v1_device_manager_create(server->wl_display); wlr_viewporter_create(server->wl_display); wlr_single_pixel_buffer_manager_v1_create(server->wl_display); server->content_type_manager_v1 = @@ -308,6 +307,10 @@ bool server_start(struct sway_server *server) { } #endif + if (config->primary_selection) { + wlr_primary_selection_v1_device_manager_create(server->wl_display); + } + sway_log(SWAY_INFO, "Starting backend on wayland display '%s'", server->socket); if (!wlr_backend_start(server->backend)) { diff --git a/sway/sway.5.scd b/sway/sway.5.scd index f6aab2d4..25082c41 100644 --- a/sway/sway.5.scd +++ b/sway/sway.5.scd @@ -807,6 +807,10 @@ The default colors are: dialog will not be rendered. If _leave_fullscreen_, the view will exit fullscreen mode and the dialog will be rendered. +*primary_selection* enabled|disabled + Enable or disable the primary selection clipboard. May only be configured + at launch. Default is _enabled_. + *set* $ Sets variable $_name_ to _value_. You can use the new variable in the arguments of future commands. When the variable is used, it can be escaped