diff --git a/src/compositor/compositor-private.h b/src/compositor/compositor-private.h index a95df0721..3b43c6a11 100644 --- a/src/compositor/compositor-private.h +++ b/src/compositor/compositor-private.h @@ -10,6 +10,7 @@ #include "compositor/meta-compositor-view.h" #include "compositor/meta-plugin-manager.h" #include "compositor/meta-window-actor-private.h" +#include "compositor/meta-window-drag.h" #include "meta/compositor.h" #include "meta/display.h" @@ -80,6 +81,13 @@ ClutterStage * meta_compositor_get_stage (MetaCompositor *compositor); gboolean meta_compositor_is_switching_workspace (MetaCompositor *compositor); +gboolean meta_compositor_drag_window (MetaCompositor *compositor, + MetaWindow *window, + MetaGrabOp grab_op, + uint32_t timestamp); + +MetaWindowDrag * meta_compositor_get_current_window_drag (MetaCompositor *compositor); + void meta_compositor_grab_begin (MetaCompositor *compositor); void meta_compositor_grab_end (MetaCompositor *compositor); diff --git a/src/compositor/compositor.c b/src/compositor/compositor.c index 6139b78a8..dbc4aea50 100644 --- a/src/compositor/compositor.c +++ b/src/compositor/compositor.c @@ -136,6 +136,8 @@ typedef struct _MetaCompositorPrivate MetaPluginManager *plugin_mgr; + MetaWindowDrag *current_drag; + MetaLaters *laters; } MetaCompositorPrivate; @@ -1673,3 +1675,47 @@ meta_compositor_get_laters (MetaCompositor *compositor) priv = meta_compositor_get_instance_private (compositor); return priv->laters; } + +static void +on_window_drag_ended (MetaWindowDrag *window_drag, + MetaCompositor *compositor) +{ + MetaCompositorPrivate *priv = + meta_compositor_get_instance_private (compositor); + + g_assert (priv->current_drag == window_drag); + g_clear_object (&priv->current_drag); +} + +gboolean +meta_compositor_drag_window (MetaCompositor *compositor, + MetaWindow *window, + MetaGrabOp grab_op, + uint32_t timestamp) +{ + MetaCompositorPrivate *priv = + meta_compositor_get_instance_private (compositor); + g_autoptr (MetaWindowDrag) window_drag = NULL; + + if (priv->current_drag) + return FALSE; + + window_drag = meta_window_drag_new (window, grab_op); + + if (!meta_window_drag_begin (window_drag, timestamp)) + return FALSE; + + g_signal_connect (window_drag, "ended", + G_CALLBACK (on_window_drag_ended), compositor); + priv->current_drag = g_steal_pointer (&window_drag); + return TRUE; +} + +MetaWindowDrag * +meta_compositor_get_current_window_drag (MetaCompositor *compositor) +{ + MetaCompositorPrivate *priv = + meta_compositor_get_instance_private (compositor); + + return priv->current_drag; +}