data-device: Setup and release drag surface and beginning and end of drag
Previously we just got the drag_icon signal and had to figure out what changed. Now we can directly setup or release the drag icon when the drag starts and stops.
This commit is contained in:
parent
40e44ab18d
commit
5f95557631
@ -472,10 +472,8 @@ struct weston_seat {
|
|||||||
struct wl_resource *drag_focus_resource;
|
struct wl_resource *drag_focus_resource;
|
||||||
struct wl_listener drag_focus_listener;
|
struct wl_listener drag_focus_listener;
|
||||||
struct weston_pointer_grab drag_grab;
|
struct weston_pointer_grab drag_grab;
|
||||||
struct wl_surface *next_drag_surface;
|
|
||||||
struct weston_surface *drag_surface;
|
struct weston_surface *drag_surface;
|
||||||
struct wl_listener drag_surface_destroy_listener;
|
struct wl_listener drag_surface_destroy_listener;
|
||||||
struct wl_listener drag_icon_listener;
|
|
||||||
|
|
||||||
uint32_t num_tp;
|
uint32_t num_tp;
|
||||||
|
|
||||||
|
@ -231,30 +231,9 @@ device_map_drag_surface(struct weston_seat *seat)
|
|||||||
void
|
void
|
||||||
weston_seat_update_drag_surface(struct weston_seat *seat, int dx, int dy)
|
weston_seat_update_drag_surface(struct weston_seat *seat, int dx, int dy)
|
||||||
{
|
{
|
||||||
int surface_changed = 0;
|
if (!seat->drag_surface)
|
||||||
|
|
||||||
if (!seat->drag_surface && !seat->next_drag_surface)
|
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (seat->drag_surface && seat->next_drag_surface &&
|
|
||||||
(&seat->drag_surface->surface.resource !=
|
|
||||||
&seat->next_drag_surface->resource))
|
|
||||||
/* between calls to this funcion we got a new drag_surface */
|
|
||||||
surface_changed = 1;
|
|
||||||
|
|
||||||
if (!seat->next_drag_surface || surface_changed) {
|
|
||||||
device_release_drag_surface(seat);
|
|
||||||
if (!surface_changed)
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!seat->drag_surface || surface_changed) {
|
|
||||||
struct weston_surface *surface =
|
|
||||||
(struct weston_surface *) seat->next_drag_surface;
|
|
||||||
if (!device_setup_new_drag_surface(seat, surface))
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* the client may not have attached a buffer to the drag surface
|
/* the client may not have attached a buffer to the drag surface
|
||||||
* when we setup it up, so check if map is needed on every update */
|
* when we setup it up, so check if map is needed on every update */
|
||||||
device_map_drag_surface(seat);
|
device_map_drag_surface(seat);
|
||||||
@ -348,9 +327,8 @@ static void
|
|||||||
data_device_end_drag_grab(struct weston_seat *seat)
|
data_device_end_drag_grab(struct weston_seat *seat)
|
||||||
{
|
{
|
||||||
if (seat->drag_surface) {
|
if (seat->drag_surface) {
|
||||||
seat->next_drag_surface = NULL;
|
device_release_drag_surface(seat);
|
||||||
weston_seat_update_drag_surface(seat, 0, 0);
|
weston_seat_update_drag_surface(seat, 0, 0);
|
||||||
wl_list_remove(&seat->drag_icon_listener.link);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
drag_grab_focus(&seat->drag_grab, NULL,
|
drag_grab_focus(&seat->drag_grab, NULL,
|
||||||
@ -398,15 +376,6 @@ destroy_data_device_source(struct wl_listener *listener, void *data)
|
|||||||
data_device_end_drag_grab(seat);
|
data_device_end_drag_grab(seat);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
|
||||||
destroy_data_device_icon(struct wl_listener *listener, void *data)
|
|
||||||
{
|
|
||||||
struct weston_seat *seat = container_of(listener, struct weston_seat,
|
|
||||||
drag_icon_listener);
|
|
||||||
|
|
||||||
seat->next_drag_surface = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
handle_drag_surface_destroy(struct wl_listener *listener, void *data)
|
handle_drag_surface_destroy(struct wl_listener *listener, void *data)
|
||||||
{
|
{
|
||||||
@ -447,10 +416,8 @@ data_device_start_drag(struct wl_client *client, struct wl_resource *resource,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (icon_resource) {
|
if (icon_resource) {
|
||||||
seat->next_drag_surface = icon_resource->data;
|
if (!device_setup_new_drag_surface(seat, icon_resource->data))
|
||||||
seat->drag_icon_listener.notify = destroy_data_device_icon;
|
return;
|
||||||
wl_signal_add(&icon_resource->destroy_signal,
|
|
||||||
&seat->drag_icon_listener);
|
|
||||||
weston_seat_update_drag_surface(seat, 0, 0);
|
weston_seat_update_drag_surface(seat, 0, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user