winmultiwindowwindow.c

Fixes for window ordering problem (Kensuke Matsuzaki)
This commit is contained in:
Alexander Gottwald 2005-01-24 19:02:29 +00:00
parent cc0849536e
commit 9f74348a33
3 changed files with 70 additions and 2 deletions

View file

@ -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:

View file

@ -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);

View file

@ -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.