mirror of
https://github.com/hyprwm/wlroots-hyprland.git
synced 2024-11-13 08:55:58 +01:00
xwayland selection: further cleanup on Xwayland exit
This is necessary if our last primary/clipboard selection was on Xwayland, and we try to paste to native wayland after Xwayland died
This commit is contained in:
parent
f8a346380c
commit
bb0d888f25
3 changed files with 26 additions and 7 deletions
|
@ -108,6 +108,7 @@ 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_selection_init(struct wlr_xwm *xwm);
|
||||
void xwm_selection_finish(struct wlr_xwm *xwm);
|
||||
|
||||
void xwm_set_seat(struct wlr_xwm *xwm, struct wlr_seat *seat);
|
||||
|
||||
|
|
|
@ -826,6 +826,30 @@ void xwm_selection_init(struct wlr_xwm *xwm) {
|
|||
selection_init(xwm, &xwm->primary_selection, xwm->atoms[PRIMARY]);
|
||||
}
|
||||
|
||||
void xwm_selection_finish(struct wlr_xwm *xwm) {
|
||||
if (!xwm) {
|
||||
return;
|
||||
}
|
||||
if (xwm->selection_window) {
|
||||
xcb_destroy_window(xwm->xcb_conn, xwm->selection_window);
|
||||
}
|
||||
if (xwm->seat) {
|
||||
if (xwm->seat->selection_source &&
|
||||
xwm->seat->selection_source->cancel == data_source_cancel) {
|
||||
wlr_seat_set_selection(xwm->seat, NULL,
|
||||
wl_display_next_serial(xwm->xwayland->wl_display));
|
||||
}
|
||||
if (xwm->seat->primary_selection_source &&
|
||||
xwm->seat->primary_selection_source->cancel == primary_selection_source_cancel) {
|
||||
wlr_seat_set_primary_selection(xwm->seat, NULL,
|
||||
wl_display_next_serial(xwm->xwayland->wl_display));
|
||||
}
|
||||
wl_list_remove(&xwm->seat_selection.link);
|
||||
wl_list_remove(&xwm->seat_primary_selection.link);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
static void xwm_selection_set_owner(struct wlr_xwm_selection *selection,
|
||||
bool set) {
|
||||
if (set) {
|
||||
|
|
|
@ -1092,9 +1092,7 @@ void xwm_destroy(struct wlr_xwm *xwm) {
|
|||
if (!xwm) {
|
||||
return;
|
||||
}
|
||||
if (xwm->selection_window) {
|
||||
xcb_destroy_window(xwm->xcb_conn, xwm->selection_window);
|
||||
}
|
||||
xwm_selection_finish(xwm);
|
||||
if (xwm->cursor) {
|
||||
xcb_free_cursor(xwm->xcb_conn, xwm->cursor);
|
||||
}
|
||||
|
@ -1114,10 +1112,6 @@ void xwm_destroy(struct wlr_xwm *xwm) {
|
|||
wl_list_for_each_safe(xsurface, tmp, &xwm->unpaired_surfaces, link) {
|
||||
wlr_xwayland_surface_destroy(xsurface);
|
||||
}
|
||||
if (xwm->seat) {
|
||||
wl_list_remove(&xwm->seat_selection.link);
|
||||
wl_list_remove(&xwm->seat_primary_selection.link);
|
||||
}
|
||||
wl_list_remove(&xwm->compositor_surface_create.link);
|
||||
xcb_disconnect(xwm->xcb_conn);
|
||||
|
||||
|
|
Loading…
Reference in a new issue