/* * Copyright © 2014 Canonical Ltd * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License * as published by the Free Software Foundation; either version 2 of * the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . */ #include "config.h" #include "gdkdisplayprivate.h" #include "gdkdeviceprivate.h" #include "gdkscreen.h" #include "gdkwindow.h" typedef struct GdkMirPointer GdkMirPointer; typedef struct GdkMirPointerClass GdkMirPointerClass; #define GDK_TYPE_MIR_POINTER (gdk_mir_pointer_get_type ()) #define GDK_MIR_POINTER(object) (G_TYPE_CHECK_INSTANCE_CAST ((object), GDK_TYPE_MIR_POINTER, GdkMirPointer)) #define GDK_MIR_POINTER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GDK_TYPE_MIR_POINTER, GdkMirPointerClass)) #define GDK_IS_MIR_POINTER(object) (G_TYPE_CHECK_INSTANCE_TYPE ((object), GDK_TYPE_MIR_POINTER)) #define GDK_IS_MIR_POINTER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GDK_TYPE_MIR_POINTER)) #define GDK_MIR_POINTER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GDK_TYPE_MIR_POINTER, GdkMirPointerClass)) struct GdkMirPointer { GdkDevice parent_instance; /* Location of pointer */ gdouble x; gdouble y; /* Window this pointer is over */ GdkWindow *over_window; /* Current modifier mask */ GdkModifierType modifier_mask; }; struct GdkMirPointerClass { GdkDeviceClass parent_class; }; G_DEFINE_TYPE (GdkMirPointer, gdk_mir_pointer, GDK_TYPE_DEVICE) GdkDevice * _gdk_mir_pointer_new (GdkDeviceManager *device_manager, const gchar *name) { return g_object_new (GDK_TYPE_MIR_POINTER, "display", gdk_device_manager_get_display (device_manager), "device-manager", device_manager, "name", name, "type", GDK_DEVICE_TYPE_MASTER, "input-source", GDK_SOURCE_MOUSE, "input-mode", GDK_MODE_SCREEN, "has-cursor", TRUE, NULL); } void _gdk_mir_pointer_set_location (GdkDevice *pointer, gdouble x, gdouble y, GdkWindow *window, GdkModifierType mask) { GdkMirPointer *p = GDK_MIR_POINTER (pointer); p->x = x; p->y = y; if (p->over_window) g_object_unref (p->over_window); p->over_window = g_object_ref (window); p->modifier_mask = mask; } static gboolean gdk_mir_pointer_get_history (GdkDevice *device, GdkWindow *window, guint32 start, guint32 stop, GdkTimeCoord ***events, gint *n_events) { return FALSE; } static void gdk_mir_pointer_get_state (GdkDevice *device, GdkWindow *window, gdouble *axes, GdkModifierType *mask) { GdkMirPointer *p = GDK_MIR_POINTER (device); gdouble x, y; gdk_window_get_device_position_double (window, device, &x, &y, mask); if (axes) { axes[0] = p->x; axes[1] = p->y; } } static void gdk_mir_pointer_set_window_cursor (GdkDevice *device, GdkWindow *window, GdkCursor *cursor) { /* Mir doesn't support cursors */ } static void gdk_mir_pointer_warp (GdkDevice *device, GdkScreen *screen, gdouble x, gdouble y) { /* Mir doesn't support warping */ } static void gdk_mir_pointer_query_state (GdkDevice *device, GdkWindow *window, GdkWindow **root_window, GdkWindow **child_window, gdouble *root_x, gdouble *root_y, gdouble *win_x, gdouble *win_y, GdkModifierType *mask) { GdkMirPointer *p = GDK_MIR_POINTER (device); if (root_window) *root_window = gdk_screen_get_root_window (gdk_display_get_default_screen (gdk_device_get_display (device))); if (child_window) *child_window = p->over_window; if (root_x) *root_x = p->x; if (root_y) *root_y = p->y; if (win_x) *win_x = p->x; // FIXME if (win_y) *win_y = p->y; if (mask) *mask = p->modifier_mask; } static GdkGrabStatus gdk_mir_pointer_grab (GdkDevice *device, GdkWindow *window, gboolean owner_events, GdkEventMask event_mask, GdkWindow *confine_to, GdkCursor *cursor, guint32 time_) { /* Mir doesn't do grabs, so sure, you have the grab */ return GDK_GRAB_SUCCESS; } static void gdk_mir_pointer_ungrab (GdkDevice *device, guint32 time_) { /* Mir doesn't do grabs */ GdkDeviceGrabInfo *grab = _gdk_display_get_last_device_grab (gdk_device_get_display (device), device); if (grab) grab->serial_end = grab->serial_start; } static GdkWindow * gdk_mir_pointer_window_at_position (GdkDevice *device, gdouble *win_x, gdouble *win_y, GdkModifierType *mask, gboolean get_toplevel) { GdkMirPointer *p = GDK_MIR_POINTER (device); if (win_x) *win_x = p->x; if (win_y) *win_y = p->y; if (mask) *mask = p->modifier_mask; return p->over_window; } static void gdk_mir_pointer_select_window_events (GdkDevice *device, GdkWindow *window, GdkEventMask event_mask) { // FIXME? } static void gdk_mir_pointer_init (GdkMirPointer *device) { } static void gdk_mir_pointer_finalize (GObject *object) { GdkMirPointer *p = GDK_MIR_POINTER (object); if (p->over_window) g_object_unref (p->over_window); G_OBJECT_CLASS (gdk_mir_pointer_parent_class)->finalize (object); } static void gdk_mir_pointer_class_init (GdkMirPointerClass *klass) { GObjectClass *object_class = G_OBJECT_CLASS (klass); GdkDeviceClass *device_class = GDK_DEVICE_CLASS (klass); object_class->finalize = gdk_mir_pointer_finalize; device_class->get_history = gdk_mir_pointer_get_history; device_class->get_state = gdk_mir_pointer_get_state; device_class->set_window_cursor = gdk_mir_pointer_set_window_cursor; device_class->warp = gdk_mir_pointer_warp; device_class->query_state = gdk_mir_pointer_query_state; device_class->grab = gdk_mir_pointer_grab; device_class->ungrab = gdk_mir_pointer_ungrab; device_class->window_at_position = gdk_mir_pointer_window_at_position; device_class->select_window_events = gdk_mir_pointer_select_window_events; }