From 73d114ffbe6899f948bcd25f6dd2c75e78f13d48 Mon Sep 17 00:00:00 2001 From: Keith Bowes Date: Tue, 10 Mar 2020 22:18:08 -0400 Subject: [PATCH] Implemented primary-selection support Well, wl-clipboard works now anyway --- include/waybox/seat.h | 5 +++++ include/waybox/server.h | 1 - waybox/seat.c | 27 +++++++++++++++++++++++++++ waybox/server.c | 1 - 4 files changed, 32 insertions(+), 2 deletions(-) diff --git a/include/waybox/seat.h b/include/waybox/seat.h index a348846..19500c5 100644 --- a/include/waybox/seat.h +++ b/include/waybox/seat.h @@ -2,6 +2,8 @@ #define _WB_SEAT_H #include +#include +#include #include #include "waybox/server.h" @@ -10,6 +12,9 @@ struct wb_seat { struct wlr_seat *seat; struct wl_list keyboards; + + struct wl_listener request_set_primary_selection; + struct wl_listener request_set_selection; }; struct wb_keyboard { diff --git a/include/waybox/server.h b/include/waybox/server.h index ecad2a6..4409679 100644 --- a/include/waybox/server.h +++ b/include/waybox/server.h @@ -16,7 +16,6 @@ #include #include #include -#include #include #include diff --git a/waybox/seat.c b/waybox/seat.c index 390a8e2..dc3b789 100644 --- a/waybox/seat.c +++ b/waybox/seat.c @@ -144,6 +144,22 @@ static void new_input_notify(struct wl_listener *listener, void *data) { wlr_seat_set_capabilities(server->seat->seat, caps); } +static void handle_request_set_primary_selection(struct wl_listener *listener, + void *data) { + struct wb_seat *seat = + wl_container_of(listener, seat, request_set_primary_selection); + struct wlr_seat_request_set_primary_selection_event *event = data; + wlr_seat_set_primary_selection(seat->seat, event->source, event->serial); +} + +static void handle_request_set_selection(struct wl_listener *listener, void + *data) { + struct wb_seat *seat = + wl_container_of(listener, seat, request_set_selection); + struct wlr_seat_request_set_selection_event *event = data; + wlr_seat_set_selection(seat->seat, event->source, event->serial); +} + struct wb_seat *wb_seat_create(struct wb_server *server) { struct wb_seat *seat = malloc(sizeof(struct wb_seat)); @@ -152,10 +168,21 @@ struct wb_seat *wb_seat_create(struct wb_server *server) { wl_signal_add(&server->backend->events.new_input, &server->new_input); seat->seat = wlr_seat_create(server->wl_display, "seat0"); + wlr_primary_selection_v1_device_manager_create(server->wl_display); + seat->request_set_primary_selection.notify = + handle_request_set_primary_selection; + wl_signal_add(&seat->seat->events.request_set_primary_selection, + &seat->request_set_primary_selection); + seat->request_set_selection.notify = handle_request_set_selection; + wl_signal_add(&seat->seat->events.request_set_selection, + &seat->request_set_selection); + return seat; } void wb_seat_destroy(struct wb_seat *seat) { + wl_list_remove(&seat->request_set_primary_selection.link); + wl_list_remove(&seat->request_set_selection.link); wlr_seat_destroy(seat->seat); free(seat); } diff --git a/waybox/server.c b/waybox/server.c index 3f99ba2..bc8952a 100644 --- a/waybox/server.c +++ b/waybox/server.c @@ -52,7 +52,6 @@ bool wb_start_server(struct wb_server* server) { wlr_gamma_control_manager_v1_create(server->wl_display); wlr_screencopy_manager_v1_create(server->wl_display); - wlr_primary_selection_v1_device_manager_create(server->wl_display); wlr_idle_create(server->wl_display); wlr_data_device_manager_create(server->wl_display);