xref: /OK3568_Linux_fs/external/xserver/hw/xwin/winwin32rootlesswindow.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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