summaryrefslogtreecommitdiff
path: root/src/compositor/meta-dnd.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/compositor/meta-dnd.c')
-rw-r--r--src/compositor/meta-dnd.c74
1 files changed, 57 insertions, 17 deletions
diff --git a/src/compositor/meta-dnd.c b/src/compositor/meta-dnd.c
index ffe695643..d495cb24c 100644
--- a/src/compositor/meta-dnd.c
+++ b/src/compositor/meta-dnd.c
@@ -19,6 +19,8 @@
#include "config.h"
+#include "compositor/meta-dnd-private.h"
+
#include <gdk/gdkx.h>
#include "meta/meta-backend.h"
@@ -28,7 +30,6 @@
#include "backends/x11/meta-backend-x11.h"
#include "backends/x11/meta-clutter-backend-x11.h"
#include "backends/x11/meta-stage-x11.h"
-#include "meta/meta-dnd.h"
#include "x11/meta-x11-display-private.h"
struct _MetaDndClass
@@ -45,19 +46,16 @@ typedef struct _MetaDndPrivate MetaDndPrivate;
struct _MetaDndPrivate
{
+ MetaBackend *backend;
+
#ifdef HAVE_WAYLAND
gboolean dnd_during_modal;
-#else
- /* to avoid warnings (g_type_class_add_private: assertion `private_size > 0' failed) */
- gchar dummy;
#endif
};
struct _MetaDnd
{
GObject parent;
-
- MetaDndPrivate *priv;
};
G_DEFINE_TYPE_WITH_PRIVATE (MetaDnd, meta_dnd, G_TYPE_OBJECT);
@@ -108,10 +106,33 @@ meta_dnd_init (MetaDnd *dnd)
{
}
+MetaDnd *
+meta_dnd_new (MetaBackend *backend)
+{
+ MetaDnd *dnd;
+ MetaDndPrivate *priv;
+
+ dnd = g_object_new (META_TYPE_DND, NULL);
+ priv = meta_dnd_get_instance_private (dnd);
+ priv->backend = backend;
+
+ return dnd;
+}
+
+MetaBackend *
+meta_dnd_get_backend (MetaDnd *dnd)
+{
+ MetaDndPrivate *priv = meta_dnd_get_instance_private (dnd);
+
+ return priv->backend;
+}
+
void
meta_dnd_init_xdnd (MetaX11Display *x11_display)
{
- MetaBackend *backend = meta_get_backend ();
+ MetaDisplay *display = meta_x11_display_get_display (x11_display);
+ MetaContext *context = meta_display_get_context (display);
+ MetaBackend *backend = meta_context_get_backend (context);
Display *xdisplay = x11_display->xdisplay;
Window xwindow, overlay_xwindow;
long xdnd_version = 5;
@@ -226,20 +247,31 @@ meta_dnd_handle_xdnd_event (MetaBackend *backend,
}
#ifdef HAVE_WAYLAND
+static MetaWaylandDataDevice *
+data_device_from_dnd (MetaDnd *dnd)
+{
+ MetaBackend *backend = meta_dnd_get_backend (dnd);
+ MetaContext *context = meta_backend_get_context (backend);
+ MetaWaylandCompositor *compositor =
+ meta_context_get_wayland_compositor (context);
+
+ return &compositor->seat->data_device;
+}
+
static void
meta_dnd_wayland_on_motion_event (MetaDnd *dnd,
const ClutterEvent *event)
{
MetaWaylandDragGrab *current_grab;
gfloat event_x, event_y;
- MetaWaylandCompositor *wl_compositor = meta_wayland_compositor_get_default ();
+ MetaWaylandDataDevice *data_device = data_device_from_dnd (dnd);
g_return_if_fail (event != NULL);
clutter_event_get_coords (event, &event_x, &event_y);
meta_dnd_notify_dnd_position_change (dnd, (int)event_x, (int)event_y);
- current_grab = meta_wayland_data_device_get_current_grab (&wl_compositor->seat->data_device);
+ current_grab = meta_wayland_data_device_get_current_grab (data_device);
if (current_grab)
meta_wayland_drag_grab_update_feedback_actor (current_grab, event);
}
@@ -248,9 +280,9 @@ static void
meta_dnd_wayland_end_notify (MetaDnd *dnd)
{
MetaDndPrivate *priv = meta_dnd_get_instance_private (dnd);
- MetaWaylandCompositor *wl_compositor = meta_wayland_compositor_get_default ();
+ MetaWaylandDataDevice *data_device = data_device_from_dnd (dnd);
- meta_wayland_data_device_end_drag (&wl_compositor->seat->data_device);
+ meta_wayland_data_device_end_drag (data_device);
priv->dnd_during_modal = FALSE;
@@ -280,10 +312,10 @@ void
meta_dnd_wayland_maybe_handle_event (MetaDnd *dnd,
const ClutterEvent *event)
{
- MetaWaylandCompositor *wl_compositor = meta_wayland_compositor_get_default ();
+ MetaWaylandDataDevice *data_device = data_device_from_dnd (dnd);
MetaDndPrivate *priv = meta_dnd_get_instance_private (dnd);
- if (!meta_wayland_data_device_get_current_grab (&wl_compositor->seat->data_device))
+ if (!meta_wayland_data_device_get_current_grab (data_device))
return;
g_warn_if_fail (priv->dnd_during_modal);
@@ -299,12 +331,17 @@ meta_dnd_wayland_maybe_handle_event (MetaDnd *dnd,
void
meta_dnd_wayland_handle_begin_modal (MetaCompositor *compositor)
{
- MetaWaylandCompositor *wl_compositor = meta_wayland_compositor_get_default ();
- MetaDnd *dnd = meta_backend_get_dnd (meta_get_backend ());
+ MetaDisplay *display = meta_compositor_get_display (compositor);
+ MetaContext *context = meta_display_get_context (display);
+ MetaWaylandCompositor *wayland_compositor =
+ meta_context_get_wayland_compositor (context);
+ MetaWaylandDataDevice *data_device = &wayland_compositor->seat->data_device;
+ MetaBackend *backend = meta_context_get_backend (context);
+ MetaDnd *dnd = meta_backend_get_dnd (backend);
MetaDndPrivate *priv = meta_dnd_get_instance_private (dnd);
if (!priv->dnd_during_modal &&
- meta_wayland_data_device_get_current_grab (&wl_compositor->seat->data_device) != NULL)
+ meta_wayland_data_device_get_current_grab (data_device))
{
priv->dnd_during_modal = TRUE;
@@ -315,7 +352,10 @@ meta_dnd_wayland_handle_begin_modal (MetaCompositor *compositor)
void
meta_dnd_wayland_handle_end_modal (MetaCompositor *compositor)
{
- MetaDnd *dnd = meta_backend_get_dnd (meta_get_backend ());
+ MetaDisplay *display = meta_compositor_get_display (compositor);
+ MetaContext *context = meta_display_get_context (display);
+ MetaBackend *backend = meta_context_get_backend (context);
+ MetaDnd *dnd = meta_backend_get_dnd (backend);
MetaDndPrivate *priv = meta_dnd_get_instance_private (dnd);
if (!priv->dnd_during_modal)