mirror of
				https://gitlab.freedesktop.org/wlroots/wlroots.git
				synced 2025-11-03 09:01:40 -05:00 
			
		
		
		
	xwm: get selection targets
This commit is contained in:
		
							parent
							
								
									1ada1b7f0b
								
							
						
					
					
						commit
						39e2ea8420
					
				
					 3 changed files with 69 additions and 6 deletions
				
			
		| 
						 | 
					@ -16,6 +16,7 @@ struct wlr_xwayland_cursor;
 | 
				
			||||||
struct wlr_xwayland {
 | 
					struct wlr_xwayland {
 | 
				
			||||||
	pid_t pid;
 | 
						pid_t pid;
 | 
				
			||||||
	int display;
 | 
						int display;
 | 
				
			||||||
 | 
						struct wlr_seat *seat;
 | 
				
			||||||
	int x_fd[2], wl_fd[2], wm_fd[2];
 | 
						int x_fd[2], wl_fd[2], wm_fd[2];
 | 
				
			||||||
	struct wl_client *client;
 | 
						struct wl_client *client;
 | 
				
			||||||
	struct wl_display *wl_display;
 | 
						struct wl_display *wl_display;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -38,6 +38,12 @@ int main(int argc, char **argv) {
 | 
				
			||||||
	server.desktop = desktop_create(&server, server.config);
 | 
						server.desktop = desktop_create(&server, server.config);
 | 
				
			||||||
	server.input = input_create(&server, server.config);
 | 
						server.input = input_create(&server, server.config);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						struct roots_seat *default_seat =
 | 
				
			||||||
 | 
							roots_seat_create(server.input, ROOTS_CONFIG_DEFAULT_SEAT_NAME);
 | 
				
			||||||
 | 
						if (server.desktop->xwayland) {
 | 
				
			||||||
 | 
							server.desktop->xwayland->seat = default_seat->seat;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	const char *socket = wl_display_add_socket_auto(server.wl_display);
 | 
						const char *socket = wl_display_add_socket_auto(server.wl_display);
 | 
				
			||||||
	if (!socket) {
 | 
						if (!socket) {
 | 
				
			||||||
		wlr_log_errno(L_ERROR, "Unable to open wayland socket");
 | 
							wlr_log_errno(L_ERROR, "Unable to open wayland socket");
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,3 +1,6 @@
 | 
				
			||||||
 | 
					#define _XOPEN_SOURCE 700
 | 
				
			||||||
 | 
					#include <stdlib.h>
 | 
				
			||||||
 | 
					#include <string.h>
 | 
				
			||||||
#include <xcb/xfixes.h>
 | 
					#include <xcb/xfixes.h>
 | 
				
			||||||
#include <fcntl.h>
 | 
					#include <fcntl.h>
 | 
				
			||||||
#include "wlr/util/log.h"
 | 
					#include "wlr/util/log.h"
 | 
				
			||||||
| 
						 | 
					@ -53,11 +56,11 @@ static void data_source_send(struct wlr_data_source *base,
 | 
				
			||||||
	if (strcmp(mime_type, "text/plain;charset=utf-8") == 0) {
 | 
						if (strcmp(mime_type, "text/plain;charset=utf-8") == 0) {
 | 
				
			||||||
		// Get data for the utf8_string target
 | 
							// Get data for the utf8_string target
 | 
				
			||||||
		xcb_convert_selection(xwm->xcb_conn,
 | 
							xcb_convert_selection(xwm->xcb_conn,
 | 
				
			||||||
				xwm->selection_window,
 | 
								xwm->selection_window,
 | 
				
			||||||
				xwm->atoms[CLIPBOARD],
 | 
								xwm->atoms[CLIPBOARD],
 | 
				
			||||||
				xwm->atoms[UTF8_STRING],
 | 
								xwm->atoms[UTF8_STRING],
 | 
				
			||||||
				xwm->atoms[WL_SELECTION],
 | 
								xwm->atoms[WL_SELECTION],
 | 
				
			||||||
				XCB_TIME_CURRENT_TIME);
 | 
								XCB_TIME_CURRENT_TIME);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		xcb_flush(xwm->xcb_conn);
 | 
							xcb_flush(xwm->xcb_conn);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -71,7 +74,54 @@ static void data_source_cancel(struct wlr_data_source *source) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void xwm_get_selection_targets(struct wlr_xwm *xwm) {
 | 
					static void xwm_get_selection_targets(struct wlr_xwm *xwm) {
 | 
				
			||||||
	// set the wayland clipboard selection to the copied selection
 | 
						// set the wayland clipboard selection to the copied selection
 | 
				
			||||||
	wlr_log(L_DEBUG, "TODO: GET SELECTION TARGETS");
 | 
					
 | 
				
			||||||
 | 
						xcb_get_property_cookie_t cookie = xcb_get_property(xwm->xcb_conn,
 | 
				
			||||||
 | 
							1, // delete
 | 
				
			||||||
 | 
							xwm->selection_window,
 | 
				
			||||||
 | 
							xwm->atoms[WL_SELECTION],
 | 
				
			||||||
 | 
							XCB_GET_PROPERTY_TYPE_ANY,
 | 
				
			||||||
 | 
							0, // offset
 | 
				
			||||||
 | 
							4096 //length
 | 
				
			||||||
 | 
							);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						xcb_get_property_reply_t *reply =
 | 
				
			||||||
 | 
							xcb_get_property_reply(xwm->xcb_conn, cookie, NULL);
 | 
				
			||||||
 | 
						if (reply == NULL)
 | 
				
			||||||
 | 
							return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (reply->type != XCB_ATOM_ATOM) {
 | 
				
			||||||
 | 
							free(reply);
 | 
				
			||||||
 | 
							return;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						struct x11_data_source *source = calloc(1, sizeof(struct x11_data_source));
 | 
				
			||||||
 | 
						if (source == NULL) {
 | 
				
			||||||
 | 
							free(reply);
 | 
				
			||||||
 | 
							return;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						wl_signal_init(&source->base.events.destroy);
 | 
				
			||||||
 | 
						source->base.accept = data_source_accept;
 | 
				
			||||||
 | 
						source->base.send = data_source_send;
 | 
				
			||||||
 | 
						source->base.cancel = data_source_cancel;
 | 
				
			||||||
 | 
						source->xwm = xwm;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						wl_array_init(&source->base.mime_types);
 | 
				
			||||||
 | 
						xcb_atom_t *value = xcb_get_property_value(reply);
 | 
				
			||||||
 | 
						for (uint32_t i = 0; i < reply->value_len; i++) {
 | 
				
			||||||
 | 
							if (value[i] == xwm->atoms[UTF8_STRING]) {
 | 
				
			||||||
 | 
								char **p = wl_array_add(&source->base.mime_types, sizeof *p);
 | 
				
			||||||
 | 
								if (p) {
 | 
				
			||||||
 | 
									*p = strdup("text/plain;charset=utf-8");
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						wlr_seat_set_selection(xwm->xwayland->seat, &source->base,
 | 
				
			||||||
 | 
							wl_display_next_serial(xwm->xwayland->wl_display));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						free(reply);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void xwm_handle_selection_notify(struct wlr_xwm *xwm,
 | 
					static void xwm_handle_selection_notify(struct wlr_xwm *xwm,
 | 
				
			||||||
| 
						 | 
					@ -133,6 +183,12 @@ static int xwm_handle_xfixes_selection_notify(struct wlr_xwm *xwm,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int xwm_handle_selection_event(struct wlr_xwm *xwm,
 | 
					int xwm_handle_selection_event(struct wlr_xwm *xwm,
 | 
				
			||||||
		xcb_generic_event_t *event) {
 | 
							xcb_generic_event_t *event) {
 | 
				
			||||||
 | 
						if (!xwm->xwayland->seat) {
 | 
				
			||||||
 | 
							wlr_log(L_DEBUG, "not handling selection events:"
 | 
				
			||||||
 | 
								"no seat assigned to xwayland");
 | 
				
			||||||
 | 
							return 0;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	switch (event->response_type & ~0x80) {
 | 
						switch (event->response_type & ~0x80) {
 | 
				
			||||||
	case XCB_SELECTION_NOTIFY:
 | 
						case XCB_SELECTION_NOTIFY:
 | 
				
			||||||
		xwm_handle_selection_notify(xwm, event);
 | 
							xwm_handle_selection_notify(xwm, event);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue