winmultiwindowwndproc.c [plain text]
#include "win.h"
#include "dixevents.h"
#include "winmultiwindowclass.h"
#include "winprefs.h"
extern Bool g_fCursor;
HICON g_hiconX = NULL;
static UINT_PTR g_uipMousePollingTimerID = 0;
#define MOUSE_POLLING_INTERVAL 500
#define WIN_MULTIWINDOW_SHAPE YES
#define makemult(a,b) ((b==1) ? (a) : (((int)((a)/(b))) * (b)) )
static void
ConstrainSize (WinXSizeHints hints, int *widthp, int *heightp)
{
int minWidth, minHeight, maxWidth, maxHeight, xinc, yinc, delta;
int baseWidth, baseHeight;
int dwidth = *widthp, dheight = *heightp;
if (hints.flags & PMinSize)
{
minWidth = hints.min_width;
minHeight = hints.min_height;
}
else if (hints.flags & PBaseSize)
{
minWidth = hints.base_width;
minHeight = hints.base_height;
}
else
minWidth = minHeight = 1;
if (hints.flags & PBaseSize)
{
baseWidth = hints.base_width;
baseHeight = hints.base_height;
}
else if (hints.flags & PMinSize)
{
baseWidth = hints.min_width;
baseHeight = hints.min_height;
}
else
baseWidth = baseHeight = 0;
if (hints.flags & PMaxSize)
{
maxWidth = hints.max_width;
maxHeight = hints.max_height;
}
else
{
maxWidth = MAXINT;
maxHeight = MAXINT;
}
if (hints.flags & PResizeInc)
{
xinc = hints.width_inc;
yinc = hints.height_inc;
}
else
xinc = yinc = 1;
if (dwidth < minWidth)
dwidth = minWidth;
if (dheight < minHeight)
dheight = minHeight;
if (dwidth > maxWidth)
dwidth = maxWidth;
if (dheight > maxHeight)
dheight = maxHeight;
dwidth = ((dwidth - baseWidth) / xinc * xinc) + baseWidth;
dheight = ((dheight - baseHeight) / yinc * yinc) + baseHeight;
if (hints.flags & PAspect)
{
if (hints.min_aspect.x * dheight > hints.min_aspect.y * dwidth)
{
delta = makemult(hints.min_aspect.x * dheight / hints.min_aspect.y - dwidth, xinc);
if (dwidth + delta <= maxWidth)
dwidth += delta;
else
{
delta = makemult(dheight - dwidth*hints.min_aspect.y/hints.min_aspect.x, yinc);
if (dheight - delta >= minHeight)
dheight -= delta;
}
}
if (hints.max_aspect.x * dheight < hints.max_aspect.y * dwidth)
{
delta = makemult(dwidth * hints.max_aspect.y / hints.max_aspect.x - dheight, yinc);
if (dheight + delta <= maxHeight)
dheight += delta;
else
{
delta = makemult(dwidth - hints.max_aspect.x*dheight/hints.max_aspect.y, xinc);
if (dwidth - delta >= minWidth)
dwidth -= delta;
}
}
}
*widthp = dwidth;
*heightp = dheight;
}
#undef makemult
static int
ValidateSizing (HWND hwnd, WindowPtr pWin,
WPARAM wParam, LPARAM lParam)
{
WinXSizeHints sizeHints;
RECT *rect;
int iWidth, iHeight, iTopBorder;
POINT pt;
if (pWin==NULL || lParam==0)
return FALSE;
if (!winMultiWindowGetWMNormalHints (pWin, &sizeHints))
return FALSE;
if (sizeHints.flags & PResizeInc)
{
if (sizeHints.width_inc == 0) sizeHints.width_inc = 1;
if (sizeHints.height_inc == 0) sizeHints.height_inc = 1;
}
rect = (RECT*)lParam;
iWidth = rect->right - rect->left;
iHeight = rect->bottom - rect->top;
pt.x = pt.y = 0;
ClientToScreen(hwnd, &pt);
iTopBorder = pt.y - rect->top;
iWidth -= 2 * GetSystemMetrics(SM_CXSIZEFRAME);
iHeight -= GetSystemMetrics(SM_CYSIZEFRAME) + iTopBorder;
ConstrainSize (sizeHints, &iWidth, &iHeight);
iWidth += 2 * GetSystemMetrics(SM_CXSIZEFRAME);
iHeight += GetSystemMetrics(SM_CYSIZEFRAME) + iTopBorder;
switch(wParam) {
case WMSZ_TOP:
case WMSZ_TOPRIGHT:
case WMSZ_BOTTOM:
case WMSZ_BOTTOMRIGHT:
case WMSZ_RIGHT:
rect->right = rect->left + iWidth;
break;
default:
rect->left = rect->right - iWidth;
break;
}
switch(wParam) {
case WMSZ_BOTTOM:
case WMSZ_BOTTOMRIGHT:
case WMSZ_BOTTOMLEFT:
case WMSZ_RIGHT:
case WMSZ_LEFT:
rect->bottom = rect->top + iHeight;
break;
default:
rect->top = rect->bottom - iHeight;
break;
}
return TRUE;
}
LRESULT CALLBACK
winTopLevelWindowProc (HWND hwnd, UINT message,
WPARAM wParam, LPARAM lParam)
{
POINT ptMouse;
HDC hdcUpdate;
PAINTSTRUCT ps;
WindowPtr pWin = NULL;
winPrivWinPtr pWinPriv = NULL;
ScreenPtr s_pScreen = NULL;
winPrivScreenPtr s_pScreenPriv = NULL;
winScreenInfo *s_pScreenInfo = NULL;
HWND hwndScreen = NULL;
DrawablePtr pDraw = NULL;
int iX, iY, iWidth, iHeight, iBorder;
winWMMessageRec wmMsg;
Bool fWMMsgInitialized = FALSE;
static Bool s_fTracking = FALSE;
if ((pWin = GetProp (hwnd, WIN_WINDOW_PROP)) != NULL)
{
pDraw = &pWin->drawable;
s_pScreen = pWin->drawable.pScreen;
pWinPriv = winGetWindowPriv(pWin);
s_pScreenPriv = pWinPriv->pScreenPriv;
s_pScreenInfo = s_pScreenPriv->pScreenInfo;
hwndScreen = s_pScreenPriv->hwndScreen;
wmMsg.msg = 0;
wmMsg.hwndWindow = hwnd;
wmMsg.iWindow = (Window)GetProp (hwnd, WIN_WID_PROP);
wmMsg.iX = pWinPriv->iX;
wmMsg.iY = pWinPriv->iY;
wmMsg.iWidth = pWinPriv->iWidth;
wmMsg.iHeight = pWinPriv->iHeight;
fWMMsgInitialized = TRUE;
#if 0
ErrorF ("hWnd %08X\n", hwnd);
ErrorF ("pWin %08X\n", pWin);
ErrorF ("pDraw %08X\n", pDraw);
ErrorF ("\ttype %08X\n", pWin->drawable.type);
ErrorF ("\tclass %08X\n", pWin->drawable.class);
ErrorF ("\tdepth %08X\n", pWin->drawable.depth);
ErrorF ("\tbitsPerPixel %08X\n", pWin->drawable.bitsPerPixel);
ErrorF ("\tid %08X\n", pWin->drawable.id);
ErrorF ("\tx %08X\n", pWin->drawable.x);
ErrorF ("\ty %08X\n", pWin->drawable.y);
ErrorF ("\twidth %08X\n", pWin->drawable.width);
ErrorF ("\thenght %08X\n", pWin->drawable.height);
ErrorF ("\tpScreen %08X\n", pWin->drawable.pScreen);
ErrorF ("\tserialNumber %08X\n", pWin->drawable.serialNumber);
ErrorF ("g_iWindowPrivateIndex %d\n", g_iWindowPrivateIndex);
ErrorF ("pWinPriv %08X\n", pWinPriv);
ErrorF ("s_pScreenPriv %08X\n", s_pScreenPriv);
ErrorF ("s_pScreenInfo %08X\n", s_pScreenInfo);
ErrorF ("hwndScreen %08X\n", hwndScreen);
#endif
}
switch (message)
{
case WM_CREATE:
#if CYGMULTIWINDOW_DEBUG
ErrorF ("winTopLevelWindowProc - WM_CREATE\n");
#endif
SetProp (hwnd,
WIN_WINDOW_PROP,
(HANDLE)((LPCREATESTRUCT) lParam)->lpCreateParams);
SetProp (hwnd,
WIN_WID_PROP,
(HANDLE)winGetWindowID (((LPCREATESTRUCT) lParam)->lpCreateParams));
return 0;
case WM_INIT_SYS_MENU:
SetupSysMenu ((unsigned long)hwnd);
return 0;
case WM_SYSCOMMAND:
HandleCustomWM_COMMAND ((unsigned long)hwnd, LOWORD(wParam));
break;
case WM_INITMENU:
HandleCustomWM_INITMENU ((unsigned long)hwnd, wParam);
break;
case WM_PAINT:
if (hwndScreen == NULL)
break;
hdcUpdate = BeginPaint (hwnd, &ps);
iBorder = wBorderWidth (pWin);
iX = pWin->drawable.x;
iY = pWin->drawable.y;
iWidth = pWin->drawable.width;
iHeight = pWin->drawable.height;
if (!BitBlt (hdcUpdate,
0, 0,
iWidth, iHeight,
s_pScreenPriv->hdcShadow,
iX, iY,
SRCCOPY))
{
LPVOID lpMsgBuf;
FormatMessage (FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM |
FORMAT_MESSAGE_IGNORE_INSERTS,
NULL,
GetLastError (),
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
(LPTSTR) &lpMsgBuf,
0, NULL);
ErrorF ("winTopLevelWindowProc - BitBlt failed: %s\n",
(LPSTR)lpMsgBuf);
LocalFree (lpMsgBuf);
}
EndPaint (hwndScreen, &ps);
return 0;
case WM_MOUSEMOVE:
ptMouse.x = GET_X_LPARAM(lParam);
ptMouse.y = GET_Y_LPARAM(lParam);
ClientToScreen (hwnd, &ptMouse);
ptMouse.x -= GetSystemMetrics (SM_XVIRTUALSCREEN);
ptMouse.y -= GetSystemMetrics (SM_YVIRTUALSCREEN);
if (s_pScreenPriv == NULL || s_pScreenInfo->fIgnoreInput)
break;
if (s_pScreen != miPointerCurrentScreen ())
miPointerSetNewScreen (s_pScreenInfo->dwScreen,
ptMouse.x - s_pScreenInfo->dwXOffset,
ptMouse.y - s_pScreenInfo->dwYOffset);
if (!s_fTracking)
{
TRACKMOUSEEVENT tme;
ZeroMemory (&tme, sizeof (tme));
tme.cbSize = sizeof (tme);
tme.dwFlags = TME_LEAVE;
tme.hwndTrack = hwnd;
if (!(*g_fpTrackMouseEvent) (&tme))
ErrorF ("winTopLevelWindowProc - _TrackMouseEvent failed\n");
s_fTracking = TRUE;
}
if (g_fCursor)
{
g_fCursor = FALSE;
ShowCursor (FALSE);
}
if (g_uipMousePollingTimerID != 0)
{
KillTimer (s_pScreenPriv->hwndScreen, WIN_POLLING_MOUSE_TIMER_ID);
g_uipMousePollingTimerID = 0;
}
miPointerAbsoluteCursor (ptMouse.x - s_pScreenInfo->dwXOffset,
ptMouse.y - s_pScreenInfo->dwYOffset,
g_c32LastInputEventTime = GetTickCount ());
return 0;
case WM_NCMOUSEMOVE:
if (s_pScreenPriv == NULL || s_pScreenInfo->fIgnoreInput)
break;
if (!g_fCursor)
{
g_fCursor = TRUE;
ShowCursor (TRUE);
}
if (g_uipMousePollingTimerID == 0)
g_uipMousePollingTimerID = SetTimer (s_pScreenPriv->hwndScreen,
WIN_POLLING_MOUSE_TIMER_ID,
MOUSE_POLLING_INTERVAL,
NULL);
break;
case WM_MOUSELEAVE:
s_fTracking = FALSE;
if (!g_fCursor)
{
g_fCursor = TRUE;
ShowCursor (TRUE);
}
if (g_uipMousePollingTimerID == 0)
g_uipMousePollingTimerID = SetTimer (s_pScreenPriv->hwndScreen,
WIN_POLLING_MOUSE_TIMER_ID,
MOUSE_POLLING_INTERVAL,
NULL);
return 0;
case WM_LBUTTONDBLCLK:
case WM_LBUTTONDOWN:
if (s_pScreenPriv == NULL || s_pScreenInfo->fIgnoreInput)
break;
return winMouseButtonsHandle (s_pScreen, ButtonPress, Button1, wParam);
case WM_LBUTTONUP:
if (s_pScreenPriv == NULL || s_pScreenInfo->fIgnoreInput)
break;
return winMouseButtonsHandle (s_pScreen, ButtonRelease, Button1, wParam);
case WM_MBUTTONDBLCLK:
case WM_MBUTTONDOWN:
if (s_pScreenPriv == NULL || s_pScreenInfo->fIgnoreInput)
break;
return winMouseButtonsHandle (s_pScreen, ButtonPress, Button2, wParam);
case WM_MBUTTONUP:
if (s_pScreenPriv == NULL || s_pScreenInfo->fIgnoreInput)
break;
return winMouseButtonsHandle (s_pScreen, ButtonRelease, Button2, wParam);
case WM_RBUTTONDBLCLK:
case WM_RBUTTONDOWN:
if (s_pScreenPriv == NULL || s_pScreenInfo->fIgnoreInput)
break;
return winMouseButtonsHandle (s_pScreen, ButtonPress, Button3, wParam);
case WM_RBUTTONUP:
if (s_pScreenPriv == NULL || s_pScreenInfo->fIgnoreInput)
break;
return winMouseButtonsHandle (s_pScreen, ButtonRelease, Button3, wParam);
case WM_MOUSEWHEEL:
#if CYGMULTIWINDOW_DEBUG
ErrorF ("winTopLevelWindowProc - WM_MOUSEWHEEL\n");
#endif
SendMessage (hwndScreen, message, wParam, lParam);
return 0;
case WM_KILLFOCUS:
winKeybdReleaseKeys ();
return 0;
case WM_SYSDEADCHAR:
case WM_DEADCHAR:
return 0;
case WM_SYSKEYDOWN:
case WM_KEYDOWN:
#if CYGMULTIWINDOW_DEBUG
ErrorF ("winTopLevelWindowProc - WM_*KEYDOWN\n");
#endif
if (wParam == VK_F4 && (GetKeyState (VK_MENU) & 0x8000))
break;
SendMessage (hwndScreen, message, wParam, lParam);
return 0;
case WM_SYSKEYUP:
case WM_KEYUP:
#if CYGMULTIWINDOW_DEBUG
ErrorF ("winTopLevelWindowProc - WM_*KEYUP\n");
#endif
SendMessage (hwndScreen, message, wParam, lParam);
return 0;
case WM_HOTKEY:
#if CYGMULTIWINDOW_DEBUG
ErrorF ("winTopLevelWindowProc - WM_HOTKEY\n");
#endif
SendMessage (hwndScreen, message, wParam, lParam);
return 0;
case WM_ACTIVATE:
#if CYGMULTIWINDOW_DEBUG
ErrorF ("winTopLevelWindowProc - WM_ACTIVATE\n");
#endif
SendMessage (hwndScreen, message, wParam, lParam);
if (s_pScreenPriv != NULL)
s_pScreenPriv->fWindowOrderChanged = TRUE;
if (LOWORD(wParam) != WA_INACTIVE)
{
wmMsg.msg = WM_WM_ACTIVATE;
if (fWMMsgInitialized)
winSendMessageToWM (s_pScreenPriv->pWMInfo, &wmMsg);
}
return 0;
case WM_ACTIVATEAPP:
#if CYGMULTIWINDOW_DEBUG
ErrorF ("winTopLevelWindowProc - WM_ACTIVATEAPP\n");
#endif
SendMessage (hwndScreen, message, wParam, lParam);
return 0;
case WM_CLOSE:
#if CYGMULTIWINDOW_DEBUG
ErrorF ("winTopLevelWindowProc - WM_CLOSE\n");
#endif
if (pWinPriv->fXKilled)
{
DestroyWindow (hwnd);
}
else
{
wmMsg.msg = WM_WM_KILL;
if (fWMMsgInitialized)
winSendMessageToWM (s_pScreenPriv->pWMInfo, &wmMsg);
}
return 0;
case WM_DESTROY:
#if CYGMULTIWINDOW_DEBUG
ErrorF ("winTopLevelWindowProc - WM_DESTROY\n");
#endif
if (pWinPriv && !pWinPriv->fXKilled)
{
ErrorF ("winTopLevelWindowProc - WM_DESTROY - WM_WM_KILL\n");
wmMsg.msg = WM_WM_KILL;
if (fWMMsgInitialized)
winSendMessageToWM (s_pScreenPriv->pWMInfo, &wmMsg);
}
#if CYGMULTIWINDOW_DEBUG
ErrorF ("winTopLevelWindowProc - WM_DESTROY\n");
#endif
break;
case WM_MOVE:
#if CYGMULTIWINDOW_DEBUG
ErrorF ("winTopLevelWindowProc - WM_MOVE - %d ms\n", GetTickCount ());
#endif
if (pWinPriv->iX == (short) LOWORD(lParam)
&& pWinPriv->iY == (short) HIWORD(lParam))
break;
{
WINDOWPLACEMENT windPlace;
windPlace.length = sizeof (WINDOWPLACEMENT);
GetWindowPlacement (hwnd, &windPlace);
if (windPlace.showCmd == SW_MAXIMIZE
|| windPlace.showCmd == SW_SHOWMAXIMIZED)
break;
}
pWinPriv->iX = (short) LOWORD(lParam);
pWinPriv->iY = (short) HIWORD(lParam);
#if CYGMULTIWINDOW_DEBUG
ErrorF ("\t(%d, %d)\n", pWinPriv->iX, pWinPriv->iY);
#endif
winMoveXWindow (pWin,
(LOWORD(lParam) - wBorderWidth (pWin)
- GetSystemMetrics (SM_XVIRTUALSCREEN)),
(HIWORD(lParam) - wBorderWidth (pWin)
- GetSystemMetrics (SM_YVIRTUALSCREEN)));
return 0;
case WM_SHOWWINDOW:
if (!wParam)
return 0;
MapWindow (pWin, wClient(pWin));
if (!pWin->overrideRedirect)
{
DWORD dwExStyle;
DWORD dwStyle;
RECT rcNew;
int iDx, iDy;
SetProp (hwnd, WIN_NEEDMANAGE_PROP, (HANDLE) 1);
dwExStyle = GetWindowLongPtr (hwnd, GWL_EXSTYLE);
dwStyle = GetWindowLongPtr (hwnd, GWL_STYLE);
if (dwExStyle != WS_EX_APPWINDOW)
{
SetRect (&rcNew,
pWinPriv->iX,
pWinPriv->iY,
pWinPriv->iX + pWinPriv->iWidth,
pWinPriv->iY + pWinPriv->iHeight);
#if 0
ErrorF ("winTopLevelWindowProc - (%d, %d)-(%d, %d)\n",
rcNew.left, rcNew.top,
rcNew.right, rcNew.bottom);
#endif
AdjustWindowRectEx (&rcNew,
WS_POPUP | WS_SIZEBOX | WS_OVERLAPPEDWINDOW,
FALSE,
WS_EX_APPWINDOW);
iDx = pWinPriv->iX - rcNew.left;
iDy = pWinPriv->iY - rcNew.top;
rcNew.left += iDx;
rcNew.right += iDx;
rcNew.top += iDy;
rcNew.bottom += iDy;
#if 0
ErrorF ("winTopLevelWindowProc - (%d, %d)-(%d, %d)\n",
rcNew.left, rcNew.top,
rcNew.right, rcNew.bottom);
#endif
SetWindowLongPtr (hwnd, GWL_EXSTYLE, WS_EX_APPWINDOW);
SetWindowLongPtr (hwnd, GWL_STYLE,
WS_POPUP | WS_SIZEBOX | WS_OVERLAPPEDWINDOW);
SetWindowPos (hwnd, HWND_TOP,
rcNew.left, rcNew.top,
rcNew.right - rcNew.left, rcNew.bottom - rcNew.top,
SWP_NOMOVE | SWP_FRAMECHANGED
| SWP_SHOWWINDOW | SWP_NOACTIVATE);
SetForegroundWindow (hwnd);
}
}
wmMsg.msg = WM_WM_MAP;
wmMsg.iWidth = pWinPriv->iWidth;
wmMsg.iHeight = pWinPriv->iHeight;
if (fWMMsgInitialized)
winSendMessageToWM (s_pScreenPriv->pWMInfo, &wmMsg);
if (s_pScreenPriv != NULL)
s_pScreenPriv->fWindowOrderChanged = TRUE;
return 0;
case WM_SIZING:
return ValidateSizing (hwnd, pWin, wParam, lParam);
case WM_WINDOWPOSCHANGED:
{
LPWINDOWPOS pwindPos = (LPWINDOWPOS) lParam;
if (pwindPos->flags & SWP_NOZORDER)
break;
#if CYGMULTIWINDOW_DEBUG
ErrorF ("winTopLevelWindowProc - hwndInsertAfter: %p\n",
pwindPos->hwndInsertAfter);
#endif
SendMessage (hwndScreen, message, wParam, lParam);
if (s_pScreenPriv != NULL)
s_pScreenPriv->fWindowOrderChanged = TRUE;
}
return 0;
case WM_SIZE:
#if CYGMULTIWINDOW_DEBUG
ErrorF ("winTopLevelWindowProc - WM_SIZE - %d ms\n", GetTickCount ());
#endif
switch (wParam)
{
case SIZE_MINIMIZED:
#if CYGMULTIWINDOW_DEBUG
ErrorF ("\tSIZE_MINIMIZED\n");
#endif
if (s_pScreenPriv != NULL)
s_pScreenPriv->fWindowOrderChanged = TRUE;
break;
case SIZE_RESTORED:
case SIZE_MAXIMIZED:
#if CYGMULTIWINDOW_DEBUG
ErrorF ("SIZE_RESTORED || SIZE_MAXIMIZED\n");
#endif
if (pWinPriv->iWidth == (short) LOWORD(lParam)
&& pWinPriv->iHeight == (short) HIWORD(lParam))
break;
pWinPriv->iWidth = (short) LOWORD(lParam);
pWinPriv->iHeight = (short) HIWORD(lParam);
#if CYGMULTIWINDOW_DEBUG
ErrorF ("\t(%d, %d)\n", pWinPriv->iWidth, pWinPriv->iHeight);
#endif
if (wParam == SIZE_MAXIMIZED)
{
POINT ptHome;
pWinPriv->fNeedRestore = TRUE;
pWinPriv->ptRestore.x = pWinPriv->iX;
pWinPriv->ptRestore.y = pWinPriv->iY;
ptHome.x = 0;
ptHome.y = 0;
ClientToScreen (hwnd, &ptHome);
winMoveXWindow (pWin,
ptHome.x - wBorderWidth (pWin)
- GetSystemMetrics (SM_XVIRTUALSCREEN),
ptHome.y - wBorderWidth (pWin)
- GetSystemMetrics (SM_YVIRTUALSCREEN));
}
else if (wParam == SIZE_RESTORED && pWinPriv->fNeedRestore)
{
WINDOWPLACEMENT windPlace;
windPlace.length = sizeof (WINDOWPLACEMENT);
GetWindowPlacement (hwnd, &windPlace);
if (windPlace.showCmd != SW_MAXIMIZE
&& windPlace.showCmd != SW_SHOWMAXIMIZED)
{
pWinPriv->fNeedRestore = FALSE;
winMoveXWindow (pWin,
pWinPriv->ptRestore.x - wBorderWidth (pWin)
- GetSystemMetrics (SM_XVIRTUALSCREEN),
pWinPriv->ptRestore.y - wBorderWidth (pWin)
- GetSystemMetrics (SM_YVIRTUALSCREEN));
}
}
winResizeXWindow (pWin,
(short) LOWORD(lParam),
(short) HIWORD(lParam));
break;
default:
break;
}
return 0;
case WM_MOUSEACTIVATE:
#if CYGMULTIWINDOW_DEBUG
ErrorF ("winTopLevelWindowProc - WM_MOUSEACTIVATE\n");
#endif
if (!GetProp (pWinPriv->hWnd, WIN_NEEDMANAGE_PROP))
{
#if CYGMULTIWINDOW_DEBUG
ErrorF ("winTopLevelWindowProc - WM_MOUSEACTIVATE - "
"MA_NOACTIVATE\n");
#endif
return MA_NOACTIVATE;
}
break;
default:
break;
}
return DefWindowProc (hwnd, message, wParam, lParam);
}