summaryrefslogtreecommitdiffstats
path: root/generic
diff options
context:
space:
mode:
authorjenglish <jenglish@flightlab.com>2008-08-05 20:31:07 (GMT)
committerjenglish <jenglish@flightlab.com>2008-08-05 20:31:07 (GMT)
commitf599302965961fcb2ea0ab5c179fa3bb3a2d860f (patch)
tree025f32b1c924bcc225cc2dae6c7aef2b0339eab5 /generic
parente789fde4f39df79644897b01974f22db4adbeeb7 (diff)
downloadtk-f599302965961fcb2ea0ab5c179fa3bb3a2d860f.zip
tk-f599302965961fcb2ea0ab5c179fa3bb3a2d860f.tar.gz
tk-f599302965961fcb2ea0ab5c179fa3bb3a2d860f.tar.bz2
Fix for [Bug 2010422] "no event type or button # or keysym
while executing "bind Listbox <MouseWheel> [...]". This allows Tk to compile and run against newer versions of libX11 where the protocol constant LastEvent has changed.
Diffstat (limited to 'generic')
-rw-r--r--generic/tk.h14
-rw-r--r--generic/tkEvent.c29
2 files changed, 30 insertions, 13 deletions
diff --git a/generic/tk.h b/generic/tk.h
index f9d734e..00424c4 100644
--- a/generic/tk.h
+++ b/generic/tk.h
@@ -12,7 +12,7 @@
* See the file "license.terms" for information on usage and redistribution of
* this file, and for a DISCLAIMER OF ALL WARRANTIES.
*
- * RCS: @(#) $Id: tk.h,v 1.113 2008/07/31 04:22:09 dgp Exp $
+ * RCS: @(#) $Id: tk.h,v 1.114 2008/08/05 20:31:08 jenglish Exp $
*/
#ifndef _TK
@@ -627,17 +627,15 @@ typedef struct Tk_GeomMgr {
*---------------------------------------------------------------------------
*/
-#define VirtualEvent (LASTEvent)
-#define ActivateNotify (LASTEvent + 1)
-#define DeactivateNotify (LASTEvent + 2)
-#define MouseWheelEvent (LASTEvent + 3)
-#define TK_LASTEVENT (LASTEvent + 4)
+#define VirtualEvent (MappingNotify + 1)
+#define ActivateNotify (MappingNotify + 2)
+#define DeactivateNotify (MappingNotify + 3)
+#define MouseWheelEvent (MappingNotify + 4)
+#define TK_LASTEVENT (MappingNotify + 5)
#define MouseWheelMask (1L << 28)
-
#define ActivateMask (1L << 29)
#define VirtualEventMask (1L << 30)
-#define TK_LASTEVENT (LASTEvent + 4)
/*
* A virtual event shares most of its fields with the XKeyEvent and
diff --git a/generic/tkEvent.c b/generic/tkEvent.c
index ffc8484..7446ef8 100644
--- a/generic/tkEvent.c
+++ b/generic/tkEvent.c
@@ -12,7 +12,7 @@
* See the file "license.terms" for information on usage and redistribution of
* this file, and for a DISCLAIMER OF ALL WARRANTIES.
*
- * RCS: @(#) $Id: tkEvent.c,v 1.35 2008/03/26 19:04:09 jenglish Exp $
+ * RCS: @(#) $Id: tkEvent.c,v 1.36 2008/08/05 20:31:08 jenglish Exp $
*/
#include "tkInt.h"
@@ -75,7 +75,7 @@ typedef struct TkWindowEvent {
* Array of event masks corresponding to each X event:
*/
-static unsigned long eventMasks[TK_LASTEVENT] = {
+static unsigned long realEventMasks[MappingNotify+1] = {
0,
0,
KeyPressMask, /* KeyPress */
@@ -113,7 +113,10 @@ static unsigned long eventMasks[TK_LASTEVENT] = {
0, /* SelectionNotify */
ColormapChangeMask, /* ColormapNotify */
0, /* ClientMessage */
- 0, /* Mapping Notify */
+ 0 /* Mapping Notify */
+};
+
+static unsigned long virtualEventMasks[TK_LASTEVENT-VirtualEvent] = {
VirtualEventMask, /* VirtualEvents */
ActivateMask, /* ActivateNotify */
ActivateMask, /* DeactivateNotify */
@@ -489,7 +492,7 @@ GetTkWindowFromXEvent(
*
* GetEventMaskFromXEvent --
*
- * The event type is looked up in our eventMasks table, and may be
+ * The event type is looked up in our eventMasks tables, and may be
* changed to a different mask depending on the state of the event and
* window members.
*
@@ -506,7 +509,23 @@ static unsigned long
GetEventMaskFromXEvent(
XEvent *eventPtr)
{
- unsigned long mask = eventMasks[eventPtr->xany.type];
+ unsigned long mask;
+
+ /*
+ * Get the event mask from the correct table. Note that there are two
+ * tables here because that means we no longer need this code to rely on
+ * the exact value of VirtualEvent, which has caused us problems in the
+ * past when X11 changed the value of LASTEvent. [Bug ???]
+ */
+
+ if (eventPtr->xany.type <= MappingNotify) {
+ mask = realEventMasks[eventPtr->xany.type];
+ } else if (eventPtr->xany.type >= VirtualEvent
+ && eventPtr->xany.type<TK_LASTEVENT) {
+ mask = virtualEventMasks[eventPtr->xany.type - VirtualEvent];
+ } else {
+ mask = 0;
+ }
/*
* Events selected by StructureNotify require special handling. They look