[gimp/gimp-2-10] Issue #6394: Wacom Airbrush finger wheel non-functional (on…



commit 2b6ab09cc1ebc3f0b0cb053f2df97eb84cd394f0
Author: Jehan <jehan girinstud io>
Date:   Wed Apr 7 14:27:56 2021 +0200

    Issue #6394: Wacom Airbrush finger wheel non-functional (on…
    
    … Cintiq 16).
    Adding the patch provided by Knuckx. Note that the GTK3 variant of the
    patch is already merged to gtk-3-24 branch and published since GTK
    3.24.28. Nevertheless since the contributor also provided a GTK2
    variant, it would be a bit of a waste to let it go down the drain,
    wouldn't it?
    So let's try and use it in our GIMP 2.10.x packages for Windows.

 ...6394-Wacom-Airbrush-finger-wheel-non-func.patch | 173 +++++++++++++++++++++
 1 file changed, 173 insertions(+)
---
diff --git a/build/windows/patches/gtk-2-24-Issue-GIMP-6394-Wacom-Airbrush-finger-wheel-non-func.patch 
b/build/windows/patches/gtk-2-24-Issue-GIMP-6394-Wacom-Airbrush-finger-wheel-non-func.patch
new file mode 100644
index 0000000000..11cd1a520c
--- /dev/null
+++ b/build/windows/patches/gtk-2-24-Issue-GIMP-6394-Wacom-Airbrush-finger-wheel-non-func.patch
@@ -0,0 +1,173 @@
+From 2c09feb4aec61de9603a30bc7b17fd3a312eb762 Mon Sep 17 00:00:00 2001
+From: Knuckx <gitlab knuckx co uk>
+Date: Wed, 7 Apr 2021 14:22:23 +0200
+Subject: [PATCH] =?UTF-8?q?Issue=20GIMP#6394:=20Wacom=20Airbrush=20finger?=
+ =?UTF-8?q?=20wheel=20non-functional=20(on=E2=80=A6?=
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+… Cintiq 16)
+
+This commit is made from the patches available at:
+https://gitlab.gnome.org/GNOME/gimp/-/issues/6394#note_1041584
+Commit on the gtk-2-24 branch, with some indentation/space cleaning by
+Jehan as only modifications, to be used for GIMP 2.10.x branch.
+---
+ gdk/win32/gdkinput-win32.c | 73 +++++++++++++++++++++++++++++++++++---
+ gdk/win32/gdkinput-win32.h |  4 +--
+ 2 files changed, 71 insertions(+), 6 deletions(-)
+
+diff --git a/gdk/win32/gdkinput-win32.c b/gdk/win32/gdkinput-win32.c
+index 3fe7aaf3de..42f1b44151 100644
+--- a/gdk/win32/gdkinput-win32.c
++++ b/gdk/win32/gdkinput-win32.c
+@@ -39,7 +39,7 @@
+ 
+ #define WINTAB32_DLL "Wintab32.dll"
+ 
+-#define PACKETDATA (PK_CONTEXT | PK_CURSOR | PK_BUTTONS | PK_X | PK_Y  | PK_NORMAL_PRESSURE | 
PK_ORIENTATION)
++#define PACKETDATA (PK_CONTEXT | PK_CURSOR | PK_BUTTONS | PK_X | PK_Y  | PK_NORMAL_PRESSURE | 
PK_ORIENTATION | PK_TANGENT_PRESSURE)
+ /* We want everything in absolute mode */
+ #define PACKETMODE (0)
+ #include <pktdef.h>
+@@ -338,7 +338,7 @@ _gdk_input_wintab_init_check (void)
+   UINT ndevices, ncursors, ncsrtypes, firstcsr, hardware;
+   BOOL active;
+   DWORD physid;
+-  AXIS axis_x, axis_y, axis_npressure, axis_or[3];
++  AXIS axis_x, axis_y, axis_npressure, axis_or[3], axis_tpressure;
+   int i, k, n;
+   int devix, cursorix;
+   wchar_t devname[100], csrname[100];
+@@ -447,6 +447,7 @@ _gdk_input_wintab_init_check (void)
+       (*p_WTInfoA) (WTI_DEVICES + devix, DVC_Y, &axis_y);
+       (*p_WTInfoA) (WTI_DEVICES + devix, DVC_NPRESSURE, &axis_npressure);
+       (*p_WTInfoA) (WTI_DEVICES + devix, DVC_ORIENTATION, axis_or);
++      (*p_WTInfoA) (WTI_DEVICES + devix, DVC_TPRESSURE, &axis_tpressure);
+ 
+       defcontext_done = FALSE;
+       if (HIBYTE (specversion) > 1 || LOBYTE (specversion) >= 1)
+@@ -567,7 +568,23 @@ _gdk_input_wintab_init_check (void)
+           gdkdev->pktdata &= ~PK_ORIENTATION;
+         
+         if (gdkdev->pktdata & PK_ORIENTATION)
+-          gdkdev->info.num_axes += 2; /* x and y tilt */
++            {
++              if (gdkdev->pktdata & PK_TANGENT_PRESSURE) /* If we have a wheel, disable the twist axis */
++                {
++                  axis_or[2].axResolution = 0;
++                }
++              if (axis_or[2].axResolution == 0) /* Check to see if we have a twist axis */
++                {
++                  gdkdev->info.num_axes += 2; /* x and y tilt */
++                }
++              else
++                {
++                  gdkdev->info.num_axes += 3; /* x and y tilt, rotation (twist) */
++                }
++            }
++
++        if (gdkdev->pktdata & PK_TANGENT_PRESSURE)
++            gdkdev->info.num_axes++; /* Wacom finger wheel */
+ 
+         gdkdev->info.axes = g_new (GdkDeviceAxis, gdkdev->info.num_axes);
+         gdkdev->axes = g_new (GdkAxisInfo, gdkdev->info.num_axes);
+@@ -611,6 +628,7 @@ _gdk_input_wintab_init_check (void)
+             
+             gdkdev->orientation_axes[0] = axis_or[0];
+             gdkdev->orientation_axes[1] = axis_or[1];
++            gdkdev->orientation_axes[2] = axis_or[2];
+             for (axis = GDK_AXIS_XTILT; axis <= GDK_AXIS_YTILT; axis++)
+               {
+                 /* Wintab gives us aximuth and altitude, which
+@@ -624,7 +642,41 @@ _gdk_input_wintab_init_check (void)
+                 gdkdev->info.axes[k].max = 1.0;
+                 k++;
+               }
++              if (axis_or[2].axResolution != 0) /* If twist is present */
++                {
++                  /* Wacom's Wintab driver returns the rotation
++                   * of an Art Pen as the orientation twist value.
++                   */
++                  gdkdev->axes[k].resolution = axis_or[2].axResolution / 65535.;
++                  /* These are back to front on purpose. If you put them
++                   * the "correct" way round, rotation will be flipped!
++                   */
++                  gdkdev->axes[k].min_value = axis_or[2].axMax;
++                  gdkdev->axes[k].max_value = axis_or[2].axMin;
++                  /* We're using GDK_AXIS_WHEEL as it's actually
++                   * called Wheel/Rotation to the user.
++                   */
++                  gdkdev->info.axes[k].use = GDK_AXIS_WHEEL;
++                  /* GIMP seems to expect values in the range 0-1 */
++                  gdkdev->info.axes[k].min = 0.0;
++                  gdkdev->info.axes[k].max = 1.0;
++                  k++;
++                }
+           }
++        if (gdkdev->pktdata & PK_TANGENT_PRESSURE)
++          {
++              /* This is the finger wheel on a Wacom Airbrush
++              */
++              gdkdev->axes[k].resolution = axis_tpressure.axResolution / 65535.;
++              gdkdev->axes[k].min_value = axis_tpressure.axMin;
++              gdkdev->axes[k].max_value = axis_tpressure.axMax;
++              gdkdev->info.axes[k].use = GDK_AXIS_WHEEL;
++              /* GIMP seems to expect values in the range 0-1 */
++              gdkdev->info.axes[k].min = 0.0; /*axis_tpressure.axMin;*/
++              gdkdev->info.axes[k].max = 1.0; /*axis_tpressure.axMax;*/
++              k++;
++          }
++
+         gdkdev->info.num_keys = 0;
+         gdkdev->info.keys = NULL;
+         GDK_NOTE (INPUT, g_print ("device: (%d) %s axes: %d\n",
+@@ -664,6 +716,10 @@ decode_tilt (gint   *axis_data,
+   axis_data[0] = cos (az) * cos (el) * 1000;
+   /* Y tilt */
+   axis_data[1] = sin (az) * cos (el) * 1000;
++  
++  /* Twist (Rotation) if present */
++  if (axes[2].axResolution != 0)
++    axis_data[2] = packet->pkOrientation.orTwist;
+ }
+ 
+ static void
+@@ -996,8 +1052,17 @@ _gdk_input_other_event (GdkEvent  *event,
+       {
+         decode_tilt (gdkdev->last_axis_data + k,
+                      gdkdev->orientation_axes, &packet);
+-        k += 2;
++        if (gdkdev->orientation_axes[2].axResolution == 0) /* we could have 3 axes if twist is present */
++          {
++            k += 2;
++          }
++        else
++          {
++            k += 3;
++          }
+       }
++      if (gdkdev->pktdata & PK_TANGENT_PRESSURE)
++      gdkdev->last_axis_data[k++] = packet.pkTangentPressure;
+ 
+       g_assert (k == gdkdev->info.num_axes);
+ 
+diff --git a/gdk/win32/gdkinput-win32.h b/gdk/win32/gdkinput-win32.h
+index 746bcaf30e..53835b27f9 100644
+--- a/gdk/win32/gdkinput-win32.h
++++ b/gdk/win32/gdkinput-win32.h
+@@ -66,8 +66,8 @@ struct _GdkDevicePrivate
+   UINT cursor;
+   /* The cursor's CSR_PKTDATA */
+   WTPKT pktdata;
+-  /* Azimuth and altitude axis */
+-  AXIS orientation_axes[2];
++  /* Azimuth, altitude and twist axis */
++  AXIS orientation_axes[3];
+ };
+ 
+ /* Addition used for extension_events mask */
+-- 
+2.30.2
+


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