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.
This commit is contained in:
@ -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
|
||||||
|
|
Reference in New Issue
Block a user