1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun *Copyright (C) 1994-2000 The XFree86 Project, Inc. All Rights Reserved.
3*4882a593Smuzhiyun *
4*4882a593Smuzhiyun *Permission is hereby granted, free of charge, to any person obtaining
5*4882a593Smuzhiyun * a copy of this software and associated documentation files (the
6*4882a593Smuzhiyun *"Software"), to deal in the Software without restriction, including
7*4882a593Smuzhiyun *without limitation the rights to use, copy, modify, merge, publish,
8*4882a593Smuzhiyun *distribute, sublicense, and/or sell copies of the Software, and to
9*4882a593Smuzhiyun *permit persons to whom the Software is furnished to do so, subject to
10*4882a593Smuzhiyun *the following conditions:
11*4882a593Smuzhiyun *
12*4882a593Smuzhiyun *The above copyright notice and this permission notice shall be
13*4882a593Smuzhiyun *included in all copies or substantial portions of the Software.
14*4882a593Smuzhiyun *
15*4882a593Smuzhiyun *THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16*4882a593Smuzhiyun *EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17*4882a593Smuzhiyun *MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
18*4882a593Smuzhiyun *NONINFRINGEMENT. IN NO EVENT SHALL THE XFREE86 PROJECT BE LIABLE FOR
19*4882a593Smuzhiyun *ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
20*4882a593Smuzhiyun *CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
21*4882a593Smuzhiyun *WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22*4882a593Smuzhiyun *
23*4882a593Smuzhiyun *Except as contained in this notice, the name of the XFree86 Project
24*4882a593Smuzhiyun *shall not be used in advertising or otherwise to promote the sale, use
25*4882a593Smuzhiyun *or other dealings in this Software without prior written authorization
26*4882a593Smuzhiyun *from the XFree86 Project.
27*4882a593Smuzhiyun *
28*4882a593Smuzhiyun * Authors: Kensuke Matsuzaki
29*4882a593Smuzhiyun * Earle F. Philhower, III
30*4882a593Smuzhiyun * Harold L Hunt II
31*4882a593Smuzhiyun */
32*4882a593Smuzhiyun
33*4882a593Smuzhiyun #ifdef HAVE_XWIN_CONFIG_H
34*4882a593Smuzhiyun #include <xwin-config.h>
35*4882a593Smuzhiyun #endif
36*4882a593Smuzhiyun #include "win.h"
37*4882a593Smuzhiyun #include "winprefs.h"
38*4882a593Smuzhiyun
39*4882a593Smuzhiyun #if 0
40*4882a593Smuzhiyun /*
41*4882a593Smuzhiyun * winMWExtWMReorderWindows
42*4882a593Smuzhiyun */
43*4882a593Smuzhiyun
44*4882a593Smuzhiyun void
45*4882a593Smuzhiyun winMWExtWMReorderWindows(ScreenPtr pScreen)
46*4882a593Smuzhiyun {
47*4882a593Smuzhiyun winScreenPriv(pScreen);
48*4882a593Smuzhiyun HWND hwnd = NULL;
49*4882a593Smuzhiyun win32RootlessWindowPtr pRLWin = NULL;
50*4882a593Smuzhiyun win32RootlessWindowPtr pRLWinSib = NULL;
51*4882a593Smuzhiyun DWORD dwCurrentProcessID = GetCurrentProcessId();
52*4882a593Smuzhiyun DWORD dwWindowProcessID = 0;
53*4882a593Smuzhiyun XID vlist[2];
54*4882a593Smuzhiyun
55*4882a593Smuzhiyun #if CYGMULTIWINDOW_DEBUG && FALSE
56*4882a593Smuzhiyun winDebug("winMWExtWMReorderWindows\n");
57*4882a593Smuzhiyun #endif
58*4882a593Smuzhiyun
59*4882a593Smuzhiyun pScreenPriv->fRestacking = TRUE;
60*4882a593Smuzhiyun
61*4882a593Smuzhiyun if (pScreenPriv->fWindowOrderChanged) {
62*4882a593Smuzhiyun #if CYGMULTIWINDOW_DEBUG
63*4882a593Smuzhiyun winDebug("winMWExtWMReorderWindows - Need to restack\n");
64*4882a593Smuzhiyun #endif
65*4882a593Smuzhiyun hwnd = GetTopWindow(NULL);
66*4882a593Smuzhiyun
67*4882a593Smuzhiyun while (hwnd) {
68*4882a593Smuzhiyun GetWindowThreadProcessId(hwnd, &dwWindowProcessID);
69*4882a593Smuzhiyun
70*4882a593Smuzhiyun if ((dwWindowProcessID == dwCurrentProcessID)
71*4882a593Smuzhiyun && GetProp(hwnd, WIN_WINDOW_PROP)) {
72*4882a593Smuzhiyun pRLWinSib = pRLWin;
73*4882a593Smuzhiyun pRLWin =
74*4882a593Smuzhiyun (win32RootlessWindowPtr) GetProp(hwnd, WIN_WINDOW_PROP);
75*4882a593Smuzhiyun
76*4882a593Smuzhiyun if (pRLWinSib) {
77*4882a593Smuzhiyun vlist[0] = pRLWinSib->pFrame->win->drawable.id;
78*4882a593Smuzhiyun vlist[1] = Below;
79*4882a593Smuzhiyun
80*4882a593Smuzhiyun ConfigureWindow(pRLWin->pFrame->win,
81*4882a593Smuzhiyun CWSibling | CWStackMode, vlist,
82*4882a593Smuzhiyun wClient(pRLWin->pFrame->win));
83*4882a593Smuzhiyun }
84*4882a593Smuzhiyun else {
85*4882a593Smuzhiyun /* 1st window - raise to the top */
86*4882a593Smuzhiyun vlist[0] = Above;
87*4882a593Smuzhiyun
88*4882a593Smuzhiyun ConfigureWindow(pRLWin->pFrame->win, CWStackMode,
89*4882a593Smuzhiyun vlist, wClient(pRLWin->pFrame->win));
90*4882a593Smuzhiyun }
91*4882a593Smuzhiyun }
92*4882a593Smuzhiyun hwnd = GetNextWindow(hwnd, GW_HWNDNEXT);
93*4882a593Smuzhiyun }
94*4882a593Smuzhiyun }
95*4882a593Smuzhiyun
96*4882a593Smuzhiyun pScreenPriv->fRestacking = FALSE;
97*4882a593Smuzhiyun pScreenPriv->fWindowOrderChanged = FALSE;
98*4882a593Smuzhiyun }
99*4882a593Smuzhiyun #endif
100*4882a593Smuzhiyun
101*4882a593Smuzhiyun /*
102*4882a593Smuzhiyun * winMWExtWMMoveXWindow
103*4882a593Smuzhiyun */
104*4882a593Smuzhiyun
105*4882a593Smuzhiyun void
winMWExtWMMoveXWindow(WindowPtr pWin,int x,int y)106*4882a593Smuzhiyun winMWExtWMMoveXWindow(WindowPtr pWin, int x, int y)
107*4882a593Smuzhiyun {
108*4882a593Smuzhiyun CARD32 *vlist = malloc(sizeof(CARD32) * 2);
109*4882a593Smuzhiyun
110*4882a593Smuzhiyun vlist[0] = x;
111*4882a593Smuzhiyun vlist[1] = y;
112*4882a593Smuzhiyun ConfigureWindow(pWin, CWX | CWY, vlist, wClient(pWin));
113*4882a593Smuzhiyun free(vlist);
114*4882a593Smuzhiyun }
115*4882a593Smuzhiyun
116*4882a593Smuzhiyun /*
117*4882a593Smuzhiyun * winMWExtWMResizeXWindow
118*4882a593Smuzhiyun */
119*4882a593Smuzhiyun
120*4882a593Smuzhiyun void
winMWExtWMResizeXWindow(WindowPtr pWin,int w,int h)121*4882a593Smuzhiyun winMWExtWMResizeXWindow(WindowPtr pWin, int w, int h)
122*4882a593Smuzhiyun {
123*4882a593Smuzhiyun CARD32 *vlist = malloc(sizeof(CARD32) * 2);
124*4882a593Smuzhiyun
125*4882a593Smuzhiyun vlist[0] = w;
126*4882a593Smuzhiyun vlist[1] = h;
127*4882a593Smuzhiyun ConfigureWindow(pWin, CWWidth | CWHeight, vlist, wClient(pWin));
128*4882a593Smuzhiyun free(vlist);
129*4882a593Smuzhiyun }
130*4882a593Smuzhiyun
131*4882a593Smuzhiyun /*
132*4882a593Smuzhiyun * winMWExtWMMoveResizeXWindow
133*4882a593Smuzhiyun */
134*4882a593Smuzhiyun
135*4882a593Smuzhiyun void
winMWExtWMMoveResizeXWindow(WindowPtr pWin,int x,int y,int w,int h)136*4882a593Smuzhiyun winMWExtWMMoveResizeXWindow(WindowPtr pWin, int x, int y, int w, int h)
137*4882a593Smuzhiyun {
138*4882a593Smuzhiyun CARD32 *vlist = malloc(sizeof(long) * 4);
139*4882a593Smuzhiyun
140*4882a593Smuzhiyun vlist[0] = x;
141*4882a593Smuzhiyun vlist[1] = y;
142*4882a593Smuzhiyun vlist[2] = w;
143*4882a593Smuzhiyun vlist[3] = h;
144*4882a593Smuzhiyun
145*4882a593Smuzhiyun ConfigureWindow(pWin, CWX | CWY | CWWidth | CWHeight, vlist, wClient(pWin));
146*4882a593Smuzhiyun free(vlist);
147*4882a593Smuzhiyun }
148*4882a593Smuzhiyun
149*4882a593Smuzhiyun /*
150*4882a593Smuzhiyun
151*4882a593Smuzhiyun
152*4882a593Smuzhiyun * winMWExtWMDecorateWindow - Update window style. Called by EnumWindows.
153*4882a593Smuzhiyun */
154*4882a593Smuzhiyun
155*4882a593Smuzhiyun wBOOL CALLBACK
winMWExtWMDecorateWindow(HWND hwnd,LPARAM lParam)156*4882a593Smuzhiyun winMWExtWMDecorateWindow(HWND hwnd, LPARAM lParam)
157*4882a593Smuzhiyun {
158*4882a593Smuzhiyun win32RootlessWindowPtr pRLWinPriv = NULL;
159*4882a593Smuzhiyun ScreenPtr pScreen = NULL;
160*4882a593Smuzhiyun winPrivScreenPtr pScreenPriv = NULL;
161*4882a593Smuzhiyun winScreenInfo *pScreenInfo = NULL;
162*4882a593Smuzhiyun
163*4882a593Smuzhiyun /* Check if the Windows window property for our X window pointer is valid */
164*4882a593Smuzhiyun if ((pRLWinPriv =
165*4882a593Smuzhiyun (win32RootlessWindowPtr) GetProp(hwnd, WIN_WINDOW_PROP)) != NULL) {
166*4882a593Smuzhiyun if (pRLWinPriv != NULL && pRLWinPriv->pFrame != NULL &&
167*4882a593Smuzhiyun pRLWinPriv->pFrame->win != NULL)
168*4882a593Smuzhiyun pScreen = pRLWinPriv->pFrame->win->drawable.pScreen;
169*4882a593Smuzhiyun if (pScreen)
170*4882a593Smuzhiyun pScreenPriv = winGetScreenPriv(pScreen);
171*4882a593Smuzhiyun if (pScreenPriv)
172*4882a593Smuzhiyun pScreenInfo = pScreenPriv->pScreenInfo;
173*4882a593Smuzhiyun if (pRLWinPriv && pScreenInfo)
174*4882a593Smuzhiyun winMWExtWMUpdateWindowDecoration(pRLWinPriv, pScreenInfo);
175*4882a593Smuzhiyun }
176*4882a593Smuzhiyun return TRUE;
177*4882a593Smuzhiyun }
178*4882a593Smuzhiyun
179*4882a593Smuzhiyun /*
180*4882a593Smuzhiyun * winMWExtWMUpdateWindowDecoration - Update window style.
181*4882a593Smuzhiyun */
182*4882a593Smuzhiyun
183*4882a593Smuzhiyun void
winMWExtWMUpdateWindowDecoration(win32RootlessWindowPtr pRLWinPriv,winScreenInfoPtr pScreenInfo)184*4882a593Smuzhiyun winMWExtWMUpdateWindowDecoration(win32RootlessWindowPtr pRLWinPriv,
185*4882a593Smuzhiyun winScreenInfoPtr pScreenInfo)
186*4882a593Smuzhiyun {
187*4882a593Smuzhiyun Bool fDecorate = FALSE;
188*4882a593Smuzhiyun DWORD dwExStyle = 0;
189*4882a593Smuzhiyun WINDOWPLACEMENT wndPlace;
190*4882a593Smuzhiyun UINT showCmd = 0;
191*4882a593Smuzhiyun
192*4882a593Smuzhiyun wndPlace.length = sizeof(WINDOWPLACEMENT);
193*4882a593Smuzhiyun
194*4882a593Smuzhiyun /* Get current window placement */
195*4882a593Smuzhiyun GetWindowPlacement(pRLWinPriv->hWnd, &wndPlace);
196*4882a593Smuzhiyun
197*4882a593Smuzhiyun #if 0
198*4882a593Smuzhiyun if (wndPlace.showCmd == SW_HIDE)
199*4882a593Smuzhiyun return; //showCmd = SWP_HIDEWINDOW;
200*4882a593Smuzhiyun else
201*4882a593Smuzhiyun showCmd = SWP_SHOWWINDOW;
202*4882a593Smuzhiyun #else
203*4882a593Smuzhiyun if (wndPlace.showCmd == SW_HIDE)
204*4882a593Smuzhiyun return;
205*4882a593Smuzhiyun
206*4882a593Smuzhiyun if (IsWindowVisible(pRLWinPriv->hWnd))
207*4882a593Smuzhiyun showCmd = SWP_SHOWWINDOW;
208*4882a593Smuzhiyun #endif
209*4882a593Smuzhiyun
210*4882a593Smuzhiyun showCmd |= SWP_NOMOVE | SWP_FRAMECHANGED | SWP_NOACTIVATE | SWP_NOZORDER;
211*4882a593Smuzhiyun
212*4882a593Smuzhiyun winDebug("winMWExtWMUpdateWindowDecoration %p %s\n",
213*4882a593Smuzhiyun pRLWinPriv, fDecorate ? "Decorate" : "Bare");
214*4882a593Smuzhiyun
215*4882a593Smuzhiyun /* Get the extended window style information */
216*4882a593Smuzhiyun dwExStyle = GetWindowLongPtr(pRLWinPriv->hWnd, GWL_EXSTYLE);
217*4882a593Smuzhiyun
218*4882a593Smuzhiyun if (fDecorate) {
219*4882a593Smuzhiyun RECT rcNew;
220*4882a593Smuzhiyun int iDx, iDy;
221*4882a593Smuzhiyun winWMMessageRec wmMsg;
222*4882a593Smuzhiyun
223*4882a593Smuzhiyun winScreenPriv(pScreenInfo->pScreen);
224*4882a593Smuzhiyun
225*4882a593Smuzhiyun /* */
226*4882a593Smuzhiyun if (!(dwExStyle & WS_EX_APPWINDOW)) {
227*4882a593Smuzhiyun winDebug("\tBare=>Decorate\n");
228*4882a593Smuzhiyun /* Setup a rectangle with the X window position and size */
229*4882a593Smuzhiyun SetRect(&rcNew,
230*4882a593Smuzhiyun pRLWinPriv->pFrame->x,
231*4882a593Smuzhiyun pRLWinPriv->pFrame->y,
232*4882a593Smuzhiyun pRLWinPriv->pFrame->x + pRLWinPriv->pFrame->width,
233*4882a593Smuzhiyun pRLWinPriv->pFrame->y + pRLWinPriv->pFrame->height);
234*4882a593Smuzhiyun
235*4882a593Smuzhiyun #ifdef CYGMULTIWINDOW_DEBUG
236*4882a593Smuzhiyun winDebug("\tWindow extend {%d, %d, %d, %d}, {%d, %d}\n",
237*4882a593Smuzhiyun rcNew.left, rcNew.top, rcNew.right, rcNew.bottom,
238*4882a593Smuzhiyun rcNew.right - rcNew.left, rcNew.bottom - rcNew.top);
239*4882a593Smuzhiyun #endif
240*4882a593Smuzhiyun /* */
241*4882a593Smuzhiyun AdjustWindowRectEx(&rcNew,
242*4882a593Smuzhiyun WS_POPUP | WS_SIZEBOX | WS_OVERLAPPEDWINDOW,
243*4882a593Smuzhiyun FALSE, WS_EX_APPWINDOW);
244*4882a593Smuzhiyun
245*4882a593Smuzhiyun #ifdef CYGMULTIWINDOW_DEBUG
246*4882a593Smuzhiyun winDebug("\tAdjusted {%d, %d, %d, %d}, {%d, %d}\n",
247*4882a593Smuzhiyun rcNew.left, rcNew.top, rcNew.right, rcNew.bottom,
248*4882a593Smuzhiyun rcNew.right - rcNew.left, rcNew.bottom - rcNew.top);
249*4882a593Smuzhiyun #endif
250*4882a593Smuzhiyun /* Calculate position deltas */
251*4882a593Smuzhiyun iDx = pRLWinPriv->pFrame->x - rcNew.left;
252*4882a593Smuzhiyun iDy = pRLWinPriv->pFrame->y - rcNew.top;
253*4882a593Smuzhiyun
254*4882a593Smuzhiyun /* Calculate new rectangle */
255*4882a593Smuzhiyun rcNew.left += iDx;
256*4882a593Smuzhiyun rcNew.right += iDx;
257*4882a593Smuzhiyun rcNew.top += iDy;
258*4882a593Smuzhiyun rcNew.bottom += iDy;
259*4882a593Smuzhiyun
260*4882a593Smuzhiyun /* Set the window extended style flags */
261*4882a593Smuzhiyun SetWindowLongPtr(pRLWinPriv->hWnd, GWL_EXSTYLE, WS_EX_APPWINDOW);
262*4882a593Smuzhiyun
263*4882a593Smuzhiyun /* Set the window standard style flags */
264*4882a593Smuzhiyun SetWindowLongPtr(pRLWinPriv->hWnd, GWL_STYLE,
265*4882a593Smuzhiyun WS_POPUP | WS_SIZEBOX | WS_OVERLAPPEDWINDOW);
266*4882a593Smuzhiyun
267*4882a593Smuzhiyun #ifdef CYGMULTIWINDOW_DEBUG
268*4882a593Smuzhiyun winDebug("\tWindowStyle: %08x %08x\n",
269*4882a593Smuzhiyun WS_POPUP | WS_SIZEBOX | WS_OVERLAPPEDWINDOW,
270*4882a593Smuzhiyun WS_EX_APPWINDOW);
271*4882a593Smuzhiyun #endif
272*4882a593Smuzhiyun /* Position the Windows window */
273*4882a593Smuzhiyun #ifdef CYGMULTIWINDOW_DEBUG
274*4882a593Smuzhiyun winDebug("\tMoved {%d, %d, %d, %d}, {%d, %d}\n",
275*4882a593Smuzhiyun rcNew.left, rcNew.top, rcNew.right, rcNew.bottom,
276*4882a593Smuzhiyun rcNew.right - rcNew.left, rcNew.bottom - rcNew.top);
277*4882a593Smuzhiyun #endif
278*4882a593Smuzhiyun SetWindowPos(pRLWinPriv->hWnd, NULL,
279*4882a593Smuzhiyun rcNew.left, rcNew.top,
280*4882a593Smuzhiyun rcNew.right - rcNew.left, rcNew.bottom - rcNew.top,
281*4882a593Smuzhiyun showCmd);
282*4882a593Smuzhiyun
283*4882a593Smuzhiyun wmMsg.hwndWindow = pRLWinPriv->hWnd;
284*4882a593Smuzhiyun wmMsg.iWindow = (Window) pRLWinPriv->pFrame->win->drawable.id;
285*4882a593Smuzhiyun wmMsg.msg = WM_WM_NAME_EVENT;
286*4882a593Smuzhiyun winSendMessageToWM(pScreenPriv->pWMInfo, &wmMsg);
287*4882a593Smuzhiyun
288*4882a593Smuzhiyun winMWExtWMReshapeFrame((RootlessFrameID) pRLWinPriv,
289*4882a593Smuzhiyun wBoundingShape(pRLWinPriv->pFrame->win));
290*4882a593Smuzhiyun }
291*4882a593Smuzhiyun }
292*4882a593Smuzhiyun else {
293*4882a593Smuzhiyun RECT rcNew;
294*4882a593Smuzhiyun
295*4882a593Smuzhiyun /* */
296*4882a593Smuzhiyun if (dwExStyle & WS_EX_APPWINDOW) {
297*4882a593Smuzhiyun winDebug("\tDecorate=>Bare\n");
298*4882a593Smuzhiyun /* Setup a rectangle with the X window position and size */
299*4882a593Smuzhiyun SetRect(&rcNew,
300*4882a593Smuzhiyun pRLWinPriv->pFrame->x,
301*4882a593Smuzhiyun pRLWinPriv->pFrame->y,
302*4882a593Smuzhiyun pRLWinPriv->pFrame->x + pRLWinPriv->pFrame->width,
303*4882a593Smuzhiyun pRLWinPriv->pFrame->y + pRLWinPriv->pFrame->height);
304*4882a593Smuzhiyun #if 0
305*4882a593Smuzhiyun /* */
306*4882a593Smuzhiyun AdjustWindowRectEx(&rcNew,
307*4882a593Smuzhiyun WS_POPUP | WS_CLIPCHILDREN,
308*4882a593Smuzhiyun FALSE, WS_EX_TOOLWINDOW);
309*4882a593Smuzhiyun
310*4882a593Smuzhiyun /* Calculate position deltas */
311*4882a593Smuzhiyun iDx = pRLWinPriv->pFrame->x - rcNew.left;
312*4882a593Smuzhiyun iDy = pRLWinPriv->pFrame->y - rcNew.top;
313*4882a593Smuzhiyun
314*4882a593Smuzhiyun /* Calculate new rectangle */
315*4882a593Smuzhiyun rcNew.left += iDx;
316*4882a593Smuzhiyun rcNew.right += iDx;
317*4882a593Smuzhiyun rcNew.top += iDy;
318*4882a593Smuzhiyun rcNew.bottom += iDy;
319*4882a593Smuzhiyun #endif
320*4882a593Smuzhiyun
321*4882a593Smuzhiyun /* Hide window temporary to remove from taskbar. */
322*4882a593Smuzhiyun ShowWindow(pRLWinPriv->hWnd, SW_HIDE);
323*4882a593Smuzhiyun
324*4882a593Smuzhiyun /* Set the window extended style flags */
325*4882a593Smuzhiyun SetWindowLongPtr(pRLWinPriv->hWnd, GWL_EXSTYLE, WS_EX_TOOLWINDOW);
326*4882a593Smuzhiyun
327*4882a593Smuzhiyun /* Set the window standard style flags */
328*4882a593Smuzhiyun SetWindowLongPtr(pRLWinPriv->hWnd, GWL_STYLE,
329*4882a593Smuzhiyun WS_POPUP | WS_CLIPCHILDREN);
330*4882a593Smuzhiyun
331*4882a593Smuzhiyun /* Position the Windows window */
332*4882a593Smuzhiyun SetWindowPos(pRLWinPriv->hWnd, NULL,
333*4882a593Smuzhiyun rcNew.left, rcNew.top,
334*4882a593Smuzhiyun rcNew.right - rcNew.left, rcNew.bottom - rcNew.top,
335*4882a593Smuzhiyun showCmd);
336*4882a593Smuzhiyun
337*4882a593Smuzhiyun winMWExtWMReshapeFrame((RootlessFrameID) pRLWinPriv,
338*4882a593Smuzhiyun wBoundingShape(pRLWinPriv->pFrame->win));
339*4882a593Smuzhiyun }
340*4882a593Smuzhiyun }
341*4882a593Smuzhiyun }
342*4882a593Smuzhiyun
343*4882a593Smuzhiyun /*
344*4882a593Smuzhiyun * winMWExtWMRestackWindows
345*4882a593Smuzhiyun */
346*4882a593Smuzhiyun
347*4882a593Smuzhiyun void
winMWExtWMRestackWindows(ScreenPtr pScreen)348*4882a593Smuzhiyun winMWExtWMRestackWindows(ScreenPtr pScreen)
349*4882a593Smuzhiyun {
350*4882a593Smuzhiyun winScreenPriv(pScreen);
351*4882a593Smuzhiyun WindowPtr pRoot = pScreen->root;
352*4882a593Smuzhiyun WindowPtr pWin = NULL;
353*4882a593Smuzhiyun WindowPtr pWinPrev = NULL;
354*4882a593Smuzhiyun win32RootlessWindowPtr pRLWin = NULL;
355*4882a593Smuzhiyun win32RootlessWindowPtr pRLWinPrev = NULL;
356*4882a593Smuzhiyun int nWindow = 0;
357*4882a593Smuzhiyun HDWP hWinPosInfo = NULL;
358*4882a593Smuzhiyun
359*4882a593Smuzhiyun #if CYGMULTIWINDOW_DEBUG
360*4882a593Smuzhiyun winDebug("winMWExtWMRestackWindows\n");
361*4882a593Smuzhiyun #endif
362*4882a593Smuzhiyun
363*4882a593Smuzhiyun pScreenPriv->fRestacking = TRUE;
364*4882a593Smuzhiyun
365*4882a593Smuzhiyun if (pRoot != NULL) {
366*4882a593Smuzhiyun for (pWin = pRoot->firstChild; pWin; pWin = pWin->nextSib)
367*4882a593Smuzhiyun nWindow++;
368*4882a593Smuzhiyun
369*4882a593Smuzhiyun hWinPosInfo = BeginDeferWindowPos(nWindow);
370*4882a593Smuzhiyun
371*4882a593Smuzhiyun for (pWin = pRoot->firstChild; pWin; pWin = pWin->nextSib) {
372*4882a593Smuzhiyun if (pWin->realized) {
373*4882a593Smuzhiyun UINT uFlags;
374*4882a593Smuzhiyun
375*4882a593Smuzhiyun pRLWin =
376*4882a593Smuzhiyun (win32RootlessWindowPtr) RootlessFrameForWindow(pWin,
377*4882a593Smuzhiyun FALSE);
378*4882a593Smuzhiyun if (pRLWin == NULL)
379*4882a593Smuzhiyun continue;
380*4882a593Smuzhiyun
381*4882a593Smuzhiyun if (pWinPrev)
382*4882a593Smuzhiyun pRLWinPrev =
383*4882a593Smuzhiyun (win32RootlessWindowPtr)
384*4882a593Smuzhiyun RootlessFrameForWindow(pWinPrev, FALSE);
385*4882a593Smuzhiyun
386*4882a593Smuzhiyun uFlags = SWP_NOMOVE | SWP_NOSIZE | SWP_SHOWWINDOW;
387*4882a593Smuzhiyun if (pRLWinPrev != NULL)
388*4882a593Smuzhiyun uFlags |= SWP_NOACTIVATE;
389*4882a593Smuzhiyun
390*4882a593Smuzhiyun #if CYGMULTIWINDOW_DEBUG
391*4882a593Smuzhiyun winDebug
392*4882a593Smuzhiyun ("winMWExtWMRestackWindows - DeferWindowPos (%p, %p)\n",
393*4882a593Smuzhiyun pRLWin->hWnd, pRLWinPrev ? pRLWinPrev->hWnd : HWND_TOP);
394*4882a593Smuzhiyun #endif
395*4882a593Smuzhiyun hWinPosInfo = DeferWindowPos(hWinPosInfo, pRLWin->hWnd,
396*4882a593Smuzhiyun pRLWinPrev ? pRLWinPrev->
397*4882a593Smuzhiyun hWnd : HWND_TOP, 0, 0, 0, 0,
398*4882a593Smuzhiyun uFlags);
399*4882a593Smuzhiyun if (hWinPosInfo == NULL) {
400*4882a593Smuzhiyun ErrorF
401*4882a593Smuzhiyun ("winMWExtWMRestackWindows - DeferWindowPos () failed: %d\n",
402*4882a593Smuzhiyun (int) GetLastError());
403*4882a593Smuzhiyun return;
404*4882a593Smuzhiyun }
405*4882a593Smuzhiyun pWinPrev = pWin;
406*4882a593Smuzhiyun }
407*4882a593Smuzhiyun }
408*4882a593Smuzhiyun if (!EndDeferWindowPos(hWinPosInfo)) {
409*4882a593Smuzhiyun ErrorF
410*4882a593Smuzhiyun ("winMWExtWMRestackWindows - EndDeferWindowPos () failed: %d\n",
411*4882a593Smuzhiyun (int) GetLastError());
412*4882a593Smuzhiyun return;
413*4882a593Smuzhiyun }
414*4882a593Smuzhiyun }
415*4882a593Smuzhiyun
416*4882a593Smuzhiyun #if CYGMULTIWINDOW_DEBUG
417*4882a593Smuzhiyun winDebug("winMWExtWMRestackWindows - done\n");
418*4882a593Smuzhiyun #endif
419*4882a593Smuzhiyun pScreenPriv->fRestacking = FALSE;
420*4882a593Smuzhiyun }
421