Fix for bug #143460 - missed tablet clicks on Windows
2007-01-19 Robert Oegren <gtk@roboros.com> Fix for bug #143460 - missed tablet clicks on Windows * gdk/win32/gdkinput-win32.c (_gdk_input_wintab_init_check): Request absolute reporting of tablet button state, and cut down the packet queue size a bit. (_gdk_input_other_event): Change button state handling accordingly. Also drop the no longer necessary code that detects missed clicks/releases for button 1. The switch to absolute button state should prevent missed events for all buttons. Additionally, swap button 2 and 3. (_gdk_input_grab_pointer): Don't reset button_state, that will only cause a new press event as soon as the next tablet packet arrives. svn path=/trunk/; revision=17188
This commit is contained in:
committed by
Tor Lillqvist
parent
a9867ab072
commit
f7687a8b9c
15
ChangeLog
15
ChangeLog
@ -1,3 +1,18 @@
|
|||||||
|
2007-01-19 Robert Ögren <gtk@roboros.com>
|
||||||
|
|
||||||
|
Fix for bug #143460 - missed tablet clicks on Windows
|
||||||
|
|
||||||
|
* gdk/win32/gdkinput-win32.c (_gdk_input_wintab_init_check):
|
||||||
|
Request absolute reporting of tablet button state, and cut down
|
||||||
|
the packet queue size a bit.
|
||||||
|
(_gdk_input_other_event): Change button state handling
|
||||||
|
accordingly. Also drop the no longer necessary code that detects
|
||||||
|
missed clicks/releases for button 1. The switch to absolute button
|
||||||
|
state should prevent missed events for all buttons. Additionally,
|
||||||
|
swap button 2 and 3.
|
||||||
|
(_gdk_input_grab_pointer): Don't reset button_state, that will only
|
||||||
|
cause a new press event as soon as the next tablet packet arrives.
|
||||||
|
|
||||||
2007-01-19 Tor Lillqvist <tml@novell.com>
|
2007-01-19 Tor Lillqvist <tml@novell.com>
|
||||||
|
|
||||||
Build Wintab support always on Windows. Don't require the Wintab
|
Build Wintab support always on Windows. Don't require the Wintab
|
||||||
|
|||||||
@ -38,7 +38,8 @@
|
|||||||
#include "gdkinput-win32.h"
|
#include "gdkinput-win32.h"
|
||||||
|
|
||||||
#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)
|
||||||
#define PACKETMODE (PK_BUTTONS)
|
/* We want everything in absolute mode */
|
||||||
|
#define PACKETMODE (0)
|
||||||
#include <pktdef.h>
|
#include <pktdef.h>
|
||||||
|
|
||||||
#define DEBUG_WINTAB 1 /* Verbose debug messages enabled */
|
#define DEBUG_WINTAB 1 /* Verbose debug messages enabled */
|
||||||
@ -340,7 +341,7 @@ _gdk_input_wintab_init_check (void)
|
|||||||
* with a smaller queue size.
|
* with a smaller queue size.
|
||||||
*/
|
*/
|
||||||
GDK_NOTE (INPUT, g_print("Attempting to increase queue size\n"));
|
GDK_NOTE (INPUT, g_print("Attempting to increase queue size\n"));
|
||||||
for (i = 128; i >= 1; i >>= 1)
|
for (i = 32; i >= 1; i >>= 1)
|
||||||
{
|
{
|
||||||
if ((*p_WTQueueSizeSet) (*hctx, i))
|
if ((*p_WTQueueSizeSet) (*hctx, i))
|
||||||
{
|
{
|
||||||
@ -720,6 +721,11 @@ _gdk_input_other_event (GdkEvent *event,
|
|||||||
PACKET packet;
|
PACKET packet;
|
||||||
gint k;
|
gint k;
|
||||||
gint x, y;
|
gint x, y;
|
||||||
|
guint translated_buttons, button_diff, button_mask;
|
||||||
|
/* Translation from tablet button state to GDK button state for
|
||||||
|
* buttons 1-3 - swap button 2 and 3.
|
||||||
|
*/
|
||||||
|
static guint button_map[8] = {0, 1, 4, 5, 2, 3, 6, 7};
|
||||||
|
|
||||||
if (event->any.window != wintab_window)
|
if (event->any.window != wintab_window)
|
||||||
{
|
{
|
||||||
@ -786,23 +792,41 @@ _gdk_input_other_event (GdkEvent *event,
|
|||||||
|
|
||||||
g_assert (k == gdkdev->info.num_axes);
|
g_assert (k == gdkdev->info.num_axes);
|
||||||
|
|
||||||
if (HIWORD (packet.pkButtons) != TBN_NONE)
|
translated_buttons = button_map[packet.pkButtons & 0x07] | (packet.pkButtons & ~0x07);
|
||||||
{
|
|
||||||
/* Gdk buttons are numbered 1.. */
|
|
||||||
event->button.button = 1 + LOWORD (packet.pkButtons);
|
|
||||||
|
|
||||||
if (HIWORD (packet.pkButtons) == TBN_UP)
|
if (translated_buttons != gdkdev->button_state)
|
||||||
|
{
|
||||||
|
/* At least one button has changed state so produce a button event
|
||||||
|
* If more than one button has changed state (unlikely),
|
||||||
|
* just care about the first and act on the next the next time
|
||||||
|
* we get a packet
|
||||||
|
*/
|
||||||
|
button_diff = translated_buttons ^ gdkdev->button_state;
|
||||||
|
|
||||||
|
/* Gdk buttons are numbered 1.. */
|
||||||
|
event->button.button = 1;
|
||||||
|
|
||||||
|
for (button_mask = 1; button_mask != 0x80000000;
|
||||||
|
button_mask <<= 1, event->button.button++)
|
||||||
|
{
|
||||||
|
if (button_diff & button_mask)
|
||||||
|
{
|
||||||
|
/* Found a button that has changed state */
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!(translated_buttons & button_mask))
|
||||||
{
|
{
|
||||||
event->any.type = GDK_BUTTON_RELEASE;
|
event->any.type = GDK_BUTTON_RELEASE;
|
||||||
masktest = GDK_BUTTON_RELEASE_MASK;
|
masktest = GDK_BUTTON_RELEASE_MASK;
|
||||||
gdkdev->button_state &= ~(1 << LOWORD (packet.pkButtons));
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
event->any.type = GDK_BUTTON_PRESS;
|
event->any.type = GDK_BUTTON_PRESS;
|
||||||
masktest = GDK_BUTTON_PRESS_MASK;
|
masktest = GDK_BUTTON_PRESS_MASK;
|
||||||
gdkdev->button_state |= 1 << LOWORD (packet.pkButtons);
|
|
||||||
}
|
}
|
||||||
|
gdkdev->button_state ^= button_mask;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -941,44 +965,6 @@ _gdk_input_other_event (GdkEvent *event,
|
|||||||
GDK_NOTE (EVENTS_OR_INPUT,
|
GDK_NOTE (EVENTS_OR_INPUT,
|
||||||
g_print ("WINTAB motion: %g,%g\n",
|
g_print ("WINTAB motion: %g,%g\n",
|
||||||
event->motion.x, event->motion.y));
|
event->motion.x, event->motion.y));
|
||||||
|
|
||||||
/* Check for missing release or press events for the normal
|
|
||||||
* pressure button. At least on my ArtPadII I sometimes miss a
|
|
||||||
* release event?
|
|
||||||
*/
|
|
||||||
if ((gdkdev->pktdata & PK_NORMAL_PRESSURE
|
|
||||||
&& (event->motion.state & GDK_BUTTON1_MASK)
|
|
||||||
&& packet.pkNormalPressure <= MAX (0, (gint) gdkdev->npbtnmarks[0] - 2))
|
|
||||||
|| (gdkdev->pktdata & PK_NORMAL_PRESSURE
|
|
||||||
&& !(event->motion.state & GDK_BUTTON1_MASK)
|
|
||||||
&& packet.pkNormalPressure > gdkdev->npbtnmarks[1] + 2))
|
|
||||||
{
|
|
||||||
GdkEvent *event2 = gdk_event_copy (event);
|
|
||||||
if (event->motion.state & GDK_BUTTON1_MASK)
|
|
||||||
{
|
|
||||||
event2->button.type = GDK_BUTTON_RELEASE;
|
|
||||||
gdkdev->button_state &= ~1;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
event2->button.type = GDK_BUTTON_PRESS;
|
|
||||||
gdkdev->button_state |= 1;
|
|
||||||
}
|
|
||||||
event2->button.state = ((gdkdev->button_state << 8)
|
|
||||||
& (GDK_BUTTON1_MASK | GDK_BUTTON2_MASK
|
|
||||||
| GDK_BUTTON3_MASK | GDK_BUTTON4_MASK
|
|
||||||
| GDK_BUTTON5_MASK))
|
|
||||||
| key_state;
|
|
||||||
event2->button.button = 1;
|
|
||||||
GDK_NOTE (EVENTS_OR_INPUT,
|
|
||||||
g_print ("WINTAB synthesized button %s: %d %g,%gg\n",
|
|
||||||
(event2->button.type == GDK_BUTTON_PRESS ?
|
|
||||||
"press" : "release"),
|
|
||||||
event2->button.button,
|
|
||||||
event2->button.x,
|
|
||||||
event2->button.y));
|
|
||||||
_gdk_event_queue_append (display, event2);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
|
||||||
@ -1102,6 +1088,7 @@ _gdk_input_grab_pointer (GdkWindow *window,
|
|||||||
{
|
{
|
||||||
x_grab_window = NULL;
|
x_grab_window = NULL;
|
||||||
tmp_list = _gdk_input_devices;
|
tmp_list = _gdk_input_devices;
|
||||||
|
#if 0
|
||||||
while (tmp_list)
|
while (tmp_list)
|
||||||
{
|
{
|
||||||
gdkdev = (GdkDevicePrivate *)tmp_list->data;
|
gdkdev = (GdkDevicePrivate *)tmp_list->data;
|
||||||
@ -1117,6 +1104,7 @@ _gdk_input_grab_pointer (GdkWindow *window,
|
|||||||
|
|
||||||
tmp_list = tmp_list->next;
|
tmp_list = tmp_list->next;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
return GDK_GRAB_SUCCESS;
|
return GDK_GRAB_SUCCESS;
|
||||||
|
|||||||
Reference in New Issue
Block a user