• Show log

    Commit

  • Hash : ac5b9bc4
    Author : DS
    Date : 2022-09-14T18:28:35

    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>`

  • Properties

  • Git HTTP https://git.kmx.io/kc3-lang/SDL.git
    Git SSH git@git.kmx.io:kc3-lang/SDL.git
    Public access ? public
    Description

    Fork of https://github.com/libsdl-org/SDL

    Users
    thodg_w kc3_lang_org thodg_l thodg_m www_kmx_io thodg
    Tags