mirror of
https://github.com/hyprwm/wlroots-hyprland.git
synced 2024-11-29 16:05:59 +01: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…
Reference in a new issue