summaryrefslogtreecommitdiffstats
path: root/win
diff options
context:
space:
mode:
authorhobbs <hobbs>2004-09-17 22:44:33 (GMT)
committerhobbs <hobbs>2004-09-17 22:44:33 (GMT)
commit705a2cd41762dcd59142f046d702a0224ad2c9af (patch)
tree6e2bc6e00f5cd1d19fdc6a4f23cca1b8054828f8 /win
parenteb82ebc6a7d603249f7eb738351333a4e2d91784 (diff)
downloadtk-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.c34
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);
}
}