SDL/src/video/wayland
DS ac5b9bc4ee
Add support for X11 primary selection (#6132)
X11 has a so-called primary selection, which you can use by marking text and middle-clicking elsewhere to copy the marked text.

There are 3 new API functions in `SDL_clipboard.h`, which work exactly like their clipboard equivalents.

## Test Instructions

* Run the tests (just a copy of the clipboard tests): `$ ./test/testautomation --filter Clipboard`
* Build and run this small application:
<details>
```C
#include <SDL.h>
#include <unistd.h>
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

void print_error(const char *where)
{
	const char *errstr = SDL_GetError();
	if (errstr == NULL || errstr[0] == '\0')
		return;
	fprintf(stderr, "SDL Error after '%s': %s\n", where, errstr);
	SDL_ClearError();
}

int main()
{
	char text_buf[256];

	srand(time(NULL));

	SDL_Init(SDL_INIT_VIDEO);
	print_error("SDL_INIT()");
	SDL_Window *window = SDL_CreateWindow("Primary Selection Test", SDL_WINDOWPOS_UNDEFINED,
			SDL_WINDOWPOS_UNDEFINED, 400, 400, SDL_WINDOW_SHOWN);
	print_error("SDL_CreateWindow()");
	SDL_Renderer *renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED);
	print_error("SDL_CreateRenderer()");

	bool quit = false;
	unsigned int do_render = 0;
	while (!quit) {
		SDL_Event event;
		while (SDL_PollEvent(&event)) {
			print_error("SDL_PollEvent()");
			switch (event.type) {
			case SDL_QUIT: {
				quit = true;
				break;
			} case SDL_KEYDOWN: {
				switch (event.key.keysym.sym) {
				case SDLK_ESCAPE:
				case SDLK_q:
					quit = true;
					break;
				case SDLK_c:
					snprintf(text_buf, sizeof(text_buf), "foo%d", rand());
					SDL_SetClipboardText(text_buf);
					print_error("SDL_SetClipboardText()");
					printf("clipboard: set_to=\"%s\"\n", text_buf);
					break;
				case SDLK_v: {
					printf("clipboard: has=%d, ", SDL_HasClipboardText());
					print_error("SDL_HasClipboardText()");
					char *text = SDL_GetClipboardText();
					print_error("SDL_GetClipboardText()");
					printf("text=\"%s\"\n", text);
					SDL_free(text);
					break;
				} case SDLK_d:
					snprintf(text_buf, sizeof(text_buf), "bar%d", rand());
					SDL_SetPrimarySelectionText(text_buf);
					print_error("SDL_SetPrimarySelectionText()");
					printf("primselec: set_to=\"%s\"\n", text_buf);
					break;
				case SDLK_f: {
					printf("primselec: has=%d, ", SDL_HasPrimarySelectionText());
					print_error("SDL_HasPrimarySelectionText()");
					char *text = SDL_GetPrimarySelectionText();
					print_error("SDL_GetPrimarySelectionText()");
					printf("text=\"%s\"\n", text);
					SDL_free(text);
					break;
				} default:
					break;
				}
				break;
			} default: {
				break;
			}}
		}
		// create less noise with WAYLAND_DEBUG=1
		if (do_render == 0) {
			SDL_RenderPresent(renderer);
			print_error("SDL_RenderPresent()");
		}
		do_render += 1;
		usleep(12000);
	}

	SDL_DestroyRenderer(renderer);
	SDL_DestroyWindow(window);
	SDL_Quit();
	print_error("quit");
	return 0;
}
```
</details>

* Use c,v,d,f to get and set the clipboard and primary selection.
* Mark text and middle-click also in other applications.
* For wayland under x:
  * `$ mutter --wayland --no-x11 --nested`
  * `$ XDG_SESSION_TYPE=wayland SDL_VIDEODRIVER=wayland ./<path_to_test_appl_binary>`
2022-09-14 09:28:35 -07:00
..
SDL_waylandclipboard.c Add support for X11 primary selection (#6132) 2022-09-14 09:28:35 -07:00
SDL_waylandclipboard.h Add support for X11 primary selection (#6132) 2022-09-14 09:28:35 -07:00
SDL_waylanddatamanager.c Add support for X11 primary selection (#6132) 2022-09-14 09:28:35 -07:00
SDL_waylanddatamanager.h Add support for X11 primary selection (#6132) 2022-09-14 09:28:35 -07:00
SDL_waylanddyn.c wayland: fix build with SDL_WAYLAND_SHARED=OFF/--enable-wayland-shared=no 2022-08-25 17:15:54 -07:00
SDL_waylanddyn.h wayland: Fix include order when building with libdecor 2022-08-21 08:54:58 -07:00
SDL_waylandevents.c Add support for X11 primary selection (#6132) 2022-09-14 09:28:35 -07:00
SDL_waylandevents_c.h Add support for X11 primary selection (#6132) 2022-09-14 09:28:35 -07:00
SDL_waylandkeyboard.c make SDL_SetTextInputRect take a pointer to const 2022-07-04 09:38:01 -07:00
SDL_waylandkeyboard.h make SDL_SetTextInputRect take a pointer to const 2022-07-04 09:38:01 -07:00
SDL_waylandmessagebox.c Don't conflict with usage of stdout as a stdio macro 2022-07-30 16:22:24 -07:00
SDL_waylandmessagebox.h Updated copyright for 2022 2022-01-03 09:40:21 -08:00
SDL_waylandmouse.c Update Wayland cursors to match X11 cursors 2022-09-09 08:59:37 -04:00
SDL_waylandmouse.h Updated copyright for 2022 2022-01-03 09:40:21 -08:00
SDL_waylandopengles.c Adding SDL_GetWindowSizeInPixels for window size in pixels (#6112) 2022-08-24 11:25:13 -07:00
SDL_waylandopengles.h Adding SDL_GetWindowSizeInPixels for window size in pixels (#6112) 2022-08-24 11:25:13 -07:00
SDL_waylandsym.h add libdecor_dispatch 2022-05-21 09:40:26 -07:00
SDL_waylandtouch.c Updated copyright for 2022 2022-01-03 09:40:21 -08:00
SDL_waylandtouch.h Updated copyright for 2022 2022-01-03 09:40:21 -08:00
SDL_waylandvideo.c Add support for X11 primary selection (#6132) 2022-09-14 09:28:35 -07:00
SDL_waylandvideo.h Add support for X11 primary selection (#6132) 2022-09-14 09:28:35 -07:00
SDL_waylandvulkan.c Adding SDL_GetWindowSizeInPixels for window size in pixels (#6112) 2022-08-24 11:25:13 -07:00
SDL_waylandvulkan.h Adding SDL_GetWindowSizeInPixels for window size in pixels (#6112) 2022-08-24 11:25:13 -07:00
SDL_waylandwindow.c wayland: Use the backbuffer size for determining if a resize event is required 2022-09-13 10:54:35 -07:00
SDL_waylandwindow.h wayland: Update the internal state when the compositor moves a fullscreen window 2022-09-09 08:17:27 -07:00