xwayland/selection: introduce `xwm_selection_transfer_init`
Currently, all this does is initialize `wl_client_fd` to -1, so that comparisons with 0 are meaningful.
This commit is contained in:
parent
aa86a022fa
commit
b3d782f818
|
@ -47,6 +47,7 @@ void xwm_selection_transfer_close_wl_client_fd(
|
|||
struct wlr_xwm_selection_transfer *transfer);
|
||||
void xwm_selection_transfer_destroy_property_reply(
|
||||
struct wlr_xwm_selection_transfer *transfer);
|
||||
void xwm_selection_transfer_init(struct wlr_xwm_selection_transfer *transfer);
|
||||
void xwm_selection_transfer_finish(struct wlr_xwm_selection_transfer *transfer);
|
||||
bool xwm_selection_transfer_get_selection_property(
|
||||
struct wlr_xwm_selection_transfer *transfer, bool delete);
|
||||
|
|
|
@ -155,7 +155,7 @@ static void source_send(struct wlr_xwm_selection *selection,
|
|||
// lose track of the current `transfer->wl_client_fd` and use-after-free
|
||||
// during cleanup. This doesn't happen often, but bail now to avoid a
|
||||
// compositor crash later.
|
||||
if (transfer->wl_client_fd > 0) {
|
||||
if (transfer->wl_client_fd >= 0) {
|
||||
wlr_log(WLR_ERROR, "source_send fd %d, but %d already in progress", fd,
|
||||
transfer->wl_client_fd);
|
||||
if (transfer->wl_client_fd != fd) {
|
||||
|
@ -404,7 +404,7 @@ void xwm_handle_selection_notify(struct wlr_xwm *xwm,
|
|||
wlr_log(WLR_DEBUG, "denying write access to clipboard: "
|
||||
"no xwayland surface focused");
|
||||
// Would leak this transfer otherwise. Should never happen.
|
||||
assert(selection->incoming.wl_client_fd <= 0);
|
||||
assert(selection->incoming.wl_client_fd < 0);
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
|
@ -297,6 +297,7 @@ static bool xwm_selection_send_data(struct wlr_xwm_selection *selection,
|
|||
return false;
|
||||
}
|
||||
|
||||
xwm_selection_transfer_init(transfer);
|
||||
transfer->selection = selection;
|
||||
transfer->request = *req;
|
||||
wl_array_init(&transfer->source_data);
|
||||
|
|
|
@ -32,6 +32,10 @@ void xwm_selection_transfer_destroy_property_reply(
|
|||
transfer->property_reply = NULL;
|
||||
}
|
||||
|
||||
void xwm_selection_transfer_init(struct wlr_xwm_selection_transfer *transfer) {
|
||||
transfer->wl_client_fd = -1;
|
||||
}
|
||||
|
||||
void xwm_selection_transfer_finish(
|
||||
struct wlr_xwm_selection_transfer *transfer) {
|
||||
transfer->incr = false;
|
||||
|
@ -182,6 +186,7 @@ static void selection_init(struct wlr_xwm *xwm,
|
|||
selection->window = xwm->selection_window;
|
||||
selection->incoming.selection = selection;
|
||||
wl_list_init(&selection->outgoing);
|
||||
xwm_selection_transfer_init(&selection->incoming);
|
||||
|
||||
uint32_t mask =
|
||||
XCB_XFIXES_SELECTION_EVENT_MASK_SET_SELECTION_OWNER |
|
||||
|
|
Loading…
Reference in New Issue