[gimp] app: do not reuse stored configuration on virtual devices.



commit 273972bc4d3bf6c836c97f0ba3d8ef584d212f7f
Author: Jehan <jehan girinstud io>
Date:   Thu Dec 10 23:54:24 2020 +0100

    app: do not reuse stored configuration on virtual devices.
    
    Virtual devices are only reflection on the various physical devices
    attached to it (mouse, touchpads, styluses, etc.). Keeping settings when
    the device is updated just makes no sense. Worse it can actually cause
    issues by setting axis uses from one device where an axis use is 'none'
    (and it's normal) to another where 'none' ends up disabling the axis.

 app/widgets/gimpdeviceinfo.c | 22 +++++++++++++++++-----
 1 file changed, 17 insertions(+), 5 deletions(-)
---
diff --git a/app/widgets/gimpdeviceinfo.c b/app/widgets/gimpdeviceinfo.c
index 3ca8edf74c..206eafddc4 100644
--- a/app/widgets/gimpdeviceinfo.c
+++ b/app/widgets/gimpdeviceinfo.c
@@ -351,7 +351,7 @@ gimp_device_info_set_property (GObject      *object,
                 n_device_values = MIN (n_device_values,
                                        gdk_device_get_n_axes (device));
               }
-            else if (! info->priv->n_axes)
+            else if (! info->priv->n_axes && n_device_values > 0)
               {
                 info->priv->n_axes     = n_device_values;
                 info->priv->axes_uses  = g_new0 (GdkAxisUse, info->priv->n_axes);
@@ -650,7 +650,17 @@ gimp_device_info_updated (GimpDeviceInfo *info)
         {
           GdkAxisUse use;
 
-          use = (i < old_n_axes) ?  old_uses[i] : gdk_device_get_axis_use (info->priv->device, i);
+          /* Virtual devices are special and just reproduce their actual
+           * physical device at a given moment. We should never try to
+           * reuse the data because we risk to pass device configuration
+           * from one physical device to another.
+           */
+          if (gdk_device_get_device_type (info->priv->device) == GDK_DEVICE_TYPE_MASTER ||
+              i >= old_n_axes)
+            use = gdk_device_get_axis_use (info->priv->device, i);
+          else
+            use = old_uses[i];
+
           gimp_device_info_set_axis_use (info, i, use);
 
           if (iter->data != GDK_NONE)
@@ -670,10 +680,12 @@ gimp_device_info_updated (GimpDeviceInfo *info)
         {
           GimpDeviceKey key;
 
-          if (i < old_n_keys)
-            key = old_keys[i];
-          else
+          if (gdk_device_get_device_type (info->priv->device) == GDK_DEVICE_TYPE_MASTER ||
+              i >= old_n_keys)
             gdk_device_get_key (info->priv->device, i, &key.keyval, &key.modifiers);
+          else
+            key = old_keys[i];
+
           gimp_device_info_set_key (info, i, key.keyval, key.modifiers);
         }
       g_clear_pointer (&old_keys, g_free);


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