#ifdef HAVE_XWIN_CONFIG_H
#include <xwin-config.h>
#endif
#include "win.h"
#include <commctrl.h>
#include "winprefs.h"
#include "winconfig.h"
#include "winmsg.h"
#include "winmonitors.h"
#include "inputstr.h"
Bool g_fCursor = TRUE;
Bool g_fButton[3] = { FALSE, FALSE, FALSE };
LRESULT CALLBACK
winWindowProc (HWND hwnd, UINT message,
WPARAM wParam, LPARAM lParam)
{
static winPrivScreenPtr s_pScreenPriv = NULL;
static winScreenInfo *s_pScreenInfo = NULL;
static ScreenPtr s_pScreen = NULL;
static HWND s_hwndLastPrivates = NULL;
static HINSTANCE s_hInstance;
static Bool s_fTracking = FALSE;
static unsigned long s_ulServerGeneration = 0;
static UINT s_uTaskbarRestart = 0;
int iScanCode;
int i;
#if CYGDEBUG
winDebugWin32Message("winWindowProc", hwnd, message, wParam, lParam);
#endif
if (g_ulServerGeneration != s_ulServerGeneration)
{
s_ulServerGeneration = g_ulServerGeneration;
}
if ((s_pScreenPriv == NULL || hwnd != s_hwndLastPrivates)
&& (s_pScreenPriv = GetProp (hwnd, WIN_SCR_PROP)) != NULL)
{
#if CYGDEBUG
winDebug ("winWindowProc - Setting privates handle\n");
#endif
s_pScreenInfo = s_pScreenPriv->pScreenInfo;
s_pScreen = s_pScreenInfo->pScreen;
s_hwndLastPrivates = hwnd;
}
else if (s_pScreenPriv == NULL)
{
s_pScreenInfo = NULL;
s_pScreen = NULL;
s_hwndLastPrivates = NULL;
}
switch (message)
{
case WM_TRAYICON:
return winHandleIconMessage (hwnd, message, wParam, lParam,
s_pScreenPriv);
case WM_CREATE:
#if CYGDEBUG
winDebug ("winWindowProc - WM_CREATE\n");
#endif
s_pScreenPriv = ((LPCREATESTRUCT) lParam)->lpCreateParams;
s_hInstance = ((LPCREATESTRUCT) lParam)->hInstance;
s_pScreenInfo = s_pScreenPriv->pScreenInfo;
s_pScreen = s_pScreenInfo->pScreen;
s_hwndLastPrivates = hwnd;
s_uTaskbarRestart = RegisterWindowMessage(TEXT("TaskbarCreated"));
SetProp (hwnd, WIN_SCR_PROP, s_pScreenPriv);
if (!s_pScreenInfo->fNoTrayIcon)
{
s_pScreenPriv->hwndScreen = hwnd;
winInitNotifyIcon (s_pScreenPriv);
}
return 0;
case WM_DISPLAYCHANGE:
if (s_pScreenInfo == NULL)
FatalError ("winWindowProc - WM_DISPLAYCHANGE - The display "
"mode changed while we were intializing. This is "
"very bad and unexpected. Exiting.\n");
if (s_pScreenInfo->fFullScreen
&& (s_pScreenInfo->dwEngine == WIN_SERVER_SHADOW_DD
|| s_pScreenInfo->dwEngine == WIN_SERVER_SHADOW_DDNL
#ifdef XWIN_PRIMARYFB
|| s_pScreenInfo->dwEngine == WIN_SERVER_PRIMARY_DD
#endif
))
{
break;
}
ErrorF ("winWindowProc - WM_DISPLAYCHANGE - new width: %d "
"new height: %d new bpp: %d\n",
LOWORD (lParam), HIWORD (lParam), wParam);
if (s_pScreenInfo->dwBPP != GetDeviceCaps (s_pScreenPriv->hdcScreen, BITSPIXEL))
{
if ((s_pScreenInfo->dwEngine == WIN_SERVER_SHADOW_DD
|| s_pScreenInfo->dwEngine == WIN_SERVER_SHADOW_DDNL
#ifdef XWIN_PRIMARYFB
|| s_pScreenInfo->dwEngine == WIN_SERVER_PRIMARY_DD
#endif
))
{
ErrorF ("winWindowProc - Disruptive change in depth\n");
winDisplayDepthChangeDialog (s_pScreenPriv);
s_pScreenPriv->fBadDepth = TRUE;
ShowWindow (hwnd, SW_MINIMIZE);
}
else
{
ErrorF ("winWindowProc - Performance may be non-optimal after change in depth\n");
}
}
else
{
s_pScreenPriv->fBadDepth = FALSE;
}
{
if ((!s_pScreenInfo->fUserGaveHeightAndWidth) &&
(s_pScreenInfo->iResizeMode == resizeWithRandr) &&
(FALSE
#ifdef XWIN_MULTIWINDOWEXTWM
|| s_pScreenInfo->fMWExtWM
#endif
|| s_pScreenInfo->fRootless
#ifdef XWIN_MULTIWINDOW
|| s_pScreenInfo->fMultiWindow
#endif
))
{
DWORD dwWidth, dwHeight;
if (s_pScreenInfo->fMultipleMonitors)
{
dwWidth = GetSystemMetrics(SM_CXVIRTUALSCREEN);
dwHeight = GetSystemMetrics(SM_CYVIRTUALSCREEN);
}
else
{
struct GetMonitorInfoData data;
if (QueryMonitor(s_pScreenInfo->iMonitor, &data))
{
if (data.bMonitorSpecifiedExists == TRUE)
{
dwWidth = data.monitorWidth;
dwHeight = data.monitorHeight;
}
else
{
ErrorF ("Monitor number %d no longer exists!\n", s_pScreenInfo->iMonitor);
}
}
}
if ((s_pScreenInfo->dwWidth != dwWidth) ||
(s_pScreenInfo->dwHeight != dwHeight))
{
winDoRandRScreenSetSize(s_pScreen,
dwWidth,
dwHeight,
(dwWidth * 25.4) / monitorResolution,
(dwHeight * 25.4) / monitorResolution);
}
}
else
{
winDebug ("winWindowProc - WM_DISPLAYCHANGE - Releasing and recreating primary surface\n");
(*s_pScreenPriv->pwinReleasePrimarySurface) (s_pScreen);
(*s_pScreenPriv->pwinCreatePrimarySurface) (s_pScreen);
}
}
break;
case WM_SIZE:
{
SCROLLINFO si;
RECT rcWindow;
int iWidth, iHeight;
#if CYGDEBUG
winDebug ("winWindowProc - WM_SIZE\n");
#endif
if ((s_pScreenInfo->iResizeMode == notAllowed)
|| !s_pScreenInfo->fDecoration
#ifdef XWIN_MULTIWINDOWEXTWM
|| s_pScreenInfo->fMWExtWM
#endif
|| s_pScreenInfo->fRootless
#ifdef XWIN_MULTIWINDOW
|| s_pScreenInfo->fMultiWindow
#endif
|| s_pScreenInfo->fFullScreen)
break;
if (wParam == SIZE_MINIMIZED)
return 0;
ErrorF ("winWindowProc - WM_SIZE - new client area w: %d h: %d\n",
LOWORD (lParam), HIWORD (lParam));
if (s_pScreenInfo->iResizeMode == resizeWithRandr)
{
return 0;
}
GetWindowRect (hwnd, &rcWindow);
iWidth = rcWindow.right - rcWindow.left;
iHeight = rcWindow.bottom - rcWindow.top;
iWidth -= 2 * GetSystemMetrics (SM_CXSIZEFRAME);
iHeight -= (2 * GetSystemMetrics (SM_CYSIZEFRAME)
+ GetSystemMetrics (SM_CYCAPTION));
if (iWidth < s_pScreenInfo->dwWidth
|| iHeight < s_pScreenInfo->dwHeight)
{
iWidth -= GetSystemMetrics (SM_CXVSCROLL);
iHeight -= GetSystemMetrics (SM_CYHSCROLL);
}
si.cbSize = sizeof (si);
si.fMask = SIF_PAGE | SIF_RANGE;
si.nMin = 0;
si.nMax = s_pScreenInfo->dwWidth - 1;
si.nPage = iWidth;
SetScrollInfo (hwnd, SB_HORZ, &si, TRUE);
si.cbSize = sizeof (si);
si.fMask = SIF_PAGE | SIF_RANGE;
si.nMin = 0;
si.nMax = s_pScreenInfo->dwHeight - 1;
si.nPage = iHeight;
SetScrollInfo (hwnd, SB_VERT, &si, TRUE);
si.cbSize = sizeof (si);
si.fMask = SIF_POS;
GetScrollInfo (hwnd, SB_HORZ, &si);
s_pScreenInfo->dwXOffset = -si.nPos;
si.cbSize = sizeof (si);
si.fMask = SIF_POS;
GetScrollInfo (hwnd, SB_VERT, &si);
s_pScreenInfo->dwYOffset = -si.nPos;
}
return 0;
case WM_ENTERSIZEMOVE:
ErrorF("winWindowProc - WM_ENTERSIZEMOVE\n");
break;
case WM_EXITSIZEMOVE:
ErrorF("winWindowProc - WM_EXITSIZEMOVE\n");
if (s_pScreenInfo->iResizeMode == resizeWithRandr)
{
RECT rcClient;
DWORD dwWidth, dwHeight;
GetClientRect (hwnd, &rcClient);
dwWidth = rcClient.right - rcClient.left;
dwHeight = rcClient.bottom - rcClient.top;
if ((s_pScreenInfo->dwWidth != dwWidth) ||
(s_pScreenInfo->dwHeight != dwHeight))
{
winDoRandRScreenSetSize(s_pScreen,
dwWidth,
dwHeight,
(dwWidth * 25.4) / monitorResolution,
(dwHeight * 25.4) / monitorResolution);
}
}
break;
case WM_VSCROLL:
{
SCROLLINFO si;
int iVertPos;
#if CYGDEBUG
winDebug ("winWindowProc - WM_VSCROLL\n");
#endif
si.cbSize = sizeof (si);
si.fMask = SIF_ALL;
GetScrollInfo (hwnd, SB_VERT, &si);
iVertPos = si.nPos;
switch (LOWORD(wParam))
{
case SB_TOP:
si.nPos = si.nMin;
break;
case SB_BOTTOM:
si.nPos = si.nMax - si.nPage + 1;
break;
case SB_LINEUP:
si.nPos -= 1;
break;
case SB_LINEDOWN:
si.nPos += 1;
break;
case SB_PAGEUP:
si.nPos -= si.nPage;
break;
case SB_PAGEDOWN:
si.nPos += si.nPage;
break;
case SB_THUMBTRACK:
si.nPos = si.nTrackPos;
break;
default:
break;
}
si.fMask = SIF_POS;
SetScrollInfo (hwnd, SB_VERT, &si, TRUE);
GetScrollInfo (hwnd, SB_VERT, &si);
if (si.nPos != iVertPos)
{
s_pScreenInfo->dwYOffset = -si.nPos;
ScrollWindowEx (hwnd,
0,
iVertPos - si.nPos,
NULL,
NULL,
NULL,
NULL,
SW_INVALIDATE);
UpdateWindow (hwnd);
}
}
return 0;
case WM_HSCROLL:
{
SCROLLINFO si;
int iHorzPos;
#if CYGDEBUG
winDebug ("winWindowProc - WM_HSCROLL\n");
#endif
si.cbSize = sizeof (si);
si.fMask = SIF_ALL;
GetScrollInfo (hwnd, SB_HORZ, &si);
iHorzPos = si.nPos;
switch (LOWORD(wParam))
{
case SB_LEFT:
si.nPos = si.nMin;
break;
case SB_RIGHT:
si.nPos = si.nMax - si.nPage + 1;
break;
case SB_LINELEFT:
si.nPos -= 1;
break;
case SB_LINERIGHT:
si.nPos += 1;
break;
case SB_PAGELEFT:
si.nPos -= si.nPage;
break;
case SB_PAGERIGHT:
si.nPos += si.nPage;
break;
case SB_THUMBTRACK:
si.nPos = si.nTrackPos;
break;
default:
break;
}
si.fMask = SIF_POS;
SetScrollInfo (hwnd, SB_HORZ, &si, TRUE);
GetScrollInfo (hwnd, SB_HORZ, &si);
if (si.nPos != iHorzPos)
{
s_pScreenInfo->dwXOffset = -si.nPos;
ScrollWindowEx (hwnd,
iHorzPos - si.nPos,
0,
NULL,
NULL,
NULL,
NULL,
SW_INVALIDATE);
UpdateWindow (hwnd);
}
}
return 0;
case WM_GETMINMAXINFO:
{
MINMAXINFO *pMinMaxInfo = (MINMAXINFO *) lParam;
int iCaptionHeight;
int iBorderHeight, iBorderWidth;
#if CYGDEBUG
winDebug ("winWindowProc - WM_GETMINMAXINFO - pScreenInfo: %08x\n",
s_pScreenInfo);
#endif
if (s_pScreenInfo == NULL
|| (s_pScreenInfo->iResizeMode != resizeWithScrollbars)
|| s_pScreenInfo->fFullScreen
|| !s_pScreenInfo->fDecoration
#ifdef XWIN_MULTIWINDOWEXTWM
|| s_pScreenInfo->fMWExtWM
#endif
|| s_pScreenInfo->fRootless
#ifdef XWIN_MULTIWINDOW
|| s_pScreenInfo->fMultiWindow
#endif
)
break;
iCaptionHeight = GetSystemMetrics (SM_CYCAPTION);
iBorderWidth = 2 * GetSystemMetrics (SM_CXSIZEFRAME);
iBorderHeight = 2 * GetSystemMetrics (SM_CYSIZEFRAME);
pMinMaxInfo->ptMaxTrackSize.x
= s_pScreenInfo->dwWidth + iBorderWidth;
pMinMaxInfo->ptMaxTrackSize.y
= s_pScreenInfo->dwHeight + iBorderHeight + iCaptionHeight;
}
return 0;
case WM_ERASEBKGND:
#if CYGDEBUG
winDebug ("winWindowProc - WM_ERASEBKGND\n");
#endif
return TRUE;
case WM_PAINT:
#if CYGDEBUG
winDebug ("winWindowProc - WM_PAINT\n");
#endif
if (s_pScreenPriv == NULL
|| !s_pScreenPriv->fEnabled
|| (s_pScreenInfo->fFullScreen && !s_pScreenPriv->fActive)
|| s_pScreenPriv->fBadDepth)
{
break;
}
if (s_pScreenPriv->pwinBltExposedRegions == NULL)
break;
(*s_pScreenPriv->pwinBltExposedRegions) (s_pScreen);
return 0;
case WM_PALETTECHANGED:
{
#if CYGDEBUG
winDebug ("winWindowProc - WM_PALETTECHANGED\n");
#endif
if (s_pScreenPriv == NULL
|| s_pScreenPriv->pcmapInstalled == NULL
|| s_pScreenPriv->fBadDepth)
break;
if ((HWND) wParam == hwnd)
{
(*s_pScreenPriv->pwinRedrawScreen) (s_pScreen);
return 0;
}
(*s_pScreenPriv->pwinRealizeInstalledPalette) (s_pScreen);
(*s_pScreenPriv->pwinRedrawScreen) (s_pScreen);
return 0;
}
case WM_MOUSEMOVE:
if (s_pScreenPriv == NULL || s_pScreenInfo->fIgnoreInput)
break;
if (g_pwinPointer == NULL)
break;
if (s_pScreen != miPointerGetScreen(g_pwinPointer))
miPointerSetScreen (g_pwinPointer, s_pScreenInfo->dwScreen,
GET_X_LPARAM(lParam)-s_pScreenInfo->dwXOffset,
GET_Y_LPARAM(lParam)-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 ("winWindowProc - _TrackMouseEvent failed\n");
s_fTracking = TRUE;
}
if (g_fSoftwareCursor && g_fCursor && (s_pScreenPriv->fActive || s_pScreenInfo->fLessPointer))
{
g_fCursor = FALSE;
ShowCursor (FALSE);
}
else if (g_fSoftwareCursor && !g_fCursor && !s_pScreenPriv->fActive
&& !s_pScreenInfo->fLessPointer)
{
g_fCursor = TRUE;
ShowCursor (TRUE);
}
winEnqueueMotion(GET_X_LPARAM(lParam)-s_pScreenInfo->dwXOffset,
GET_Y_LPARAM(lParam)-s_pScreenInfo->dwYOffset);
return 0;
case WM_NCMOUSEMOVE:
if (s_pScreenPriv == NULL || s_pScreenInfo->fIgnoreInput)
break;
if (g_fSoftwareCursor && !g_fCursor)
{
g_fCursor = TRUE;
ShowCursor (TRUE);
}
break;
case WM_MOUSELEAVE:
s_fTracking = FALSE;
if (g_fSoftwareCursor && !g_fCursor)
{
g_fCursor = TRUE;
ShowCursor (TRUE);
}
return 0;
case WM_LBUTTONDBLCLK:
case WM_LBUTTONDOWN:
if (s_pScreenPriv == NULL || s_pScreenInfo->fIgnoreInput)
break;
if (s_pScreenInfo->fRootless
#ifdef XWIN_MULTIWINDOWEXTWM
|| s_pScreenInfo->fMWExtWM
#endif
)
SetCapture (hwnd);
return winMouseButtonsHandle (s_pScreen, ButtonPress, Button1, wParam);
case WM_LBUTTONUP:
if (s_pScreenPriv == NULL || s_pScreenInfo->fIgnoreInput)
break;
if (s_pScreenInfo->fRootless
#ifdef XWIN_MULTIWINDOWEXTWM
|| s_pScreenInfo->fMWExtWM
#endif
)
ReleaseCapture ();
return winMouseButtonsHandle (s_pScreen, ButtonRelease, Button1, wParam);
case WM_MBUTTONDBLCLK:
case WM_MBUTTONDOWN:
if (s_pScreenPriv == NULL || s_pScreenInfo->fIgnoreInput)
break;
if (s_pScreenInfo->fRootless
#ifdef XWIN_MULTIWINDOWEXTWM
|| s_pScreenInfo->fMWExtWM
#endif
)
SetCapture (hwnd);
return winMouseButtonsHandle (s_pScreen, ButtonPress, Button2, wParam);
case WM_MBUTTONUP:
if (s_pScreenPriv == NULL || s_pScreenInfo->fIgnoreInput)
break;
if (s_pScreenInfo->fRootless
#ifdef XWIN_MULTIWINDOWEXTWM
|| s_pScreenInfo->fMWExtWM
#endif
)
ReleaseCapture ();
return winMouseButtonsHandle (s_pScreen, ButtonRelease, Button2, wParam);
case WM_RBUTTONDBLCLK:
case WM_RBUTTONDOWN:
if (s_pScreenPriv == NULL || s_pScreenInfo->fIgnoreInput)
break;
if (s_pScreenInfo->fRootless
#ifdef XWIN_MULTIWINDOWEXTWM
|| s_pScreenInfo->fMWExtWM
#endif
)
SetCapture (hwnd);
return winMouseButtonsHandle (s_pScreen, ButtonPress, Button3, wParam);
case WM_RBUTTONUP:
if (s_pScreenPriv == NULL || s_pScreenInfo->fIgnoreInput)
break;
if (s_pScreenInfo->fRootless
#ifdef XWIN_MULTIWINDOWEXTWM
|| s_pScreenInfo->fMWExtWM
#endif
)
ReleaseCapture ();
return winMouseButtonsHandle (s_pScreen, ButtonRelease, Button3, wParam);
case WM_XBUTTONDBLCLK:
case WM_XBUTTONDOWN:
if (s_pScreenPriv == NULL || s_pScreenInfo->fIgnoreInput)
break;
if (s_pScreenInfo->fRootless
#ifdef XWIN_MULTIWINDOWEXTWM
|| s_pScreenInfo->fMWExtWM
#endif
)
SetCapture (hwnd);
return winMouseButtonsHandle (s_pScreen, ButtonPress, HIWORD(wParam) + 5, wParam);
case WM_XBUTTONUP:
if (s_pScreenPriv == NULL || s_pScreenInfo->fIgnoreInput)
break;
if (s_pScreenInfo->fRootless
#ifdef XWIN_MULTIWINDOWEXTWM
|| s_pScreenInfo->fMWExtWM
#endif
)
ReleaseCapture ();
return winMouseButtonsHandle (s_pScreen, ButtonRelease, HIWORD(wParam) + 5, wParam);
case WM_TIMER:
if (s_pScreenPriv == NULL || s_pScreenInfo->fIgnoreInput)
break;
switch (wParam)
{
case WIN_E3B_TIMER_ID:
winMouseButtonsSendEvent (ButtonPress,
s_pScreenPriv->iE3BCachedPress);
KillTimer (s_pScreenPriv->hwndScreen, WIN_E3B_TIMER_ID);
s_pScreenPriv->iE3BCachedPress = 0;
break;
case WIN_POLLING_MOUSE_TIMER_ID:
{
POINT point;
WPARAM wL, wM, wR, wShift, wCtrl;
LPARAM lPos;
GetCursorPos (&point);
point.x -= GetSystemMetrics (SM_XVIRTUALSCREEN);
point.y -= GetSystemMetrics (SM_YVIRTUALSCREEN);
winEnqueueMotion(point.x , point.y);
GetCursorPos (&point);
wL = (GetKeyState (VK_LBUTTON) & 0x8000)?MK_LBUTTON:0;
wM = (GetKeyState (VK_MBUTTON) & 0x8000)?MK_MBUTTON:0;
wR = (GetKeyState (VK_RBUTTON) & 0x8000)?MK_RBUTTON:0;
wShift = (GetKeyState (VK_SHIFT) & 0x8000)?MK_SHIFT:0;
wCtrl = (GetKeyState (VK_CONTROL) & 0x8000)?MK_CONTROL:0;
lPos = MAKELPARAM(point.x, point.y);
if (g_fButton[0] & !wL)
PostMessage (hwnd, WM_LBUTTONUP, wCtrl|wM|wR|wShift, lPos);
if (g_fButton[1] & !wM)
PostMessage (hwnd, WM_MBUTTONUP, wCtrl|wL|wR|wShift, lPos);
if (g_fButton[2] & !wR)
PostMessage (hwnd, WM_RBUTTONUP, wCtrl|wL|wM|wShift, lPos);
}
}
return 0;
case WM_CTLCOLORSCROLLBAR:
FatalError ("winWindowProc - WM_CTLCOLORSCROLLBAR - We are not "
"supposed to get this message. Exiting.\n");
return 0;
case WM_MOUSEWHEEL:
if (s_pScreenPriv == NULL || s_pScreenInfo->fIgnoreInput)
break;
#if CYGDEBUG
winDebug ("winWindowProc - WM_MOUSEWHEEL\n");
#endif
winMouseWheel (s_pScreen, GET_WHEEL_DELTA_WPARAM(wParam));
break;
case WM_SETFOCUS:
if (s_pScreenPriv == NULL || s_pScreenInfo->fIgnoreInput)
break;
winRestoreModeKeyStates ();
if (g_fKeyboardHookLL)
g_fKeyboardHookLL = winInstallKeyboardHookLL ();
return 0;
case WM_KILLFOCUS:
if (s_pScreenPriv == NULL || s_pScreenInfo->fIgnoreInput)
break;
winKeybdReleaseKeys ();
winRemoveKeyboardHookLL ();
return 0;
case WM_SYSKEYDOWN:
case WM_KEYDOWN:
if (s_pScreenPriv == NULL || s_pScreenInfo->fIgnoreInput)
break;
if ((s_pScreenInfo->fUseWinKillKey && wParam == VK_F4
&& (GetKeyState (VK_MENU) & 0x8000))
|| (s_pScreenInfo->fUseUnixKillKey && wParam == VK_BACK
&& (GetKeyState (VK_MENU) & 0x8000)
&& (GetKeyState (VK_CONTROL) & 0x8000)))
{
ErrorF ("winWindowProc - WM_*KEYDOWN - Closekey hit, quitting\n");
winDisplayExitDialog (s_pScreenPriv);
return 0;
}
if ((wParam == VK_LWIN || wParam == VK_RWIN) && !g_fKeyboardHookLL)
break;
if (lParam & (1<<30))
{
switch (wParam)
{
case VK_CONTROL:
case VK_SHIFT:
if (winCheckKeyPressed(wParam, lParam))
return 0;
break;
default:
return 0;
}
}
if (winIsFakeCtrl_L (message, wParam, lParam))
return 0;
winTranslateKey (wParam, lParam, &iScanCode);
if (wParam == VK_CAPITAL)
lParam = 1;
for (i = 0; i < LOWORD(lParam); ++i)
winSendKeyEvent (iScanCode, TRUE);
return 0;
case WM_SYSKEYUP:
case WM_KEYUP:
if (s_pScreenPriv == NULL || s_pScreenInfo->fIgnoreInput)
break;
if ((wParam == VK_LWIN || wParam == VK_RWIN) && !g_fKeyboardHookLL)
break;
if (winIsFakeCtrl_L (message, wParam, lParam))
return 0;
winTranslateKey (wParam, lParam, &iScanCode);
winSendKeyEvent (iScanCode, FALSE);
if (wParam == VK_SHIFT)
winFixShiftKeys (iScanCode);
return 0;
case WM_HOTKEY:
if (s_pScreenPriv == NULL)
break;
(*s_pScreenPriv->pwinHotKeyAltTab) (s_pScreen);
return 0;
case WM_ACTIVATE:
if (s_pScreenPriv == NULL
|| s_pScreenInfo->fIgnoreInput)
break;
if (LOWORD(wParam) != WA_INACTIVE && s_pScreenPriv->fBadDepth)
{
ErrorF ("winWindowProc - WM_ACTIVATE - Bad depth, trying "
"to override window activation\n");
ShowWindow (hwnd, SW_MINIMIZE);
if (g_hDlgDepthChange != NULL)
{
SetActiveWindow (g_hDlgDepthChange);
}
else
{
ShowWindow (g_hDlgDepthChange, SW_SHOWDEFAULT);
}
return 0;
}
#if CYGDEBUG
winDebug ("winWindowProc - WM_ACTIVATE\n");
#endif
s_pScreenPriv->iDeltaZ = 0;
if (g_fSoftwareCursor && LOWORD(wParam) == WA_INACTIVE
&& !g_fCursor)
{
g_fCursor = TRUE;
ShowCursor (TRUE);
}
return 0;
case WM_ACTIVATEAPP:
if (s_pScreenPriv == NULL
|| s_pScreenInfo->fIgnoreInput)
break;
#if CYGDEBUG || TRUE
winDebug ("winWindowProc - WM_ACTIVATEAPP\n");
#endif
s_pScreenPriv->fActive = wParam;
if (g_fSoftwareCursor && !s_pScreenPriv->fActive
&& !g_fCursor)
{
g_fCursor = TRUE;
ShowCursor (TRUE);
}
#ifdef XWIN_CLIPBOARD
winFixClipboardChain ();
#endif
(*s_pScreenPriv->pwinActivateApp) (s_pScreen);
#ifdef XWIN_MULTIWINDOWEXTWM
if (s_pScreenPriv->fActive)
{
if (s_pScreenInfo->fInternalWM && s_pScreenInfo->fAnotherWMRunning)
winMWExtWMRestackWindows (s_pScreen);
}
#endif
return 0;
case WM_COMMAND:
switch (LOWORD (wParam))
{
case ID_APP_EXIT:
winDisplayExitDialog (s_pScreenPriv);
return 0;
#ifdef XWIN_MULTIWINDOW
case ID_APP_HIDE_ROOT:
if (s_pScreenPriv->fRootWindowShown)
ShowWindow (s_pScreenPriv->hwndScreen, SW_HIDE);
else
ShowWindow (s_pScreenPriv->hwndScreen, SW_SHOW);
s_pScreenPriv->fRootWindowShown = !s_pScreenPriv->fRootWindowShown;
return 0;
#endif
case ID_APP_ABOUT:
winDisplayAboutDialog (s_pScreenPriv);
return 0;
default:
if (HandleCustomWM_COMMAND (0, LOWORD (wParam)))
return 0;
}
break;
case WM_ENDSESSION:
case WM_GIVEUP:
#ifdef XWIN_MULTIWINDOW
if (s_pScreenInfo->fMultiWindow)
winDeinitMultiWindowWM ();
#endif
GiveUp (0);
return 0;
case WM_CLOSE:
winDisplayExitDialog (s_pScreenPriv);
return 0;
case WM_SETCURSOR:
if (LOWORD(lParam) == HTCLIENT)
{
if (!g_fSoftwareCursor) SetCursor (s_pScreenPriv->cursor.handle);
return TRUE;
}
break;
#ifdef XWIN_MULTIWINDOWEXTWM
case WM_MANAGE:
ErrorF ("winWindowProc - WM_MANAGE\n");
s_pScreenInfo->fAnotherWMRunning = FALSE;
if (s_pScreenInfo->fInternalWM)
{
EnumThreadWindows (g_dwCurrentThreadID, winMWExtWMDecorateWindow, 0);
}
break;
case WM_UNMANAGE:
ErrorF ("winWindowProc - WM_UNMANAGE\n");
s_pScreenInfo->fAnotherWMRunning = TRUE;
if (s_pScreenInfo->fInternalWM)
{
EnumThreadWindows (g_dwCurrentThreadID, winMWExtWMDecorateWindow, 0);
winMWExtWMRestackWindows (s_pScreen);
}
break;
#endif
default:
if(message == s_uTaskbarRestart)
{
winInitNotifyIcon (s_pScreenPriv);
}
break;
}
return DefWindowProc (hwnd, message, wParam, lParam);
}