Add InternalWM mode.

This commit is contained in:
Kensuke Matsuzaki 2004-11-04 11:52:22 +00:00
parent 522c878fca
commit 1aef106064
13 changed files with 748 additions and 108 deletions

View File

@ -1,3 +1,28 @@
2004-11-04 Kensuke Matsuzaki <zakki@peppermint.jp>
* InitOutput.c: (winUseMsg):
* win.h:
* winmultiwindowwindow.c: (winMinimizeWindow):
* winmultiwindowwm.c: (PushMessage), (UpdateName),
(PreserveWin32Stack), (winMultiWindowWMProc),
(winMultiWindowXMsgProc), (winInitWM), (winInitMultiWindowWM),
(CheckAnotherWindowManager):
* winprocarg.c: (winInitializeDefaultScreens),
(ddxProcessArgument):
* winscrinit.c: (winFinishScreenInitFB):
* wintrayicon.c: (winHandleIconMessage):
* winwin32rootless.c: (InitWin32RootlessEngine),
(winMWExtWMResizeFrame), (winMWExtWMRestackFrame),
(winMWExtWMStartDrawing), (winMWExtWMRootlessSwitchWindow),
(winMWExtWMSetNativeProperty):
* winwin32rootlesswindow.c: (winMWExtWMReorderWindows),
(winMWExtWMDecorateWindow), (winMWExtWMUpdateWindowDecoration),
(winIsInternalWMRunning), (winMWExtWMRestackWindows):
* winwin32rootlesswndproc.c: (winMWExtWMWindowProc):
* winwindow.h:
* winwndproc.c: (winWindowProc):
Add internalwm mode.
2004-10-28 Alexander Gottwald <ago at freedesktop dot org>
* win.h:

View File

@ -451,6 +451,9 @@ winUseMsg (void)
#ifdef XWIN_MULTIWINDOWEXTWM
ErrorF ("-mwextwm\n"
"\tRun the server in multi-window external window manager mode.\n");
ErrorF ("-internalwm\n"
"\tRun the internal window manager.\n");
#endif
ErrorF ("-rootless\n"

View File

@ -420,6 +420,8 @@ typedef struct
Bool fDecoration;
#ifdef XWIN_MULTIWINDOWEXTWM
Bool fMWExtWM;
Bool fInternalWM;
Bool fAnotherWMRunning;
#endif
Bool fRootless;
#ifdef XWIN_MULTIWINDOW
@ -1391,6 +1393,19 @@ winMWExtWMMoveResizeXWindow (WindowPtr pWin, int x, int y, int w, int h);
void
winMWExtWMUpdateIcon (Window id);
void
winMWExtWMUpdateWindowDecoration (win32RootlessWindowPtr pRLWinPriv,
winScreenInfoPtr pScreenInfo);
BOOL CALLBACK
winMWExtWMDecorateWindow (HWND hwnd, LPARAM lParam);
Bool
winIsInternalWMRunning (winScreenInfoPtr pScreenInfo);
void
winMWExtWMRestackWindows (ScreenPtr pScreen);
#endif

View File

@ -813,16 +813,34 @@ winMinimizeWindow (Window id)
{
WindowPtr pWin;
winPrivWinPtr pWinPriv;
win32RootlessWindowPtr pRLWinPriv;
HWND hWnd;
ScreenPtr pScreen = NULL;
winPrivScreenPtr pScreenPriv = NULL;
winScreenInfo *pScreenInfo = NULL;
#if CYGWINDOWING_DEBUG
ErrorF ("winMinimizeWindow\n");
#endif
pWin = LookupIDByType (id, RT_WINDOW);
pWinPriv = winGetWindowPriv (pWin);
ShowWindow (pWinPriv->hWnd, SW_MINIMIZE);
pScreen = pWin->drawable.pScreen;
if (pScreen) pScreenPriv = winGetScreenPriv(pScreen);
if (pScreenPriv) pScreenInfo = pScreenPriv->pScreenInfo;
if (pScreenPriv && pScreenInfo->fInternalWM)
{
pRLWinPriv = (win32RootlessWindowPtr) RootlessFrameForWindow (pWin, FALSE);
hWnd = pRLWinPriv->hWnd;
}
else
{
pWinPriv = winGetWindowPriv (pWin);
hWnd = pWinPriv->hWnd;
}
ShowWindow (hWnd, SW_MINIMIZE);
}

View File

@ -54,10 +54,11 @@
#include "obj_base.h"
#include "ddraw.h"
#include "winwindow.h"
#include "windowswmstr.h"
extern void winDebug(const char *format, ...);
#ifndef CYGDEBUG
#ifndef CYGDEBUG
#define CYGDEBUG NO
#endif
@ -108,6 +109,7 @@ typedef struct _XMsgProcArgRec {
DWORD dwScreen;
WMInfoPtr pWMInfo;
pthread_mutex_t *ppmServerStarted;
HWND hwndScreen;
} XMsgProcArgRec, *XMsgProcArgPtr;
@ -170,6 +172,9 @@ static void
PreserveWin32Stack(WMInfoPtr pWMInfo, Window iWindow, UINT direction);
#endif
static Bool
CheckAnotherWindowManager (Display *pDisplay, DWORD dwScreen);
/*
* Local globals
@ -177,8 +182,9 @@ PreserveWin32Stack(WMInfoPtr pWMInfo, Window iWindow, UINT direction);
static jmp_buf g_jmpWMEntry;
static jmp_buf g_jmpXMsgProcEntry;
static Bool g_shutdown = FALSE;
static Bool g_shutdown = FALSE;
static Bool redirectError = FALSE;
static Bool g_fAnotherWMRunnig = FALSE;
/*
@ -212,11 +218,14 @@ PushMessage (WMMsgQueuePtr pQueue, WMMsgNodePtr pNode)
case WM_WM_MOVE:
ErrorF ("\tWM_WM_MOVE\n");
break;
case WM_WM_SIZE:
ErrorF ("\tWM_WM_SIZE\n");
break;
case WM_WM_RAISE:
ErrorF ("\tWM_WM_RAISE\n");
break;
case WM_WM_LOWER:
ErrorF ("\tWM_WM_RAISE\n");
ErrorF ("\tWM_WM_LOWER\n");
break;
case WM_WM_MAP:
ErrorF ("\tWM_WM_MAP\n");
@ -227,8 +236,11 @@ PushMessage (WMMsgQueuePtr pQueue, WMMsgNodePtr pNode)
case WM_WM_KILL:
ErrorF ("\tWM_WM_KILL\n");
break;
case WM_WM_ACTIVATE:
ErrorF ("\tWM_WM_ACTIVATE\n");
break;
default:
ErrorF ("Unknown Message.\n");
ErrorF ("\tUnknown Message.\n");
break;
}
#endif
@ -482,7 +494,7 @@ UpdateName (WMInfoPtr pWMInfo, Window iWindow)
0,
1,
False,
pWMInfo->atmPrivMap,
XA_INTEGER,//pWMInfo->atmPrivMap,
&atmType,
&fmtRet,
&items,
@ -499,7 +511,7 @@ UpdateName (WMInfoPtr pWMInfo, Window iWindow)
/* Some sanity checks */
if (!hWnd) return;
if (!IsWindow (hWnd)) return;
/* Set the Windows window name */
GetWindowName (pWMInfo->pDisplay, iWindow, &pszName);
if (pszName)
@ -543,7 +555,7 @@ PreserveWin32Stack(WMInfoPtr pWMInfo, Window iWindow, UINT direction)
0,
1,
False,
pWMInfo->atmPrivMap,
XA_INTEGER,//pWMInfo->atmPrivMap,
&atmType,
&fmtRet,
&items,
@ -609,6 +621,12 @@ winMultiWindowWMProc (void *pArg)
{
WMMsgNodePtr pNode;
if(g_fAnotherWMRunnig)/* Another Window manager exists. */
{
Sleep (1000);
continue;
}
/* Pop a message off of our queue */
pNode = PopMessage (&pWMInfo->wmMsgQueue, pWMInfo);
if (pNode == NULL)
@ -623,7 +641,7 @@ winMultiWindowWMProc (void *pArg)
ErrorF ("winMultiWindowWMProc - %d ms MSG: %d ID: %d\n",
GetTickCount (), (int)pNode->msg.msg, (int)pNode->msg.dwID);
#endif
/* Branch on the message type */
switch (pNode->msg.msg)
{
@ -665,7 +683,7 @@ winMultiWindowWMProc (void *pArg)
XChangeProperty (pWMInfo->pDisplay,
pNode->msg.iWindow,
pWMInfo->atmPrivMap,
pWMInfo->atmPrivMap,
XA_INTEGER,//pWMInfo->atmPrivMap,
32,
PropModeReplace,
(unsigned char *) &(pNode->msg.hwndWindow),
@ -897,19 +915,7 @@ winMultiWindowXMsgProc (void *pArg)
"successfully opened the display.\n");
/* Check if another window manager is already running */
redirectError = FALSE;
XSetErrorHandler (winRedirectErrorHandler);
XSelectInput(pProcArg->pDisplay,
RootWindow (pProcArg->pDisplay, pProcArg->dwScreen),
SubstructureNotifyMask | ButtonPressMask);
XSync (pProcArg->pDisplay, 0);
XSetErrorHandler (winMultiWindowXMsgProcErrorHandler);
if (redirectError)
{
ErrorF ("winMultiWindowXMsgProc - "
"another window manager is running. Exiting.\n");
pthread_exit (NULL);
}
g_fAnotherWMRunnig = CheckAnotherWindowManager (pProcArg->pDisplay, pProcArg->dwScreen);
/* Set up the supported icon sizes */
xis = XAllocIconSize ();
@ -938,15 +944,49 @@ winMultiWindowXMsgProc (void *pArg)
/* Loop until we explicitly break out */
while (1)
{
if (!XPending (pProcArg->pDisplay))
{
if (CheckAnotherWindowManager (pProcArg->pDisplay, pProcArg->dwScreen))
{
if (!g_fAnotherWMRunnig)
{
g_fAnotherWMRunnig = TRUE;
SendMessage(*(HWND*)pProcArg->hwndScreen, WM_UNMANAGE, 0, 0);
}
}
else
{
if (g_fAnotherWMRunnig)
{
g_fAnotherWMRunnig = FALSE;
SendMessage(*(HWND*)pProcArg->hwndScreen, WM_MANAGE, 0, 0);
}
}
Sleep (500);
continue;
}
/* Fetch next event */
XNextEvent (pProcArg->pDisplay, &event);
/* Branch on event type */
if (event.type == CreateNotify)
{
XWindowAttributes attr;
XSelectInput (pProcArg->pDisplay,
event.xcreatewindow.window,
PropertyChangeMask);
/* Get the window attributes */
XGetWindowAttributes (pProcArg->pDisplay,
event.xcreatewindow.window,
&attr);
if (!attr.override_redirect)
XSetWindowBorderWidth(pProcArg->pDisplay,
event.xcreatewindow.window,
0);
}
else if (event.type == PropertyNotify
&& event.xproperty.atom == atmWmName)
@ -998,7 +1038,8 @@ winInitWM (void **ppWMInfo,
pthread_t *ptWMProc,
pthread_t *ptXMsgProc,
pthread_mutex_t *ppmServerStarted,
int dwScreen)
int dwScreen,
HWND hwndScreen)
{
WMProcArgPtr pArg = (WMProcArgPtr) malloc (sizeof(WMProcArgRec));
WMInfoPtr pWMInfo = (WMInfoPtr) malloc (sizeof(WMInfoRec));
@ -1043,6 +1084,7 @@ winInitWM (void **ppWMInfo,
pXMsgArg->dwScreen = dwScreen;
pXMsgArg->pWMInfo = pWMInfo;
pXMsgArg->ppmServerStarted = ppmServerStarted;
pXMsgArg->hwndScreen = hwndScreen;
if (pthread_create (ptXMsgProc, NULL, winMultiWindowXMsgProc, pXMsgArg))
{
/* Bail if thread creation failed */
@ -1182,7 +1224,7 @@ winInitMultiWindowWM (WMInfoPtr pWMInfo, WMProcArgPtr pProcArg)
"WM_DELETE_WINDOW",
False);
pWMInfo->atmPrivMap = XInternAtom (pWMInfo->pDisplay,
WIN_HWND_CACHE,
WINDOWSWM_NATIVE_HWND,
False);
}
@ -1299,6 +1341,36 @@ winRedirectErrorHandler (Display *pDisplay, XErrorEvent *pErr)
}
/*
* Check if another window manager is running
*/
static Bool
CheckAnotherWindowManager (Display *pDisplay, DWORD dwScreen)
{
redirectError = FALSE;
XSetErrorHandler (winRedirectErrorHandler);
XSelectInput(pDisplay, RootWindow (pDisplay, dwScreen),
// SubstructureNotifyMask | ButtonPressMask
ColormapChangeMask | EnterWindowMask | PropertyChangeMask |
SubstructureRedirectMask | KeyPressMask |
ButtonPressMask | ButtonReleaseMask);
XSync (pDisplay, 0);
XSetErrorHandler (winMultiWindowXMsgProcErrorHandler);
XSelectInput(pDisplay, RootWindow (pDisplay, dwScreen),
SubstructureNotifyMask);
XSync (pDisplay, 0);
if (redirectError)
{
//ErrorF ("CheckAnotherWindowManager() - another window manager is running. Exiting.\n");
return TRUE;
}
else
{
return FALSE;
}
}
/*
* Notify the MWM thread we're exiting and not to reconnect
*/

View File

@ -123,6 +123,7 @@ winInitializeDefaultScreens (void)
g_ScreenInfo[i].fDecoration = TRUE;
#ifdef XWIN_MULTIWINDOWEXTWM
g_ScreenInfo[i].fMWExtWM = FALSE;
g_ScreenInfo[i].fInternalWM = FALSE;
#endif
g_ScreenInfo[i].fRootless = FALSE;
#ifdef XWIN_MULTIWINDOW
@ -502,6 +503,33 @@ ddxProcessArgument (int argc, char *argv[], int i)
g_ScreenInfo[g_iLastScreen].fMWExtWM = TRUE;
}
/* Indicate that we have processed this argument */
return 1;
}
/*
* Look for the '-internalwm' argument
*/
if (IS_OPTION ("-internalwm"))
{
/* Is this parameter attached to a screen or is it global? */
if (-1 == g_iLastScreen)
{
int j;
/* Parameter is for all screens */
for (j = 0; j < MAXSCREENS; j++)
{
g_ScreenInfo[j].fMWExtWM = TRUE;
g_ScreenInfo[j].fInternalWM = TRUE;
}
}
else
{
/* Parameter is for a single screen */
g_ScreenInfo[g_iLastScreen].fMWExtWM = TRUE;
g_ScreenInfo[g_iLastScreen].fInternalWM = TRUE;
}
/* Indicate that we have processed this argument */
return 1;
}

View File

@ -592,12 +592,13 @@ winFinishScreenInitFB (int index,
#endif
/* Initialize multi window mode */
if (pScreenInfo->fMultiWindow
if ((pScreenInfo->fMultiWindow || pScreenInfo->fInternalWM)
&& !winInitWM (&pScreenPriv->pWMInfo,
&pScreenPriv->ptWMProc,
&pScreenPriv->ptXMsgProc,
&pScreenPriv->pmServerStarted,
pScreenInfo->dwScreen))
pScreenInfo->dwScreen,
(HWND)&pScreenPriv->hwndScreen))
{
ErrorF ("winFinishScreenInitFB - winInitWM () failed.\n");
return FALSE;

View File

@ -115,6 +115,14 @@ winHandleIconMessage (HWND hwnd, UINT message,
switch (lParam)
{
case WM_LBUTTONUP:
/* Restack and bring all windows to top */
SetForegroundWindow (hwnd);
if (pScreenInfo->fMWExtWM)
winMWExtWMRestackWindows (pScreenInfo->pScreen);
break;
case WM_LBUTTONDBLCLK:
/* Display Exit dialog box */
winDisplayExitDialog (pScreenPriv);

View File

@ -203,7 +203,7 @@ InitWin32RootlessEngine (win32RootlessWindowPtr pRLWinPriv)
+ 256 * sizeof (RGBQUAD));
if (pRLWinPriv->pbmihShadow == NULL)
{
ErrorF ("winMWExtWMCreateFrame - malloc () failed\n");
ErrorF ("InitWin32RootlessEngine - malloc () failed\n");
return;
}
@ -478,7 +478,7 @@ winMWExtWMResizeFrame (RootlessFrameID wid, ScreenPtr pScreen,
DWORD dwExStyle;
DWORD dwStyle;
int iX, iY;
#if CYGMULTIWINDOW_DEBUG
winDebug ("winMWExtWMResizeFrame (%08x) (%d %d)-(%d %d)\n",
(int) pRLWinPriv, iNewX, iNewY, uiNewWidth, uiNewHeight);
@ -525,6 +525,7 @@ winMWExtWMRestackFrame (RootlessFrameID wid, RootlessFrameID nextWid)
win32RootlessWindowPtr pRLWinPriv = (win32RootlessWindowPtr) wid;
win32RootlessWindowPtr pRLNextWinPriv = (win32RootlessWindowPtr) nextWid;
winScreenPriv(pRLWinPriv->pFrame->win->drawable.pScreen);
winScreenInfo *pScreenInfo = NULL;
DWORD dwCurrentProcessID = GetCurrentProcessId ();
DWORD dwWindowProcessID = 0;
HWND hWnd;
@ -536,6 +537,8 @@ winMWExtWMRestackFrame (RootlessFrameID wid, RootlessFrameID nextWid)
if (pScreenPriv->fRestacking) return;
if (pScreenPriv) pScreenInfo = pScreenPriv->pScreenInfo;
pRLWinPriv->fRestackingNow = TRUE;
/* Show window */
@ -551,8 +554,9 @@ winMWExtWMRestackFrame (RootlessFrameID wid, RootlessFrameID nextWid)
SetWindowPos (pRLWinPriv->hWnd, HWND_TOP,
0, 0, 0, 0, SWP_NOMOVE|SWP_NOSIZE|SWP_NOACTIVATE);
}
else
else if (winIsInternalWMRunning(pScreenInfo))
{
/* using mulwinidow wm */
#if CYGMULTIWINDOW_DEBUG
winDebug ("Win %08x is not top\n", pRLWinPriv);
#endif
@ -613,6 +617,19 @@ winMWExtWMRestackFrame (RootlessFrameID wid, RootlessFrameID nextWid)
}
}
}
else
{
/* using general wm like twm, wmaker etc.
Interleave X window and Windows window will cause problem. */
SetWindowPos (pRLWinPriv->hWnd, pRLNextWinPriv->hWnd,
0, 0, 0, 0,
SWP_NOMOVE|SWP_NOSIZE|SWP_NOACTIVATE);
#if 0
#endif
}
#if CYGMULTIWINDOW_DEBUG
winDebug ("winMWExtWMRestackFrame - done (%08x)\n", (int) pRLWinPriv);
#endif
pRLWinPriv->fRestackingNow = FALSE;
}
@ -676,7 +693,7 @@ winMWExtWMStartDrawing (RootlessFrameID wid, char **pixelData, int *bytesPerRow)
Bool fReturn = TRUE;
HDC hdcNew;
HBITMAP hbmpNew;
#if CYGMULTIWINDOW_DEBUG
#if CYGMULTIWINDOW_DEBUG && FALSE
winDebug ("winMWExtWMStartDrawing (%08x) %08x\n", (int) pRLWinPriv, pRLWinPriv->fDestroyed);
#endif
@ -686,9 +703,11 @@ winMWExtWMStartDrawing (RootlessFrameID wid, char **pixelData, int *bytesPerRow)
if (pScreen) pScreenPriv = winGetScreenPriv(pScreen);
if (pScreenPriv) pScreenInfo = pScreenPriv->pScreenInfo;
#if CYGMULTIWINDOW_DEBUG
winDebug ("pScreenPriv %08X\n", (int) pScreenPriv);
winDebug ("pScreenInfo %08X\n", (int) pScreenInfo);
#if CYGMULTIWINDOW_DEBUG && FALSE
winDebug ("\tpScreenPriv %08X\n", (int) pScreenPriv);
winDebug ("\tpScreenInfo %08X\n", (int) pScreenInfo);
winDebug ("\t(%d, %d)\n", (int)pRLWinPriv->pFrame->width,
(int) -pRLWinPriv->pFrame->height);
#endif
if (pRLWinPriv->hdcScreen == NULL)
{
@ -786,7 +805,7 @@ winMWExtWMStartDrawing (RootlessFrameID wid, char **pixelData, int *bytesPerRow)
pRLWinPriv->fResized = FALSE;
}
#if CYGMULTIWINDOW_DEBUG
#if CYGMULTIWINDOW_DEBUG && FALSE
winDebug ("winMWExtWMStartDrawing - 0x%08x %d\n",
(unsigned int)pRLWinPriv->pfb, (unsigned int)dibsection.dsBm.bmWidthBytes);
#endif
@ -795,8 +814,8 @@ winMWExtWMStartDrawing (RootlessFrameID wid, char **pixelData, int *bytesPerRow)
{
ErrorF ("winMWExtWMStartDrawing - Already window was destroyed \n");
}
#if CYGMULTIWINDOW_DEBUG
winDebug ("winMWExtWMStartDrawing - done (0x08x) 0x%08x %d\n",
#if CYGMULTIWINDOW_DEBUG && FALSE
winDebug ("winMWExtWMStartDrawing - done (0x08%x) 0x%08x %d\n",
(int) pRLWinPriv,
(unsigned int)pRLWinPriv->pfb, (unsigned int)pRLWinPriv->dwWidthBytes);
#endif
@ -914,6 +933,13 @@ winMWExtWMRootlessSwitchWindow (RootlessWindowPtr pFrame, WindowPtr oldWin)
pRLWinPriv->pFrame = pFrame;
pRLWinPriv->fResized = TRUE;
/* Set the window extended style flags */
SetWindowLongPtr (pRLWinPriv->hWnd, GWL_EXSTYLE, WS_EX_TOOLWINDOW);
/* Set the window standard style flags */
SetWindowLongPtr (pRLWinPriv->hWnd, GWL_STYLE,
WS_POPUP | WS_CLIPCHILDREN);
DeleteProperty (oldWin, AtmWindowsWmNativeHwnd ());
winMWExtWMSetNativeProperty (pFrame);
#if CYGMULTIWINDOW_DEBUG
@ -1029,7 +1055,7 @@ winMWExtWMSetNativeProperty (RootlessWindowPtr pFrame)
/* FIXME: move this to WindowsWM extension */
lData = pRLWinPriv->hWnd;
lData = (long) pRLWinPriv->hWnd;
ChangeWindowProperty (pFrame->win, AtmWindowsWmNativeHwnd (),
XA_INTEGER, 32, PropModeReplace, 1, &lData, TRUE);
}

View File

@ -50,7 +50,7 @@ winMWExtWMReorderWindows (ScreenPtr pScreen)
XID vlist[2];
#if CYGMULTIWINDOW_DEBUG && FALSE
ErrorF ("winMWExtWMReorderWindows\n");
winDebug ("winMWExtWMReorderWindows\n");
#endif
pScreenPriv->fRestacking = TRUE;
@ -58,7 +58,7 @@ winMWExtWMReorderWindows (ScreenPtr pScreen)
if (pScreenPriv->fWindowOrderChanged)
{
#if CYGMULTIWINDOW_DEBUG
ErrorF ("winMWExtWMReorderWindows - Need to restack\n");
winDebug ("winMWExtWMReorderWindows - Need to restack\n");
#endif
hwnd = GetTopWindow (NULL);
@ -182,3 +182,271 @@ winMWExtWMUpdateIcon (Window id)
}
}
}
/*
* winMWExtWMDecorateWindow - Update window style. Called by EnumWindows.
*/
BOOL CALLBACK
winMWExtWMDecorateWindow (HWND hwnd, LPARAM lParam)
{
win32RootlessWindowPtr pRLWinPriv = NULL;
ScreenPtr pScreen = NULL;
winPrivScreenPtr pScreenPriv = NULL;
winScreenInfo *pScreenInfo = NULL;
/* Check if the Windows window property for our X window pointer is valid */
if ((pRLWinPriv = (win32RootlessWindowPtr)GetProp (hwnd, WIN_WINDOW_PROP)) != NULL)
{
pScreen = pRLWinPriv->pFrame->win->drawable.pScreen;
if (pScreen) pScreenPriv = winGetScreenPriv(pScreen);
if (pScreenPriv) pScreenInfo = pScreenPriv->pScreenInfo;
if (pRLWinPriv && pScreenInfo) winMWExtWMUpdateWindowDecoration (pRLWinPriv, pScreenInfo);
}
return TRUE;
}
/*
* winMWExtWMUpdateWindowDecoration - Update window style.
*/
void
winMWExtWMUpdateWindowDecoration (win32RootlessWindowPtr pRLWinPriv,
winScreenInfoPtr pScreenInfo)
{
Bool fDecorate = FALSE;
DWORD dwExStyle = 0;
DWORD dwStyle = 0;
WINDOWPLACEMENT wndPlace;
UINT showCmd = 0;
wndPlace.length = sizeof (WINDOWPLACEMENT);
/* Get current window placement */
GetWindowPlacement (pRLWinPriv->hWnd, &wndPlace);
if (winIsInternalWMRunning(pScreenInfo))
{
if (!pRLWinPriv->pFrame->win->overrideRedirect)
fDecorate = TRUE;
}
#if 0
if (wndPlace.showCmd == SW_HIDE)
return;//showCmd = SWP_HIDEWINDOW;
else
showCmd = SWP_SHOWWINDOW;
#else
if (wndPlace.showCmd == SW_HIDE)
return;
if (IsWindowVisible (pRLWinPriv->hWnd))
showCmd = SWP_SHOWWINDOW;
#endif
showCmd |= SWP_NOMOVE | SWP_FRAMECHANGED | SWP_NOACTIVATE | SWP_NOZORDER;
winDebug ("winMWExtWMUpdateWindowDecoration %08x %s\n",
(int)pRLWinPriv, fDecorate?"Decorate":"Bare");
/* Get the standard and extended window style information */
dwExStyle = GetWindowLongPtr (pRLWinPriv->hWnd, GWL_EXSTYLE);
dwStyle = GetWindowLongPtr (pRLWinPriv->hWnd, GWL_STYLE);
if (fDecorate)
{
RECT rcNew;
int iDx, iDy;
winWMMessageRec wmMsg;
winScreenPriv(pScreenInfo->pScreen);
/* */
if (!(dwExStyle & WS_EX_APPWINDOW))
{
winDebug ("\tBare=>Decorate\n");
/* Setup a rectangle with the X window position and size */
SetRect (&rcNew,
pRLWinPriv->pFrame->x,
pRLWinPriv->pFrame->y,
pRLWinPriv->pFrame->x + pRLWinPriv->pFrame->width,
pRLWinPriv->pFrame->y + pRLWinPriv->pFrame->height);
/* */
AdjustWindowRectEx (&rcNew,
WS_POPUP | WS_SIZEBOX | WS_OVERLAPPEDWINDOW,
FALSE,
WS_EX_APPWINDOW);
/* Calculate position deltas */
iDx = pRLWinPriv->pFrame->x - rcNew.left;
iDy = pRLWinPriv->pFrame->y - rcNew.top;
/* Calculate new rectangle */
rcNew.left += iDx;
rcNew.right += iDx;
rcNew.top += iDy;
rcNew.bottom += iDy;
/* Set the window extended style flags */
SetWindowLongPtr (pRLWinPriv->hWnd, GWL_EXSTYLE, WS_EX_APPWINDOW);
/* Set the window standard style flags */
SetWindowLongPtr (pRLWinPriv->hWnd, GWL_STYLE,
WS_POPUP | WS_SIZEBOX | WS_OVERLAPPEDWINDOW);
/* Position the Windows window */
SetWindowPos (pRLWinPriv->hWnd, NULL,
rcNew.left, rcNew.top,
rcNew.right - rcNew.left, rcNew.bottom - rcNew.top,
showCmd);
wmMsg.hwndWindow = pRLWinPriv->hWnd;
wmMsg.iWindow = (Window)pRLWinPriv->pFrame->win->drawable.id;
wmMsg.msg = WM_WM_NAME_EVENT;
winSendMessageToWM (pScreenPriv->pWMInfo, &wmMsg);
winMWExtWMReshapeFrame ((RootlessFrameID)pRLWinPriv ,
wBoundingShape(pRLWinPriv->pFrame->win));
}
}
else
{
RECT rcNew;
/* */
if (dwExStyle & WS_EX_APPWINDOW)
{
winDebug ("\tDecorate=>Bare\n");
/* Setup a rectangle with the X window position and size */
SetRect (&rcNew,
pRLWinPriv->pFrame->x,
pRLWinPriv->pFrame->y,
pRLWinPriv->pFrame->x + pRLWinPriv->pFrame->width,
pRLWinPriv->pFrame->y + pRLWinPriv->pFrame->height);
#if 0
/* */
AdjustWindowRectEx (&rcNew,
WS_POPUP | WS_CLIPCHILDREN,
FALSE,
WS_EX_TOOLWINDOW);
/* Calculate position deltas */
iDx = pRLWinPriv->pFrame->x - rcNew.left;
iDy = pRLWinPriv->pFrame->y - rcNew.top;
/* Calculate new rectangle */
rcNew.left += iDx;
rcNew.right += iDx;
rcNew.top += iDy;
rcNew.bottom += iDy;
#endif
/* Hide window temporary to remove from taskbar. */
ShowWindow( pRLWinPriv->hWnd, SW_HIDE );
/* Set the window extended style flags */
SetWindowLongPtr (pRLWinPriv->hWnd, GWL_EXSTYLE, WS_EX_TOOLWINDOW);
/* Set the window standard style flags */
SetWindowLongPtr (pRLWinPriv->hWnd, GWL_STYLE,
WS_POPUP | WS_CLIPCHILDREN);
/* Position the Windows window */
SetWindowPos (pRLWinPriv->hWnd, NULL,
rcNew.left, rcNew.top,
rcNew.right - rcNew.left, rcNew.bottom - rcNew.top,
showCmd);
winMWExtWMReshapeFrame ((RootlessFrameID)pRLWinPriv ,
wBoundingShape(pRLWinPriv->pFrame->win));
}
}
}
/*
* winIsInternalWMRunning (winScreenInfoPtr pScreenInfo)
*/
Bool
winIsInternalWMRunning (winScreenInfoPtr pScreenInfo)
{
return pScreenInfo->fInternalWM && !pScreenInfo->fAnotherWMRunning;
}
/*
* winMWExtWMRestackWindows
*/
void
winMWExtWMRestackWindows (ScreenPtr pScreen)
{
winScreenPriv(pScreen);
WindowPtr pRoot = WindowTable[pScreen->myNum];
WindowPtr pWin = NULL;
WindowPtr pWinPrev = NULL;
win32RootlessWindowPtr pRLWin = NULL;
win32RootlessWindowPtr pRLWinPrev = NULL;
int nWindow = 0;
HDWP hWinPosInfo = NULL;
#if CYGMULTIWINDOW_DEBUG
winDebug ("winMWExtWMRestackWindows\n");
#endif
pScreenPriv->fRestacking = TRUE;
if (pRoot != NULL)
{
for (pWin = pRoot->firstChild; pWin; pWin = pWin->nextSib)
nWindow ++;
hWinPosInfo = BeginDeferWindowPos(nWindow);
for (pWin = pRoot->firstChild; pWin; pWin = pWin->nextSib)
{
if (pWin->realized)
{
UINT uFlags;
pRLWin = (win32RootlessWindowPtr) RootlessFrameForWindow (pWin, FALSE);
if (pRLWin == NULL) continue;
if (pWinPrev)
pRLWinPrev = (win32RootlessWindowPtr) RootlessFrameForWindow (pWinPrev, FALSE);
uFlags = SWP_NOMOVE | SWP_NOSIZE | SWP_SHOWWINDOW;
if (pRLWinPrev != NULL) uFlags |= SWP_NOACTIVATE;
#if CYGMULTIWINDOW_DEBUG
winDebug ("winMWExtWMRestackWindows - DeferWindowPos (%08x, %08x)\n",
pRLWin->hWnd,
pRLWinPrev ? pRLWinPrev->hWnd : HWND_TOP);
#endif
hWinPosInfo = DeferWindowPos (hWinPosInfo, pRLWin->hWnd,
pRLWinPrev ? pRLWinPrev->hWnd : HWND_TOP,
0, 0, 0, 0,
uFlags);
if (hWinPosInfo == NULL)
{
ErrorF ("winMWExtWMRestackWindows - DeferWindowPos () failed: %d\n",
(int) GetLastError ());
return;
}
pWinPrev = pWin;
}
}
if (!EndDeferWindowPos (hWinPosInfo))
{
ErrorF ("winMWExtWMRestackWindows - EndDeferWindowPos () failed: %d\n",
(int) GetLastError ());
return;
}
}
#if CYGMULTIWINDOW_DEBUG
winDebug ("winMWExtWMRestackWindows - done\n");
#endif
pScreenPriv->fRestacking = FALSE;
}

View File

@ -37,6 +37,9 @@
#include "propertyst.h"
#include "Xatom.h"
#include "winmultiwindowclass.h"
#if CYGDEBUG
#include "winmessages.h"
#endif
/*
@ -48,7 +51,6 @@
#define RAISE_ON_CLICK_DEFAULT FALSE
/*
* Global variables
*/
@ -412,7 +414,8 @@ winMWExtWMWindowProc (HWND hwnd, UINT message,
PAINTSTRUCT ps;
LPWINDOWPOS pWinPos = NULL;
RECT rcClient;
XID vlist[2];
winWMMessageRec wmMsg;
Bool fWMMsgInitialized = FALSE;
/* Check if the Windows window property for our X window pointer is valid */
if ((pRLWinPriv = (win32RootlessWindowPtr)GetProp (hwnd, WIN_WINDOW_PROP)) != NULL)
@ -422,11 +425,35 @@ winMWExtWMWindowProc (HWND hwnd, UINT message,
if (pScreen) pScreenPriv = winGetScreenPriv(pScreen);
if (pScreenPriv) pScreenInfo = pScreenPriv->pScreenInfo;
if (pScreenPriv) hwndScreen = pScreenPriv->hwndScreen;
wmMsg.msg = 0;
wmMsg.hwndWindow = hwnd;
wmMsg.iWindow = (Window)pWin->drawable.id;
wmMsg.iX = pRLWinPriv->pFrame->x;
wmMsg.iY = pRLWinPriv->pFrame->y;
wmMsg.iWidth = pRLWinPriv->pFrame->width;
wmMsg.iHeight = pRLWinPriv->pFrame->height;
fWMMsgInitialized = TRUE;
#if 0
winDebug ("hWnd %08X\n", hwnd);
winDebug ("pScreenPriv %08X\n", pScreenPriv);
winDebug ("pScreenInfo %08X\n", pScreenInfo);
winDebug ("hwndScreen %08X\n", hwndScreen);
if (message >= WM_USER)
{
winDebug("winMWExtWMWindowProc - Message WM_USER + %d",
message - WM_USER);
winDebug(" wParam 0x%x lParam 0x%x\n", wParam, lParam);
}
else if (message < MESSAGE_NAMES_LEN && MESSAGE_NAMES[message])
{
winDebug("winMWExtWMWindowProc - Message %s",
MESSAGE_NAMES[message]);
winDebug(" wParam 0x%x lParam 0x%x\n", wParam, lParam);
}
winDebug ("\thWnd %08X\n", hwnd);
winDebug ("\tpScreenPriv %08X\n", pScreenPriv);
winDebug ("\tpScreenInfo %08X\n", pScreenInfo);
winDebug ("\thwndScreen %08X\n", hwndScreen);
winDebug ("winMWExtWMWindowProc (%08x) %08x %08x %08x\n",
pRLWinPriv, message, wParam, lParam);
#endif
@ -455,7 +482,14 @@ winMWExtWMWindowProc (HWND hwnd, UINT message,
}
else
{
winWindowsWMSendEvent(WindowsWMControllerNotify,
if (winIsInternalWMRunning(pScreenInfo))
{
/* Tell our Window Manager thread to kill the window */
wmMsg.msg = WM_WM_KILL;
if (fWMMsgInitialized)
winSendMessageToWM (pScreenPriv->pWMInfo, &wmMsg);
}
winWindowsWMSendEvent(WindowsWMControllerNotify,
WindowsWMControllerNotifyMask,
1,
WindowsWMCloseWindow,
@ -677,9 +711,9 @@ winMWExtWMWindowProc (HWND hwnd, UINT message,
#if CYGMULTIWINDOW_DEBUG
winDebug ("winMWExtWMWindowProc - WM_MOUSEACTIVATE\n");
#endif
#if 0
#if 1
/* Check if this window needs to be made active when clicked */
if (pWin->overrideRedirect)
if (winIsInternalWMRunning(pScreenInfo) && pWin->overrideRedirect)
{
#if CYGMULTIWINDOW_DEBUG
winDebug ("winMWExtWMWindowProc - WM_MOUSEACTIVATE - "
@ -690,10 +724,11 @@ winMWExtWMWindowProc (HWND hwnd, UINT message,
return MA_NOACTIVATE;
}
#endif
if (!IsMouseActive (pWin)) return MA_NOACTIVATE;
if (!winIsInternalWMRunning(pScreenInfo) && !IsMouseActive (pWin))
return MA_NOACTIVATE;
break;
case WM_KILLFOCUS:
/* Pop any pressed keys since we are losing keyboard focus */
winKeybdReleaseKeys ();
@ -795,6 +830,20 @@ winMWExtWMWindowProc (HWND hwnd, UINT message,
#endif
if (LOWORD(wParam) != WA_INACTIVE)
{
if (winIsInternalWMRunning(pScreenInfo))
{
#if 0
/* Raise the window to the top in Z order */
wmMsg.msg = WM_WM_RAISE;
if (fWMMsgInitialized)
winSendMessageToWM (pScreenPriv->pWMInfo, &wmMsg);
#endif
/* Tell our Window Manager thread to activate the window */
wmMsg.msg = WM_WM_ACTIVATE;
if (fWMMsgInitialized)
if (!pWin || !pWin->overrideRedirect) /* for OOo menus */
winSendMessageToWM (pScreenPriv->pWMInfo, &wmMsg);
}
winWindowsWMSendEvent(WindowsWMControllerNotify,
WindowsWMControllerNotifyMask,
1,
@ -804,13 +853,13 @@ winMWExtWMWindowProc (HWND hwnd, UINT message,
0, 0);
}
return 0;
#if 1
case WM_WINDOWPOSCHANGING:
pWinPos = (LPWINDOWPOS)lParam;
if (!(pWinPos->flags & SWP_NOZORDER))
{
if (pRLWinPriv->fRestackingNow)
if (pRLWinPriv->fRestackingNow || pScreenPriv->fRestacking)
{
#if CYGMULTIWINDOW_DEBUG
winDebug ("Win %08x is now restacking.\n", (unsigned int)pRLWinPriv);
@ -818,7 +867,7 @@ winMWExtWMWindowProc (HWND hwnd, UINT message,
break;
}
if (IsRaiseOnClick (pWin))
if (winIsInternalWMRunning(pScreenInfo) || IsRaiseOnClick (pWin))
{
#if CYGMULTIWINDOW_DEBUG
winDebug ("Win %08x has WINDOWSWM_RAISE_ON_CLICK.\n", (unsigned int)pRLWinPriv);
@ -867,19 +916,52 @@ winMWExtWMWindowProc (HWND hwnd, UINT message,
#endif
if (!pRLWinPriv->fMovingOrSizing)
{
if (winIsInternalWMRunning(pScreenInfo))
winAdjustXWindow (pWin, hwnd);
winMWExtWMMoveXWindow (pWin,
(LOWORD(lParam) - wBorderWidth (pWin)
- GetSystemMetrics (SM_XVIRTUALSCREEN)),
(HIWORD(lParam) - wBorderWidth (pWin)
- GetSystemMetrics (SM_YVIRTUALSCREEN)));
(LOWORD(lParam) - wBorderWidth (pWin)
- GetSystemMetrics (SM_XVIRTUALSCREEN)),
(HIWORD(lParam) - wBorderWidth (pWin)
- GetSystemMetrics (SM_YVIRTUALSCREEN)));
}
return 0;
case WM_SHOWWINDOW:
#if CYGMULTIWINDOW_DEBUG
#if CYGMULTIWINDOW_DEBUG || TRUE
winDebug ("winMWExtWMWindowProc - WM_SHOWWINDOW - %d ms\n",
(unsigned int)GetTickCount ());
#endif
/* Bail out if the window is being hidden */
if (!wParam)
return 0;
if (!pScreenInfo->fInternalWM)//XXXX
return 0;
winMWExtWMUpdateWindowDecoration (pRLWinPriv, pScreenInfo);
if (winIsInternalWMRunning(pScreenInfo))
{
#if CYGMULTIWINDOW_DEBUG || TRUE
winDebug ("\tMapWindow\n");
#endif
/* Tell X to map the window */
MapWindow (pWin, wClient(pWin));
if (!pRLWinPriv->pFrame->win->overrideRedirect)
/* Bring the Windows window to the foreground */
SetForegroundWindow (hwnd);
/* Setup the Window Manager message */
wmMsg.msg = WM_WM_MAP;
wmMsg.iWidth = pRLWinPriv->pFrame->width;
wmMsg.iHeight = pRLWinPriv->pFrame->height;
/* Tell our Window Manager thread to map the window */
if (fWMMsgInitialized)
winSendMessageToWM (pScreenPriv->pWMInfo, &wmMsg);
}
break;
case WM_SIZING:
@ -914,15 +996,23 @@ winMWExtWMWindowProc (HWND hwnd, UINT message,
/* Reorder if window z order was changed */
if ((pScreenPriv != NULL)
&& !(pWinPos->flags & SWP_NOZORDER)
&& !(pWinPos->flags & SWP_SHOWWINDOW))
&& !(pWinPos->flags & SWP_SHOWWINDOW)
&& winIsInternalWMRunning(pScreenInfo))
{
#if CYGMULTIWINDOW_DEBUG
winDebug ("\twindow z order was changed\n");
#endif
if (pWinPos->hwndInsertAfter == HWND_TOP
||pWinPos->hwndInsertAfter == HWND_TOPMOST
||pWinPos->hwndInsertAfter == HWND_NOTOPMOST)
{
vlist[0] = Above;
ConfigureWindow (pWin, CWStackMode,
vlist, wClient(pWin));
#if CYGMULTIWINDOW_DEBUG
winDebug ("\traise to top\n");
#endif
/* Raise the window to the top in Z order */
wmMsg.msg = WM_WM_RAISE;
if (fWMMsgInitialized)
winSendMessageToWM (pScreenPriv->pWMInfo, &wmMsg);
}
#if 1
else if (pWinPos->hwndInsertAfter == HWND_BOTTOM)
@ -943,7 +1033,8 @@ winMWExtWMWindowProc (HWND hwnd, UINT message,
GetWindowThreadProcessId (hWndAbove, &dwWindowProcessID);
if ((dwWindowProcessID == dwCurrentProcessID)
&& GetProp (Above, WIN_WINDOW_PROP)
&& GetProp (hWndAbove, WIN_WINDOW_PROP)
&& !IsWindowVisible (hWndAbove)
&& !IsIconic (hWndAbove) ) /* ignore minimized windows */
break;
}
@ -951,9 +1042,13 @@ winMWExtWMWindowProc (HWND hwnd, UINT message,
raise it in X stack. */
if (hWndAbove == NULL)
{
vlist[0] = Above;
ConfigureWindow (pWin, CWStackMode,
vlist, wClient(pWin));
#if CYGMULTIWINDOW_DEBUG
winDebug ("\traise to top\n");
#endif
/* Raise the window to the top in Z order */
wmMsg.msg = WM_WM_RAISE;
if (fWMMsgInitialized)
winSendMessageToWM (pScreenPriv->pWMInfo, &wmMsg);
}
}
#endif
@ -964,6 +1059,13 @@ winMWExtWMWindowProc (HWND hwnd, UINT message,
#if CYGMULTIWINDOW_DEBUG
winDebug ("\tIconic -> MINIMIZED\n");
#endif
if (winIsInternalWMRunning(pScreenInfo))
{
/* Raise the window to the top in Z order */
wmMsg.msg = WM_WM_LOWER;
if (fWMMsgInitialized)
winSendMessageToWM (pScreenPriv->pWMInfo, &wmMsg);
}
winWindowsWMSendEvent(WindowsWMControllerNotify,
WindowsWMControllerNotifyMask,
1,
@ -1004,33 +1106,42 @@ winMWExtWMWindowProc (HWND hwnd, UINT message,
#if CYGMULTIWINDOW_DEBUG
winDebug ("\tmove & resize\n");
#endif
if (winIsInternalWMRunning(pScreenInfo))
winAdjustXWindow (pWin, hwnd);
winMWExtWMMoveResizeXWindow (pWin,
rcClient.left - wBorderWidth (pWin)
- GetSystemMetrics (SM_XVIRTUALSCREEN),
rcClient.top - wBorderWidth (pWin)
- GetSystemMetrics (SM_YVIRTUALSCREEN),
rcClient.right - rcClient.left
- wBorderWidth (pWin)*2,
rcClient.bottom - rcClient.top
- wBorderWidth (pWin)*2);
rcClient.left - wBorderWidth (pWin)
- GetSystemMetrics (SM_XVIRTUALSCREEN),
rcClient.top - wBorderWidth (pWin)
- GetSystemMetrics (SM_YVIRTUALSCREEN),
rcClient.right - rcClient.left
- wBorderWidth (pWin)*2,
rcClient.bottom - rcClient.top
- wBorderWidth (pWin)*2);
} else if (!(pWinPos->flags & SWP_NOMOVE)) {
#if CYGMULTIWINDOW_DEBUG
winDebug ("\tmove\n");
#endif
if (winIsInternalWMRunning(pScreenInfo))
winAdjustXWindow (pWin, hwnd);
winMWExtWMMoveXWindow (pWin,
rcClient.left - wBorderWidth (pWin)
- GetSystemMetrics (SM_XVIRTUALSCREEN),
rcClient.top - wBorderWidth (pWin)
- GetSystemMetrics (SM_YVIRTUALSCREEN));
rcClient.left - wBorderWidth (pWin)
- GetSystemMetrics (SM_XVIRTUALSCREEN),
rcClient.top - wBorderWidth (pWin)
- GetSystemMetrics (SM_YVIRTUALSCREEN));
} else if (!(pWinPos->flags & SWP_NOSIZE)) {
#if CYGMULTIWINDOW_DEBUG
winDebug ("\tresize\n");
#endif
if (winIsInternalWMRunning(pScreenInfo))
winAdjustXWindow (pWin, hwnd);
winMWExtWMResizeXWindow (pWin,
rcClient.right - rcClient.left
- wBorderWidth (pWin)*2,
rcClient.bottom - rcClient.top
- wBorderWidth (pWin)*2);
rcClient.right - rcClient.left
- wBorderWidth (pWin)*2,
rcClient.bottom - rcClient.top
- wBorderWidth (pWin)*2);
}
}
}
@ -1059,6 +1170,13 @@ winMWExtWMWindowProc (HWND hwnd, UINT message,
#if CYGMULTIWINDOW_DEBUG
winDebug ("\tSIZE_MINIMIZED\n");
#endif
if (winIsInternalWMRunning(pScreenInfo))
{
/* Raise the window to the top in Z order */
wmMsg.msg = WM_WM_LOWER;
if (fWMMsgInitialized)
winSendMessageToWM (pScreenPriv->pWMInfo, &wmMsg);
}
winWindowsWMSendEvent(WindowsWMControllerNotify,
WindowsWMControllerNotifyMask,
1,
@ -1098,17 +1216,30 @@ winMWExtWMWindowProc (HWND hwnd, UINT message,
/* Perform the resize and notify the X client */
if (!pRLWinPriv->fMovingOrSizing)
{
if (winIsInternalWMRunning(pScreenInfo))
winAdjustXWindow (pWin, hwnd);
winMWExtWMResizeXWindow (pWin,
(short) LOWORD(lParam)
- wBorderWidth (pWin)*2,
(short) HIWORD(lParam)
- wBorderWidth (pWin)*2);
(short) LOWORD(lParam)
- wBorderWidth (pWin)*2,
(short) HIWORD(lParam)
- wBorderWidth (pWin)*2);
}
break;
case WM_ACTIVATEAPP:
#if CYGMULTIWINDOW_DEBUG
winDebug ("winMWExtWMWindowProc - WM_ACTIVATEAPP - %d ms\n",
(unsigned int)GetTickCount ());
#endif
if (wParam)
{
if (winIsInternalWMRunning(pScreenInfo))
{
}
else
{
}
winWindowsWMSendEvent(WindowsWMActivationNotify,
WindowsWMActivationNotifyMask,
1,
@ -1155,15 +1286,27 @@ winMWExtWMWindowProc (HWND hwnd, UINT message,
GetClientRect (hwnd, &rcClient);
MapWindowPoints (hwnd, HWND_DESKTOP, (LPPOINT)&rcClient, 2);
if (winIsInternalWMRunning(pScreenInfo))
winAdjustXWindow (pWin, hwnd);
winMWExtWMMoveResizeXWindow (pWin,
rcClient.left - wBorderWidth (pWin)
- GetSystemMetrics (SM_XVIRTUALSCREEN),
rcClient.top - wBorderWidth (pWin)
- GetSystemMetrics (SM_YVIRTUALSCREEN),
rcClient.right - rcClient.left
- wBorderWidth (pWin)*2,
rcClient.bottom - rcClient.top
- wBorderWidth (pWin)*2);
rcClient.left - wBorderWidth (pWin)
- GetSystemMetrics (SM_XVIRTUALSCREEN),
rcClient.top - wBorderWidth (pWin)
- GetSystemMetrics (SM_YVIRTUALSCREEN),
rcClient.right - rcClient.left
- wBorderWidth (pWin)*2,
rcClient.bottom - rcClient.top
- wBorderWidth (pWin)*2);
break;
case WM_MANAGE:
ErrorF ("winMWExtWMWindowProc - WM_MANAGE\n");
break;
case WM_UNMANAGE:
ErrorF ("winMWExtWMWindowProc - WM_UNMANAGE\n");
break;
default:

View File

@ -49,7 +49,6 @@
#define WIN_MSG_QUEUE_FNAME "/dev/windows"
#define WIN_WID_PROP "cyg_wid_prop_rl"
#define WIN_NEEDMANAGE_PROP "cyg_override_redirect_prop_rl"
#define WIN_HWND_CACHE "cyg_privmap_rl"
#ifndef CYGMULTIWINDOW_DEBUG
#define CYGMULTIWINDOW_DEBUG NO
#endif
@ -105,9 +104,11 @@ typedef struct _winWMMessageRec{
#define WM_WM_UNMAP (WM_USER + 6)
#define WM_WM_KILL (WM_USER + 7)
#define WM_WM_ACTIVATE (WM_USER + 8)
#define WM_WM_NAME_EVENT (WM_USER + 9)
#define WM_WM_HINTS_EVENT (WM_USER + 10)
#define WM_WM_NAME_EVENT (WM_USER + 9)
#define WM_WM_HINTS_EVENT (WM_USER + 10)
#define WM_WM_CHANGE_STATE (WM_USER + 11)
#define WM_MANAGE (WM_USER + 100)
#define WM_UNMANAGE (WM_USER + 102)
void
winSendMessageToWM (void *pWMInfo, winWMMessagePtr msg);
@ -117,7 +118,8 @@ winInitWM (void **ppWMInfo,
pthread_t *ptWMProc,
pthread_t *ptXMsgProc,
pthread_mutex_t *ppmServerStarted,
int dwScreen);
int dwScreen,
HWND hwndScreen);
void
winDeinitMultiWindowWM (void);

View File

@ -56,7 +56,8 @@ extern Bool g_fClipboard;
extern HWND g_hDlgDepthChange;
extern Bool g_fKeyboardHookLL;
extern HWND g_hwndKeyboardFocus;
extern Bool g_fSoftwareCursor;
extern Bool g_fSoftwareCursor;
extern DWORD g_dwCurrentThreadID;
/*
* Called by winWakeupHandler
@ -1131,7 +1132,7 @@ winWindowProc (HWND hwnd, UINT message,
|| s_pScreenInfo->fIgnoreInput)
break;
#if CYGDEBUG
#if CYGDEBUG || TRUE
winDebug ("winWindowProc - WM_ACTIVATEAPP\n");
#endif
@ -1152,6 +1153,14 @@ winWindowProc (HWND hwnd, UINT message,
/* Call engine specific screen activation/deactivation function */
(*s_pScreenPriv->pwinActivateApp) (s_pScreen);
if (s_pScreenPriv->fActive)
{
/* Restack all window unless using built-in wm. */
if (s_pScreenInfo->fInternalWM && s_pScreenInfo->fAnotherWMRunning)
winMWExtWMRestackWindows (s_pScreen);
}
return 0;
case WM_COMMAND:
@ -1161,9 +1170,9 @@ winWindowProc (HWND hwnd, UINT message,
/* Display Exit dialog */
winDisplayExitDialog (s_pScreenPriv);
return 0;
case ID_APP_SHOWCURSOR:
winDebug("ShowCursor: %d\n", ShowCursor(TRUE));
return 0;
case ID_APP_SHOWCURSOR:
winDebug("ShowCursor: %d\n", ShowCursor(TRUE));
return 0;
#ifdef XWIN_MULTIWINDOW
case ID_APP_HIDE_ROOT:
@ -1210,6 +1219,28 @@ winWindowProc (HWND hwnd, UINT message,
}
break;
case WM_MANAGE:
ErrorF ("winWindowProc - WM_MANAGE\n");
s_pScreenInfo->fAnotherWMRunning = FALSE;
if (s_pScreenInfo->fInternalWM)
{
EnumThreadWindows (g_dwCurrentThreadID, winMWExtWMDecorateWindow, 0);
//RootlessRepositionWindows (s_pScreen);
}
break;
case WM_UNMANAGE:
ErrorF ("winWindowProc - WM_UNMANAGE\n");
s_pScreenInfo->fAnotherWMRunning = TRUE;
if (s_pScreenInfo->fInternalWM)
{
EnumThreadWindows (g_dwCurrentThreadID, winMWExtWMDecorateWindow, 0);
winMWExtWMRestackWindows (s_pScreen);
}
break;
default:
if(message == s_uTaskbarRestart)
{