summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--macosx/tkMacOSXSubwindows.c33
-rw-r--r--macosx/tkMacOSXWindowEvent.c2
-rw-r--r--macosx/tkMacOSXWm.c2
3 files changed, 33 insertions, 4 deletions
diff --git a/macosx/tkMacOSXSubwindows.c b/macosx/tkMacOSXSubwindows.c
index 2a6a04c..caebd7b 100644
--- a/macosx/tkMacOSXSubwindows.c
+++ b/macosx/tkMacOSXSubwindows.c
@@ -303,12 +303,41 @@ XUnmapWindow(
display->request++;
if (Tk_IsTopLevel(winPtr)) {
if (!Tk_IsEmbedded(winPtr) &&
- winPtr->wmInfoPtr->hints.initial_state!=IconicState) {
- [win orderOut:nil];
+ winPtr->wmInfoPtr->hints.initial_state!=IconicState) {
[win setExcludedFromWindowsMenu:YES];
+ [win orderOut:NSApp];
+ if ([win isKeyWindow]) {
+
+ /*
+ * If we are unmapping the key window then we need to make sure
+ * that a new key window is assigned, if possible. This is
+ * supposed to happen when a key window is ordered out, but as
+ * noted in tkMacOSXWm.c this does not happen, in spite of
+ * Apple's claims to the contrary.
+ */
+
+ for (NSWindow *w in [NSApp orderedWindows]) {
+ TkWindow *winPtr2 = TkMacOSXGetTkWindow(w);
+ WmInfo *wmInfoPtr;
+
+ BOOL isOnScreen;
+
+ if (!winPtr2 || !winPtr2->wmInfoPtr) {
+ continue;
+ }
+ wmInfoPtr = winPtr2->wmInfoPtr;
+ isOnScreen = (wmInfoPtr->hints.initial_state != IconicState &&
+ wmInfoPtr->hints.initial_state != WithdrawnState);
+ if (w != win && isOnScreen && [w canBecomeKeyWindow]) {
+ [w makeKeyAndOrderFront:NSApp];
+ break;
+ }
+ }
+ }
}
TkMacOSXInvalClipRgns((Tk_Window)winPtr);
} else {
+
/*
* Rebuild the visRgn clip region for the parent so it will be allowed
* to draw in the space from which this subwindow was removed and then
diff --git a/macosx/tkMacOSXWindowEvent.c b/macosx/tkMacOSXWindowEvent.c
index 8fd5a61..5d90716 100644
--- a/macosx/tkMacOSXWindowEvent.c
+++ b/macosx/tkMacOSXWindowEvent.c
@@ -337,7 +337,7 @@ static void RefocusGrabWindow(void *data) {
continue;
}
if (winPtr->wmInfoPtr->hints.initial_state == WithdrawnState) {
- [win orderOut:nil];
+ [win orderOut:NSApp];
}
if (winPtr->dispPtr->grabWinPtr == winPtr) {
Tcl_DoWhenIdle(RefocusGrabWindow, winPtr);
diff --git a/macosx/tkMacOSXWm.c b/macosx/tkMacOSXWm.c
index 0f49e4b..5a39948 100644
--- a/macosx/tkMacOSXWm.c
+++ b/macosx/tkMacOSXWm.c
@@ -2827,7 +2827,7 @@ WmIconwindowCmd(
*/
TkpWmSetState(oldIcon, WithdrawnState);
- [win orderOut:nil];
+ [win orderOut:NSApp];
[win setExcludedFromWindowsMenu:YES];
wmPtr3->iconFor = NULL;
}