summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthias Clasen <mclasen@redhat.com>2014-11-28 12:32:48 -0500
committerMatthias Clasen <mclasen@redhat.com>2014-11-28 14:28:50 -0500
commita0e294dba9c473c887132628ac92f05bc8e64304 (patch)
tree8d91a69fb2ce6b073fc008c7f92976b6210d4103
parent0851e8d47e067ab34a7f8480fd8427d8ea79eab2 (diff)
downloadgtk+-a0e294dba9c473c887132628ac92f05bc8e64304.tar.gz
Track the most-recently used device
Add a ::current-device property to GdkDeviceManager which tracks the most recently used slave device.
-rw-r--r--gdk/gdkdevice.c6
-rw-r--r--gdk/gdkdevicemanager.c35
-rw-r--r--gdk/gdkdevicemanagerprivate.h5
3 files changed, 44 insertions, 2 deletions
diff --git a/gdk/gdkdevice.c b/gdk/gdkdevice.c
index 51c91721a5..d8b66f1a83 100644
--- a/gdk/gdkdevice.c
+++ b/gdk/gdkdevice.c
@@ -20,6 +20,7 @@
#include <math.h>
#include "gdkdeviceprivate.h"
+#include "gdkdevicemanagerprivate.h"
#include "gdkdisplayprivate.h"
#include "gdkinternals.h"
#include "gdkintl.h"
@@ -1782,5 +1783,8 @@ _gdk_device_set_time (GdkDevice *device,
guint32 time)
{
if (time > device->time)
- device->time = time;
+ {
+ device->time = time;
+ _gdk_device_manager_update_current_device (device->manager, device);
+ }
}
diff --git a/gdk/gdkdevicemanager.c b/gdk/gdkdevicemanager.c
index 3da434d703..e7e16b546e 100644
--- a/gdk/gdkdevicemanager.c
+++ b/gdk/gdkdevicemanager.c
@@ -154,13 +154,15 @@ G_DEFINE_ABSTRACT_TYPE (GdkDeviceManager, gdk_device_manager, G_TYPE_OBJECT)
enum {
PROP_0,
- PROP_DISPLAY
+ PROP_DISPLAY,
+ PROP_CURRENT_DEVICE
};
enum {
DEVICE_ADDED,
DEVICE_REMOVED,
DEVICE_CHANGED,
+ CURRENT_DEVICE_CHANGED,
LAST_SIGNAL
};
@@ -184,6 +186,15 @@ gdk_device_manager_class_init (GdkDeviceManagerClass *klass)
G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY |
G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (object_class,
+ PROP_CURRENT_DEVICE,
+ g_param_spec_object ("current-device",
+ P_("Current device"),
+ P_("Most recently used device"),
+ GDK_TYPE_DEVICE,
+ G_PARAM_READABLE |
+ G_PARAM_STATIC_STRINGS));
+
/**
* GdkDeviceManager::device-added:
* @device_manager: the object on which the signal is emitted
@@ -283,6 +294,9 @@ gdk_device_manager_get_property (GObject *object,
case PROP_DISPLAY:
g_value_set_object (value, GDK_DEVICE_MANAGER (object)->display);
break;
+ case PROP_CURRENT_DEVICE:
+ g_value_set_object (value, GDK_DEVICE_MANAGER (object)->current_device);
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
@@ -356,3 +370,22 @@ gdk_device_manager_get_client_pointer (GdkDeviceManager *device_manager)
return GDK_DEVICE_MANAGER_GET_CLASS (device_manager)->get_client_pointer (device_manager);
}
+
+void
+_gdk_device_manager_update_current_device (GdkDeviceManager *device_manager,
+ GdkDevice *device)
+{
+ if (gdk_device_get_device_type (device) != GDK_DEVICE_TYPE_SLAVE)
+ return;
+
+ if (device_manager->current_device == device)
+ return;
+
+ if (device_manager->current_device == NULL ||
+ device == NULL ||
+ gdk_device_get_time (device) >= gdk_device_get_time (device_manager->current_device))
+ {
+ device_manager->current_device = device;
+ g_object_notify (G_OBJECT (device_manager), "current-device");
+ }
+}
diff --git a/gdk/gdkdevicemanagerprivate.h b/gdk/gdkdevicemanagerprivate.h
index c18d2cdd73..5ce6371af7 100644
--- a/gdk/gdkdevicemanagerprivate.h
+++ b/gdk/gdkdevicemanagerprivate.h
@@ -36,6 +36,7 @@ struct _GdkDeviceManager
/*< private >*/
GdkDisplay *display;
+ GdkDevice *current_device;
};
struct _GdkDeviceManagerClass
@@ -56,6 +57,10 @@ struct _GdkDeviceManagerClass
GdkDevice * (* get_client_pointer) (GdkDeviceManager *device_manager);
};
+void
+_gdk_device_manager_update_current_device (GdkDeviceManager *device_manager,
+ GdkDevice *device);
+
G_END_DECLS
#endif