diff options
author | hobbs <hobbs> | 2004-09-17 22:44:33 (GMT) |
---|---|---|
committer | hobbs <hobbs> | 2004-09-17 22:44:33 (GMT) |
commit | 705a2cd41762dcd59142f046d702a0224ad2c9af (patch) | |
tree | 6e2bc6e00f5cd1d19fdc6a4f23cca1b8054828f8 /win | |
parent | eb82ebc6a7d603249f7eb738351333a4e2d91784 (diff) | |
download | tk-705a2cd41762dcd59142f046d702a0224ad2c9af.zip tk-705a2cd41762dcd59142f046d702a0224ad2c9af.tar.gz tk-705a2cd41762dcd59142f046d702a0224ad2c9af.tar.bz2 |
* win/tkWinWm.c (UpdateWrapper): Ensure that we maintain Z order
* tests/winWm.test: and focus of preexisting window
when replacing the wrapper window.
Diffstat (limited to 'win')
-rw-r--r-- | win/tkWinWm.c | 34 |
1 files changed, 30 insertions, 4 deletions
diff --git a/win/tkWinWm.c b/win/tkWinWm.c index 2107cb7..cc77fe0 100644 --- a/win/tkWinWm.c +++ b/win/tkWinWm.c @@ -12,7 +12,7 @@ * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: tkWinWm.c,v 1.69 2004/09/15 04:02:57 mdejong Exp $ + * RCS: @(#) $Id: tkWinWm.c,v 1.70 2004/09/17 22:44:34 hobbs Exp $ */ #include "tkWinInt.h" @@ -1897,7 +1897,7 @@ UpdateWrapper(winPtr) { register WmInfo *wmPtr = winPtr->wmInfoPtr; HWND parentHWND, oldWrapper = wmPtr->wrapper; - HWND child; + HWND child, nextHWND, focusHWND; int x, y, width, height, state; WINDOWPLACEMENT place; HICON hSmallIcon = NULL; @@ -1916,6 +1916,15 @@ UpdateWrapper(winPtr) child = TkWinGetHWND(winPtr->window); parentHWND = NULL; + /* + * nextHWND will help us maintain Z order. + * focusHWND will help us maintain focus, if we had it. + */ + nextHWND = NULL; + focusHWND = GetFocus(); + if ((oldWrapper == NULL) || (oldWrapper != GetForegroundWindow())) { + focusHWND = NULL; + } if (winPtr->flags & TK_EMBEDDED) { wmPtr->wrapper = (HWND) winPtr->privatePtr; @@ -2025,6 +2034,13 @@ UpdateWrapper(winPtr) wmPtr->y = place.rcNormalPosition.top; TkInstallFrameMenu((Tk_Window) winPtr); + + if (oldWrapper && (oldWrapper != wmPtr->wrapper)) { + /* + * We will adjust wrapper to have the same Z order as oldWrapper + */ + nextHWND = GetNextWindow(oldWrapper, GW_HWNDPREV); + } } /* @@ -2097,11 +2113,16 @@ UpdateWrapper(winPtr) /* * Force an initial transition from withdrawn to the real - * initial state. + * initial state. Set the Z order based on previous wrapper + * before we set the state. */ state = wmPtr->hints.initial_state; wmPtr->hints.initial_state = WithdrawnState; + if (nextHWND) { + SetWindowPos(wmPtr->wrapper, nextHWND, 0, 0, 0, 0, + SWP_NOMOVE|SWP_NOSIZE|SWP_NOACTIVATE|SWP_NOSENDCHANGING); + } TkpWmSetState(winPtr, state); if (hSmallIcon != NULL) { @@ -2158,12 +2179,17 @@ UpdateWrapper(winPtr) /* * If this is the first window created by the application, then - * we should activate the initial window. + * we should activate the initial window. Otherwise, if this had + * the focus, we need to restore that. + * XXX: Rewrapping generates a <FocusOut> and <FocusIn> that would + * XXX: best be avoided, if we could safely mask them. */ if (tsdPtr->firstWindow) { tsdPtr->firstWindow = 0; SetActiveWindow(wmPtr->wrapper); + } else if (focusHWND) { + SetFocus(focusHWND); } } |