summaryrefslogtreecommitdiffstats
path: root/macosx/tkMacOSXWm.c
diff options
context:
space:
mode:
Diffstat (limited to 'macosx/tkMacOSXWm.c')
-rw-r--r--macosx/tkMacOSXWm.c34
1 files changed, 27 insertions, 7 deletions
diff --git a/macosx/tkMacOSXWm.c b/macosx/tkMacOSXWm.c
index 3c23308..5a39948 100644
--- a/macosx/tkMacOSXWm.c
+++ b/macosx/tkMacOSXWm.c
@@ -1942,6 +1942,8 @@ WmDeiconifyCmd(
}
}
+ [[win contentView] setNeedsDisplay:YES];
+ Tcl_DoWhenIdle(TkMacOSXDrawAllViews, NULL);
return TCL_OK;
}
@@ -2825,7 +2827,7 @@ WmIconwindowCmd(
*/
TkpWmSetState(oldIcon, WithdrawnState);
- [win orderOut:nil];
+ [win orderOut:NSApp];
[win setExcludedFromWindowsMenu:YES];
wmPtr3->iconFor = NULL;
}
@@ -3734,6 +3736,7 @@ WmTransientCmd(
if (TkGetWindowFromObj(interp, tkwin, objv[3], &container) != TCL_OK) {
return TCL_ERROR;
}
+ RemoveTransient(winPtr);
containerPtr = (TkWindow*) container;
while (!Tk_TopWinHierarchy(containerPtr)) {
/*
@@ -5535,12 +5538,15 @@ Tk_MacOSXGetTkWindow(
void *w)
{
Window window = None;
- TkDisplay *dispPtr = TkGetDisplayList();
if ([(NSWindow *)w respondsToSelector: @selector (tkWindow)]) {
window = [(TKWindow *)w tkWindow];
}
- return (window != None ?
- Tk_IdToWindow(dispPtr->display, window) : NULL);
+ if (window) {
+ TkDisplay *dispPtr = TkGetDisplayList();
+ return Tk_IdToWindow(dispPtr->display, window);
+ } else {
+ return NULL;
+ }
}
/*
@@ -6271,6 +6277,7 @@ TkMacOSXMakeRealWindowExist(
Tk_ChangeWindowAttributes((Tk_Window)winPtr, CWOverrideRedirect, &atts);
ApplyContainerOverrideChanges(winPtr, NULL);
}
+ [window display];
}
/*
@@ -6309,8 +6316,7 @@ TkpRedrawWidget(Tk_Window tkwin) {
[view bounds].size.height - tkBounds.bottom,
tkBounds.right - tkBounds.left,
tkBounds.bottom - tkBounds.top);
- [view setTkNeedsDisplay:YES];
- [view setTkDirtyRect:bounds];
+ [view addTkDirtyRect:bounds];
}
}
@@ -6443,6 +6449,19 @@ TkpWmSetState(
macWin = TkMacOSXGetNSWindowForDrawable(winPtr->window);
+ /*
+ * Make sure windows are updated before the state change. As an exception,
+ * do not process idle tasks before withdrawing a window. The purpose of
+ * this is to support the common paradigm of immediately withdrawing the
+ * root window. Processing idle tasks before changing the state causes the
+ * root to briefly flash on the screen, which users of this paradigm find
+ * annoying. Not processing the events does not guarantee that the window
+ * will not appear but makes it more likely.
+ */
+
+ if (state != WithdrawnState) {
+ while (Tcl_DoOneEvent(TCL_IDLE_EVENTS)) {};
+ }
if (state == WithdrawnState) {
Tk_UnmapWindow((Tk_Window)winPtr);
} else if (state == IconicState) {
@@ -6463,8 +6482,9 @@ TkpWmSetState(
[macWin orderFront:NSApp];
TkMacOSXZoomToplevel(macWin, state == NormalState ? inZoomIn : inZoomOut);
}
+
/*
- * Make sure windows are updated after the state change.
+ * Make sure windows are updated after the state change too.
*/
while (Tcl_DoOneEvent(TCL_IDLE_EVENTS)){}