diff options
author | Thomas Jaeger <ThJaeger@gmail.com> | 2009-09-29 01:51:44 -0400 |
---|---|---|
committer | Alexander Larsson <alexl@redhat.com> | 2009-09-29 14:44:18 +0200 |
commit | 2635fb75c688b9c44a7db4840afaadba4c6d31b3 (patch) | |
tree | e51e8d174cdf88139565a1782d57706cc7f93b19 /gdk/x11 | |
parent | abf7742beb53f8a2c8012a353299abc68b5dbaaf (diff) | |
download | gtk+-2635fb75c688b9c44a7db4840afaadba4c6d31b3.tar.gz |
XInput allows up to 255 buttons
Signed-off-by: Thomas Jaeger <ThJaeger@gmail.com>
https://bugzilla.gnome.org/show_bug.cgi?id=588649
Diffstat (limited to 'gdk/x11')
-rw-r--r-- | gdk/x11/gdkinput-x11.c | 16 | ||||
-rw-r--r-- | gdk/x11/gdkinput-xfree.c | 5 | ||||
-rw-r--r-- | gdk/x11/gdkinputprivate.h | 3 |
3 files changed, 18 insertions, 6 deletions
diff --git a/gdk/x11/gdkinput-x11.c b/gdk/x11/gdkinput-x11.c index a423c917a0..73ce4ccfc1 100644 --- a/gdk/x11/gdkinput-x11.c +++ b/gdk/x11/gdkinput-x11.c @@ -135,7 +135,8 @@ gdk_input_device_new (GdkDisplay *display, gdkdev->info.has_cursor = 0; gdkdev->needs_update = FALSE; gdkdev->claimed = FALSE; - gdkdev->button_state = 0; + memset(gdkdev->button_state, 0, sizeof (gdkdev->button_state)); + gdkdev->button_count = 0; class = device->inputclassinfo; for (i=0;i<device->num_classes;i++) @@ -556,15 +557,24 @@ _gdk_input_common_other_event (GdkEvent *event, { XDeviceButtonEvent *xdbe = (XDeviceButtonEvent *)(xevent); + g_return_val_if_fail (xdbe->button < 256, FALSE); if (xdbe->type == gdkdev->buttonpress_type) { event->button.type = GDK_BUTTON_PRESS; - gdkdev->button_state |= 1 << xdbe->button; + if (!(gdkdev->button_state[xdbe->button/8] & 1 << (xdbe->button%8))) + { + gdkdev->button_state[xdbe->button/8] |= 1 << (xdbe->button%8); + gdkdev->button_count++; + } } else { event->button.type = GDK_BUTTON_RELEASE; - gdkdev->button_state &= ~(1 << xdbe->button); + if (gdkdev->button_state[xdbe->button/8] & 1 << (xdbe->button%8)) + { + gdkdev->button_state[xdbe->button/8] &= ~(1 << (xdbe->button%8)); + gdkdev->button_count--; + } } event->button.device = &gdkdev->info; event->button.window = window; diff --git a/gdk/x11/gdkinput-xfree.c b/gdk/x11/gdkinput-xfree.c index e52ef2afe9..695175f61c 100644 --- a/gdk/x11/gdkinput-xfree.c +++ b/gdk/x11/gdkinput-xfree.c @@ -369,10 +369,11 @@ _gdk_input_grab_pointer (GdkWindow *window, { gdkdev = (GdkDevicePrivate *)tmp_list->data; if (!GDK_IS_CORE (gdkdev) && gdkdev->xdevice && - ((gdkdev->button_state != 0) || need_ungrab)) + ((gdkdev->button_count != 0) || need_ungrab)) { XUngrabDevice (display_impl->xdisplay, gdkdev->xdevice, time); - gdkdev->button_state = 0; + memset(gdkdev->button_state, 0, sizeof (gdkdev->button_state)); + gdkdev->button_count = 0; } tmp_list = tmp_list->next; diff --git a/gdk/x11/gdkinputprivate.h b/gdk/x11/gdkinputprivate.h index 217e28c002..aeb440e9e0 100644 --- a/gdk/x11/gdkinputprivate.h +++ b/gdk/x11/gdkinputprivate.h @@ -89,7 +89,8 @@ struct _GdkDevicePrivate gint needs_update; /* Mask of buttons (used for button grabs) */ - gint button_state; + char button_state[32]; + gint button_count; /* true if we've claimed the device as active. (used only for XINPUT_GXI) */ gint claimed; |