mirror of
https://github.com/Ryujinx/SDL.git
synced 2025-01-10 19:05:44 +00:00
ac5b9bc4ee
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>`
141 lines
4.2 KiB
C
141 lines
4.2 KiB
C
/*
|
|
Simple DirectMedia Layer
|
|
Copyright (C) 1997-2022 Sam Lantinga <slouken@libsdl.org>
|
|
|
|
This software is provided 'as-is', without any express or implied
|
|
warranty. In no event will the authors be held liable for any damages
|
|
arising from the use of this software.
|
|
|
|
Permission is granted to anyone to use this software for any purpose,
|
|
including commercial applications, and to alter it and redistribute it
|
|
freely, subject to the following restrictions:
|
|
|
|
1. The origin of this software must not be misrepresented; you must not
|
|
claim that you wrote the original software. If you use this software
|
|
in a product, an acknowledgment in the product documentation would be
|
|
appreciated but is not required.
|
|
2. Altered source versions must be plainly marked as such, and must not be
|
|
misrepresented as being the original software.
|
|
3. This notice may not be removed or altered from any source distribution.
|
|
*/
|
|
|
|
/**
|
|
* \file SDL_clipboard.h
|
|
*
|
|
* Include file for SDL clipboard handling
|
|
*/
|
|
|
|
#ifndef SDL_clipboard_h_
|
|
#define SDL_clipboard_h_
|
|
|
|
#include "SDL_stdinc.h"
|
|
|
|
#include "begin_code.h"
|
|
/* Set up for C function definitions, even when using C++ */
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
/* Function prototypes */
|
|
|
|
/**
|
|
* Put UTF-8 text into the clipboard.
|
|
*
|
|
* \param text the text to store in the clipboard
|
|
* \returns 0 on success or a negative error code on failure; call
|
|
* SDL_GetError() for more information.
|
|
*
|
|
* \since This function is available since SDL 2.0.0.
|
|
*
|
|
* \sa SDL_GetClipboardText
|
|
* \sa SDL_HasClipboardText
|
|
*/
|
|
extern DECLSPEC int SDLCALL SDL_SetClipboardText(const char *text);
|
|
|
|
/**
|
|
* Get UTF-8 text from the clipboard, which must be freed with SDL_free().
|
|
*
|
|
* This functions returns empty string if there was not enough memory left for
|
|
* a copy of the clipboard's content.
|
|
*
|
|
* \returns the clipboard text on success or an empty string on failure; call
|
|
* SDL_GetError() for more information. Caller must call SDL_free()
|
|
* on the returned pointer when done with it (even if there was an
|
|
* error).
|
|
*
|
|
* \since This function is available since SDL 2.0.0.
|
|
*
|
|
* \sa SDL_HasClipboardText
|
|
* \sa SDL_SetClipboardText
|
|
*/
|
|
extern DECLSPEC char * SDLCALL SDL_GetClipboardText(void);
|
|
|
|
/**
|
|
* Query whether the clipboard exists and contains a non-empty text string.
|
|
*
|
|
* \returns SDL_TRUE if the clipboard has text, or SDL_FALSE if it does not.
|
|
*
|
|
* \since This function is available since SDL 2.0.0.
|
|
*
|
|
* \sa SDL_GetClipboardText
|
|
* \sa SDL_SetClipboardText
|
|
*/
|
|
extern DECLSPEC SDL_bool SDLCALL SDL_HasClipboardText(void);
|
|
|
|
/**
|
|
* Put UTF-8 text into the primary selection.
|
|
*
|
|
* \param text the text to store in the primary selection
|
|
* \returns 0 on success or a negative error code on failure; call
|
|
* SDL_GetError() for more information.
|
|
*
|
|
* \since This function is available since SDL 2.25.0.
|
|
*
|
|
* \sa SDL_GetPrimarySelectionText
|
|
* \sa SDL_HasPrimarySelectionText
|
|
*/
|
|
extern DECLSPEC int SDLCALL SDL_SetPrimarySelectionText(const char *text);
|
|
|
|
/**
|
|
* Get UTF-8 text from the primary selection, which must be freed with SDL_free().
|
|
*
|
|
* This functions returns empty string if there was not enough memory left for
|
|
* a copy of the primary selection's content.
|
|
*
|
|
* \returns the primary selection text on success or an empty string on failure;
|
|
* call SDL_GetError() for more information. Caller must call SDL_free()
|
|
* on the returned pointer when done with it (even if there was an
|
|
* error).
|
|
*
|
|
* \since This function is available since SDL 2.25.0.
|
|
*
|
|
* \sa SDL_HasPrimarySelectionText
|
|
* \sa SDL_SetPrimarySelectionText
|
|
*/
|
|
extern DECLSPEC char * SDLCALL SDL_GetPrimarySelectionText(void);
|
|
|
|
/**
|
|
* Query whether the primary selection exists and contains a non-empty text
|
|
* string.
|
|
*
|
|
* \returns SDL_TRUE if the primary selection has text, or SDL_FALSE if it does
|
|
* not.
|
|
*
|
|
* \since This function is available since SDL 2.25.0.
|
|
*
|
|
* \sa SDL_GetPrimarySelectionText
|
|
* \sa SDL_SetPrimarySelectionText
|
|
*/
|
|
extern DECLSPEC SDL_bool SDLCALL SDL_HasPrimarySelectionText(void);
|
|
|
|
|
|
/* Ends C function definitions when using C++ */
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
#include "close_code.h"
|
|
|
|
#endif /* SDL_clipboard_h_ */
|
|
|
|
/* vi: set ts=4 sw=4 expandtab: */
|