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