summaryrefslogtreecommitdiffstats
path: root/win
diff options
context:
space:
mode:
Diffstat (limited to 'win')
-rw-r--r--win/tkWinWm.c36
1 files changed, 34 insertions, 2 deletions
diff --git a/win/tkWinWm.c b/win/tkWinWm.c
index f6d3216..4ad0056 100644
--- a/win/tkWinWm.c
+++ b/win/tkWinWm.c
@@ -2466,6 +2466,33 @@ TkpWmGetState(
*--------------------------------------------------------------
*/
+static void CheckForPointer(TkWindow *winPtr)
+{
+ POINT mouse;
+ int x, y;
+ unsigned int state = TkWinGetModifierState();
+ TkWindow **windows = TkWmStackorderToplevel(winPtr->mainPtr->winPtr);
+ TkWindow **w;
+ TkGetPointerCoords(NULL, &x, &y);
+ mouse.x = x;
+ mouse.y = y;
+ if (windows != NULL) {
+ for (w = windows; *w ; w++) {
+ RECT windowRect;
+ HWND hwnd = Tk_GetHWND(Tk_WindowId((Tk_Window) *w));
+ if (GetWindowRect(hwnd, &windowRect) == 0) {
+ continue;
+ }
+ if (winPtr != *w && PtInRect(&windowRect, mouse)) {
+ Tk_Window target = Tk_CoordsToWindow(x, y, (Tk_Window) *w);
+ Tk_UpdatePointer((Tk_Window) target, x, y, state);
+ break;
+ }
+ }
+ ckfree(windows);
+ }
+}
+
void
TkWmDeadWindow(
TkWindow *winPtr) /* Top-level window that's being deleted. */
@@ -2604,6 +2631,13 @@ TkWmDeadWindow(
DecrIconRefCount(wmPtr->iconPtr);
}
+ /*
+ * Check if the dead window is a toplevel containing the pointer. If so,
+ * find the window which will inherit the pointer and call
+ * TkUpdatePointer.
+ */
+
+ CheckForPointer(winPtr);
ckfree(wmPtr);
winPtr->wmInfoPtr = NULL;
}
@@ -6595,8 +6629,6 @@ TkWmStackorderToplevelEnumProc(
TkWmStackorderToplevelPair *pair =
(TkWmStackorderToplevelPair *) lParam;
- /*fprintf(stderr, "Looking up HWND %d\n", hwnd);*/
-
hPtr = Tcl_FindHashEntry(pair->table, hwnd);
if (hPtr != NULL) {
childWinPtr = (TkWindow *)Tcl_GetHashValue(hPtr);