From c32a507303e38c7bf0b8054108bec45ff67e92c2 Mon Sep 17 00:00:00 2001
From: Aidan Dang <dang@aidan.gg>
Date: Wed, 16 Mar 2022 22:22:41 +0000
Subject: 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 <t1lde@protonmail.com>
---
 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 ++++
 6 files changed, 34 insertions(+), 1 deletion(-)
 create mode 100644 sway/commands/primary_selection.c

(limited to 'sway')

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 <string.h>
+#include <strings.h>
+#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* $<name> <value>
 	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
-- 
cgit v1.2.3