summaryrefslogtreecommitdiffstats
path: root/generic/tkBind.c
diff options
context:
space:
mode:
Diffstat (limited to 'generic/tkBind.c')
-rw-r--r--generic/tkBind.c307
1 files changed, 144 insertions, 163 deletions
diff --git a/generic/tkBind.c b/generic/tkBind.c
index a83c6ad..ccffd9b 100644
--- a/generic/tkBind.c
+++ b/generic/tkBind.c
@@ -11,7 +11,7 @@
* See the file "license.terms" for information on usage and redistribution of
* this file, and for a DISCLAIMER OF ALL WARRANTIES.
*
- * RCS: @(#) $Id: tkBind.c,v 1.45.2.2 2009/04/11 04:26:59 das Exp $
+ * RCS: @(#) $Id: tkBind.c,v 1.45.2.3 2010/01/29 12:41:11 nijtmans Exp $
*/
#include "tkInt.h"
@@ -230,8 +230,7 @@ typedef struct PatSeq {
* enough space will be allocated for
* "numPats" patterns. To match, pats[0] must
* match event n, pats[1] must match event
- * n-1, etc.
- */
+ * n-1, etc. */
} PatSeq;
/*
@@ -536,7 +535,7 @@ static Tcl_HashTable eventTable;
#define CIRCREQ 0x400000
#define KEY_BUTTON_MOTION_VIRTUAL (KEY|BUTTON|MOTION|VIRTUAL)
-#define KEY_BUTTON_MOTION_CROSSING (KEY|BUTTON|MOTION|CROSSING|VIRTUAL)
+#define KEY_BUTTON_MOTION_CROSSING (KEY|BUTTON|MOTION|VIRTUAL|CROSSING)
static int flagArray[TK_LASTEVENT] = {
/* Not used */ 0,
@@ -699,7 +698,6 @@ static void DoWarp(ClientData clientData);
*/
#define EvalTclBinding ((TkBindEvalProc *) 1)
-
/*
*---------------------------------------------------------------------------
@@ -741,7 +739,6 @@ TkBindInit(
ModInfo *modPtr;
EventInfo *eiPtr;
int newEntry;
-
#ifdef REDO_KEYSYM_LOOKUP
KeySymInfo *kPtr;
@@ -1087,7 +1084,6 @@ TkCreateBindingProcedure(
}
Tcl_SetHashValue(hPtr, psPtr);
} else {
-
/*
* Free existing callback.
*/
@@ -1326,7 +1322,7 @@ Tk_DeleteAllBindings(
}
for (psPtr = (PatSeq *) Tcl_GetHashValue(hPtr); psPtr != NULL;
psPtr = nextPtr) {
- nextPtr = psPtr->nextObjPtr;
+ nextPtr = psPtr->nextObjPtr;
/*
* Be sure to remove each binding from its hash chain in the pattern
@@ -1421,9 +1417,8 @@ Tk_BindEvent(
Tcl_DString scripts, savedResult;
Detail detail;
char *p, *end;
- PendingBinding *pendingPtr;
- PendingBinding staticPending;
- TkWindow *winPtr = (TkWindow *)tkwin;
+ PendingBinding staticPending, *pendingPtr;
+ TkWindow *winPtr = (TkWindow *) tkwin;
PatternTableKey key;
Tk_ClassModalProc *modalProc;
@@ -1445,12 +1440,12 @@ Tk_BindEvent(
* mega-widget isn't supposed to be visible to people watching the parent.
*/
- if ((eventPtr->type == EnterNotify) || (eventPtr->type == LeaveNotify)) {
+ if ((eventPtr->type == EnterNotify) || (eventPtr->type == LeaveNotify)) {
if (eventPtr->xcrossing.detail == NotifyInferior) {
return;
}
}
- if ((eventPtr->type == FocusIn) || (eventPtr->type == FocusOut)) {
+ if ((eventPtr->type == FocusIn) || (eventPtr->type == FocusOut)) {
if (eventPtr->xfocus.detail == NotifyInferior) {
return;
}
@@ -1543,11 +1538,9 @@ Tk_BindEvent(
memset(&key, 0, sizeof(key));
if (ringPtr->type != VirtualEvent) {
- Tcl_HashTable *veptPtr;
+ Tcl_HashTable *veptPtr = &bindInfoPtr->virtualEventTable.patternTable;
Tcl_HashEntry *hPtr;
- veptPtr = &bindInfoPtr->virtualEventTable.patternTable;
-
key.object = NULL;
key.type = ringPtr->type;
key.detail = detail;
@@ -1580,12 +1573,9 @@ Tk_BindEvent(
Tcl_DStringInit(&scripts);
for ( ; numObjects > 0; numObjects--, objectPtr++) {
- PatSeq *matchPtr, *sourcePtr;
+ PatSeq *matchPtr = NULL, *sourcePtr = NULL;
Tcl_HashEntry *hPtr;
- matchPtr = NULL;
- sourcePtr = NULL;
-
/*
* Match the new event against those recorded in the pattern table,
* saving the longest matching pattern. For events with details
@@ -1770,6 +1760,7 @@ Tk_BindEvent(
}
} else {
int len = (int) strlen(p);
+
code = Tcl_EvalEx(interp, p, len, TCL_EVAL_GLOBAL);
p += len;
}
@@ -1962,22 +1953,17 @@ MatchPatterns(
*/
for ( ; psPtr != NULL; psPtr = psPtr->nextSeqPtr) {
- XEvent *eventPtr;
- Pattern *patPtr;
- Window window;
- Detail *detailPtr;
- int patCount, ringCount, flags, state;
- int modMask;
+ XEvent *eventPtr = &bindPtr->eventRing[bindPtr->curEvent];
+ Detail *detailPtr = &bindPtr->detailRing[bindPtr->curEvent];
+ Pattern *patPtr = psPtr->pats;
+ Window window = eventPtr->xany.window;
+ int patCount, ringCount, flags, state, modMask, i;
/*
* Iterate over all the patterns in a sequence to be sure that they
* all match.
*/
- eventPtr = &bindPtr->eventRing[bindPtr->curEvent];
- detailPtr = &bindPtr->detailRing[bindPtr->curEvent];
- window = eventPtr->xany.window;
- patPtr = psPtr->pats;
patCount = psPtr->numPats;
ringCount = EVENT_BUFFER_SIZE;
while (patCount > 0) {
@@ -2013,8 +1999,6 @@ MatchPatterns(
|| (patPtr->eventType == ButtonRelease)) {
if ((eventPtr->xany.type == KeyPress)
|| (eventPtr->xany.type == KeyRelease)) {
- int i;
-
/*
* Ignore key events if they are modifier keys.
*/
@@ -2025,6 +2009,7 @@ MatchPatterns(
/*
* This key is a modifier key, so ignore it.
*/
+
goto nextEvent;
}
}
@@ -2056,8 +2041,6 @@ MatchPatterns(
*/
if (eventPtr->xany.type == KeyPress) {
- int i;
-
for (i = 0; i < dispPtr->numModKeyCodes; i++) {
if (dispPtr->modKeyCodes[i] == eventPtr->xkey.keycode) {
goto nextEvent;
@@ -2067,7 +2050,7 @@ MatchPatterns(
goto nextSequence;
}
flags = flagArray[eventPtr->type];
- if (flags & (KEY_BUTTON_MOTION_VIRTUAL)) {
+ if (flags & KEY_BUTTON_MOTION_VIRTUAL) {
state = eventPtr->xkey.state;
} else if (flags & CROSSING) {
state = eventPtr->xcrossing.state;
@@ -2095,10 +2078,9 @@ MatchPatterns(
}
}
if (psPtr->flags & PAT_NEARBY) {
- XEvent *firstPtr;
+ XEvent *firstPtr = &bindPtr->eventRing[bindPtr->curEvent];
int timeDiff;
- firstPtr = &bindPtr->eventRing[bindPtr->curEvent];
timeDiff = (Time) firstPtr->xkey.time - eventPtr->xkey.time;
if ((firstPtr->xkey.x_root
< (eventPtr->xkey.x_root - NEARBY_PIXELS))
@@ -2154,16 +2136,14 @@ MatchPatterns(
hPtr = Tcl_FindHashEntry(&bindPtr->patternTable,
(char *) &key);
if (hPtr != NULL) {
-
/*
* This tag is interested in this virtual event and its
* corresponding physical event is a good match with the
* virtual event's definition.
*/
- PatSeq *virtMatchPtr;
+ PatSeq *virtMatchPtr = (PatSeq *) Tcl_GetHashValue(hPtr);
- virtMatchPtr = (PatSeq *) Tcl_GetHashValue(hPtr);
if ((virtMatchPtr->numPats != 1)
|| (virtMatchPtr->nextSeqPtr != NULL)) {
Tcl_Panic("MatchPattern: badly constructed virtual event");
@@ -2190,7 +2170,6 @@ MatchPatterns(
if (bestPtr != NULL) {
Pattern *patPtr2;
- int i;
if (matchPtr->numPats != bestPtr->numPats) {
if (bestPtr->numPats > matchPtr->numPats) {
@@ -2218,6 +2197,7 @@ MatchPatterns(
}
}
}
+
/*
* Tie goes to current best pattern.
*
@@ -2248,7 +2228,6 @@ MatchPatterns(
*sourcePtrPtr = bestSourcePtr;
return bestPtr;
}
-
/*
*--------------------------------------------------------------
@@ -2376,14 +2355,14 @@ ExpandPercents(
case 'h':
if (flags & EXPOSE) {
number = eventPtr->xexpose.height;
- } else if (flags & (CONFIG)) {
+ } else if (flags & CONFIG) {
number = eventPtr->xconfigure.height;
} else if (flags & CREATE) {
number = eventPtr->xcreatewindow.height;
} else if (flags & CONFIGREQ) {
- number = eventPtr->xconfigurerequest.height;
+ number = eventPtr->xconfigurerequest.height;
} else if (flags & RESIZEREQ) {
- number = eventPtr->xresizerequest.height;
+ number = eventPtr->xresizerequest.height;
} else {
goto doString;
}
@@ -2439,24 +2418,22 @@ ExpandPercents(
}
goto doString;
case 's':
- if (flags & (KEY_BUTTON_MOTION_VIRTUAL)) {
+ if (flags & KEY_BUTTON_MOTION_VIRTUAL) {
number = eventPtr->xkey.state;
+ goto doNumber;
} else if (flags & CROSSING) {
number = eventPtr->xcrossing.state;
+ goto doNumber;
} else if (flags & PROP) {
string = TkFindStateString(propNotify,
eventPtr->xproperty.state);
- goto doString;
} else if (flags & VISIBILITY) {
string = TkFindStateString(visNotify,
eventPtr->xvisibility.state);
- goto doString;
- } else {
- goto doString;
}
- goto doNumber;
+ goto doString;
case 't':
- if (flags & (KEY_BUTTON_MOTION_VIRTUAL)) {
+ if (flags & KEY_BUTTON_MOTION_VIRTUAL) {
number = (int) eventPtr->xkey.time;
} else if (flags & CROSSING) {
number = (int) eventPtr->xcrossing.time;
@@ -2477,15 +2454,15 @@ ExpandPercents(
} else if (flags & CREATE) {
number = eventPtr->xcreatewindow.width;
} else if (flags & CONFIGREQ) {
- number = eventPtr->xconfigurerequest.width;
+ number = eventPtr->xconfigurerequest.width;
} else if (flags & RESIZEREQ) {
- number = eventPtr->xresizerequest.width;
+ number = eventPtr->xresizerequest.width;
} else {
goto doString;
}
goto doNumber;
case 'x':
- if (flags & (KEY_BUTTON_MOTION_VIRTUAL)) {
+ if (flags & KEY_BUTTON_MOTION_VIRTUAL) {
number = eventPtr->xkey.x;
} else if (flags & CROSSING) {
number = eventPtr->xcrossing.x;
@@ -2498,13 +2475,13 @@ ExpandPercents(
} else if (flags & CREATE) {
number = eventPtr->xcreatewindow.x;
} else if (flags & CONFIGREQ) {
- number = eventPtr->xconfigurerequest.x;
+ number = eventPtr->xconfigurerequest.x;
} else {
goto doString;
}
goto doNumber;
case 'y':
- if (flags & (KEY_BUTTON_MOTION_VIRTUAL)) {
+ if (flags & KEY_BUTTON_MOTION_VIRTUAL) {
number = eventPtr->xkey.y;
} else if (flags & EXPOSE) {
number = eventPtr->xexpose.y;
@@ -2554,9 +2531,8 @@ ExpandPercents(
goto doNumber;
case 'K':
if (flags & KEY) {
- char *name;
+ char *name = TkKeysymToString(keySym);
- name = TkKeysymToString(keySym);
if (name != NULL) {
string = name;
}
@@ -2663,7 +2639,7 @@ ExpandPercents(
* ChangeScreen --
*
* This function is invoked whenever the current screen changes in an
- * application. It invokes a Tcl function named "tk::ScreenChanged",
+ * application. It invokes a Tcl command named "tk::ScreenChanged",
* passing it the screen name as argument. tk::ScreenChanged does things
* like making the tk::Priv variable point to an array for the current
* display.
@@ -2672,7 +2648,7 @@ ExpandPercents(
* None.
*
* Side effects:
- * Depends on what tk::ScreenChanged does. If an error occurs them
+ * Depends on what tk::ScreenChanged does. If an error occurs then
* bgerror will be invoked.
*
*----------------------------------------------------------------------
@@ -3050,15 +3026,15 @@ DeleteVirtualEvent(
eventPSPtr = FindSequence(interp, &vetPtr->patternTable, NULL,
eventString, 0, 0, &eventMask);
if (eventPSPtr == NULL) {
- const char *string;
+ const char *string = Tcl_GetStringResult(interp);
- string = Tcl_GetStringResult(interp);
return (string[0] != '\0') ? TCL_ERROR : TCL_OK;
}
}
for (iPhys = poPtr->numOwned; --iPhys >= 0; ) {
PatSeq *psPtr = poPtr->patSeqs[iPhys];
+
if ((eventPSPtr == NULL) || (psPtr == eventPSPtr)) {
int iVirt;
VirtualOwners *voPtr;
@@ -3288,7 +3264,7 @@ HandleEventGenerate(
int objc, /* Number of arguments. */
Tcl_Obj *const objv[]) /* Argument objects. */
{
- XEvent event;
+ union {XEvent general; XVirtualEvent virtual;} event;
const char *p;
char *name, *windowName;
int count, flags, synch, i, number, warp;
@@ -3355,43 +3331,43 @@ HandleEventGenerate(
}
memset((void *) &event, 0, sizeof(event));
- event.xany.type = pat.eventType;
- event.xany.serial = NextRequest(Tk_Display(tkwin));
- event.xany.send_event = False;
+ event.general.xany.type = pat.eventType;
+ event.general.xany.serial = NextRequest(Tk_Display(tkwin));
+ event.general.xany.send_event = False;
if (windowName[0]) {
- event.xany.window = Tk_WindowId(tkwin);
+ event.general.xany.window = Tk_WindowId(tkwin);
} else {
- event.xany.window =
+ event.general.xany.window =
RootWindow(Tk_Display(tkwin), Tk_ScreenNumber(tkwin));
}
- event.xany.display = Tk_Display(tkwin);
+ event.general.xany.display = Tk_Display(tkwin);
- flags = flagArray[event.xany.type];
+ flags = flagArray[event.general.xany.type];
if (flags & DESTROY) {
/*
- * Event DesotryNotify should be generated by destroying the window.
+ * Event DestroyNotify should be generated by destroying the window.
*/
Tk_DestroyWindow(tkwin);
return TCL_OK;
}
- if (flags & (KEY_BUTTON_MOTION_VIRTUAL)) {
- event.xkey.state = pat.needMods;
- if ((flags & KEY) && (event.xany.type != MouseWheelEvent)) {
- TkpSetKeycodeAndState(tkwin, pat.detail.keySym, &event);
+ if (flags & KEY_BUTTON_MOTION_VIRTUAL) {
+ event.general.xkey.state = pat.needMods;
+ if ((flags & KEY) && (event.general.xany.type != MouseWheelEvent)) {
+ TkpSetKeycodeAndState(tkwin, pat.detail.keySym, &event.general);
} else if (flags & BUTTON) {
- event.xbutton.button = pat.detail.button;
+ event.general.xbutton.button = pat.detail.button;
} else if (flags & VIRTUAL) {
- ((XVirtualEvent *) &event)->name = pat.detail.name;
+ event.virtual.name = pat.detail.name;
}
}
if (flags & (CREATE|UNMAP|MAP|REPARENT|CONFIG|GRAVITY|CIRC)) {
- event.xcreatewindow.window = event.xany.window;
+ event.general.xcreatewindow.window = event.general.xany.window;
}
- if (flags & (KEY_BUTTON_MOTION_VIRTUAL|CROSSING)) {
- event.xkey.x_root = -1;
- event.xkey.y_root = -1;
+ if (flags & KEY_BUTTON_MOTION_CROSSING) {
+ event.general.xkey.x_root = -1;
+ event.general.xkey.y_root = -1;
}
/*
@@ -3431,7 +3407,7 @@ HandleEventGenerate(
if (Tcl_GetBooleanFromObj(interp, valuePtr, &warp) != TCL_OK) {
return TCL_ERROR;
}
- if (!(flags & (KEY_BUTTON_MOTION_VIRTUAL))) {
+ if (!(flags & KEY_BUTTON_MOTION_VIRTUAL)) {
goto badopt;
}
break;
@@ -3451,7 +3427,7 @@ HandleEventGenerate(
return TCL_ERROR;
}
if (flags & CONFIG) {
- event.xconfigure.above = Tk_WindowId(tkwin2);
+ event.general.xconfigure.above = Tk_WindowId(tkwin2);
} else {
goto badopt;
}
@@ -3461,7 +3437,7 @@ HandleEventGenerate(
return TCL_ERROR;
}
if (flags & (CREATE|CONFIG)) {
- event.xcreatewindow.border_width = number;
+ event.general.xcreatewindow.border_width = number;
} else {
goto badopt;
}
@@ -3471,7 +3447,7 @@ HandleEventGenerate(
return TCL_ERROR;
}
if (flags & BUTTON) {
- event.xbutton.button = number;
+ event.general.xbutton.button = number;
} else {
goto badopt;
}
@@ -3481,7 +3457,7 @@ HandleEventGenerate(
return TCL_ERROR;
}
if (flags & EXPOSE) {
- event.xexpose.count = number;
+ event.general.xexpose.count = number;
} else {
goto badopt;
}
@@ -3503,8 +3479,8 @@ HandleEventGenerate(
if (Tcl_GetIntFromObj(interp, valuePtr, &number) != TCL_OK) {
return TCL_ERROR;
}
- if ((flags & KEY) && (event.xkey.type == MouseWheelEvent)) {
- event.xkey.keycode = number;
+ if ((flags & KEY) && (event.general.xkey.type == MouseWheelEvent)) {
+ event.general.xkey.keycode = number;
} else {
goto badopt;
}
@@ -3516,9 +3492,9 @@ HandleEventGenerate(
return TCL_ERROR;
}
if (flags & FOCUS) {
- event.xfocus.detail = number;
+ event.general.xfocus.detail = number;
} else if (flags & CROSSING) {
- event.xcrossing.detail = number;
+ event.general.xcrossing.detail = number;
} else {
goto badopt;
}
@@ -3528,7 +3504,7 @@ HandleEventGenerate(
return TCL_ERROR;
}
if (flags & CROSSING) {
- event.xcrossing.focus = number;
+ event.general.xcrossing.focus = number;
} else {
goto badopt;
}
@@ -3539,9 +3515,9 @@ HandleEventGenerate(
return TCL_ERROR;
}
if (flags & EXPOSE) {
- event.xexpose.height = number;
+ event.general.xexpose.height = number;
} else if (flags & CONFIG) {
- event.xconfigure.height = number;
+ event.general.xconfigure.height = number;
} else {
goto badopt;
}
@@ -3550,8 +3526,8 @@ HandleEventGenerate(
if (Tcl_GetIntFromObj(interp, valuePtr, &number) != TCL_OK) {
return TCL_ERROR;
}
- if ((flags & KEY) && (event.xkey.type != MouseWheelEvent)) {
- event.xkey.keycode = number;
+ if ((flags & KEY) && (event.general.xkey.type != MouseWheelEvent)) {
+ event.general.xkey.keycode = number;
} else {
goto badopt;
}
@@ -3568,13 +3544,14 @@ HandleEventGenerate(
return TCL_ERROR;
}
- TkpSetKeycodeAndState(tkwin, keysym, &event);
- if (event.xkey.keycode == 0) {
+ TkpSetKeycodeAndState(tkwin, keysym, &event.general);
+ if (event.general.xkey.keycode == 0) {
Tcl_AppendResult(interp, "no keycode for keysym \"", value,
"\"", NULL);
return TCL_ERROR;
}
- if (!(flags & KEY) || (event.xkey.type == MouseWheelEvent)) {
+ if (!(flags & KEY)
+ || (event.general.xkey.type == MouseWheelEvent)) {
goto badopt;
}
break;
@@ -3585,9 +3562,9 @@ HandleEventGenerate(
return TCL_ERROR;
}
if (flags & CROSSING) {
- event.xcrossing.mode = number;
+ event.general.xcrossing.mode = number;
} else if (flags & FOCUS) {
- event.xfocus.mode = number;
+ event.general.xfocus.mode = number;
} else {
goto badopt;
}
@@ -3597,13 +3574,13 @@ HandleEventGenerate(
return TCL_ERROR;
}
if (flags & CREATE) {
- event.xcreatewindow.override_redirect = number;
+ event.general.xcreatewindow.override_redirect = number;
} else if (flags & MAP) {
- event.xmap.override_redirect = number;
+ event.general.xmap.override_redirect = number;
} else if (flags & REPARENT) {
- event.xreparent.override_redirect = number;
+ event.general.xreparent.override_redirect = number;
} else if (flags & CONFIG) {
- event.xconfigure.override_redirect = number;
+ event.general.xconfigure.override_redirect = number;
} else {
goto badopt;
}
@@ -3614,7 +3591,7 @@ HandleEventGenerate(
return TCL_ERROR;
}
if (flags & CIRC) {
- event.xcirculate.place = number;
+ event.general.xcirculate.place = number;
} else {
goto badopt;
}
@@ -3623,8 +3600,8 @@ HandleEventGenerate(
if (NameToWindow(interp, tkwin, valuePtr, &tkwin2) != TCL_OK) {
return TCL_ERROR;
}
- if (flags & (KEY_BUTTON_MOTION_VIRTUAL|CROSSING)) {
- event.xkey.root = Tk_WindowId(tkwin2);
+ if (flags & KEY_BUTTON_MOTION_CROSSING) {
+ event.general.xkey.root = Tk_WindowId(tkwin2);
} else {
goto badopt;
}
@@ -3633,8 +3610,8 @@ HandleEventGenerate(
if (Tk_GetPixelsFromObj(interp,tkwin,valuePtr,&number) != TCL_OK) {
return TCL_ERROR;
}
- if (flags & (KEY_BUTTON_MOTION_VIRTUAL|CROSSING)) {
- event.xkey.x_root = number;
+ if (flags & KEY_BUTTON_MOTION_CROSSING) {
+ event.general.xkey.x_root = number;
} else {
goto badopt;
}
@@ -3643,8 +3620,8 @@ HandleEventGenerate(
if (Tk_GetPixelsFromObj(interp,tkwin,valuePtr,&number) != TCL_OK) {
return TCL_ERROR;
}
- if (flags & (KEY_BUTTON_MOTION_VIRTUAL|CROSSING)) {
- event.xkey.y_root = number;
+ if (flags & KEY_BUTTON_MOTION_CROSSING) {
+ event.general.xkey.y_root = number;
} else {
goto badopt;
}
@@ -3667,24 +3644,24 @@ HandleEventGenerate(
return TCL_ERROR;
}
}
- event.xany.send_event = number;
+ event.general.xany.send_event = number;
break;
}
case EVENT_SERIAL:
if (Tcl_GetIntFromObj(interp, valuePtr, &number) != TCL_OK) {
return TCL_ERROR;
}
- event.xany.serial = number;
+ event.general.xany.serial = number;
break;
case EVENT_STATE:
- if (flags & (KEY_BUTTON_MOTION_VIRTUAL|CROSSING)) {
+ if (flags & KEY_BUTTON_MOTION_CROSSING) {
if (Tcl_GetIntFromObj(interp, valuePtr, &number) != TCL_OK) {
return TCL_ERROR;
}
- if (flags & (KEY_BUTTON_MOTION_VIRTUAL)) {
- event.xkey.state = number;
+ if (flags & KEY_BUTTON_MOTION_VIRTUAL) {
+ event.general.xkey.state = number;
} else {
- event.xcrossing.state = number;
+ event.general.xcrossing.state = number;
}
} else if (flags & VISIBILITY) {
number = TkFindStateNumObj(interp, optionPtr, visNotify,
@@ -3692,7 +3669,7 @@ HandleEventGenerate(
if (number < 0) {
return TCL_ERROR;
}
- event.xvisibility.state = number;
+ event.general.xvisibility.state = number;
} else {
goto badopt;
}
@@ -3701,8 +3678,8 @@ HandleEventGenerate(
if (NameToWindow(interp, tkwin, valuePtr, &tkwin2) != TCL_OK) {
return TCL_ERROR;
}
- if (flags & (KEY_BUTTON_MOTION_VIRTUAL|CROSSING)) {
- event.xkey.subwindow = Tk_WindowId(tkwin2);
+ if (flags & KEY_BUTTON_MOTION_CROSSING) {
+ event.general.xkey.subwindow = Tk_WindowId(tkwin2);
} else {
goto badopt;
}
@@ -3711,10 +3688,10 @@ HandleEventGenerate(
if (Tcl_GetIntFromObj(interp, valuePtr, &number) != TCL_OK) {
return TCL_ERROR;
}
- if (flags & (KEY_BUTTON_MOTION_VIRTUAL|CROSSING)) {
- event.xkey.time = (Time) number;
+ if (flags & KEY_BUTTON_MOTION_CROSSING) {
+ event.general.xkey.time = (Time) number;
} else if (flags & PROP) {
- event.xproperty.time = (Time) number;
+ event.general.xproperty.time = (Time) number;
} else {
goto badopt;
}
@@ -3724,9 +3701,9 @@ HandleEventGenerate(
return TCL_ERROR;
}
if (flags & EXPOSE) {
- event.xexpose.width = number;
+ event.general.xexpose.width = number;
} else if (flags & (CREATE|CONFIG)) {
- event.xcreatewindow.width = number;
+ event.general.xcreatewindow.width = number;
} else {
goto badopt;
}
@@ -3736,7 +3713,7 @@ HandleEventGenerate(
return TCL_ERROR;
}
if (flags & (CREATE|UNMAP|MAP|REPARENT|CONFIG|GRAVITY|CIRC)) {
- event.xcreatewindow.window = Tk_WindowId(tkwin2);
+ event.general.xcreatewindow.window = Tk_WindowId(tkwin2);
} else {
goto badopt;
}
@@ -3746,24 +3723,24 @@ HandleEventGenerate(
return TCL_ERROR;
}
if (flags & (KEY_BUTTON_MOTION_VIRTUAL|CROSSING)) {
- event.xkey.x = number;
+ event.general.xkey.x = number;
/*
* Only modify rootx as well if it hasn't been changed.
*/
- if (event.xkey.x_root == -1) {
+ if (event.general.xkey.x_root == -1) {
int rootX, rootY;
Tk_GetRootCoords(tkwin, &rootX, &rootY);
- event.xkey.x_root = rootX + number;
+ event.general.xkey.x_root = rootX + number;
}
} else if (flags & EXPOSE) {
- event.xexpose.x = number;
+ event.general.xexpose.x = number;
} else if (flags & (CREATE|CONFIG|GRAVITY)) {
- event.xcreatewindow.x = number;
+ event.general.xcreatewindow.x = number;
} else if (flags & REPARENT) {
- event.xreparent.x = number;
+ event.general.xreparent.x = number;
} else {
goto badopt;
}
@@ -3772,25 +3749,25 @@ HandleEventGenerate(
if (Tk_GetPixelsFromObj(interp,tkwin,valuePtr,&number) != TCL_OK) {
return TCL_ERROR;
}
- if (flags & (KEY_BUTTON_MOTION_VIRTUAL|CROSSING)) {
- event.xkey.y = number;
+ if (flags & KEY_BUTTON_MOTION_CROSSING) {
+ event.general.xkey.y = number;
/*
* Only modify rooty as well if it hasn't been changed.
*/
- if (event.xkey.y_root == -1) {
+ if (event.general.xkey.y_root == -1) {
int rootX, rootY;
Tk_GetRootCoords(tkwin, &rootX, &rootY);
- event.xkey.y_root = rootY + number;
+ event.general.xkey.y_root = rootY + number;
}
} else if (flags & EXPOSE) {
- event.xexpose.y = number;
+ event.general.xexpose.y = number;
} else if (flags & (CREATE|CONFIG|GRAVITY)) {
- event.xcreatewindow.y = number;
+ event.general.xcreatewindow.y = number;
} else if (flags & REPARENT) {
- event.xreparent.y = number;
+ event.general.xreparent.y = number;
} else {
goto badopt;
}
@@ -3823,9 +3800,9 @@ HandleEventGenerate(
*/
if (synch != 0) {
- Tk_HandleEvent(&event);
+ Tk_HandleEvent(&event.general);
} else {
- Tk_QueueWindowEvent(&event, pos);
+ Tk_QueueWindowEvent(&event.general, pos);
}
/*
@@ -3833,15 +3810,15 @@ HandleEventGenerate(
*/
if ((warp != 0) && Tk_IsMapped(tkwin)) {
- TkDisplay *dispPtr;
- dispPtr = TkGetDisplay(event.xmotion.display);
+ TkDisplay *dispPtr = TkGetDisplay(event.general.xmotion.display);
+
if (!(dispPtr->flags & TK_DISPLAY_IN_WARP)) {
Tcl_DoWhenIdle(DoWarp, (ClientData) dispPtr);
dispPtr->flags |= TK_DISPLAY_IN_WARP;
}
- dispPtr->warpWindow = event.xany.window;
- dispPtr->warpX = event.xkey.x;
- dispPtr->warpY = event.xkey.y;
+ dispPtr->warpWindow = event.general.xany.window;
+ dispPtr->warpX = event.general.xkey.x;
+ dispPtr->warpY = event.general.xkey.y;
}
Tcl_ResetResult(interp);
return TCL_OK;
@@ -4231,6 +4208,7 @@ ParseEventDescription(
*/
char *field = p + 1;
+
p = strchr(field, '>');
if (p == field) {
Tcl_SetResult(interp, "virtual event \"<<>>\" is badly formed",
@@ -4256,6 +4234,7 @@ ParseEventDescription(
while (1) {
ModInfo *modPtr;
+
p = GetField(p, field, FIELD_SIZE);
if (*p == '>') {
/*
@@ -4272,10 +4251,13 @@ ParseEventDescription(
}
modPtr = (ModInfo *) Tcl_GetHashValue(hPtr);
patPtr->needMods |= modPtr->mask;
- if (modPtr->flags & (MULT_CLICKS)) {
+ if (modPtr->flags & MULT_CLICKS) {
int i = modPtr->flags & MULT_CLICKS;
+
count = 2;
- while (i >>= 1) count++;
+ while (i >>= 1) {
+ count++;
+ }
}
while ((*p == '-') || isspace(UCHAR(*p))) {
p++;
@@ -4285,8 +4267,7 @@ ParseEventDescription(
eventFlags = 0;
hPtr = Tcl_FindHashEntry(&eventTable, field);
if (hPtr != NULL) {
- EventInfo *eiPtr;
- eiPtr = (EventInfo *) Tcl_GetHashValue(hPtr);
+ EventInfo *eiPtr = (EventInfo *) Tcl_GetHashValue(hPtr);
patPtr->eventType = eiPtr->type;
eventFlags = flagArray[eiPtr->type];
@@ -4439,7 +4420,6 @@ GetPatternString(
for (patsLeft = psPtr->numPats, patPtr = &psPtr->pats[psPtr->numPats - 1];
patsLeft > 0; patsLeft--, patPtr--) {
-
/*
* Check for simple case of an ASCII character.
*/
@@ -4451,7 +4431,6 @@ GetPatternString(
&& isprint(UCHAR(patPtr->detail.keySym))
&& (patPtr->detail.keySym != '<')
&& (patPtr->detail.keySym != ' ')) {
-
c = (char) patPtr->detail.keySym;
Tcl_DStringAppend(dsPtr, &c, 1);
continue;
@@ -4475,6 +4454,7 @@ GetPatternString(
*/
Tcl_DStringAppend(dsPtr, "<", 1);
+
if ((psPtr->flags & PAT_NEARBY) && (patsLeft > 1)
&& (memcmp((char *) patPtr, (char *) (patPtr-1),
sizeof(Pattern)) == 0)) {
@@ -4496,6 +4476,7 @@ GetPatternString(
Tcl_DStringAppend(dsPtr, "Double-", 7);
}
}
+
for (needMods = patPtr->needMods, modPtr = modArray;
needMods != 0; modPtr++) {
if (modPtr->mask & needMods) {
@@ -4504,6 +4485,7 @@ GetPatternString(
Tcl_DStringAppend(dsPtr, "-", 1);
}
}
+
for (eiPtr = eventArray; eiPtr->name != NULL; eiPtr++) {
if (eiPtr->type == patPtr->eventType) {
Tcl_DStringAppend(dsPtr, eiPtr->name, -1);
@@ -4517,9 +4499,7 @@ GetPatternString(
if (patPtr->detail.clientData != 0) {
if ((patPtr->eventType == KeyPress)
|| (patPtr->eventType == KeyRelease)) {
- char *string;
-
- string = TkKeysymToString(patPtr->detail.keySym);
+ char *string = TkKeysymToString(patPtr->detail.keySym);
if (string != NULL) {
Tcl_DStringAppend(dsPtr, string, -1);
}
@@ -4528,6 +4508,7 @@ GetPatternString(
Tcl_DStringAppend(dsPtr, buffer, -1);
}
}
+
Tcl_DStringAppend(dsPtr, ">", 1);
}
}
@@ -4579,15 +4560,14 @@ TkStringToKeysym(
char *name) /* Name of a keysym. */
{
#ifdef REDO_KEYSYM_LOOKUP
- Tcl_HashEntry *hPtr;
- KeySym keysym;
+ Tcl_HashEntry *hPtr = Tcl_FindHashEntry(&keySymTable, name);
- hPtr = Tcl_FindHashEntry(&keySymTable, name);
if (hPtr != NULL) {
return (KeySym) Tcl_GetHashValue(hPtr);
}
if (strlen(name) == 1) {
- keysym = (KeySym) (unsigned char) name[0];
+ KeySym keysym = (KeySym) (unsigned char) name[0];
+
if (TkKeysymToString(keysym) != NULL) {
return keysym;
}
@@ -4618,13 +4598,13 @@ TkKeysymToString(
KeySym keysym)
{
#ifdef REDO_KEYSYM_LOOKUP
- Tcl_HashEntry *hPtr;
+ Tcl_HashEntry *hPtr = Tcl_FindHashEntry(&nameTable, (char *)keysym);
- hPtr = Tcl_FindHashEntry(&nameTable, (char *)keysym);
if (hPtr != NULL) {
return (char *) Tcl_GetHashValue(hPtr);
}
#endif /* REDO_KEYSYM_LOOKUP */
+
return XKeysymToString(keysym);
}
@@ -4642,7 +4622,7 @@ TkKeysymToString(
* completion code and a string in the interp's result.
*
* Side effects:
- * None.
+ * Any; depends on script.
*
*----------------------------------------------------------------------
*/
@@ -4688,6 +4668,7 @@ TkpGetBindingXEvent(
{
TkWindow *winPtr = (TkWindow *) Tk_MainWindow(interp);
BindingTable *bindPtr = (BindingTable *) winPtr->mainPtr->bindingTable;
+
return &(bindPtr->eventRing[bindPtr->curEvent]);
}