[gimp/gtk3-port: 33/444] app: port device management to GdkDeviceManager



commit 2ac626d3636734d10f65fc39bde0975ed66e54ca
Author: Michael Natterer <mitch gimp org>
Date:   Mon Oct 18 17:58:48 2010 +0200

    app: port device management to GdkDeviceManager

 app/widgets/gimpdevicemanager.c |  100 ++++++++++++++++++++++++++++++++------
 1 files changed, 84 insertions(+), 16 deletions(-)
---
diff --git a/app/widgets/gimpdevicemanager.c b/app/widgets/gimpdevicemanager.c
index 89582a3..a8897de 100644
--- a/app/widgets/gimpdevicemanager.c
+++ b/app/widgets/gimpdevicemanager.c
@@ -74,10 +74,10 @@ static void   gimp_device_manager_display_closed (GdkDisplay        *display,
                                                   gboolean           is_error,
                                                   GimpDeviceManager *manager);
 
-static void   gimp_device_manager_device_added   (GdkDisplay        *gdk_display,
+static void   gimp_device_manager_device_added   (GdkDeviceManager  *gdk_manager,
                                                   GdkDevice         *device,
                                                   GimpDeviceManager *manager);
-static void   gimp_device_manager_device_removed (GdkDisplay        *gdk_display,
+static void   gimp_device_manager_device_removed (GdkDeviceManager  *gdk_manager,
                                                   GdkDevice         *device,
                                                   GimpDeviceManager *manager);
 
@@ -141,6 +141,8 @@ gimp_device_manager_constructed (GObject *object)
   GSList                   *displays;
   GSList                   *list;
   GdkDisplay               *display;
+  GdkDeviceManager         *gdk_manager;
+  GdkDevice                *client_pointer;
 
   G_OBJECT_CLASS (parent_class)->constructed (object);
 
@@ -164,10 +166,12 @@ gimp_device_manager_constructed (GObject *object)
                     G_CALLBACK (gimp_device_manager_display_opened),
                     manager);
 
-  display = gdk_display_get_default ();
+  display     = gdk_display_get_default ();
+  gdk_manager = gdk_display_get_device_manager (display);
 
-  private->current_device =
-    gimp_device_info_get_by_device (gdk_display_get_core_pointer (display));
+  client_pointer = gdk_device_manager_get_client_pointer (gdk_manager);
+
+  private->current_device = gimp_device_info_get_by_device (client_pointer);
 
   g_signal_connect_object (private->gimp->config, "notify::devices-share-tool",
                            G_CALLBACK (gimp_device_manager_config_notify),
@@ -306,6 +310,8 @@ gimp_device_manager_display_opened (GdkDisplayManager *disp_manager,
                                     GimpDeviceManager *manager)
 {
   GimpDeviceManagerPrivate *private = GET_PRIVATE (manager);
+  GdkDeviceManager         *gdk_manager;
+  GList                    *devices;
   GList                    *list;
   const gchar              *display_name;
   gint                      count;
@@ -322,14 +328,41 @@ gimp_device_manager_display_opened (GdkDisplayManager *disp_manager,
   if (count > 0)
     return;
 
+  gdk_manager = gdk_display_get_device_manager (gdk_display);
+
+  devices = gdk_device_manager_list_devices (gdk_manager,
+                                             GDK_DEVICE_TYPE_MASTER);
+
   /*  create device info structures for present devices */
-  for (list = gdk_display_list_devices (gdk_display); list; list = list->next)
+  for (list = devices; list; list = g_list_next (list))
     {
       GdkDevice *device = list->data;
 
-      gimp_device_manager_device_added (gdk_display, device, manager);
+      gimp_device_manager_device_added (gdk_manager, device, manager);
     }
 
+  g_list_free (devices);
+
+  devices = gdk_device_manager_list_devices (gdk_manager,
+                                             GDK_DEVICE_TYPE_FLOATING);
+
+  /*  create device info structures for present devices */
+  for (list = devices; list; list = g_list_next (list))
+    {
+      GdkDevice *device = list->data;
+
+      gimp_device_manager_device_added (gdk_manager, device, manager);
+    }
+
+  g_list_free (devices);
+
+  g_signal_connect (gdk_manager, "device-added",
+                    G_CALLBACK (gimp_device_manager_device_added),
+                    manager);
+  g_signal_connect (gdk_manager, "device-removed",
+                    G_CALLBACK (gimp_device_manager_device_removed),
+                    manager);
+
   g_signal_connect (gdk_display, "closed",
                     G_CALLBACK (gimp_device_manager_display_closed),
                     manager);
@@ -341,6 +374,8 @@ gimp_device_manager_display_closed (GdkDisplay        *gdk_display,
                                     GimpDeviceManager *manager)
 {
   GimpDeviceManagerPrivate *private = GET_PRIVATE (manager);
+  GdkDeviceManager         *gdk_manager;
+  GList                    *devices;
   GList                    *list;
   const gchar              *display_name;
   gint                      count;
@@ -360,33 +395,66 @@ gimp_device_manager_display_closed (GdkDisplay        *gdk_display,
 
   g_hash_table_remove (private->displays, display_name);
 
-  for (list = gdk_display_list_devices (gdk_display); list; list = list->next)
+  gdk_manager = gdk_display_get_device_manager (gdk_display);
+
+  g_signal_handlers_disconnect_by_func (gdk_manager,
+                                        gimp_device_manager_device_added,
+                                        manager);
+  g_signal_handlers_disconnect_by_func (gdk_manager,
+                                        gimp_device_manager_device_removed,
+                                        manager);
+
+  g_signal_handlers_disconnect_by_func (gdk_display,
+                                        gimp_device_manager_display_closed,
+                                        manager);
+
+  devices = gdk_device_manager_list_devices (gdk_manager,
+                                             GDK_DEVICE_TYPE_MASTER);
+
+  for (list = devices; list; list = list->next)
+    {
+      GdkDevice *device = list->data;
+
+      gimp_device_manager_device_removed (gdk_manager, device, manager);
+    }
+
+  g_list_free (devices);
+
+  devices = gdk_device_manager_list_devices (gdk_manager,
+                                             GDK_DEVICE_TYPE_FLOATING);
+
+  for (list = devices; list; list = list->next)
     {
       GdkDevice *device = list->data;
 
-      gimp_device_manager_device_removed (gdk_display, device, manager);
+      gimp_device_manager_device_removed (gdk_manager, device, manager);
     }
+
+  g_list_free (devices);
 }
 
 static void
-gimp_device_manager_device_added (GdkDisplay        *gdk_display,
+gimp_device_manager_device_added (GdkDeviceManager  *gdk_manager,
                                   GdkDevice         *device,
                                   GimpDeviceManager *manager)
 {
   GimpDeviceManagerPrivate *private = GET_PRIVATE (manager);
+  GdkDisplay               *display;
   GimpDeviceInfo           *device_info;
 
+  display = gdk_device_manager_get_display (gdk_manager);
+
   device_info =
     GIMP_DEVICE_INFO (gimp_container_get_child_by_name (GIMP_CONTAINER (manager),
-                                                        device->name));
+                                                        gdk_device_get_name (device)));
 
   if (device_info)
     {
-      gimp_device_info_set_device (device_info, device, gdk_display);
+      gimp_device_info_set_device (device_info, device, display);
     }
   else
     {
-      device_info = gimp_device_info_new (private->gimp, device, gdk_display);
+      device_info = gimp_device_info_new (private->gimp, device, display);
 
       gimp_device_info_set_default_tool (device_info);
 
@@ -396,7 +464,7 @@ gimp_device_manager_device_added (GdkDisplay        *gdk_display,
 }
 
 static void
-gimp_device_manager_device_removed (GdkDisplay        *gdk_display,
+gimp_device_manager_device_removed (GdkDeviceManager  *gdk_manager,
                                     GdkDevice         *device,
                                     GimpDeviceManager *manager)
 {
@@ -405,7 +473,7 @@ gimp_device_manager_device_removed (GdkDisplay        *gdk_display,
 
   device_info =
     GIMP_DEVICE_INFO (gimp_container_get_child_by_name (GIMP_CONTAINER (manager),
-                                                        device->name));
+                                                        gdk_device_get_name (device)));
 
   if (device_info)
     {
@@ -413,7 +481,7 @@ gimp_device_manager_device_removed (GdkDisplay        *gdk_display,
 
       if (device_info == private->current_device)
         {
-          device      = gdk_display_get_core_pointer (gdk_display);
+          device      = gdk_device_manager_get_client_pointer (gdk_manager);
           device_info = gimp_device_info_get_by_device (device);
 
           gimp_device_manager_set_current_device (manager, device_info);


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]