emacs-diffs
[Top][All Lists]
Advanced

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

master df8efda552: Try to restore valuator values when a device is enabl


From: Po Lu
Subject: master df8efda552: Try to restore valuator values when a device is enabled
Date: Sat, 14 May 2022 02:13:10 -0400 (EDT)

branch: master
commit df8efda552d85c571966219ec72d9e50b4f998cd
Author: Po Lu <luangruo@yahoo.com>
Commit: Po Lu <luangruo@yahoo.com>

    Try to restore valuator values when a device is enabled
    
    * src/xterm.c (struct xi_known_valuator): New struct.
    (xi_populate_device_from_info): Figure out all the values of the
    valuators and set the scroll valuators's current_value to it.
---
 src/xterm.c | 60 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++---
 1 file changed, 57 insertions(+), 3 deletions(-)

diff --git a/src/xterm.c b/src/xterm.c
index 0bec87438e..64c4f91a18 100644
--- a/src/xterm.c
+++ b/src/xterm.c
@@ -4067,27 +4067,48 @@ x_free_xi_devices (struct x_display_info *dpyinfo)
   unblock_input ();
 }
 
+#ifdef HAVE_XINPUT2_1
+struct xi_known_valuator
+{
+  /* The current value of this valuator.  */
+  double current_value;
+
+  /* The number of the valuator.  */
+  int number;
+
+  /* The next valuator whose value we already know.  */
+  struct xi_known_valuator *next;
+};
+#endif
+
 static void
 xi_populate_device_from_info (struct xi_device_t *xi_device,
                              XIDeviceInfo *device)
 {
 #ifdef HAVE_XINPUT2_1
   struct xi_scroll_valuator_t *valuator;
+  struct xi_known_valuator *values, *tem;
   int actual_valuator_count;
   XIScrollClassInfo *info;
+  XIValuatorClassInfo *val_info;
 #endif
+  int c;
 #ifdef HAVE_XINPUT2_2
   XITouchClassInfo *touch_info;
 #endif
-  int c;
+
+#ifdef HAVE_XINPUT2_1
+  USE_SAFE_ALLOCA;
+#endif
 
   xi_device->device_id = device->deviceid;
   xi_device->grab = 0;
 
 #ifdef HAVE_XINPUT2_1
   actual_valuator_count = 0;
-  xi_device->valuators =
-    xmalloc (sizeof *xi_device->valuators * device->num_classes);
+  xi_device->valuators = xmalloc (sizeof *xi_device->valuators
+                                 * device->num_classes);
+  values = NULL;
 #endif
 #ifdef HAVE_XINPUT2_2
   xi_device->touchpoints = NULL;
@@ -4119,7 +4140,21 @@ xi_populate_device_from_info (struct xi_device_t 
*xi_device,
 
            break;
          }
+
+       case XIValuatorClass:
+         {
+           val_info = (XIValuatorClassInfo *) device->classes[c];
+           tem = SAFE_ALLOCA (sizeof *tem);
+
+           tem->next = values;
+           tem->number = val_info->number;
+           tem->current_value = val_info->value;
+
+           values = tem;
+           break;
+         }
 #endif
+
 #ifdef HAVE_XINPUT2_2
        case XITouchClass:
          {
@@ -4134,6 +4169,25 @@ xi_populate_device_from_info (struct xi_device_t 
*xi_device,
 
 #ifdef HAVE_XINPUT2_1
   xi_device->scroll_valuator_count = actual_valuator_count;
+
+  /* Now look through all the valuators whose values are already known
+     and populate our client-side records with their current
+     values.  */
+
+  for (tem = values; values; values = values->next)
+    {
+      for (c = 0; c < xi_device->scroll_valuator_count; ++c)
+       {
+         if (xi_device->valuators[c].number == tem->number)
+           {
+             xi_device->valuators[c].invalid_p = false;
+             xi_device->valuators[c].current_value = tem->current_value;
+             xi_device->valuators[c].pending_enter_reset = true;
+           }
+       }
+    }
+
+  SAFE_FREE ();
 #endif
 }
 



reply via email to

[Prev in Thread] Current Thread [Next in Thread]