From e3542d879d50d6239ad4ca24b4d30520fef40a87 Mon Sep 17 00:00:00 2001 From: Tony Crisci Date: Wed, 22 Nov 2017 14:58:36 -0500 Subject: [PATCH] xwm: only take clipboard if window is focused --- xwayland/selection.c | 23 +++++++++++++++++------ xwayland/xwm.c | 1 + xwayland/xwm.h | 2 ++ 3 files changed, 20 insertions(+), 6 deletions(-) diff --git a/xwayland/selection.c b/xwayland/selection.c index 3d57f394..07d1d48f 100644 --- a/xwayland/selection.c +++ b/xwayland/selection.c @@ -466,7 +466,6 @@ static int xwm_handle_xfixes_selection_notify(struct wlr_xwm *xwm, return 1; } - int xwm_handle_selection_event(struct wlr_xwm *xwm, xcb_generic_event_t *event) { if (!xwm->seat) { @@ -542,13 +541,25 @@ static void handle_seat_set_selection(struct wl_listener *listener, return; } - if (source->send == data_source_send) + if (source->send == data_source_send) { return; + } - xcb_set_selection_owner(xwm->xcb_conn, - xwm->selection_window, - xwm->atoms[CLIPBOARD], - XCB_TIME_CURRENT_TIME); + xwm_set_selection_owner(xwm); +} + +void xwm_set_selection_owner(struct wlr_xwm *xwm) { + if (xwm->focus_surface && xwm->seat->selection_source) { + xcb_set_selection_owner(xwm->xcb_conn, + xwm->selection_window, + xwm->atoms[CLIPBOARD], + XCB_TIME_CURRENT_TIME); + } else { + xcb_set_selection_owner(xwm->xcb_conn, + XCB_ATOM_NONE, + xwm->atoms[CLIPBOARD], + xwm->selection_timestamp); + } } void xwm_set_seat(struct wlr_xwm *xwm, struct wlr_seat *seat) { diff --git a/xwayland/xwm.c b/xwayland/xwm.c index 407ee362..b0a24ff2 100644 --- a/xwayland/xwm.c +++ b/xwayland/xwm.c @@ -174,6 +174,7 @@ void xwm_surface_activate(struct wlr_xwm *xwm, xwm_send_focus_window(xwm, xsurface); xwm->focus_surface = xsurface; + xwm_set_selection_owner(xwm); xcb_flush(xwm->xcb_conn); } diff --git a/xwayland/xwm.h b/xwayland/xwm.h index 47e674c0..ad8bf9d5 100644 --- a/xwayland/xwm.h +++ b/xwayland/xwm.h @@ -98,6 +98,8 @@ void xwm_set_cursor(struct wlr_xwm *xwm, const uint8_t *pixels, uint32_t stride, int xwm_handle_selection_event(struct wlr_xwm *xwm, xcb_generic_event_t *event); +void xwm_set_selection_owner(struct wlr_xwm *xwm); + void xwm_selection_init(struct wlr_xwm *xwm); void xwm_set_seat(struct wlr_xwm *xwm, struct wlr_seat *seat);