summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexander Gottwald <alexander.gottwald@s1999.tu-chemnitz.de>2005-01-24 19:02:29 +0000
committerAlexander Gottwald <alexander.gottwald@s1999.tu-chemnitz.de>2005-01-24 19:02:29 +0000
commit9f74348a3357cb5993c6c7480fcf7ad597e8c3e8 (patch)
tree30922e4e1f56e76a32a1b200e08a107612359246
parentcc0849536e9db6900f2e41ab8e795dfb0e4bca50 (diff)
winmultiwindowwindow.c
Fixes for window ordering problem (Kensuke Matsuzaki)
-rw-r--r--hw/xwin/ChangeLog6
-rw-r--r--hw/xwin/winmultiwindowwindow.c2
-rwxr-xr-xhw/xwin/winmultiwindowwndproc.c64
3 files changed, 70 insertions, 2 deletions
diff --git a/hw/xwin/ChangeLog b/hw/xwin/ChangeLog
index 3e3c21207..7c1e14433 100644
--- a/hw/xwin/ChangeLog
+++ b/hw/xwin/ChangeLog
@@ -1,3 +1,9 @@
+2005-01-24 Alexander Gottwald <ago at freedesktop dot org>
+
+ * winmultiwindowwindow.c
+ * winmultiwindowwndproc.c:
+ Fixes for window ordering problem (Kensuke Matsuzaki)
+
2005-01-11 Alexander Gottwald <ago at freedesktop dot org>
* XWin.man:
diff --git a/hw/xwin/winmultiwindowwindow.c b/hw/xwin/winmultiwindowwindow.c
index 5034ec0d6..475fa7ddc 100644
--- a/hw/xwin/winmultiwindowwindow.c
+++ b/hw/xwin/winmultiwindowwindow.c
@@ -571,7 +571,7 @@ winCreateWindowsWindow (WindowPtr pWin)
/* Change style back to popup, already placed... */
SetWindowLong (hWnd, GWL_STYLE, WS_POPUP | WS_CLIPCHILDREN | WS_CLIPSIBLINGS);
SetWindowPos (hWnd, 0, 0, 0, 0, 0,
- SWP_FRAMECHANGED | SWP_NOZORDER | SWP_NOMOVE | SWP_NOSIZE);
+ SWP_FRAMECHANGED | SWP_NOZORDER | SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE);
/* Make sure it gets the proper system menu for a WS_POPUP, too */
GetSystemMenu (hWnd, TRUE);
diff --git a/hw/xwin/winmultiwindowwndproc.c b/hw/xwin/winmultiwindowwndproc.c
index 3ebd0be7d..b2038ae55 100755
--- a/hw/xwin/winmultiwindowwndproc.c
+++ b/hw/xwin/winmultiwindowwndproc.c
@@ -765,6 +765,7 @@ winTopLevelWindowProc (HWND hwnd, UINT message,
/* Pass the message to the root window */
SendMessage (hwndScreen, message, wParam, lParam);
+#if 0
if (LOWORD(wParam) != WA_INACTIVE)
{
/* Raise the window to the top in Z order */
@@ -778,6 +779,7 @@ winTopLevelWindowProc (HWND hwnd, UINT message,
if (!pWin || !pWin->overrideRedirect) /* for OOo menus */
winSendMessageToWM (s_pScreenPriv->pWMInfo, &wmMsg);
}
+#endif
return 0;
case WM_ACTIVATEAPP:
@@ -933,7 +935,7 @@ winTopLevelWindowProc (HWND hwnd, UINT message,
ErrorF ("overridden window is shown\n");
#endif
SetWindowPos (hwnd, HWND_TOPMOST, 0, 0, 0, 0,
- SWP_NOMOVE | SWP_NOSIZE);
+ SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE);
}
/* Setup the Window Manager message */
@@ -953,6 +955,7 @@ winTopLevelWindowProc (HWND hwnd, UINT message,
return ValidateSizing (hwnd, pWin, wParam, lParam);
case WM_WINDOWPOSCHANGING:
+#if 0
if (lParam != 0)
{
WINDOWPOS *windowpos = (WINDOWPOS *)lParam;
@@ -989,8 +992,67 @@ winTopLevelWindowProc (HWND hwnd, UINT message,
winSendMessageToWM (s_pScreenPriv->pWMInfo, &wmMsg);
}
}
+#endif
break;
case WM_WINDOWPOSCHANGED:
+ {
+ LPWINDOWPOS pWinPos = (LPWINDOWPOS) lParam;
+
+ if (!(pWinPos->flags & SWP_NOZORDER))
+ {
+#if CYGWINDOWING_DEBUG
+ winDebug ("\twindow z order was changed\n");
+#endif
+ if (pWinPos->hwndInsertAfter == HWND_TOP
+ ||pWinPos->hwndInsertAfter == HWND_TOPMOST
+ ||pWinPos->hwndInsertAfter == HWND_NOTOPMOST)
+ {
+#if CYGWINDOWING_DEBUG
+ winDebug ("\traise to top\n");
+#endif
+ /* Raise the window to the top in Z order */
+ wmMsg.msg = WM_WM_RAISE;
+ if (fWMMsgInitialized)
+ winSendMessageToWM (s_pScreenPriv->pWMInfo, &wmMsg);
+ }
+ else if (pWinPos->hwndInsertAfter == HWND_BOTTOM)
+ {
+ }
+ else
+ {
+ /* Check if this window is top of X windows. */
+ HWND hWndAbove = NULL;
+ DWORD dwCurrentProcessID = GetCurrentProcessId ();
+ DWORD dwWindowProcessID = 0;
+
+ for (hWndAbove = pWinPos->hwndInsertAfter;
+ hWndAbove != NULL;
+ hWndAbove = GetNextWindow (hWndAbove, GW_HWNDPREV))
+ {
+ /* Ignore other XWin process's window */
+ GetWindowThreadProcessId (hWndAbove, &dwWindowProcessID);
+
+ if ((dwWindowProcessID == dwCurrentProcessID)
+ && GetProp (hWndAbove, WIN_WINDOW_PROP)
+ && !IsWindowVisible (hWndAbove)
+ && !IsIconic (hWndAbove) ) /* ignore minimized windows */
+ break;
+ }
+ /* If this is top of X windows in Windows stack,
+ raise it in X stack. */
+ if (hWndAbove == NULL)
+ {
+#if CYGWINDOWING_DEBUG
+ winDebug ("\traise to top\n");
+#endif
+ /* Raise the window to the top in Z order */
+ wmMsg.msg = WM_WM_RAISE;
+ if (fWMMsgInitialized)
+ winSendMessageToWM (s_pScreenPriv->pWMInfo, &wmMsg);
+ }
+ }
+ }
+ }
/*
* Pass the message to DefWindowProc to let the function
* break down WM_WINDOWPOSCHANGED to WM_MOVE and WM_SIZE.