xwayland/selection: make xwm_selection_finish take a wlr_xwm_selection *
Previously it took a wlr_xwm *, which was a bit surprising in that it freed members of wlr_xwm *, not just its respective selections.
This commit is contained in:
parent
b6ba595862
commit
aa86a022fa
|
@ -77,6 +77,6 @@ bool primary_selection_source_is_xwayland(
|
||||||
void xwm_seat_handle_start_drag(struct wlr_xwm *xwm, struct wlr_drag *drag);
|
void xwm_seat_handle_start_drag(struct wlr_xwm *xwm, struct wlr_drag *drag);
|
||||||
|
|
||||||
void xwm_selection_init(struct wlr_xwm *xwm);
|
void xwm_selection_init(struct wlr_xwm *xwm);
|
||||||
void xwm_selection_finish(struct wlr_xwm *xwm);
|
void xwm_selection_finish(struct wlr_xwm_selection *selection);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -5,7 +5,6 @@
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <wlr/types/wlr_data_device.h>
|
#include <wlr/types/wlr_data_device.h>
|
||||||
#include <wlr/types/wlr_primary_selection.h>
|
|
||||||
#include <wlr/util/log.h>
|
#include <wlr/util/log.h>
|
||||||
#include <xcb/xfixes.h>
|
#include <xcb/xfixes.h>
|
||||||
#include "xwayland/selection.h"
|
#include "xwayland/selection.h"
|
||||||
|
@ -245,53 +244,18 @@ void xwm_selection_init(struct wlr_xwm *xwm) {
|
||||||
selection_init(xwm, &xwm->dnd_selection, xwm->atoms[DND_SELECTION]);
|
selection_init(xwm, &xwm->dnd_selection, xwm->atoms[DND_SELECTION]);
|
||||||
}
|
}
|
||||||
|
|
||||||
void xwm_selection_finish(struct wlr_xwm *xwm) {
|
void xwm_selection_finish(struct wlr_xwm_selection *selection) {
|
||||||
if (!xwm) {
|
if (!selection) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct wlr_xwm_selection *selections[] = {
|
struct wlr_xwm_selection_transfer *outgoing, *tmp;
|
||||||
&xwm->clipboard_selection,
|
wl_list_for_each_safe(outgoing, tmp, &selection->outgoing, outgoing_link) {
|
||||||
&xwm->primary_selection,
|
wlr_log(WLR_INFO, "destroyed pending transfer %p", outgoing);
|
||||||
&xwm->dnd_selection,
|
xwm_selection_transfer_destroy_outgoing(outgoing);
|
||||||
};
|
|
||||||
|
|
||||||
for (size_t i = 0; i < sizeof(selections)/sizeof(selections[0]); i++) {
|
|
||||||
struct wlr_xwm_selection *selection = selections[i];
|
|
||||||
|
|
||||||
struct wlr_xwm_selection_transfer *outgoing, *tmp;
|
|
||||||
wl_list_for_each_safe(outgoing, tmp, &selection->outgoing, outgoing_link) {
|
|
||||||
wlr_log(WLR_INFO, "destroyed pending transfer %ld/%p", i, outgoing);
|
|
||||||
xwm_selection_transfer_destroy_outgoing(outgoing);
|
|
||||||
}
|
|
||||||
|
|
||||||
xwm_selection_transfer_finish(&selection->incoming);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (xwm->selection_window) {
|
xwm_selection_transfer_finish(&selection->incoming);
|
||||||
xcb_destroy_window(xwm->xcb_conn, xwm->selection_window);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (xwm->dnd_window) {
|
|
||||||
xcb_destroy_window(xwm->xcb_conn, xwm->dnd_window);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (xwm->seat) {
|
|
||||||
if (xwm->seat->selection_source &&
|
|
||||||
data_source_is_xwayland(xwm->seat->selection_source)) {
|
|
||||||
wlr_seat_set_selection(xwm->seat, NULL,
|
|
||||||
wl_display_next_serial(xwm->xwayland->wl_display));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (xwm->seat->primary_selection_source &&
|
|
||||||
primary_selection_source_is_xwayland(
|
|
||||||
xwm->seat->primary_selection_source)) {
|
|
||||||
wlr_seat_set_primary_selection(xwm->seat, NULL,
|
|
||||||
wl_display_next_serial(xwm->xwayland->wl_display));
|
|
||||||
}
|
|
||||||
|
|
||||||
wlr_xwayland_set_seat(xwm->xwayland, NULL);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void xwm_selection_set_owner(struct wlr_xwm_selection *selection,
|
static void xwm_selection_set_owner(struct wlr_xwm_selection *selection,
|
||||||
|
|
|
@ -5,6 +5,8 @@
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <wlr/config.h>
|
#include <wlr/config.h>
|
||||||
|
#include <wlr/types/wlr_data_device.h>
|
||||||
|
#include <wlr/types/wlr_primary_selection.h>
|
||||||
#include <wlr/types/wlr_surface.h>
|
#include <wlr/types/wlr_surface.h>
|
||||||
#include <wlr/util/edges.h>
|
#include <wlr/util/edges.h>
|
||||||
#include <wlr/util/log.h>
|
#include <wlr/util/log.h>
|
||||||
|
@ -1581,7 +1583,36 @@ void xwm_destroy(struct wlr_xwm *xwm) {
|
||||||
if (!xwm) {
|
if (!xwm) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
xwm_selection_finish(xwm);
|
|
||||||
|
xwm_selection_finish(&xwm->clipboard_selection);
|
||||||
|
xwm_selection_finish(&xwm->primary_selection);
|
||||||
|
xwm_selection_finish(&xwm->dnd_selection);
|
||||||
|
|
||||||
|
if (xwm->selection_window) {
|
||||||
|
xcb_destroy_window(xwm->xcb_conn, xwm->selection_window);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (xwm->dnd_window) {
|
||||||
|
xcb_destroy_window(xwm->xcb_conn, xwm->dnd_window);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (xwm->seat) {
|
||||||
|
if (xwm->seat->selection_source &&
|
||||||
|
data_source_is_xwayland(xwm->seat->selection_source)) {
|
||||||
|
wlr_seat_set_selection(xwm->seat, NULL,
|
||||||
|
wl_display_next_serial(xwm->xwayland->wl_display));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (xwm->seat->primary_selection_source &&
|
||||||
|
primary_selection_source_is_xwayland(
|
||||||
|
xwm->seat->primary_selection_source)) {
|
||||||
|
wlr_seat_set_primary_selection(xwm->seat, NULL,
|
||||||
|
wl_display_next_serial(xwm->xwayland->wl_display));
|
||||||
|
}
|
||||||
|
|
||||||
|
wlr_xwayland_set_seat(xwm->xwayland, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
if (xwm->cursor) {
|
if (xwm->cursor) {
|
||||||
xcb_free_cursor(xwm->xcb_conn, xwm->cursor);
|
xcb_free_cursor(xwm->xcb_conn, xwm->cursor);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue