|
|
@ -186,7 +186,7 @@ static void xwm_selection_source_send(struct wlr_xwm_selection *selection,
|
|
|
|
const char *mime_type, int32_t fd) {
|
|
|
|
const char *mime_type, int32_t fd) {
|
|
|
|
if (selection == &selection->xwm->clipboard_selection) {
|
|
|
|
if (selection == &selection->xwm->clipboard_selection) {
|
|
|
|
struct wlr_data_source *source =
|
|
|
|
struct wlr_data_source *source =
|
|
|
|
selection->xwm->seat->selection_data_source;
|
|
|
|
selection->xwm->seat->selection_source;
|
|
|
|
if (source != NULL) {
|
|
|
|
if (source != NULL) {
|
|
|
|
source->send(source, mime_type, fd);
|
|
|
|
source->send(source, mime_type, fd);
|
|
|
|
return;
|
|
|
|
return;
|
|
|
@ -199,13 +199,11 @@ static void xwm_selection_source_send(struct wlr_xwm_selection *selection,
|
|
|
|
return;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
} else if (selection == &selection->xwm->dnd_selection) {
|
|
|
|
} else if (selection == &selection->xwm->dnd_selection) {
|
|
|
|
if (selection->xwm->seat->drag != NULL) {
|
|
|
|
struct wlr_data_source *source =
|
|
|
|
struct wlr_data_source *source =
|
|
|
|
selection->xwm->seat->drag_source;
|
|
|
|
selection->xwm->seat->drag->source;
|
|
|
|
if (source != NULL) {
|
|
|
|
if (source != NULL) {
|
|
|
|
source->send(source, mime_type, fd);
|
|
|
|
source->send(source, mime_type, fd);
|
|
|
|
return;
|
|
|
|
return;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
@ -216,7 +214,7 @@ static struct wl_array *xwm_selection_source_get_mime_types(
|
|
|
|
struct wlr_xwm_selection *selection) {
|
|
|
|
struct wlr_xwm_selection *selection) {
|
|
|
|
if (selection == &selection->xwm->clipboard_selection) {
|
|
|
|
if (selection == &selection->xwm->clipboard_selection) {
|
|
|
|
struct wlr_data_source *source =
|
|
|
|
struct wlr_data_source *source =
|
|
|
|
selection->xwm->seat->selection_data_source;
|
|
|
|
selection->xwm->seat->selection_source;
|
|
|
|
if (source != NULL) {
|
|
|
|
if (source != NULL) {
|
|
|
|
return &source->mime_types;
|
|
|
|
return &source->mime_types;
|
|
|
|
}
|
|
|
|
}
|
|
|
@ -227,9 +225,10 @@ static struct wl_array *xwm_selection_source_get_mime_types(
|
|
|
|
return &source->mime_types;
|
|
|
|
return &source->mime_types;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
} else if (selection == &selection->xwm->dnd_selection) {
|
|
|
|
} else if (selection == &selection->xwm->dnd_selection) {
|
|
|
|
if (selection->xwm->seat->drag != NULL &&
|
|
|
|
struct wlr_data_source *source =
|
|
|
|
selection->xwm->seat->drag->source != NULL) {
|
|
|
|
selection->xwm->seat->drag_source;
|
|
|
|
return &selection->xwm->seat->drag->source->mime_types;
|
|
|
|
if (source != NULL) {
|
|
|
|
|
|
|
|
return &source->mime_types;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return NULL;
|
|
|
|
return NULL;
|
|
|
@ -815,8 +814,7 @@ static void xwm_selection_get_targets(struct wlr_xwm_selection *selection) {
|
|
|
|
// set the wayland selection to the X11 selection
|
|
|
|
// set the wayland selection to the X11 selection
|
|
|
|
struct wlr_xwm *xwm = selection->xwm;
|
|
|
|
struct wlr_xwm *xwm = selection->xwm;
|
|
|
|
|
|
|
|
|
|
|
|
if (selection == &xwm->clipboard_selection ||
|
|
|
|
if (selection == &xwm->clipboard_selection) {
|
|
|
|
selection == &xwm->dnd_selection) {
|
|
|
|
|
|
|
|
struct x11_data_source *source =
|
|
|
|
struct x11_data_source *source =
|
|
|
|
calloc(1, sizeof(struct x11_data_source));
|
|
|
|
calloc(1, sizeof(struct x11_data_source));
|
|
|
|
if (source == NULL) {
|
|
|
|
if (source == NULL) {
|
|
|
@ -827,8 +825,6 @@ static void xwm_selection_get_targets(struct wlr_xwm_selection *selection) {
|
|
|
|
source->base.send = data_source_send;
|
|
|
|
source->base.send = data_source_send;
|
|
|
|
source->base.cancel = data_source_cancel;
|
|
|
|
source->base.cancel = data_source_cancel;
|
|
|
|
|
|
|
|
|
|
|
|
// TODO: DND
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
source->selection = selection;
|
|
|
|
source->selection = selection;
|
|
|
|
wl_array_init(&source->mime_types_atoms);
|
|
|
|
wl_array_init(&source->mime_types_atoms);
|
|
|
|
|
|
|
|
|
|
|
@ -861,6 +857,8 @@ static void xwm_selection_get_targets(struct wlr_xwm_selection *selection) {
|
|
|
|
} else {
|
|
|
|
} else {
|
|
|
|
source->base.cancel(&source->base);
|
|
|
|
source->base.cancel(&source->base);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
} else if (selection == &xwm->dnd_selection) {
|
|
|
|
|
|
|
|
// TODO
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
@ -1082,8 +1080,8 @@ void xwm_selection_finish(struct wlr_xwm *xwm) {
|
|
|
|
xcb_destroy_window(xwm->xcb_conn, xwm->selection_window);
|
|
|
|
xcb_destroy_window(xwm->xcb_conn, xwm->selection_window);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (xwm->seat) {
|
|
|
|
if (xwm->seat) {
|
|
|
|
if (xwm->seat->selection_data_source &&
|
|
|
|
if (xwm->seat->selection_source &&
|
|
|
|
xwm->seat->selection_data_source->cancel == data_source_cancel) {
|
|
|
|
xwm->seat->selection_source->cancel == data_source_cancel) {
|
|
|
|
wlr_seat_set_selection(xwm->seat, NULL,
|
|
|
|
wlr_seat_set_selection(xwm->seat, NULL,
|
|
|
|
wl_display_next_serial(xwm->xwayland->wl_display));
|
|
|
|
wl_display_next_serial(xwm->xwayland->wl_display));
|
|
|
|
}
|
|
|
|
}
|
|
|
@ -1118,7 +1116,7 @@ static void seat_handle_selection(struct wl_listener *listener,
|
|
|
|
struct wlr_seat *seat = data;
|
|
|
|
struct wlr_seat *seat = data;
|
|
|
|
struct wlr_xwm *xwm =
|
|
|
|
struct wlr_xwm *xwm =
|
|
|
|
wl_container_of(listener, xwm, seat_selection);
|
|
|
|
wl_container_of(listener, xwm, seat_selection);
|
|
|
|
struct wlr_data_source *source = seat->selection_data_source;
|
|
|
|
struct wlr_data_source *source = seat->selection_source;
|
|
|
|
|
|
|
|
|
|
|
|
if (source != NULL && source->send == data_source_send) {
|
|
|
|
if (source != NULL && source->send == data_source_send) {
|
|
|
|
return;
|
|
|
|
return;
|
|
|
@ -1211,10 +1209,21 @@ static void seat_handle_drag_destroy(struct wl_listener *listener, void *data) {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
wl_list_remove(&xwm->seat_drag_focus.link);
|
|
|
|
wl_list_remove(&xwm->seat_drag_focus.link);
|
|
|
|
|
|
|
|
wl_list_remove(&xwm->seat_drag_motion.link);
|
|
|
|
|
|
|
|
wl_list_remove(&xwm->seat_drag_drop.link);
|
|
|
|
wl_list_remove(&xwm->seat_drag_destroy.link);
|
|
|
|
wl_list_remove(&xwm->seat_drag_destroy.link);
|
|
|
|
xwm->drag = NULL;
|
|
|
|
xwm->drag = NULL;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static void seat_handle_drag_source_destroy(struct wl_listener *listener,
|
|
|
|
|
|
|
|
void *data) {
|
|
|
|
|
|
|
|
struct wlr_xwm *xwm =
|
|
|
|
|
|
|
|
wl_container_of(listener, xwm, seat_drag_source_destroy);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
wl_list_remove(&xwm->seat_drag_source_destroy.link);
|
|
|
|
|
|
|
|
xwm->drag_focus = NULL;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static void seat_handle_start_drag(struct wl_listener *listener, void *data) {
|
|
|
|
static void seat_handle_start_drag(struct wl_listener *listener, void *data) {
|
|
|
|
struct wlr_drag *drag = data;
|
|
|
|
struct wlr_drag *drag = data;
|
|
|
|
struct wlr_xwm *xwm = wl_container_of(listener, xwm, seat_start_drag);
|
|
|
|
struct wlr_xwm *xwm = wl_container_of(listener, xwm, seat_start_drag);
|
|
|
@ -1232,6 +1241,10 @@ static void seat_handle_start_drag(struct wl_listener *listener, void *data) {
|
|
|
|
xwm->seat_drag_drop.notify = seat_handle_drag_drop;
|
|
|
|
xwm->seat_drag_drop.notify = seat_handle_drag_drop;
|
|
|
|
wl_signal_add(&drag->events.destroy, &xwm->seat_drag_destroy);
|
|
|
|
wl_signal_add(&drag->events.destroy, &xwm->seat_drag_destroy);
|
|
|
|
xwm->seat_drag_destroy.notify = seat_handle_drag_destroy;
|
|
|
|
xwm->seat_drag_destroy.notify = seat_handle_drag_destroy;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
wl_signal_add(&drag->source->events.destroy,
|
|
|
|
|
|
|
|
&xwm->seat_drag_source_destroy);
|
|
|
|
|
|
|
|
xwm->seat_drag_source_destroy.notify = seat_handle_drag_source_destroy;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|