diff -up tk8.5.3/generic/tkEvent.c.crash1 tk8.5.3/generic/tkEvent.c --- tk8.5.3/generic/tkEvent.c.crash1 2008-03-26 20:04:09.000000000 +0100 +++ tk8.5.3/generic/tkEvent.c 2008-08-06 09:47:03.000000000 +0200 @@ -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_LASTE 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.typexany.type - VirtualEvent]; + } else { + mask = 0; + } /* * Events selected by StructureNotify require special handling. They look diff -up tk8.5.3/generic/tk.h.crash1 tk8.5.3/generic/tk.h --- tk8.5.3/generic/tk.h.crash1 2008-06-30 05:37:37.000000000 +0200 +++ tk8.5.3/generic/tk.h 2008-08-06 09:47:40.000000000 +0200 @@ -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