winwin32rootlesswndproc.c revision 706f2543
1706f2543Smrg/*
2706f2543Smrg *Copyright (C) 1994-2000 The XFree86 Project, Inc. All Rights Reserved.
3706f2543Smrg *
4706f2543Smrg *Permission is hereby granted, free of charge, to any person obtaining
5706f2543Smrg * a copy of this software and associated documentation files (the
6706f2543Smrg *"Software"), to deal in the Software without restriction, including
7706f2543Smrg *without limitation the rights to use, copy, modify, merge, publish,
8706f2543Smrg *distribute, sublicense, and/or sell copies of the Software, and to
9706f2543Smrg *permit persons to whom the Software is furnished to do so, subject to
10706f2543Smrg *the following conditions:
11706f2543Smrg *
12706f2543Smrg *The above copyright notice and this permission notice shall be
13706f2543Smrg *included in all copies or substantial portions of the Software.
14706f2543Smrg *
15706f2543Smrg *THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16706f2543Smrg *EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17706f2543Smrg *MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
18706f2543Smrg *NONINFRINGEMENT. IN NO EVENT SHALL THE XFREE86 PROJECT BE LIABLE FOR
19706f2543Smrg *ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
20706f2543Smrg *CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
21706f2543Smrg *WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22706f2543Smrg *
23706f2543Smrg *Except as contained in this notice, the name of the XFree86 Project
24706f2543Smrg *shall not be used in advertising or otherwise to promote the sale, use
25706f2543Smrg *or other dealings in this Software without prior written authorization
26706f2543Smrg *from the XFree86 Project.
27706f2543Smrg *
28706f2543Smrg * Authors:	Kensuke Matsuzaki
29706f2543Smrg *		Earle F. Philhower, III
30706f2543Smrg *		Harold L Hunt II
31706f2543Smrg */
32706f2543Smrg#ifdef HAVE_XWIN_CONFIG_H
33706f2543Smrg#include <xwin-config.h>
34706f2543Smrg#endif
35706f2543Smrg#include "win.h"
36706f2543Smrg#include <winuser.h>
37706f2543Smrg#define _WINDOWSWM_SERVER_
38706f2543Smrg#include <X11/extensions/windowswmstr.h>
39706f2543Smrg#include "dixevents.h"
40706f2543Smrg#include "propertyst.h"
41706f2543Smrg#include <X11/Xatom.h>
42706f2543Smrg#include "winmultiwindowclass.h"
43706f2543Smrg#include "winmsg.h"
44706f2543Smrg#include "inputstr.h"
45706f2543Smrg
46706f2543Smrg
47706f2543Smrg/*
48706f2543Smrg * Constant defines
49706f2543Smrg */
50706f2543Smrg
51706f2543Smrg#define MOUSE_ACTIVATE_DEFAULT		TRUE
52706f2543Smrg#define RAISE_ON_CLICK_DEFAULT		FALSE
53706f2543Smrg
54706f2543Smrg
55706f2543Smrg/*
56706f2543Smrg * Local globals
57706f2543Smrg */
58706f2543Smrg
59706f2543Smrgstatic UINT_PTR		g_uipMousePollingTimerID = 0;
60706f2543Smrg
61706f2543Smrg
62706f2543Smrg/*
63706f2543Smrg * Local function
64706f2543Smrg */
65706f2543Smrg
66706f2543SmrgDEFINE_ATOM_HELPER(AtmWindowsWmRaiseOnClick, WINDOWSWM_RAISE_ON_CLICK)
67706f2543SmrgDEFINE_ATOM_HELPER(AtmWindowsWMMouseActivate, WINDOWSWM_MOUSE_ACTIVATE)
68706f2543Smrg/* DEFINE_ATOM_HELPER(AtmWindowsWMClientWindow, WINDOWSWM_CLIENT_WINDOW) */
69706f2543Smrg
70706f2543Smrg/*
71706f2543Smrg * ConstrainSize - Taken from TWM sources - Respects hints for sizing
72706f2543Smrg */
73706f2543Smrg#define makemult(a,b) ((b==1) ? (a) : (((int)((a)/(b))) * (b)) )
74706f2543Smrgstatic void
75706f2543SmrgConstrainSize (WinXSizeHints hints, int *widthp, int *heightp)
76706f2543Smrg{
77706f2543Smrg  int minWidth, minHeight, maxWidth, maxHeight, xinc, yinc, delta;
78706f2543Smrg  int baseWidth, baseHeight;
79706f2543Smrg  int dwidth = *widthp, dheight = *heightp;
80706f2543Smrg
81706f2543Smrg  if (hints.flags & PMinSize)
82706f2543Smrg    {
83706f2543Smrg      minWidth = hints.min_width;
84706f2543Smrg      minHeight = hints.min_height;
85706f2543Smrg    }
86706f2543Smrg  else if (hints.flags & PBaseSize)
87706f2543Smrg    {
88706f2543Smrg      minWidth = hints.base_width;
89706f2543Smrg      minHeight = hints.base_height;
90706f2543Smrg    }
91706f2543Smrg  else
92706f2543Smrg    minWidth = minHeight = 1;
93706f2543Smrg
94706f2543Smrg  if (hints.flags & PBaseSize)
95706f2543Smrg    {
96706f2543Smrg      baseWidth = hints.base_width;
97706f2543Smrg      baseHeight = hints.base_height;
98706f2543Smrg    }
99706f2543Smrg  else if (hints.flags & PMinSize)
100706f2543Smrg    {
101706f2543Smrg      baseWidth = hints.min_width;
102706f2543Smrg      baseHeight = hints.min_height;
103706f2543Smrg    }
104706f2543Smrg  else
105706f2543Smrg    baseWidth = baseHeight = 0;
106706f2543Smrg
107706f2543Smrg  if (hints.flags & PMaxSize)
108706f2543Smrg    {
109706f2543Smrg      maxWidth = hints.max_width;
110706f2543Smrg      maxHeight = hints.max_height;
111706f2543Smrg    }
112706f2543Smrg  else
113706f2543Smrg    {
114706f2543Smrg      maxWidth = MAXINT;
115706f2543Smrg      maxHeight = MAXINT;
116706f2543Smrg    }
117706f2543Smrg
118706f2543Smrg  if (hints.flags & PResizeInc)
119706f2543Smrg    {
120706f2543Smrg      xinc = hints.width_inc;
121706f2543Smrg      yinc = hints.height_inc;
122706f2543Smrg    }
123706f2543Smrg  else
124706f2543Smrg    xinc = yinc = 1;
125706f2543Smrg
126706f2543Smrg  /*
127706f2543Smrg   * First, clamp to min and max values
128706f2543Smrg   */
129706f2543Smrg  if (dwidth < minWidth)
130706f2543Smrg    dwidth = minWidth;
131706f2543Smrg  if (dheight < minHeight)
132706f2543Smrg    dheight = minHeight;
133706f2543Smrg
134706f2543Smrg  if (dwidth > maxWidth)
135706f2543Smrg    dwidth = maxWidth;
136706f2543Smrg  if (dheight > maxHeight)
137706f2543Smrg    dheight = maxHeight;
138706f2543Smrg
139706f2543Smrg  /*
140706f2543Smrg   * Second, fit to base + N * inc
141706f2543Smrg   */
142706f2543Smrg  dwidth = ((dwidth - baseWidth) / xinc * xinc) + baseWidth;
143706f2543Smrg  dheight = ((dheight - baseHeight) / yinc * yinc) + baseHeight;
144706f2543Smrg
145706f2543Smrg  /*
146706f2543Smrg   * Third, adjust for aspect ratio
147706f2543Smrg   */
148706f2543Smrg
149706f2543Smrg  /*
150706f2543Smrg   * The math looks like this:
151706f2543Smrg   *
152706f2543Smrg   * minAspectX    dwidth     maxAspectX
153706f2543Smrg   * ---------- <= ------- <= ----------
154706f2543Smrg   * minAspectY    dheight    maxAspectY
155706f2543Smrg   *
156706f2543Smrg   * If that is multiplied out, then the width and height are
157706f2543Smrg   * invalid in the following situations:
158706f2543Smrg   *
159706f2543Smrg   * minAspectX * dheight > minAspectY * dwidth
160706f2543Smrg   * maxAspectX * dheight < maxAspectY * dwidth
161706f2543Smrg   *
162706f2543Smrg   */
163706f2543Smrg
164706f2543Smrg  if (hints.flags & PAspect)
165706f2543Smrg    {
166706f2543Smrg      if (hints.min_aspect.x * dheight > hints.min_aspect.y * dwidth)
167706f2543Smrg        {
168706f2543Smrg	  delta = makemult(hints.min_aspect.x * dheight / hints.min_aspect.y - dwidth, xinc);
169706f2543Smrg	  if (dwidth + delta <= maxWidth)
170706f2543Smrg	    dwidth += delta;
171706f2543Smrg	  else
172706f2543Smrg            {
173706f2543Smrg	      delta = makemult(dheight - dwidth*hints.min_aspect.y/hints.min_aspect.x, yinc);
174706f2543Smrg	      if (dheight - delta >= minHeight)
175706f2543Smrg		dheight -= delta;
176706f2543Smrg            }
177706f2543Smrg        }
178706f2543Smrg
179706f2543Smrg      if (hints.max_aspect.x * dheight < hints.max_aspect.y * dwidth)
180706f2543Smrg        {
181706f2543Smrg	  delta = makemult(dwidth * hints.max_aspect.y / hints.max_aspect.x - dheight, yinc);
182706f2543Smrg	  if (dheight + delta <= maxHeight)
183706f2543Smrg	    dheight += delta;
184706f2543Smrg	  else
185706f2543Smrg            {
186706f2543Smrg	      delta = makemult(dwidth - hints.max_aspect.x*dheight/hints.max_aspect.y, xinc);
187706f2543Smrg	      if (dwidth - delta >= minWidth)
188706f2543Smrg		dwidth -= delta;
189706f2543Smrg            }
190706f2543Smrg        }
191706f2543Smrg    }
192706f2543Smrg
193706f2543Smrg  /* Return computed values */
194706f2543Smrg  *widthp = dwidth;
195706f2543Smrg  *heightp = dheight;
196706f2543Smrg}
197706f2543Smrg#undef makemult
198706f2543Smrg
199706f2543Smrg
200706f2543Smrg
201706f2543Smrg/*
202706f2543Smrg * ValidateSizing - Ensures size request respects hints
203706f2543Smrg */
204706f2543Smrgstatic int
205706f2543SmrgValidateSizing (HWND hwnd, WindowPtr pWin,
206706f2543Smrg		WPARAM wParam, LPARAM lParam)
207706f2543Smrg{
208706f2543Smrg  WinXSizeHints sizeHints;
209706f2543Smrg  RECT *rect;
210706f2543Smrg  int iWidth, iHeight, iTopBorder;
211706f2543Smrg  POINT pt;
212706f2543Smrg
213706f2543Smrg  /* Invalid input checking */
214706f2543Smrg  if (pWin==NULL || lParam==0)
215706f2543Smrg    {
216706f2543Smrg      ErrorF ("Invalid input checking\n");
217706f2543Smrg      return FALSE;
218706f2543Smrg    }
219706f2543Smrg
220706f2543Smrg  /* No size hints, no checking */
221706f2543Smrg  if (!winMultiWindowGetWMNormalHints (pWin, &sizeHints))
222706f2543Smrg    {
223706f2543Smrg      ErrorF ("No size hints, no checking\n");
224706f2543Smrg      return FALSE;
225706f2543Smrg    }
226706f2543Smrg
227706f2543Smrg  /* Avoid divide-by-zero */
228706f2543Smrg  if (sizeHints.flags & PResizeInc)
229706f2543Smrg    {
230706f2543Smrg      if (sizeHints.width_inc == 0) sizeHints.width_inc = 1;
231706f2543Smrg      if (sizeHints.height_inc == 0) sizeHints.height_inc = 1;
232706f2543Smrg    }
233706f2543Smrg
234706f2543Smrg  rect = (RECT*)lParam;
235706f2543Smrg
236706f2543Smrg  iWidth = rect->right - rect->left;
237706f2543Smrg  iHeight = rect->bottom - rect->top;
238706f2543Smrg
239706f2543Smrg  /* Get title bar height, there must be an easier way?! */
240706f2543Smrg  pt.x = pt.y = 0;
241706f2543Smrg  ClientToScreen(hwnd, &pt);
242706f2543Smrg  iTopBorder = pt.y - rect->top;
243706f2543Smrg
244706f2543Smrg  /* Now remove size of any borders */
245706f2543Smrg  iWidth -= 2 * GetSystemMetrics(SM_CXSIZEFRAME);
246706f2543Smrg  iHeight -= GetSystemMetrics(SM_CYSIZEFRAME) + iTopBorder;
247706f2543Smrg
248706f2543Smrg  /* Constrain the size to legal values */
249706f2543Smrg  ConstrainSize (sizeHints, &iWidth, &iHeight);
250706f2543Smrg
251706f2543Smrg  /* Add back the borders */
252706f2543Smrg  iWidth += 2 * GetSystemMetrics(SM_CXSIZEFRAME);
253706f2543Smrg  iHeight += GetSystemMetrics(SM_CYSIZEFRAME) + iTopBorder;
254706f2543Smrg
255706f2543Smrg  /* Adjust size according to where we're dragging from */
256706f2543Smrg  switch(wParam) {
257706f2543Smrg  case WMSZ_TOP:
258706f2543Smrg  case WMSZ_TOPRIGHT:
259706f2543Smrg  case WMSZ_BOTTOM:
260706f2543Smrg  case WMSZ_BOTTOMRIGHT:
261706f2543Smrg  case WMSZ_RIGHT:
262706f2543Smrg    rect->right = rect->left + iWidth;
263706f2543Smrg    break;
264706f2543Smrg  default:
265706f2543Smrg    rect->left = rect->right - iWidth;
266706f2543Smrg    break;
267706f2543Smrg  }
268706f2543Smrg  switch(wParam) {
269706f2543Smrg  case WMSZ_BOTTOM:
270706f2543Smrg  case WMSZ_BOTTOMRIGHT:
271706f2543Smrg  case WMSZ_BOTTOMLEFT:
272706f2543Smrg  case WMSZ_RIGHT:
273706f2543Smrg  case WMSZ_LEFT:
274706f2543Smrg    rect->bottom = rect->top + iHeight;
275706f2543Smrg    break;
276706f2543Smrg  default:
277706f2543Smrg    rect->top = rect->bottom - iHeight;
278706f2543Smrg    break;
279706f2543Smrg  }
280706f2543Smrg  return TRUE;
281706f2543Smrg}
282706f2543Smrg
283706f2543Smrg
284706f2543Smrg/*
285706f2543Smrg * IsRaiseOnClick
286706f2543Smrg */
287706f2543Smrg
288706f2543Smrgstatic Bool
289706f2543SmrgIsRaiseOnClick (WindowPtr pWin)
290706f2543Smrg{
291706f2543Smrg
292706f2543Smrg  struct _Window	*pwin;
293706f2543Smrg  struct _Property	*prop;
294706f2543Smrg  /* XXX We're getting inputInfo.poniter here, but this might be really wrong.
295706f2543Smrg   * Which pointer's current window do we want? */
296706f2543Smrg  WindowPtr		pRoot = GetCurrentRootWindow (inputInfo.pointer);
297706f2543Smrg
298706f2543Smrg  if (!pWin)
299706f2543Smrg    {
300706f2543Smrg      ErrorF ("IsRaiseOnClick - no prop use default value:%d\n",
301706f2543Smrg	      RAISE_ON_CLICK_DEFAULT);
302706f2543Smrg      return RAISE_ON_CLICK_DEFAULT;
303706f2543Smrg    }
304706f2543Smrg
305706f2543Smrg  pwin = (struct _Window*) pWin;
306706f2543Smrg
307706f2543Smrg  if (pwin->optional)
308706f2543Smrg    prop = (struct _Property *) pwin->optional->userProps;
309706f2543Smrg  else
310706f2543Smrg    prop = NULL;
311706f2543Smrg
312706f2543Smrg  while (prop)
313706f2543Smrg    {
314706f2543Smrg      if (prop->propertyName == AtmWindowsWmRaiseOnClick ()
315706f2543Smrg	  && prop->type == XA_INTEGER
316706f2543Smrg	  && prop->format == 32)
317706f2543Smrg	{
318706f2543Smrg	  return *(int*)prop->data;
319706f2543Smrg	}
320706f2543Smrg      else
321706f2543Smrg	prop = prop->next;
322706f2543Smrg    }
323706f2543Smrg
324706f2543Smrg  if (pWin != pRoot)
325706f2543Smrg    {
326706f2543Smrg      return IsRaiseOnClick (pRoot);
327706f2543Smrg    }
328706f2543Smrg  else
329706f2543Smrg    {
330706f2543Smrg#if CYGMULTIWINDOW_DEBUG
331706f2543Smrg      winDebug ("IsRaiseOnClick - no prop use default value:%d\n",
332706f2543Smrg		RAISE_ON_CLICK_DEFAULT);
333706f2543Smrg#endif
334706f2543Smrg      return RAISE_ON_CLICK_DEFAULT;
335706f2543Smrg    }
336706f2543Smrg}
337706f2543Smrg
338706f2543Smrg
339706f2543Smrg/*
340706f2543Smrg * IsMouseActive
341706f2543Smrg */
342706f2543Smrg
343706f2543Smrgstatic Bool
344706f2543SmrgIsMouseActive (WindowPtr pWin)
345706f2543Smrg{
346706f2543Smrg
347706f2543Smrg  struct _Window	*pwin;
348706f2543Smrg  struct _Property	*prop;
349706f2543Smrg  /* XXX We're getting inputInfo.poniter here, but this might be really wrong.
350706f2543Smrg   * Which pointer's current window do we want? */
351706f2543Smrg  WindowPtr		pRoot = GetCurrentRootWindow (inputInfo.pointer);
352706f2543Smrg
353706f2543Smrg  if (!pWin)
354706f2543Smrg    {
355706f2543Smrg      ErrorF ("IsMouseActive - pWin was NULL use default value:%d\n",
356706f2543Smrg	      MOUSE_ACTIVATE_DEFAULT);
357706f2543Smrg      return MOUSE_ACTIVATE_DEFAULT;
358706f2543Smrg    }
359706f2543Smrg
360706f2543Smrg  pwin = (struct _Window*) pWin;
361706f2543Smrg
362706f2543Smrg  if (pwin->optional)
363706f2543Smrg    prop = (struct _Property *) pwin->optional->userProps;
364706f2543Smrg  else
365706f2543Smrg    prop = NULL;
366706f2543Smrg
367706f2543Smrg  while (prop)
368706f2543Smrg    {
369706f2543Smrg      if (prop->propertyName == AtmWindowsWMMouseActivate ()
370706f2543Smrg	  && prop->type == XA_INTEGER
371706f2543Smrg	  && prop->format == 32)
372706f2543Smrg	{
373706f2543Smrg	  return *(int*)prop->data;
374706f2543Smrg	}
375706f2543Smrg      else
376706f2543Smrg	prop = prop->next;
377706f2543Smrg    }
378706f2543Smrg
379706f2543Smrg  if (pWin != pRoot)
380706f2543Smrg    {
381706f2543Smrg      return IsMouseActive (pRoot);
382706f2543Smrg    }
383706f2543Smrg  else
384706f2543Smrg    {
385706f2543Smrg#if CYGMULTIWINDOW_DEBUG
386706f2543Smrg      winDebug ("IsMouseActive - no prop use default value:%d\n",
387706f2543Smrg		MOUSE_ACTIVATE_DEFAULT);
388706f2543Smrg#endif
389706f2543Smrg      return MOUSE_ACTIVATE_DEFAULT;
390706f2543Smrg    }
391706f2543Smrg}
392706f2543Smrg
393706f2543Smrg
394706f2543Smrg/*
395706f2543Smrg * winMWExtWMWindowProc - Window procedure
396706f2543Smrg */
397706f2543Smrg
398706f2543SmrgLRESULT CALLBACK
399706f2543SmrgwinMWExtWMWindowProc (HWND hwnd, UINT message,
400706f2543Smrg			    WPARAM wParam, LPARAM lParam)
401706f2543Smrg{
402706f2543Smrg  WindowPtr		pWin = NULL;
403706f2543Smrg  win32RootlessWindowPtr pRLWinPriv = NULL;
404706f2543Smrg  ScreenPtr		pScreen = NULL;
405706f2543Smrg  winPrivScreenPtr	pScreenPriv = NULL;
406706f2543Smrg  winScreenInfo		*pScreenInfo = NULL;
407706f2543Smrg  HWND			hwndScreen = NULL;
408706f2543Smrg  POINT			ptMouse;
409706f2543Smrg  static Bool		s_fTracking = FALSE;
410706f2543Smrg  HDC			hdcUpdate;
411706f2543Smrg  PAINTSTRUCT		ps;
412706f2543Smrg  LPWINDOWPOS		pWinPos = NULL;
413706f2543Smrg  RECT			rcClient;
414706f2543Smrg  winWMMessageRec	wmMsg;
415706f2543Smrg  Bool			fWMMsgInitialized = FALSE;
416706f2543Smrg
417706f2543Smrg  /* Check if the Windows window property for our X window pointer is valid */
418706f2543Smrg  if ((pRLWinPriv = (win32RootlessWindowPtr)GetProp (hwnd, WIN_WINDOW_PROP)) != NULL)
419706f2543Smrg    {
420706f2543Smrg      pWin = pRLWinPriv->pFrame->win;
421706f2543Smrg      pScreen				= pWin->drawable.pScreen;
422706f2543Smrg      if (pScreen) pScreenPriv		= winGetScreenPriv(pScreen);
423706f2543Smrg      if (pScreenPriv) pScreenInfo	= pScreenPriv->pScreenInfo;
424706f2543Smrg      if (pScreenPriv) hwndScreen	= pScreenPriv->hwndScreen;
425706f2543Smrg
426706f2543Smrg      wmMsg.msg		= 0;
427706f2543Smrg      wmMsg.hwndWindow	= hwnd;
428706f2543Smrg      wmMsg.iWindow	= (Window)pWin->drawable.id;
429706f2543Smrg
430706f2543Smrg      wmMsg.iX		= pRLWinPriv->pFrame->x;
431706f2543Smrg      wmMsg.iY		= pRLWinPriv->pFrame->y;
432706f2543Smrg      wmMsg.iWidth	= pRLWinPriv->pFrame->width;
433706f2543Smrg      wmMsg.iHeight	= pRLWinPriv->pFrame->height;
434706f2543Smrg
435706f2543Smrg      fWMMsgInitialized = TRUE;
436706f2543Smrg#if CYGDEBUG
437706f2543Smrg      winDebugWin32Message("winMWExtWMWindowProc", hwnd, message, wParam, lParam);
438706f2543Smrg
439706f2543Smrg      winDebug ("\thWnd %08X\n", hwnd);
440706f2543Smrg      winDebug ("\tpScreenPriv %08X\n", pScreenPriv);
441706f2543Smrg      winDebug ("\tpScreenInfo %08X\n", pScreenInfo);
442706f2543Smrg      winDebug ("\thwndScreen %08X\n", hwndScreen);
443706f2543Smrg      winDebug ("winMWExtWMWindowProc (%08x) %08x %08x %08x\n",
444706f2543Smrg	      pRLWinPriv, message, wParam, lParam);
445706f2543Smrg#endif
446706f2543Smrg    }
447706f2543Smrg  /* Branch on message type */
448706f2543Smrg  switch (message)
449706f2543Smrg    {
450706f2543Smrg    case WM_CREATE:
451706f2543Smrg#if CYGMULTIWINDOW_DEBUG
452706f2543Smrg      winDebug ("winMWExtWMWindowProc - WM_CREATE\n");
453706f2543Smrg#endif
454706f2543Smrg      /* */
455706f2543Smrg      SetProp (hwnd,
456706f2543Smrg	       WIN_WINDOW_PROP,
457706f2543Smrg	       (HANDLE)((LPCREATESTRUCT) lParam)->lpCreateParams);
458706f2543Smrg      return 0;
459706f2543Smrg
460706f2543Smrg    case WM_CLOSE:
461706f2543Smrg#if CYGMULTIWINDOW_DEBUG
462706f2543Smrg      winDebug ("winMWExtWMWindowProc - WM_CLOSE %d\n", pRLWinPriv->fClose);
463706f2543Smrg#endif
464706f2543Smrg      /* Tell window-manager to close window */
465706f2543Smrg      if (pRLWinPriv->fClose)
466706f2543Smrg	{
467706f2543Smrg	  DestroyWindow (hwnd);
468706f2543Smrg	}
469706f2543Smrg      else
470706f2543Smrg	{
471706f2543Smrg	  if (winIsInternalWMRunning(pScreenInfo))
472706f2543Smrg	    {
473706f2543Smrg	      /* Tell our Window Manager thread to kill the window */
474706f2543Smrg	      wmMsg.msg = WM_WM_KILL;
475706f2543Smrg	      if (fWMMsgInitialized)
476706f2543Smrg		winSendMessageToWM (pScreenPriv->pWMInfo, &wmMsg);
477706f2543Smrg	    }
478706f2543Smrg	  winWindowsWMSendEvent(WindowsWMControllerNotify,
479706f2543Smrg				WindowsWMControllerNotifyMask,
480706f2543Smrg				1,
481706f2543Smrg				WindowsWMCloseWindow,
482706f2543Smrg				pWin->drawable.id,
483706f2543Smrg				0, 0, 0, 0);
484706f2543Smrg	}
485706f2543Smrg      return 0;
486706f2543Smrg
487706f2543Smrg    case WM_DESTROY:
488706f2543Smrg#if CYGMULTIWINDOW_DEBUG
489706f2543Smrg      winDebug ("winMWExtWMWindowProc - WM_DESTROY\n");
490706f2543Smrg#endif
491706f2543Smrg      /* Free the shaodw DC; which allows the bitmap to be freed */
492706f2543Smrg      DeleteDC (pRLWinPriv->hdcShadow);
493706f2543Smrg      pRLWinPriv->hdcShadow = NULL;
494706f2543Smrg
495706f2543Smrg      /* Free the shadow bitmap */
496706f2543Smrg      DeleteObject (pRLWinPriv->hbmpShadow);
497706f2543Smrg      pRLWinPriv->hbmpShadow = NULL;
498706f2543Smrg
499706f2543Smrg      /* Free the screen DC */
500706f2543Smrg      ReleaseDC (pRLWinPriv->hWnd, pRLWinPriv->hdcScreen);
501706f2543Smrg      pRLWinPriv->hdcScreen = NULL;
502706f2543Smrg
503706f2543Smrg      /* Free shadow buffer info header */
504706f2543Smrg      free (pRLWinPriv->pbmihShadow);
505706f2543Smrg      pRLWinPriv->pbmihShadow = NULL;
506706f2543Smrg
507706f2543Smrg      pRLWinPriv->fResized = FALSE;
508706f2543Smrg      pRLWinPriv->pfb = NULL;
509706f2543Smrg      free (pRLWinPriv);
510706f2543Smrg      RemoveProp (hwnd, WIN_WINDOW_PROP);
511706f2543Smrg      break;
512706f2543Smrg
513706f2543Smrg    case WM_MOUSEMOVE:
514706f2543Smrg#if CYGMULTIWINDOW_DEBUG && 0
515706f2543Smrg      winDebug ("winMWExtWMWindowProc - WM_MOUSEMOVE\n");
516706f2543Smrg#endif
517706f2543Smrg      /* Unpack the client area mouse coordinates */
518706f2543Smrg      ptMouse.x = GET_X_LPARAM(lParam);
519706f2543Smrg      ptMouse.y = GET_Y_LPARAM(lParam);
520706f2543Smrg
521706f2543Smrg      /* Translate the client area mouse coordinates to screen coordinates */
522706f2543Smrg      ClientToScreen (hwnd, &ptMouse);
523706f2543Smrg
524706f2543Smrg      /* Screen Coords from (-X, -Y) -> Root Window (0, 0) */
525706f2543Smrg      ptMouse.x -= GetSystemMetrics (SM_XVIRTUALSCREEN);
526706f2543Smrg      ptMouse.y -= GetSystemMetrics (SM_YVIRTUALSCREEN);
527706f2543Smrg
528706f2543Smrg      /* We can't do anything without privates */
529706f2543Smrg      if (pScreenPriv == NULL || pScreenInfo->fIgnoreInput)
530706f2543Smrg	break;
531706f2543Smrg
532706f2543Smrg      /* Has the mouse pointer crossed screens? */
533706f2543Smrg      if (pScreen != miPointerGetScreen(inputInfo.pointer))
534706f2543Smrg	miPointerSetScreen (inputInfo.pointer, pScreenInfo->dwScreen,
535706f2543Smrg			       ptMouse.x - pScreenInfo->dwXOffset,
536706f2543Smrg			       ptMouse.y - pScreenInfo->dwYOffset);
537706f2543Smrg
538706f2543Smrg      /* Are we tracking yet? */
539706f2543Smrg      if (!s_fTracking)
540706f2543Smrg	{
541706f2543Smrg	  TRACKMOUSEEVENT		tme;
542706f2543Smrg
543706f2543Smrg	  /* Setup data structure */
544706f2543Smrg	  ZeroMemory (&tme, sizeof (tme));
545706f2543Smrg	  tme.cbSize = sizeof (tme);
546706f2543Smrg	  tme.dwFlags = TME_LEAVE;
547706f2543Smrg	  tme.hwndTrack = hwnd;
548706f2543Smrg
549706f2543Smrg	  /* Call the tracking function */
550706f2543Smrg	  if (!(*g_fpTrackMouseEvent) (&tme))
551706f2543Smrg	    ErrorF ("winMWExtWMWindowProc - _TrackMouseEvent failed\n");
552706f2543Smrg
553706f2543Smrg	  /* Flag that we are tracking now */
554706f2543Smrg	  s_fTracking = TRUE;
555706f2543Smrg	}
556706f2543Smrg
557706f2543Smrg      /* Kill the timer used to poll mouse events */
558706f2543Smrg      if (g_uipMousePollingTimerID != 0)
559706f2543Smrg	{
560706f2543Smrg	  KillTimer (pScreenPriv->hwndScreen, WIN_POLLING_MOUSE_TIMER_ID);
561706f2543Smrg	  g_uipMousePollingTimerID = 0;
562706f2543Smrg	}
563706f2543Smrg
564706f2543Smrg      /* Deliver absolute cursor position to X Server */
565706f2543Smrg      winEnqueueMotion(ptMouse.x - pScreenInfo->dwXOffset,
566706f2543Smrg		       ptMouse.y - pScreenInfo->dwYOffset);
567706f2543Smrg
568706f2543Smrg      return 0;
569706f2543Smrg
570706f2543Smrg    case WM_NCMOUSEMOVE:
571706f2543Smrg#if CYGMULTIWINDOW_DEBUG && 0
572706f2543Smrg      winDebug ("winMWExtWMWindowProc - WM_NCMOUSEMOVE\n");
573706f2543Smrg#endif
574706f2543Smrg      /*
575706f2543Smrg       * We break instead of returning 0 since we need to call
576706f2543Smrg       * DefWindowProc to get the mouse cursor changes
577706f2543Smrg       * and min/max/close button highlighting in Windows XP.
578706f2543Smrg       * The Platform SDK says that you should return 0 if you
579706f2543Smrg       * process this message, but it fails to mention that you
580706f2543Smrg       * will give up any default functionality if you do return 0.
581706f2543Smrg       */
582706f2543Smrg
583706f2543Smrg      /* We can't do anything without privates */
584706f2543Smrg      if (pScreenPriv == NULL || pScreenInfo->fIgnoreInput)
585706f2543Smrg	break;
586706f2543Smrg
587706f2543Smrg      /*
588706f2543Smrg       * Timer to poll mouse events.  This is needed to make
589706f2543Smrg       * programs like xeyes follow the mouse properly.
590706f2543Smrg       */
591706f2543Smrg      if (g_uipMousePollingTimerID == 0)
592706f2543Smrg	g_uipMousePollingTimerID = SetTimer (pScreenPriv->hwndScreen,
593706f2543Smrg					     WIN_POLLING_MOUSE_TIMER_ID,
594706f2543Smrg					     MOUSE_POLLING_INTERVAL,
595706f2543Smrg					     NULL);
596706f2543Smrg      break;
597706f2543Smrg
598706f2543Smrg    case WM_MOUSELEAVE:
599706f2543Smrg#if CYGMULTIWINDOW_DEBUG
600706f2543Smrg      winDebug ("winMWExtWMWindowProc - WM_MOUSELEAVE\n");
601706f2543Smrg#endif
602706f2543Smrg      /* Mouse has left our client area */
603706f2543Smrg
604706f2543Smrg      /* Flag that we are no longer tracking */
605706f2543Smrg      s_fTracking = FALSE;
606706f2543Smrg
607706f2543Smrg      /*
608706f2543Smrg       * Timer to poll mouse events.  This is needed to make
609706f2543Smrg       * programs like xeyes follow the mouse properly.
610706f2543Smrg       */
611706f2543Smrg      if (g_uipMousePollingTimerID == 0)
612706f2543Smrg	g_uipMousePollingTimerID = SetTimer (pScreenPriv->hwndScreen,
613706f2543Smrg					     WIN_POLLING_MOUSE_TIMER_ID,
614706f2543Smrg					     MOUSE_POLLING_INTERVAL,
615706f2543Smrg					     NULL);
616706f2543Smrg      return 0;
617706f2543Smrg
618706f2543Smrg    case WM_LBUTTONDBLCLK:
619706f2543Smrg    case WM_LBUTTONDOWN:
620706f2543Smrg#if CYGMULTIWINDOW_DEBUG
621706f2543Smrg      winDebug ("winMWExtWMWindowProc - WM_LBUTTONDBLCLK\n");
622706f2543Smrg#endif
623706f2543Smrg      if (pScreenPriv == NULL || pScreenInfo->fIgnoreInput)
624706f2543Smrg	break;
625706f2543Smrg      SetCapture (hwnd);
626706f2543Smrg      return winMouseButtonsHandle (pScreen, ButtonPress, Button1, wParam);
627706f2543Smrg
628706f2543Smrg    case WM_LBUTTONUP:
629706f2543Smrg#if CYGMULTIWINDOW_DEBUG
630706f2543Smrg      winDebug ("winMWExtWMWindowProc - WM_LBUTTONUP\n");
631706f2543Smrg#endif
632706f2543Smrg      if (pScreenPriv == NULL || pScreenInfo->fIgnoreInput)
633706f2543Smrg	break;
634706f2543Smrg      ReleaseCapture ();
635706f2543Smrg      return winMouseButtonsHandle (pScreen, ButtonRelease, Button1, wParam);
636706f2543Smrg
637706f2543Smrg    case WM_MBUTTONDBLCLK:
638706f2543Smrg    case WM_MBUTTONDOWN:
639706f2543Smrg#if CYGMULTIWINDOW_DEBUG
640706f2543Smrg      winDebug ("winMWExtWMWindowProc - WM_MBUTTONDBLCLK\n");
641706f2543Smrg#endif
642706f2543Smrg      if (pScreenPriv == NULL || pScreenInfo->fIgnoreInput)
643706f2543Smrg	break;
644706f2543Smrg      SetCapture (hwnd);
645706f2543Smrg      return winMouseButtonsHandle (pScreen, ButtonPress, Button2, wParam);
646706f2543Smrg
647706f2543Smrg    case WM_MBUTTONUP:
648706f2543Smrg#if CYGMULTIWINDOW_DEBUG
649706f2543Smrg      winDebug ("winMWExtWMWindowProc - WM_MBUTTONUP\n");
650706f2543Smrg#endif
651706f2543Smrg      if (pScreenPriv == NULL || pScreenInfo->fIgnoreInput)
652706f2543Smrg	break;
653706f2543Smrg      ReleaseCapture ();
654706f2543Smrg      return winMouseButtonsHandle (pScreen, ButtonRelease, Button2, wParam);
655706f2543Smrg
656706f2543Smrg    case WM_RBUTTONDBLCLK:
657706f2543Smrg    case WM_RBUTTONDOWN:
658706f2543Smrg#if CYGMULTIWINDOW_DEBUG
659706f2543Smrg      winDebug ("winMWExtWMWindowProc - WM_RBUTTONDBLCLK\n");
660706f2543Smrg#endif
661706f2543Smrg      if (pScreenPriv == NULL || pScreenInfo->fIgnoreInput)
662706f2543Smrg	break;
663706f2543Smrg      SetCapture (hwnd);
664706f2543Smrg      return winMouseButtonsHandle (pScreen, ButtonPress, Button3, wParam);
665706f2543Smrg
666706f2543Smrg    case WM_RBUTTONUP:
667706f2543Smrg#if CYGMULTIWINDOW_DEBUG
668706f2543Smrg      winDebug ("winMWExtWMWindowProc - WM_RBUTTONUP\n");
669706f2543Smrg#endif
670706f2543Smrg      if (pScreenPriv == NULL || pScreenInfo->fIgnoreInput)
671706f2543Smrg	break;
672706f2543Smrg      ReleaseCapture ();
673706f2543Smrg      return winMouseButtonsHandle (pScreen, ButtonRelease, Button3, wParam);
674706f2543Smrg
675706f2543Smrg    case WM_XBUTTONDBLCLK:
676706f2543Smrg    case WM_XBUTTONDOWN:
677706f2543Smrg      if (pScreenPriv == NULL || pScreenInfo->fIgnoreInput)
678706f2543Smrg	break;
679706f2543Smrg      SetCapture (hwnd);
680706f2543Smrg      return winMouseButtonsHandle (pScreen, ButtonPress, HIWORD(wParam) + 5, wParam);
681706f2543Smrg    case WM_XBUTTONUP:
682706f2543Smrg      if (pScreenPriv == NULL || pScreenInfo->fIgnoreInput)
683706f2543Smrg	break;
684706f2543Smrg      ReleaseCapture ();
685706f2543Smrg      return winMouseButtonsHandle (pScreen, ButtonRelease, HIWORD(wParam) + 5, wParam);
686706f2543Smrg
687706f2543Smrg    case WM_MOUSEWHEEL:
688706f2543Smrg#if CYGMULTIWINDOW_DEBUG
689706f2543Smrg      winDebug ("winMWExtWMWindowProc - WM_MOUSEWHEEL\n");
690706f2543Smrg#endif
691706f2543Smrg
692706f2543Smrg      /* Pass the message to the root window */
693706f2543Smrg      SendMessage (hwndScreen, message, wParam, lParam);
694706f2543Smrg      return 0;
695706f2543Smrg
696706f2543Smrg    case WM_MOUSEACTIVATE:
697706f2543Smrg#if CYGMULTIWINDOW_DEBUG
698706f2543Smrg      winDebug ("winMWExtWMWindowProc - WM_MOUSEACTIVATE\n");
699706f2543Smrg#endif
700706f2543Smrg#if 1
701706f2543Smrg      /* Check if this window needs to be made active when clicked */
702706f2543Smrg      if (winIsInternalWMRunning(pScreenInfo) && pWin->overrideRedirect)
703706f2543Smrg	{
704706f2543Smrg#if CYGMULTIWINDOW_DEBUG
705706f2543Smrg	  winDebug ("winMWExtWMWindowProc - WM_MOUSEACTIVATE - "
706706f2543Smrg		    "MA_NOACTIVATE\n");
707706f2543Smrg#endif
708706f2543Smrg
709706f2543Smrg	  /* */
710706f2543Smrg	  return MA_NOACTIVATE;
711706f2543Smrg	}
712706f2543Smrg#endif
713706f2543Smrg      if (!winIsInternalWMRunning(pScreenInfo) && !IsMouseActive (pWin))
714706f2543Smrg	return MA_NOACTIVATE;
715706f2543Smrg
716706f2543Smrg      break;
717706f2543Smrg
718706f2543Smrg    case WM_KILLFOCUS:
719706f2543Smrg      /* Pop any pressed keys since we are losing keyboard focus */
720706f2543Smrg      winKeybdReleaseKeys ();
721706f2543Smrg      return 0;
722706f2543Smrg
723706f2543Smrg    case WM_SYSDEADCHAR:
724706f2543Smrg    case WM_DEADCHAR:
725706f2543Smrg      /*
726706f2543Smrg       * NOTE: We do nothing with WM_*CHAR messages,
727706f2543Smrg       * nor does the root window, so we can just toss these messages.
728706f2543Smrg       */
729706f2543Smrg      return 0;
730706f2543Smrg
731706f2543Smrg    case WM_SYSKEYDOWN:
732706f2543Smrg    case WM_KEYDOWN:
733706f2543Smrg#if CYGMULTIWINDOW_DEBUG
734706f2543Smrg      winDebug ("winMWExtWMWindowProc - WM_*KEYDOWN\n");
735706f2543Smrg#endif
736706f2543Smrg
737706f2543Smrg      /*
738706f2543Smrg       * Don't pass Alt-F4 key combo to root window,
739706f2543Smrg       * let Windows translate to WM_CLOSE and close this top-level window.
740706f2543Smrg       *
741706f2543Smrg       * NOTE: We purposely don't check the fUseWinKillKey setting because
742706f2543Smrg       * it should only apply to the key handling for the root window,
743706f2543Smrg       * not for top-level window-manager windows.
744706f2543Smrg       *
745706f2543Smrg       * ALSO NOTE: We do pass Ctrl-Alt-Backspace to the root window
746706f2543Smrg       * because that is a key combo that no X app should be expecting to
747706f2543Smrg       * receive, since it has historically been used to shutdown the X server.
748706f2543Smrg       * Passing Ctrl-Alt-Backspace to the root window preserves that
749706f2543Smrg       * behavior, assuming that -unixkill has been passed as a parameter.
750706f2543Smrg       */
751706f2543Smrg      if (wParam == VK_F4 && (GetKeyState (VK_MENU) & 0x8000))
752706f2543Smrg	  break;
753706f2543Smrg
754706f2543Smrg      /* Pass the message to the root window */
755706f2543Smrg      SendMessage (hwndScreen, message, wParam, lParam);
756706f2543Smrg      return 0;
757706f2543Smrg
758706f2543Smrg    case WM_SYSKEYUP:
759706f2543Smrg    case WM_KEYUP:
760706f2543Smrg
761706f2543Smrg#if CYGMULTIWINDOW_DEBUG
762706f2543Smrg      winDebug ("winMWExtWMWindowProc - WM_*KEYUP\n");
763706f2543Smrg#endif
764706f2543Smrg
765706f2543Smrg      /* Pass the message to the root window */
766706f2543Smrg      SendMessage (hwndScreen, message, wParam, lParam);
767706f2543Smrg      return 0;
768706f2543Smrg
769706f2543Smrg    case WM_HOTKEY:
770706f2543Smrg#if CYGMULTIWINDOW_DEBUG
771706f2543Smrg      winDebug ("winMWExtWMWindowProc - WM_HOTKEY\n");
772706f2543Smrg#endif
773706f2543Smrg
774706f2543Smrg      /* Pass the message to the root window */
775706f2543Smrg      SendMessage (hwndScreen, message, wParam, lParam);
776706f2543Smrg      return 0;
777706f2543Smrg
778706f2543Smrg    case WM_ERASEBKGND:
779706f2543Smrg#if CYGDEBUG
780706f2543Smrg      winDebug ("winMWExtWMWindowProc - WM_ERASEBKGND\n");
781706f2543Smrg#endif
782706f2543Smrg      /*
783706f2543Smrg       * Pretend that we did erase the background but we don't care,
784706f2543Smrg       * since we repaint the entire region anyhow
785706f2543Smrg       * This avoids some flickering when resizing.
786706f2543Smrg       */
787706f2543Smrg      return TRUE;
788706f2543Smrg
789706f2543Smrg    case WM_PAINT:
790706f2543Smrg
791706f2543Smrg      /* BeginPaint gives us an hdc that clips to the invalidated region */
792706f2543Smrg      hdcUpdate = BeginPaint (hwnd, &ps);
793706f2543Smrg
794706f2543Smrg      /* Try to copy from the shadow buffer */
795706f2543Smrg      if (!BitBlt (hdcUpdate,
796706f2543Smrg		   ps.rcPaint.left, ps.rcPaint.top,
797706f2543Smrg		   ps.rcPaint.right - ps.rcPaint.left,
798706f2543Smrg		   ps.rcPaint.bottom - ps.rcPaint.top,
799706f2543Smrg		   pRLWinPriv->hdcShadow,
800706f2543Smrg		   ps.rcPaint.left, ps.rcPaint.top,
801706f2543Smrg		   SRCCOPY))
802706f2543Smrg	{
803706f2543Smrg	  LPVOID lpMsgBuf;
804706f2543Smrg
805706f2543Smrg	  /* Display a fancy error message */
806706f2543Smrg	  FormatMessage (FORMAT_MESSAGE_ALLOCATE_BUFFER |
807706f2543Smrg			 FORMAT_MESSAGE_FROM_SYSTEM |
808706f2543Smrg			 FORMAT_MESSAGE_IGNORE_INSERTS,
809706f2543Smrg			 NULL,
810706f2543Smrg			 GetLastError (),
811706f2543Smrg			 MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
812706f2543Smrg			 (LPTSTR) &lpMsgBuf,
813706f2543Smrg			 0, NULL);
814706f2543Smrg
815706f2543Smrg	  ErrorF ("winMWExtWMWindowProc - BitBlt failed: %s\n",
816706f2543Smrg		  (LPSTR)lpMsgBuf);
817706f2543Smrg	  LocalFree (lpMsgBuf);
818706f2543Smrg	}
819706f2543Smrg
820706f2543Smrg      /* EndPaint frees the DC */
821706f2543Smrg      EndPaint (hwnd, &ps);
822706f2543Smrg      break;
823706f2543Smrg
824706f2543Smrg    case WM_ACTIVATE:
825706f2543Smrg#if CYGMULTIWINDOW_DEBUG
826706f2543Smrg      winDebug ("winMWExtWMWindowProc - WM_ACTIVATE\n");
827706f2543Smrg#endif
828706f2543Smrg      if (LOWORD(wParam) != WA_INACTIVE)
829706f2543Smrg	{
830706f2543Smrg	  if (winIsInternalWMRunning(pScreenInfo))
831706f2543Smrg	    {
832706f2543Smrg#if 0
833706f2543Smrg	      /* Raise the window to the top in Z order */
834706f2543Smrg	      wmMsg.msg = WM_WM_RAISE;
835706f2543Smrg	      if (fWMMsgInitialized)
836706f2543Smrg		winSendMessageToWM (pScreenPriv->pWMInfo, &wmMsg);
837706f2543Smrg#endif
838706f2543Smrg	      /* Tell our Window Manager thread to activate the window */
839706f2543Smrg	      wmMsg.msg = WM_WM_ACTIVATE;
840706f2543Smrg	      if (fWMMsgInitialized)
841706f2543Smrg		if (!pWin || !pWin->overrideRedirect) /* for OOo menus */
842706f2543Smrg		  winSendMessageToWM (pScreenPriv->pWMInfo, &wmMsg);
843706f2543Smrg	    }
844706f2543Smrg	  winWindowsWMSendEvent(WindowsWMControllerNotify,
845706f2543Smrg				WindowsWMControllerNotifyMask,
846706f2543Smrg				1,
847706f2543Smrg				WindowsWMActivateWindow,
848706f2543Smrg				pWin->drawable.id,
849706f2543Smrg				0, 0,
850706f2543Smrg				0, 0);
851706f2543Smrg	}
852706f2543Smrg      return 0;
853706f2543Smrg
854706f2543Smrg#if 1
855706f2543Smrg    case WM_WINDOWPOSCHANGING:
856706f2543Smrg      pWinPos = (LPWINDOWPOS)lParam;
857706f2543Smrg      if (!(pWinPos->flags & SWP_NOZORDER))
858706f2543Smrg	{
859706f2543Smrg	  if (pRLWinPriv->fRestackingNow || pScreenPriv->fRestacking)
860706f2543Smrg	    {
861706f2543Smrg#if CYGMULTIWINDOW_DEBUG
862706f2543Smrg	      winDebug ("Win %08x is now restacking.\n", (unsigned int)pRLWinPriv);
863706f2543Smrg#endif
864706f2543Smrg	      break;
865706f2543Smrg	    }
866706f2543Smrg
867706f2543Smrg	  if (winIsInternalWMRunning(pScreenInfo) || IsRaiseOnClick (pWin))
868706f2543Smrg	    {
869706f2543Smrg#if CYGMULTIWINDOW_DEBUG
870706f2543Smrg	      winDebug ("Win %08x has WINDOWSWM_RAISE_ON_CLICK.\n", (unsigned int)pRLWinPriv);
871706f2543Smrg#endif
872706f2543Smrg	      break;
873706f2543Smrg	    }
874706f2543Smrg
875706f2543Smrg#if CYGMULTIWINDOW_DEBUG
876706f2543Smrg	  winDebug ("Win %08x forbid to change z order (%08x).\n",
877706f2543Smrg		    (unsigned int)pRLWinPriv, (unsigned int)pWinPos->hwndInsertAfter);
878706f2543Smrg#endif
879706f2543Smrg	  pWinPos->flags |= SWP_NOZORDER;
880706f2543Smrg	}
881706f2543Smrg      break;
882706f2543Smrg#endif
883706f2543Smrg
884706f2543Smrg    case WM_MOVE:
885706f2543Smrg#if CYGMULTIWINDOW_DEBUG
886706f2543Smrg      winDebug ("winMWExtWMWindowProc - WM_MOVE - %d ms\n",
887706f2543Smrg		(unsigned int)GetTickCount ());
888706f2543Smrg#endif
889706f2543Smrg      if (g_fNoConfigureWindow) break;
890706f2543Smrg#if 0
891706f2543Smrg      /* Bail if Windows window is not actually moving */
892706f2543Smrg      if (pRLWinPriv->dwX == (short) LOWORD(lParam)
893706f2543Smrg	  && pRLWinPriv->dwY == (short) HIWORD(lParam))
894706f2543Smrg	break;
895706f2543Smrg
896706f2543Smrg      /* Also bail if we're maximizing, we'll do the whole thing in WM_SIZE */
897706f2543Smrg      {
898706f2543Smrg	WINDOWPLACEMENT windPlace;
899706f2543Smrg	windPlace.length = sizeof (WINDOWPLACEMENT);
900706f2543Smrg
901706f2543Smrg	/* Get current window placement */
902706f2543Smrg	GetWindowPlacement (hwnd, &windPlace);
903706f2543Smrg
904706f2543Smrg	/* Bail if maximizing */
905706f2543Smrg	if (windPlace.showCmd == SW_MAXIMIZE
906706f2543Smrg	    || windPlace.showCmd == SW_SHOWMAXIMIZED)
907706f2543Smrg	  break;
908706f2543Smrg      }
909706f2543Smrg#endif
910706f2543Smrg
911706f2543Smrg#if CYGMULTIWINDOW_DEBUG
912706f2543Smrg      winDebug ("\t(%d, %d)\n", (short) LOWORD(lParam), (short) HIWORD(lParam));
913706f2543Smrg#endif
914706f2543Smrg      if (!pRLWinPriv->fMovingOrSizing)
915706f2543Smrg	{
916706f2543Smrg	  if (winIsInternalWMRunning(pScreenInfo))
917706f2543Smrg	    winAdjustXWindow (pWin, hwnd);
918706f2543Smrg
919706f2543Smrg	  winMWExtWMMoveXWindow (pWin,
920706f2543Smrg				 (LOWORD(lParam) - wBorderWidth (pWin)
921706f2543Smrg				  - GetSystemMetrics (SM_XVIRTUALSCREEN)),
922706f2543Smrg				 (HIWORD(lParam) - wBorderWidth (pWin)
923706f2543Smrg				  - GetSystemMetrics (SM_YVIRTUALSCREEN)));
924706f2543Smrg	}
925706f2543Smrg      return 0;
926706f2543Smrg
927706f2543Smrg    case WM_SHOWWINDOW:
928706f2543Smrg#if CYGMULTIWINDOW_DEBUG || TRUE
929706f2543Smrg      winDebug ("winMWExtWMWindowProc - WM_SHOWWINDOW - %d ms\n",
930706f2543Smrg		(unsigned int)GetTickCount ());
931706f2543Smrg#endif
932706f2543Smrg      /* Bail out if the window is being hidden */
933706f2543Smrg      if (!wParam)
934706f2543Smrg	return 0;
935706f2543Smrg
936706f2543Smrg      if (!pScreenInfo->fInternalWM)//XXXX
937706f2543Smrg	return 0;
938706f2543Smrg
939706f2543Smrg      winMWExtWMUpdateWindowDecoration (pRLWinPriv, pScreenInfo);
940706f2543Smrg
941706f2543Smrg      if (winIsInternalWMRunning(pScreenInfo))
942706f2543Smrg	{
943706f2543Smrg#if CYGMULTIWINDOW_DEBUG || TRUE
944706f2543Smrg	  winDebug ("\tMapWindow\n");
945706f2543Smrg#endif
946706f2543Smrg	  /* Tell X to map the window */
947706f2543Smrg	   MapWindow (pWin, wClient(pWin));
948706f2543Smrg
949706f2543Smrg	  if (!pRLWinPriv->pFrame->win->overrideRedirect)
950706f2543Smrg	    /* Bring the Windows window to the foreground */
951706f2543Smrg	    SetForegroundWindow (hwnd);
952706f2543Smrg
953706f2543Smrg	  /* Setup the Window Manager message */
954706f2543Smrg	  wmMsg.msg = WM_WM_MAP;
955706f2543Smrg	  wmMsg.iWidth = pRLWinPriv->pFrame->width;
956706f2543Smrg	  wmMsg.iHeight = pRLWinPriv->pFrame->height;
957706f2543Smrg
958706f2543Smrg	  /* Tell our Window Manager thread to map the window */
959706f2543Smrg	  if (fWMMsgInitialized)
960706f2543Smrg	    winSendMessageToWM (pScreenPriv->pWMInfo, &wmMsg);
961706f2543Smrg	}
962706f2543Smrg      break;
963706f2543Smrg
964706f2543Smrg    case WM_SIZING:
965706f2543Smrg      /* Need to legalize the size according to WM_NORMAL_HINTS */
966706f2543Smrg      /* for applications like xterm */
967706f2543Smrg      return ValidateSizing (hwnd, pWin, wParam, lParam);
968706f2543Smrg
969706f2543Smrg    case WM_WINDOWPOSCHANGED:
970706f2543Smrg      {
971706f2543Smrg	pWinPos = (LPWINDOWPOS) lParam;
972706f2543Smrg#if CYGMULTIWINDOW_DEBUG
973706f2543Smrg        winDebug("winMWExtWMWindowProc - WM_WINDOWPOSCHANGED\n");
974706f2543Smrg	winDebug("\tflags: %s%s%s%s%s%s%s%s%s%s%s%s\n",
975706f2543Smrg	(pWinPos->flags & SWP_DRAWFRAME)?"SWP_DRAWFRAME ":"",
976706f2543Smrg	(pWinPos->flags & SWP_FRAMECHANGED)?"SWP_FRAMECHANGED ":"",
977706f2543Smrg	(pWinPos->flags & SWP_HIDEWINDOW)?"SWP_HIDEWINDOW ":"",
978706f2543Smrg	(pWinPos->flags & SWP_NOACTIVATE)?"SWP_NOACTIVATE ":"",
979706f2543Smrg	(pWinPos->flags & SWP_NOCOPYBITS)?"SWP_NOCOPYBITS ":"",
980706f2543Smrg	(pWinPos->flags & SWP_NOMOVE)?"SWP_NOMOVE ":"",
981706f2543Smrg	(pWinPos->flags & SWP_NOOWNERZORDER)?"SWP_NOOWNERZORDER ":"",
982706f2543Smrg	(pWinPos->flags & SWP_NOSIZE)?"SWP_NOSIZE ":"",
983706f2543Smrg	(pWinPos->flags & SWP_NOREDRAW)?"SWP_NOREDRAW ":"",
984706f2543Smrg	(pWinPos->flags & SWP_NOSENDCHANGING)?"SWP_NOSENDCHANGING ":"",
985706f2543Smrg	(pWinPos->flags & SWP_NOZORDER)?"SWP_NOZORDER ":"",
986706f2543Smrg	(pWinPos->flags & SWP_SHOWWINDOW)?"SWP_SHOWWINDOW ":"");
987706f2543Smrg	winDebug("\tno_configure: %s\n", (g_fNoConfigureWindow?"Yes":"No"));
988706f2543Smrg	winDebug("\textend: (%d, %d, %d, %d)\n",
989706f2543Smrg            pWinPos->x, pWinPos->y, pWinPos->cx, pWinPos->cy);
990706f2543Smrg
991706f2543Smrg#endif
992706f2543Smrg	if (pWinPos->flags & SWP_HIDEWINDOW) break;
993706f2543Smrg
994706f2543Smrg	/* Reorder if window z order was changed */
995706f2543Smrg	if ((pScreenPriv != NULL)
996706f2543Smrg	    && !(pWinPos->flags & SWP_NOZORDER)
997706f2543Smrg	    && !(pWinPos->flags & SWP_SHOWWINDOW)
998706f2543Smrg	    && winIsInternalWMRunning(pScreenInfo))
999706f2543Smrg	  {
1000706f2543Smrg#if CYGMULTIWINDOW_DEBUG
1001706f2543Smrg	    winDebug ("\twindow z order was changed\n");
1002706f2543Smrg#endif
1003706f2543Smrg	    if (pWinPos->hwndInsertAfter == HWND_TOP
1004706f2543Smrg		||pWinPos->hwndInsertAfter == HWND_TOPMOST
1005706f2543Smrg		||pWinPos->hwndInsertAfter == HWND_NOTOPMOST)
1006706f2543Smrg	      {
1007706f2543Smrg#if CYGMULTIWINDOW_DEBUG
1008706f2543Smrg		winDebug ("\traise to top\n");
1009706f2543Smrg#endif
1010706f2543Smrg		/* Raise the window to the top in Z order */
1011706f2543Smrg		wmMsg.msg = WM_WM_RAISE;
1012706f2543Smrg		if (fWMMsgInitialized)
1013706f2543Smrg		  winSendMessageToWM (pScreenPriv->pWMInfo, &wmMsg);
1014706f2543Smrg	      }
1015706f2543Smrg#if 1
1016706f2543Smrg	    else if (pWinPos->hwndInsertAfter == HWND_BOTTOM)
1017706f2543Smrg	      {
1018706f2543Smrg	      }
1019706f2543Smrg	    else
1020706f2543Smrg	      {
1021706f2543Smrg		/* Check if this window is top of X windows. */
1022706f2543Smrg		HWND hWndAbove = NULL;
1023706f2543Smrg		DWORD dwCurrentProcessID = GetCurrentProcessId ();
1024706f2543Smrg		DWORD dwWindowProcessID = 0;
1025706f2543Smrg
1026706f2543Smrg		for (hWndAbove = pWinPos->hwndInsertAfter;
1027706f2543Smrg		     hWndAbove != NULL;
1028706f2543Smrg		     hWndAbove = GetNextWindow (hWndAbove, GW_HWNDPREV))
1029706f2543Smrg		  {
1030706f2543Smrg		    /* Ignore other XWin process's window */
1031706f2543Smrg		    GetWindowThreadProcessId (hWndAbove, &dwWindowProcessID);
1032706f2543Smrg
1033706f2543Smrg		    if ((dwWindowProcessID == dwCurrentProcessID)
1034706f2543Smrg			&& GetProp (hWndAbove, WIN_WINDOW_PROP)
1035706f2543Smrg			&& !IsWindowVisible (hWndAbove)
1036706f2543Smrg			&& !IsIconic (hWndAbove) ) /* ignore minimized windows */
1037706f2543Smrg		      break;
1038706f2543Smrg		  }
1039706f2543Smrg		/* If this is top of X windows in Windows stack,
1040706f2543Smrg		   raise it in X stack. */
1041706f2543Smrg		if (hWndAbove == NULL)
1042706f2543Smrg		  {
1043706f2543Smrg#if CYGMULTIWINDOW_DEBUG
1044706f2543Smrg		    winDebug ("\traise to top\n");
1045706f2543Smrg#endif
1046706f2543Smrg		    /* Raise the window to the top in Z order */
1047706f2543Smrg		    wmMsg.msg = WM_WM_RAISE;
1048706f2543Smrg		    if (fWMMsgInitialized)
1049706f2543Smrg		      winSendMessageToWM (pScreenPriv->pWMInfo, &wmMsg);
1050706f2543Smrg		  }
1051706f2543Smrg	      }
1052706f2543Smrg#endif
1053706f2543Smrg	  }
1054706f2543Smrg
1055706f2543Smrg	if (!(pWinPos->flags & SWP_NOSIZE)) {
1056706f2543Smrg	  if (IsIconic(hwnd)){
1057706f2543Smrg#if CYGMULTIWINDOW_DEBUG
1058706f2543Smrg	    winDebug ("\tIconic -> MINIMIZED\n");
1059706f2543Smrg#endif
1060706f2543Smrg	    if (winIsInternalWMRunning(pScreenInfo))
1061706f2543Smrg	      {
1062706f2543Smrg	      /* Raise the window to the top in Z order */
1063706f2543Smrg		wmMsg.msg = WM_WM_LOWER;
1064706f2543Smrg		if (fWMMsgInitialized)
1065706f2543Smrg		  winSendMessageToWM (pScreenPriv->pWMInfo, &wmMsg);
1066706f2543Smrg	      }
1067706f2543Smrg	    winWindowsWMSendEvent(WindowsWMControllerNotify,
1068706f2543Smrg				  WindowsWMControllerNotifyMask,
1069706f2543Smrg				  1,
1070706f2543Smrg				  WindowsWMMinimizeWindow,
1071706f2543Smrg				  pWin->drawable.id,
1072706f2543Smrg				  0, 0, 0, 0);
1073706f2543Smrg	  } else if (IsZoomed(hwnd)){
1074706f2543Smrg#if CYGMULTIWINDOW_DEBUG
1075706f2543Smrg	    winDebug ("\tZoomed -> MAXIMIZED\n");
1076706f2543Smrg#endif
1077706f2543Smrg	    winWindowsWMSendEvent(WindowsWMControllerNotify,
1078706f2543Smrg				  WindowsWMControllerNotifyMask,
1079706f2543Smrg				  1,
1080706f2543Smrg				  WindowsWMMaximizeWindow,
1081706f2543Smrg				  pWin->drawable.id,
1082706f2543Smrg				  0, 0, 0, 0);
1083706f2543Smrg	  } else {
1084706f2543Smrg#if CYGMULTIWINDOW_DEBUG
1085706f2543Smrg	    winDebug ("\tnone -> RESTORED\n");
1086706f2543Smrg#endif
1087706f2543Smrg	    winWindowsWMSendEvent(WindowsWMControllerNotify,
1088706f2543Smrg				  WindowsWMControllerNotifyMask,
1089706f2543Smrg				  1,
1090706f2543Smrg				  WindowsWMRestoreWindow,
1091706f2543Smrg				  pWin->drawable.id,
1092706f2543Smrg				  0, 0, 0, 0);
1093706f2543Smrg	  }
1094706f2543Smrg	}
1095706f2543Smrg	if (!g_fNoConfigureWindow ) {
1096706f2543Smrg
1097706f2543Smrg	  if (!pRLWinPriv->fMovingOrSizing
1098706f2543Smrg	      /*&& (pWinPos->flags & SWP_SHOWWINDOW)*/) {
1099706f2543Smrg	    GetClientRect (hwnd, &rcClient);
1100706f2543Smrg	    MapWindowPoints (hwnd, HWND_DESKTOP, (LPPOINT)&rcClient, 2);
1101706f2543Smrg
1102706f2543Smrg	    if (!(pWinPos->flags & SWP_NOMOVE)
1103706f2543Smrg		&&!(pWinPos->flags & SWP_NOSIZE)) {
1104706f2543Smrg#if CYGMULTIWINDOW_DEBUG
1105706f2543Smrg	      winDebug ("\tmove & resize\n");
1106706f2543Smrg#endif
1107706f2543Smrg	      if (winIsInternalWMRunning(pScreenInfo))
1108706f2543Smrg                winAdjustXWindow (pWin, hwnd);
1109706f2543Smrg
1110706f2543Smrg	      winMWExtWMMoveResizeXWindow (pWin,
1111706f2543Smrg					   rcClient.left - wBorderWidth (pWin)
1112706f2543Smrg					   - GetSystemMetrics (SM_XVIRTUALSCREEN),
1113706f2543Smrg					   rcClient.top - wBorderWidth (pWin)
1114706f2543Smrg					   - GetSystemMetrics (SM_YVIRTUALSCREEN),
1115706f2543Smrg					   rcClient.right - rcClient.left
1116706f2543Smrg					   - wBorderWidth (pWin)*2,
1117706f2543Smrg					   rcClient.bottom - rcClient.top
1118706f2543Smrg					   - wBorderWidth (pWin)*2);
1119706f2543Smrg	    } else if (!(pWinPos->flags & SWP_NOMOVE)) {
1120706f2543Smrg#if CYGMULTIWINDOW_DEBUG
1121706f2543Smrg	      winDebug ("\tmove\n");
1122706f2543Smrg#endif
1123706f2543Smrg	      if (winIsInternalWMRunning(pScreenInfo))
1124706f2543Smrg                winAdjustXWindow (pWin, hwnd);
1125706f2543Smrg
1126706f2543Smrg	      winMWExtWMMoveResizeXWindow (pWin,
1127706f2543Smrg					   rcClient.left - wBorderWidth (pWin)
1128706f2543Smrg					   - GetSystemMetrics (SM_XVIRTUALSCREEN),
1129706f2543Smrg					   rcClient.top - wBorderWidth (pWin)
1130706f2543Smrg					   - GetSystemMetrics (SM_YVIRTUALSCREEN),
1131706f2543Smrg					   rcClient.right - rcClient.left
1132706f2543Smrg					   - wBorderWidth (pWin)*2,
1133706f2543Smrg					   rcClient.bottom - rcClient.top
1134706f2543Smrg					   - wBorderWidth (pWin)*2);
1135706f2543Smrg	    } else if (!(pWinPos->flags & SWP_NOMOVE)) {
1136706f2543Smrg#if CYGMULTIWINDOW_DEBUG
1137706f2543Smrg	      winDebug ("\tmove\n");
1138706f2543Smrg#endif
1139706f2543Smrg	      if (winIsInternalWMRunning(pScreenInfo))
1140706f2543Smrg                winAdjustXWindow (pWin, hwnd);
1141706f2543Smrg
1142706f2543Smrg	      winMWExtWMMoveXWindow (pWin,
1143706f2543Smrg				     rcClient.left - wBorderWidth (pWin)
1144706f2543Smrg				     - GetSystemMetrics (SM_XVIRTUALSCREEN),
1145706f2543Smrg				     rcClient.top - wBorderWidth (pWin)
1146706f2543Smrg				     - GetSystemMetrics (SM_YVIRTUALSCREEN));
1147706f2543Smrg	    } else if (!(pWinPos->flags & SWP_NOSIZE)) {
1148706f2543Smrg#if CYGMULTIWINDOW_DEBUG
1149706f2543Smrg	      winDebug ("\tresize\n");
1150706f2543Smrg#endif
1151706f2543Smrg	      if (winIsInternalWMRunning(pScreenInfo))
1152706f2543Smrg                winAdjustXWindow (pWin, hwnd);
1153706f2543Smrg
1154706f2543Smrg	      winMWExtWMResizeXWindow (pWin,
1155706f2543Smrg				       rcClient.right - rcClient.left
1156706f2543Smrg				       - wBorderWidth (pWin)*2,
1157706f2543Smrg				       rcClient.bottom - rcClient.top
1158706f2543Smrg				       - wBorderWidth (pWin)*2);
1159706f2543Smrg	    }
1160706f2543Smrg	  }
1161706f2543Smrg	}
1162706f2543Smrg      }
1163706f2543Smrg#if CYGMULTIWINDOW_DEBUG
1164706f2543Smrg      winDebug ("winMWExtWMWindowProc - WM_WINDOWPOSCHANGED - done.\n");
1165706f2543Smrg#endif
1166706f2543Smrg      return 0;
1167706f2543Smrg
1168706f2543Smrg    case WM_SIZE:
1169706f2543Smrg      /* see dix/window.c */
1170706f2543Smrg      /* FIXME: Maximize/Restore? */
1171706f2543Smrg#if CYGMULTIWINDOW_DEBUG
1172706f2543Smrg      winDebug ("winMWExtWMWindowProc - WM_SIZE - %d ms\n",
1173706f2543Smrg		(unsigned int)GetTickCount ());
1174706f2543Smrg#endif
1175706f2543Smrg#if CYGMULTIWINDOW_DEBUG
1176706f2543Smrg      winDebug ("\t(%d, %d) %d\n", (short) LOWORD(lParam), (short) HIWORD(lParam), g_fNoConfigureWindow);
1177706f2543Smrg#endif
1178706f2543Smrg      if (g_fNoConfigureWindow) break;
1179706f2543Smrg
1180706f2543Smrg      /* Branch on type of resizing occurring */
1181706f2543Smrg      switch (wParam)
1182706f2543Smrg	{
1183706f2543Smrg	case SIZE_MINIMIZED:
1184706f2543Smrg#if CYGMULTIWINDOW_DEBUG
1185706f2543Smrg	  winDebug ("\tSIZE_MINIMIZED\n");
1186706f2543Smrg#endif
1187706f2543Smrg	  if (winIsInternalWMRunning(pScreenInfo))
1188706f2543Smrg	    {
1189706f2543Smrg	      /* Raise the window to the top in Z order */
1190706f2543Smrg	      wmMsg.msg = WM_WM_LOWER;
1191706f2543Smrg	      if (fWMMsgInitialized)
1192706f2543Smrg		winSendMessageToWM (pScreenPriv->pWMInfo, &wmMsg);
1193706f2543Smrg	    }
1194706f2543Smrg	  winWindowsWMSendEvent(WindowsWMControllerNotify,
1195706f2543Smrg				WindowsWMControllerNotifyMask,
1196706f2543Smrg				1,
1197706f2543Smrg				WindowsWMMinimizeWindow,
1198706f2543Smrg				pWin->drawable.id,
1199706f2543Smrg				0, 0,
1200706f2543Smrg				LOWORD(lParam), HIWORD(lParam));
1201706f2543Smrg	  break;
1202706f2543Smrg
1203706f2543Smrg	case SIZE_RESTORED:
1204706f2543Smrg#if CYGMULTIWINDOW_DEBUG
1205706f2543Smrg	  winDebug ("\tSIZE_RESTORED\n");
1206706f2543Smrg#endif
1207706f2543Smrg	  winWindowsWMSendEvent(WindowsWMControllerNotify,
1208706f2543Smrg				WindowsWMControllerNotifyMask,
1209706f2543Smrg				1,
1210706f2543Smrg				WindowsWMRestoreWindow,
1211706f2543Smrg				pWin->drawable.id,
1212706f2543Smrg				0, 0,
1213706f2543Smrg				LOWORD(lParam), HIWORD(lParam));
1214706f2543Smrg	  break;
1215706f2543Smrg
1216706f2543Smrg	case SIZE_MAXIMIZED:
1217706f2543Smrg#if CYGMULTIWINDOW_DEBUG
1218706f2543Smrg	  winDebug ("\tSIZE_MAXIMIZED\n");
1219706f2543Smrg#endif
1220706f2543Smrg	  winWindowsWMSendEvent(WindowsWMControllerNotify,
1221706f2543Smrg				WindowsWMControllerNotifyMask,
1222706f2543Smrg				1,
1223706f2543Smrg				WindowsWMMaximizeWindow,
1224706f2543Smrg				pWin->drawable.id,
1225706f2543Smrg				0, 0,
1226706f2543Smrg				LOWORD(lParam), HIWORD(lParam));
1227706f2543Smrg	  break;
1228706f2543Smrg	}
1229706f2543Smrg
1230706f2543Smrg      /* Perform the resize and notify the X client */
1231706f2543Smrg      if (!pRLWinPriv->fMovingOrSizing)
1232706f2543Smrg	{
1233706f2543Smrg	  if (winIsInternalWMRunning(pScreenInfo))
1234706f2543Smrg            winAdjustXWindow (pWin, hwnd);
1235706f2543Smrg
1236706f2543Smrg	  winMWExtWMResizeXWindow (pWin,
1237706f2543Smrg				   (short) LOWORD(lParam)
1238706f2543Smrg				   - wBorderWidth (pWin)*2,
1239706f2543Smrg				   (short) HIWORD(lParam)
1240706f2543Smrg				   - wBorderWidth (pWin)*2);
1241706f2543Smrg	}
1242706f2543Smrg      break;
1243706f2543Smrg
1244706f2543Smrg    case WM_ACTIVATEAPP:
1245706f2543Smrg#if CYGMULTIWINDOW_DEBUG
1246706f2543Smrg      winDebug ("winMWExtWMWindowProc - WM_ACTIVATEAPP - %d ms\n",
1247706f2543Smrg		(unsigned int)GetTickCount ());
1248706f2543Smrg#endif
1249706f2543Smrg      if (wParam)
1250706f2543Smrg	{
1251706f2543Smrg	  if (winIsInternalWMRunning(pScreenInfo))
1252706f2543Smrg	    {
1253706f2543Smrg	    }
1254706f2543Smrg	  else
1255706f2543Smrg	    {
1256706f2543Smrg	    }
1257706f2543Smrg	  winWindowsWMSendEvent(WindowsWMActivationNotify,
1258706f2543Smrg				WindowsWMActivationNotifyMask,
1259706f2543Smrg				1,
1260706f2543Smrg				WindowsWMIsActive,
1261706f2543Smrg				pWin->drawable.id,
1262706f2543Smrg				0, 0,
1263706f2543Smrg				0, 0);
1264706f2543Smrg	}
1265706f2543Smrg      else
1266706f2543Smrg	{
1267706f2543Smrg	  winWindowsWMSendEvent(WindowsWMActivationNotify,
1268706f2543Smrg				WindowsWMActivationNotifyMask,
1269706f2543Smrg				1,
1270706f2543Smrg				WindowsWMIsInactive,
1271706f2543Smrg				pWin->drawable.id,
1272706f2543Smrg				0, 0,
1273706f2543Smrg				0, 0);
1274706f2543Smrg	}
1275706f2543Smrg      break;
1276706f2543Smrg
1277706f2543Smrg    case WM_SETCURSOR:
1278706f2543Smrg      if (LOWORD(lParam) == HTCLIENT)
1279706f2543Smrg	{
1280706f2543Smrg	  if (!g_fSoftwareCursor) SetCursor (pScreenPriv->cursor.handle);
1281706f2543Smrg	  return TRUE;
1282706f2543Smrg	}
1283706f2543Smrg      break;
1284706f2543Smrg
1285706f2543Smrg    case WM_ENTERSIZEMOVE:
1286706f2543Smrg#if CYGMULTIWINDOW_DEBUG
1287706f2543Smrg      winDebug ("winMWExtWMWindowProc - WM_ENTERSIZEMOVE - %d ms\n",
1288706f2543Smrg		(unsigned int)GetTickCount ());
1289706f2543Smrg#endif
1290706f2543Smrg      pRLWinPriv->fMovingOrSizing = TRUE;
1291706f2543Smrg      break;
1292706f2543Smrg
1293706f2543Smrg    case WM_EXITSIZEMOVE:
1294706f2543Smrg#if CYGMULTIWINDOW_DEBUG
1295706f2543Smrg      winDebug ("winMWExtWMWindowProc - WM_EXITSIZEMOVE - %d ms\n",
1296706f2543Smrg		(unsigned int)GetTickCount ());
1297706f2543Smrg#endif
1298706f2543Smrg      pRLWinPriv->fMovingOrSizing = FALSE;
1299706f2543Smrg
1300706f2543Smrg      GetClientRect (hwnd, &rcClient);
1301706f2543Smrg
1302706f2543Smrg      MapWindowPoints (hwnd, HWND_DESKTOP, (LPPOINT)&rcClient, 2);
1303706f2543Smrg
1304706f2543Smrg      if (winIsInternalWMRunning(pScreenInfo))
1305706f2543Smrg        winAdjustXWindow (pWin, hwnd);
1306706f2543Smrg
1307706f2543Smrg      winMWExtWMMoveResizeXWindow (pWin,
1308706f2543Smrg				   rcClient.left - wBorderWidth (pWin)
1309706f2543Smrg				   - GetSystemMetrics (SM_XVIRTUALSCREEN),
1310706f2543Smrg				   rcClient.top - wBorderWidth (pWin)
1311706f2543Smrg				   - GetSystemMetrics (SM_YVIRTUALSCREEN),
1312706f2543Smrg				   rcClient.right - rcClient.left
1313706f2543Smrg				   - wBorderWidth (pWin)*2,
1314706f2543Smrg				   rcClient.bottom - rcClient.top
1315706f2543Smrg				   - wBorderWidth (pWin)*2);
1316706f2543Smrg      break;
1317706f2543Smrg
1318706f2543Smrg    case WM_MANAGE:
1319706f2543Smrg      ErrorF ("winMWExtWMWindowProc - WM_MANAGE\n");
1320706f2543Smrg      break;
1321706f2543Smrg
1322706f2543Smrg    case WM_UNMANAGE:
1323706f2543Smrg      ErrorF ("winMWExtWMWindowProc - WM_UNMANAGE\n");
1324706f2543Smrg      break;
1325706f2543Smrg
1326706f2543Smrg    default:
1327706f2543Smrg      break;
1328706f2543Smrg    }
1329706f2543Smrg
1330706f2543Smrg  return DefWindowProc (hwnd, message, wParam, lParam);
1331706f2543Smrg}
1332