wayland/xdg-toplevel-drag: Use the new grab API in meta_window_drag_begin
Signed-off-by: Nick Diego Yamane <nickdiego@igalia.com> Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/4107>
This commit is contained in:
parent
0c42ddefad
commit
b3c80016c3
@ -50,7 +50,7 @@ static guint signals[LAST_SIGNAL] = { 0, };
|
||||
|
||||
struct _MetaWindowDrag {
|
||||
GObject parent_class;
|
||||
ClutterActor *handler;
|
||||
ClutterActor *external_grab_actor;
|
||||
|
||||
MetaWindow *window;
|
||||
MetaWindow *effective_grab_window;
|
||||
@ -176,24 +176,14 @@ hide_tile_preview (MetaWindowDrag *window_drag)
|
||||
meta_compositor_hide_tile_preview (window->display->compositor);
|
||||
}
|
||||
|
||||
static gboolean
|
||||
owns_grab_actor (MetaWindowDrag *window_drag)
|
||||
{
|
||||
g_assert (META_IS_WINDOW_DRAG (window_drag));
|
||||
return window_drag->grab != NULL;
|
||||
}
|
||||
|
||||
static void
|
||||
meta_window_drag_finalize (GObject *object)
|
||||
{
|
||||
MetaWindowDrag *window_drag = META_WINDOW_DRAG (object);
|
||||
|
||||
hide_tile_preview (window_drag);
|
||||
if (owns_grab_actor (window_drag))
|
||||
{
|
||||
g_clear_pointer (&window_drag->handler, clutter_actor_destroy);
|
||||
g_clear_object (&window_drag->grab);
|
||||
}
|
||||
if (window_drag->grab)
|
||||
g_clear_object (&window_drag->grab);
|
||||
g_clear_object (&window_drag->effective_grab_window);
|
||||
|
||||
G_OBJECT_CLASS (meta_window_drag_parent_class)->finalize (object);
|
||||
@ -398,11 +388,16 @@ meta_window_drag_end (MetaWindowDrag *window_drag)
|
||||
|
||||
meta_window_grab_op_ended (grab_window, grab_op);
|
||||
|
||||
if (owns_grab_actor (window_drag))
|
||||
clutter_grab_dismiss (window_drag->grab);
|
||||
if (window_drag->grab)
|
||||
{
|
||||
clutter_grab_dismiss (window_drag->grab);
|
||||
}
|
||||
else
|
||||
g_clear_signal_handler (&window_drag->event_handler_id,
|
||||
window_drag->handler);
|
||||
{
|
||||
g_assert (window_drag->external_grab_actor);
|
||||
g_clear_signal_handler (&window_drag->event_handler_id,
|
||||
window_drag->external_grab_actor);
|
||||
}
|
||||
|
||||
g_clear_signal_handler (&window_drag->unmanaged_id, grab_window);
|
||||
g_clear_signal_handler (&window_drag->size_changed_id, grab_window);
|
||||
@ -1774,8 +1769,8 @@ process_pointer_event (MetaWindowDrag *window_drag,
|
||||
}
|
||||
|
||||
static gboolean
|
||||
on_window_drag_event (MetaWindowDrag *window_drag,
|
||||
ClutterEvent *event)
|
||||
on_window_drag_event (MetaWindowDrag *window_drag,
|
||||
const ClutterEvent *event)
|
||||
{
|
||||
switch (clutter_event_type (event))
|
||||
{
|
||||
@ -1791,6 +1786,14 @@ on_window_drag_event (MetaWindowDrag *window_drag,
|
||||
return CLUTTER_EVENT_PROPAGATE;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
handle_drag_event (const ClutterEvent *event,
|
||||
gpointer user_data)
|
||||
{
|
||||
MetaWindowDrag *window_drag = user_data;
|
||||
return on_window_drag_event (window_drag, event);
|
||||
}
|
||||
|
||||
gboolean
|
||||
meta_window_drag_begin (MetaWindowDrag *window_drag,
|
||||
ClutterInputDevice *device,
|
||||
@ -1803,7 +1806,7 @@ meta_window_drag_begin (MetaWindowDrag *window_drag,
|
||||
MetaContext *context = meta_display_get_context (display);
|
||||
MetaBackend *backend = meta_context_get_backend (context);
|
||||
MetaGrabOp grab_op = window_drag->grab_op;
|
||||
ClutterActor *stage;
|
||||
ClutterStage *stage;
|
||||
int root_x, root_y;
|
||||
|
||||
if ((grab_op & META_GRAB_OP_KEYBOARD_MOVING) == META_GRAB_OP_KEYBOARD_MOVING)
|
||||
@ -1859,32 +1862,27 @@ meta_window_drag_begin (MetaWindowDrag *window_drag,
|
||||
window->desc);
|
||||
meta_window_focus (window, timestamp);
|
||||
|
||||
stage = meta_backend_get_stage (backend);
|
||||
stage = CLUTTER_STAGE (meta_backend_get_stage (backend));
|
||||
|
||||
if (grab_actor)
|
||||
{
|
||||
meta_topic (META_DEBUG_WINDOW_OPS, "Reusing grab actor %p.", grab_actor);
|
||||
window_drag->handler = grab_actor;
|
||||
window_drag->external_grab_actor = grab_actor;
|
||||
window_drag->event_handler_id =
|
||||
g_signal_connect_swapped (window_drag->handler, "event",
|
||||
g_signal_connect_swapped (window_drag->external_grab_actor, "event",
|
||||
G_CALLBACK (on_window_drag_event), window_drag);
|
||||
}
|
||||
else
|
||||
{
|
||||
meta_topic (META_DEBUG_WINDOW_OPS, "Creating a new grab.");
|
||||
window_drag->handler = clutter_actor_new ();
|
||||
clutter_actor_hide (window_drag->handler);
|
||||
clutter_actor_set_name (window_drag->handler,
|
||||
"Window drag helper");
|
||||
clutter_actor_set_accessible_name (window_drag->handler,
|
||||
"Window drag helper");
|
||||
window_drag->event_handler_id =
|
||||
g_signal_connect_swapped (window_drag->handler, "event",
|
||||
G_CALLBACK (on_window_drag_event), window_drag);
|
||||
clutter_actor_add_child (stage, window_drag->handler);
|
||||
|
||||
window_drag->grab = clutter_stage_grab (CLUTTER_STAGE (stage),
|
||||
window_drag->handler);
|
||||
window_drag->grab = clutter_stage_grab_input_only_inactive (stage,
|
||||
handle_drag_event,
|
||||
window_drag,
|
||||
NULL);
|
||||
grab_actor = clutter_stage_get_grab_actor (stage);
|
||||
clutter_actor_set_name (grab_actor, "Window drag helper");
|
||||
clutter_actor_set_accessible_name (grab_actor, "Window drag helper");
|
||||
clutter_grab_activate (window_drag->grab);
|
||||
|
||||
if ((clutter_grab_get_seat_state (window_drag->grab) &
|
||||
CLUTTER_GRAB_STATE_POINTER) == 0 &&
|
||||
|
Loading…
x
Reference in New Issue
Block a user