static void drag_grab_button (MetaWaylandPointerGrab *grab, const ClutterEvent *event) { MetaWaylandDragGrab *drag_grab = (MetaWaylandDragGrab*) grab; MetaWaylandSeat *seat = drag_grab->seat; ClutterEventType event_type = clutter_event_type (event); if (drag_grab->generic.pointer->grab_button == clutter_event_get_button (event) && event_type == CLUTTER_BUTTON_RELEASE) { gboolean success = FALSE; if (drag_grab->drag_focus_data_device && drag_grab->drag_data_source->has_target) { wl_data_device_send_drop (drag_grab->drag_focus_data_device); success = TRUE; } /* Finish drag and let actor self-destruct */ meta_dnd_actor_drag_finish (META_DND_ACTOR (drag_grab->feedback_actor), success); drag_grab->feedback_actor = NULL; } if (seat->pointer.button_count == 0 && event_type == CLUTTER_BUTTON_RELEASE) data_device_end_drag_grab (drag_grab); }
static void destroy_data_device_source(struct wl_listener *listener, void *data) { struct wl_seat *seat = container_of(listener, struct wl_seat, drag_data_source_listener); data_device_end_drag_grab(seat); }
static void destroy_data_device_source (struct wl_listener *listener, void *data) { MetaWaylandDragGrab *drag_grab = wl_container_of (listener, drag_grab, drag_data_source_listener); drag_grab->drag_data_source = NULL; data_device_end_drag_grab (drag_grab); }
static void data_device_end_touch_drag_grab(struct weston_touch_drag *drag) { struct weston_touch *touch = drag->grab.touch; data_device_end_drag_grab(&drag->base, touch->seat); weston_touch_end_grab(touch); free(drag); }
static void data_device_end_pointer_drag_grab(struct weston_pointer_drag *drag) { struct weston_pointer *pointer = drag->grab.pointer; data_device_end_drag_grab(&drag->base, pointer->seat); weston_pointer_end_grab(pointer); free(drag); }
static void drag_grab_button(struct wl_pointer_grab *grab, uint32_t time, uint32_t button, uint32_t state_w) { struct wl_seat *seat = container_of(grab, struct wl_seat, drag_grab); enum wl_pointer_button_state state = state_w; if (seat->drag_focus_resource && seat->pointer->grab_button == button && state == WL_POINTER_BUTTON_STATE_RELEASED) wl_data_device_send_drop(seat->drag_focus_resource); if (seat->pointer->button_count == 0 && state == WL_POINTER_BUTTON_STATE_RELEASED) { if (seat->drag_data_source) wl_list_remove(&seat->drag_data_source_listener.link); data_device_end_drag_grab(seat); } }