Import Tk 8.6.10

This commit is contained in:
Steve Dower
2020-09-24 22:55:34 +01:00
parent 5ba5cbc9af
commit 42c69189d9
365 changed files with 24323 additions and 12832 deletions

View File

@@ -139,7 +139,7 @@ typedef struct ExitHandler {
* storage for the current thread.
*/
typedef struct ThreadSpecificData {
typedef struct {
int handlersActive; /* The following variable has a non-zero value
* when a handler is active. */
InProgress *pendingPtr; /* Topmost search in progress, or NULL if
@@ -193,7 +193,6 @@ TCL_DECLARE_MUTEX(exitMutex)
static void CleanUpTkEvent(XEvent *eventPtr);
static void DelayedMotionProc(ClientData clientData);
static int GetButtonMask(unsigned int Button);
static unsigned long GetEventMaskFromXEvent(XEvent *eventPtr);
static TkWindow * GetTkWindowFromXEvent(XEvent *eventPtr);
static void InvokeClientMessageHandlers(ThreadSpecificData *tsdPtr,
@@ -208,7 +207,6 @@ static Window ParentXId(Display *display, Window w);
static int RefreshKeyboardMappingIfNeeded(XEvent *eventPtr);
static int TkXErrorHandler(ClientData clientData,
XErrorEvent *errEventPtr);
static void UpdateButtonEventState(XEvent *eventPtr);
static int WindowEventProc(Tcl_Event *evPtr, int flags);
#ifdef TK_USE_INPUT_METHODS
static void CreateXIC(TkWindow *winPtr);
@@ -524,7 +522,7 @@ RefreshKeyboardMappingIfNeeded(
/*
*----------------------------------------------------------------------
*
* GetButtonMask --
* TkGetButtonMask --
*
* Return the proper Button${n}Mask for the button.
*
@@ -537,88 +535,15 @@ RefreshKeyboardMappingIfNeeded(
*----------------------------------------------------------------------
*/
static int
GetButtonMask(
static const unsigned long buttonMasks[] = {
0, Button1Mask, Button2Mask, Button3Mask, Button4Mask, Button5Mask
};
unsigned long
TkGetButtonMask(
unsigned int button)
{
switch (button) {
case 1:
return Button1Mask;
case 2:
return Button2Mask;
case 3:
return Button3Mask;
case 4:
return Button4Mask;
case 5:
return Button5Mask;
}
return 0;
}
/*
*----------------------------------------------------------------------
*
* UpdateButtonEventState --
*
* Update the button event state in our TkDisplay using the XEvent
* passed. We also may modify the the XEvent passed to fit some aspects
* of our TkDisplay.
*
* Results:
* None.
*
* Side effects:
* The TkDisplay's private button state may be modified. The eventPtr's
* state may be updated to reflect masks stored in our TkDisplay that the
* event doesn't contain. The eventPtr may also be modified to not
* contain a button state for the window in which it was not pressed in.
*
*----------------------------------------------------------------------
*/
static void
UpdateButtonEventState(
XEvent *eventPtr)
{
TkDisplay *dispPtr;
int allButtonsMask = Button1Mask | Button2Mask | Button3Mask
| Button4Mask | Button5Mask;
switch (eventPtr->type) {
case ButtonPress:
dispPtr = TkGetDisplay(eventPtr->xbutton.display);
dispPtr->mouseButtonWindow = eventPtr->xbutton.window;
eventPtr->xbutton.state |= dispPtr->mouseButtonState;
dispPtr->mouseButtonState |= GetButtonMask(eventPtr->xbutton.button);
break;
case ButtonRelease:
dispPtr = TkGetDisplay(eventPtr->xbutton.display);
dispPtr->mouseButtonWindow = None;
dispPtr->mouseButtonState &= ~GetButtonMask(eventPtr->xbutton.button);
eventPtr->xbutton.state |= dispPtr->mouseButtonState;
break;
case MotionNotify:
dispPtr = TkGetDisplay(eventPtr->xmotion.display);
if (dispPtr->mouseButtonState & allButtonsMask) {
if (eventPtr->xbutton.window != dispPtr->mouseButtonWindow) {
/*
* This motion event should not be interpreted as a button
* press + motion event since this is not the same window the
* button was pressed down in.
*/
dispPtr->mouseButtonState &= ~allButtonsMask;
dispPtr->mouseButtonWindow = None;
} else {
eventPtr->xmotion.state |= dispPtr->mouseButtonState;
}
}
break;
}
return (button > Button5) ? 0 : buttonMasks[button];
}
/*
@@ -1220,7 +1145,13 @@ Tk_HandleEvent(
ThreadSpecificData *tsdPtr =
Tcl_GetThreadData(&dataKey, sizeof(ThreadSpecificData));
UpdateButtonEventState(eventPtr);
#if !defined(MAC_OSX_TK) && !defined(_WIN32)
if (((eventPtr->type == ButtonPress) || (eventPtr->type == ButtonRelease))
&& ((eventPtr->xbutton.button - 6) < 2)) {
eventPtr->xbutton.button -= 2;
eventPtr->xbutton.state ^= ShiftMask;
}
#endif
/*
* If the generic handler processed this event we are done and can return.
@@ -1368,7 +1299,7 @@ Tk_HandleEvent(
* handle CreateNotify events, so we gotta pass 'em through.
*/
if ((ip.winPtr != None)
if ((ip.winPtr != NULL)
&& ((mask != SubstructureNotifyMask)
|| (eventPtr->type == CreateNotify))) {
TkBindEventProc(winPtr, eventPtr);
@@ -1439,7 +1370,7 @@ TkEventDeadWindow(
ipPtr->nextHandler = NULL;
}
if (ipPtr->winPtr == winPtr) {
ipPtr->winPtr = None;
ipPtr->winPtr = NULL;
}
}
ckfree(handlerPtr);