mirror of
https://github.com/reactos/reactos.git
synced 2024-12-28 10:04:49 +00:00
Added missing files
svn path=/trunk/; revision=2505
This commit is contained in:
parent
43b2190795
commit
47910ad286
7 changed files with 1037 additions and 0 deletions
831
reactos/lib/user32/windows/defwnd.c
Normal file
831
reactos/lib/user32/windows/defwnd.c
Normal file
|
@ -0,0 +1,831 @@
|
||||||
|
/* $Id: defwnd.c,v 1.1 2002/01/14 01:11:58 dwelch Exp $
|
||||||
|
*
|
||||||
|
* COPYRIGHT: See COPYING in the top level directory
|
||||||
|
* PROJECT: ReactOS user32.dll
|
||||||
|
* FILE: lib/user32/windows/window.c
|
||||||
|
* PURPOSE: Window management
|
||||||
|
* PROGRAMMER: Casper S. Hornstrup (chorns@users.sourceforge.net)
|
||||||
|
* UPDATE HISTORY:
|
||||||
|
* 06-06-2001 CSH Created
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* INCLUDES ******************************************************************/
|
||||||
|
|
||||||
|
#include <windows.h>
|
||||||
|
#include <user32.h>
|
||||||
|
#include <window.h>
|
||||||
|
#include <debug.h>
|
||||||
|
#include <user32/wininternal.h>
|
||||||
|
|
||||||
|
/* GLOBALS *******************************************************************/
|
||||||
|
|
||||||
|
static HBITMAP hbitmapClose;
|
||||||
|
static HBITMAP hbitmapMinimize;
|
||||||
|
static HBITMAP hbitmapMinimizeD;
|
||||||
|
static HBITMAP hbitmapMaximize;
|
||||||
|
static HBITMAP hbitmapMaximizeD;
|
||||||
|
static HBITMAP hbitmapRestore;
|
||||||
|
static HBITMAP hbitmapRestoreD;
|
||||||
|
|
||||||
|
/* FUNCTIONS *****************************************************************/
|
||||||
|
|
||||||
|
BOOL
|
||||||
|
UserRedrawIconTitle(HWND hWnd)
|
||||||
|
{
|
||||||
|
#if 0
|
||||||
|
LPINTERNALPOS lpPos = (LPINTERNALPOS)GetPropA(hWnd, atomInternalPos);
|
||||||
|
if (lpPos)
|
||||||
|
{
|
||||||
|
if (lpPos->hwndIconTitle)
|
||||||
|
{
|
||||||
|
SendMessageA(lpPos->hwndIconTitle, WM_SHOWWINDOW, TRUE, 0);
|
||||||
|
InvalidateRect(lpPos->hwndIconTitle, NULL, TRUE);
|
||||||
|
return(TRUE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return(FALSE);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
ULONG
|
||||||
|
UserHasAnyFrameStyle(ULONG Style, ULONG ExStyle)
|
||||||
|
{
|
||||||
|
return((Style & (WS_THICKFRAME | WS_DLGFRAME | WS_BORDER)) ||
|
||||||
|
(ExStyle & WS_EX_DLGMODALFRAME) ||
|
||||||
|
(!(Style & (WS_CHILD | WS_POPUP))));
|
||||||
|
}
|
||||||
|
|
||||||
|
ULONG
|
||||||
|
UserHasDlgFrameStyle(ULONG Style, ULONG ExStyle)
|
||||||
|
{
|
||||||
|
return((ExStyle & WS_EX_DLGMODALFRAME) ||
|
||||||
|
((Style & WS_DLGFRAME) && (!(Style & WS_THICKFRAME))));
|
||||||
|
}
|
||||||
|
|
||||||
|
ULONG
|
||||||
|
UserHasThickFrameStyle(ULONG Style, ULONG ExStyle)
|
||||||
|
{
|
||||||
|
return((Style & WS_THICKFRAME) &&
|
||||||
|
(!((Style & (WS_DLGFRAME | WS_BORDER)) == WS_DLGFRAME)));
|
||||||
|
}
|
||||||
|
|
||||||
|
ULONG
|
||||||
|
UserHasThinFrameStyle(ULONG Style, ULONG ExStyle)
|
||||||
|
{
|
||||||
|
return((Style & WS_BORDER) ||
|
||||||
|
(!(Style & (WS_CHILD | WS_POPUP))));
|
||||||
|
}
|
||||||
|
|
||||||
|
ULONG
|
||||||
|
UserHasBigFrameStyle(ULONG Style, ULONG ExStyle)
|
||||||
|
{
|
||||||
|
return((Style & (WS_THICKFRAME | WS_DLGFRAME)) ||
|
||||||
|
(ExStyle & WS_EX_DLGMODALFRAME));
|
||||||
|
}
|
||||||
|
|
||||||
|
static void UserGetInsideRectNC( HWND hwnd, RECT *rect )
|
||||||
|
{
|
||||||
|
RECT WindowRect;
|
||||||
|
ULONG Style;
|
||||||
|
ULONG ExStyle;
|
||||||
|
|
||||||
|
Style = GetWindowLong(hwnd, GWL_STYLE);
|
||||||
|
ExStyle = GetWindowLong(hwnd, GWL_EXSTYLE);
|
||||||
|
GetWindowRect(hwnd, &WindowRect);
|
||||||
|
rect->top = rect->left = 0;
|
||||||
|
rect->right = WindowRect.right - WindowRect.left;
|
||||||
|
rect->bottom = WindowRect.bottom - WindowRect.top;
|
||||||
|
|
||||||
|
if (Style & WS_ICONIC)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Remove frame from rectangle */
|
||||||
|
if (UserHasThickFrameStyle(Style, ExStyle ))
|
||||||
|
{
|
||||||
|
InflateRect( rect, -GetSystemMetrics(SM_CXFRAME),
|
||||||
|
-GetSystemMetrics(SM_CYFRAME) );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (UserHasDlgFrameStyle(Style, ExStyle ))
|
||||||
|
{
|
||||||
|
InflateRect( rect, -GetSystemMetrics(SM_CXDLGFRAME),
|
||||||
|
-GetSystemMetrics(SM_CYDLGFRAME));
|
||||||
|
/* FIXME: this isn't in NC_AdjustRect? why not? */
|
||||||
|
if (ExStyle & WS_EX_DLGMODALFRAME)
|
||||||
|
InflateRect( rect, -1, 0 );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (UserHasThinFrameStyle(Style, ExStyle))
|
||||||
|
{
|
||||||
|
InflateRect( rect, -GetSystemMetrics(SM_CXBORDER), -GetSystemMetrics(SM_CYBORDER) );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void UserDrawSysButton( HWND hwnd, HDC hdc, BOOL down )
|
||||||
|
{
|
||||||
|
RECT rect;
|
||||||
|
HDC hdcMem;
|
||||||
|
HBITMAP hbitmap;
|
||||||
|
ULONG Style;
|
||||||
|
|
||||||
|
Style = GetWindowLong(hwnd, GWL_STYLE);
|
||||||
|
UserGetInsideRectNC( hwnd, &rect );
|
||||||
|
hdcMem = CreateCompatibleDC( hdc );
|
||||||
|
hbitmap = SelectObject( hdcMem, hbitmapClose );
|
||||||
|
BitBlt(hdc, rect.left, rect.top, GetSystemMetrics(SM_CXSIZE), GetSystemMetrics(SM_CYSIZE),
|
||||||
|
hdcMem, (Style & WS_CHILD) ? GetSystemMetrics(SM_CXSIZE) : 0, 0,
|
||||||
|
down ? NOTSRCCOPY : SRCCOPY );
|
||||||
|
SelectObject( hdcMem, hbitmap );
|
||||||
|
DeleteDC( hdcMem );
|
||||||
|
}
|
||||||
|
|
||||||
|
static void UserDrawMaxButton( HWND hwnd, HDC hdc, BOOL down )
|
||||||
|
{
|
||||||
|
RECT rect;
|
||||||
|
HDC hdcMem;
|
||||||
|
|
||||||
|
UserGetInsideRectNC( hwnd, &rect );
|
||||||
|
hdcMem = CreateCompatibleDC( hdc );
|
||||||
|
SelectObject( hdcMem, (IsZoomed(hwnd)
|
||||||
|
? (down ? hbitmapRestoreD : hbitmapRestore)
|
||||||
|
: (down ? hbitmapMaximizeD : hbitmapMaximize)) );
|
||||||
|
BitBlt( hdc, rect.right - GetSystemMetrics(SM_CXSIZE) - 1, rect.top,
|
||||||
|
GetSystemMetrics(SM_CXSIZE) + 1, GetSystemMetrics(SM_CYSIZE), hdcMem, 0, 0,
|
||||||
|
SRCCOPY );
|
||||||
|
DeleteDC( hdcMem );
|
||||||
|
}
|
||||||
|
|
||||||
|
static void UserDrawMinButton( HWND hwnd, HDC hdc, BOOL down)
|
||||||
|
{
|
||||||
|
RECT rect;
|
||||||
|
HDC hdcMem;
|
||||||
|
|
||||||
|
UserGetInsideRectNC(hwnd, &rect);
|
||||||
|
hdcMem = CreateCompatibleDC(hdc);
|
||||||
|
SelectObject(hdcMem, (down ? hbitmapMinimizeD : hbitmapMinimize));
|
||||||
|
if (GetWindowLong(hwnd, GWL_STYLE) & WS_MAXIMIZEBOX)
|
||||||
|
{
|
||||||
|
rect.right -= GetSystemMetrics(SM_CXSIZE)+1;
|
||||||
|
}
|
||||||
|
BitBlt( hdc, rect.right - GetSystemMetrics(SM_CXSIZE) - 1, rect.top,
|
||||||
|
GetSystemMetrics(SM_CXSIZE) + 1, GetSystemMetrics(SM_CYSIZE),
|
||||||
|
hdcMem, 0, 0,
|
||||||
|
SRCCOPY );
|
||||||
|
DeleteDC( hdcMem );
|
||||||
|
}
|
||||||
|
|
||||||
|
static void UserDrawCaptionNC( HDC hdc, RECT *rect, HWND hwnd,
|
||||||
|
DWORD style, BOOL active )
|
||||||
|
{
|
||||||
|
RECT r = *rect;
|
||||||
|
char buffer[256];
|
||||||
|
|
||||||
|
if (!hbitmapClose)
|
||||||
|
{
|
||||||
|
if (!(hbitmapClose = LoadBitmapW( 0, MAKEINTRESOURCE(OBM_CLOSE) )))
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
hbitmapMinimize = LoadBitmapW( 0, MAKEINTRESOURCE(OBM_REDUCE) );
|
||||||
|
hbitmapMinimizeD = LoadBitmapW( 0, MAKEINTRESOURCE(OBM_REDUCED) );
|
||||||
|
hbitmapMaximize = LoadBitmapW( 0, MAKEINTRESOURCE(OBM_ZOOM) );
|
||||||
|
hbitmapMaximizeD = LoadBitmapW( 0, MAKEINTRESOURCE(OBM_ZOOMD) );
|
||||||
|
hbitmapRestore = LoadBitmapW( 0, MAKEINTRESOURCE(OBM_RESTORE) );
|
||||||
|
hbitmapRestoreD = LoadBitmapW( 0, MAKEINTRESOURCE(OBM_RESTORED) );
|
||||||
|
}
|
||||||
|
|
||||||
|
if (GetWindowLong(hwnd, GWL_EXSTYLE) & WS_EX_DLGMODALFRAME)
|
||||||
|
{
|
||||||
|
HBRUSH hbrushOld = SelectObject(hdc, GetSysColorBrush(COLOR_WINDOW) );
|
||||||
|
PatBlt( hdc, r.left, r.top, 1, r.bottom-r.top+1,PATCOPY );
|
||||||
|
PatBlt( hdc, r.right-1, r.top, 1, r.bottom-r.top+1, PATCOPY );
|
||||||
|
PatBlt( hdc, r.left, r.top-1, r.right-r.left, 1, PATCOPY );
|
||||||
|
r.left++;
|
||||||
|
r.right--;
|
||||||
|
SelectObject( hdc, hbrushOld );
|
||||||
|
}
|
||||||
|
|
||||||
|
MoveToEx( hdc, r.left, r.bottom, NULL );
|
||||||
|
LineTo( hdc, r.right, r.bottom );
|
||||||
|
|
||||||
|
if (style & WS_SYSMENU)
|
||||||
|
{
|
||||||
|
UserDrawSysButton( hwnd, hdc, FALSE );
|
||||||
|
r.left += GetSystemMetrics(SM_CXSIZE) + 1;
|
||||||
|
MoveToEx( hdc, r.left - 1, r.top, NULL );
|
||||||
|
LineTo( hdc, r.left - 1, r.bottom );
|
||||||
|
}
|
||||||
|
if (style & WS_MAXIMIZEBOX)
|
||||||
|
{
|
||||||
|
UserDrawMaxButton( hwnd, hdc, FALSE );
|
||||||
|
r.right -= GetSystemMetrics(SM_CXSIZE) + 1;
|
||||||
|
}
|
||||||
|
if (style & WS_MINIMIZEBOX)
|
||||||
|
{
|
||||||
|
UserDrawMinButton( hwnd, hdc, FALSE );
|
||||||
|
r.right -= GetSystemMetrics(SM_CXSIZE) + 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
FillRect( hdc, &r, GetSysColorBrush(active ? COLOR_ACTIVECAPTION :
|
||||||
|
COLOR_INACTIVECAPTION) );
|
||||||
|
|
||||||
|
if (GetWindowTextA( hwnd, buffer, sizeof(buffer) ))
|
||||||
|
{
|
||||||
|
if (active) SetTextColor( hdc, GetSysColor( COLOR_CAPTIONTEXT ) );
|
||||||
|
else SetTextColor( hdc, GetSysColor( COLOR_INACTIVECAPTIONTEXT ) );
|
||||||
|
SetBkMode( hdc, TRANSPARENT );
|
||||||
|
DrawTextA( hdc, buffer, -1, &r,
|
||||||
|
DT_SINGLELINE | DT_CENTER | DT_VCENTER | DT_NOPREFIX );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
VOID
|
||||||
|
UserDrawFrameNC(HDC hdc, RECT* rect, BOOL dlgFrame, BOOL active)
|
||||||
|
{
|
||||||
|
INT width, height;
|
||||||
|
|
||||||
|
if (dlgFrame)
|
||||||
|
{
|
||||||
|
width = GetSystemMetrics(SM_CXDLGFRAME) - 1;
|
||||||
|
height = GetSystemMetrics(SM_CYDLGFRAME) - 1;
|
||||||
|
SelectObject( hdc, GetSysColorBrush(active ? COLOR_ACTIVECAPTION :
|
||||||
|
COLOR_INACTIVECAPTION) );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
width = GetSystemMetrics(SM_CXFRAME) - 2;
|
||||||
|
height = GetSystemMetrics(SM_CYFRAME) - 2;
|
||||||
|
SelectObject( hdc, GetSysColorBrush(active ? COLOR_ACTIVEBORDER :
|
||||||
|
COLOR_INACTIVEBORDER) );
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Draw frame */
|
||||||
|
PatBlt( hdc, rect->left, rect->top,
|
||||||
|
rect->right - rect->left, height, PATCOPY );
|
||||||
|
PatBlt( hdc, rect->left, rect->top,
|
||||||
|
width, rect->bottom - rect->top, PATCOPY );
|
||||||
|
PatBlt( hdc, rect->left, rect->bottom - 1,
|
||||||
|
rect->right - rect->left, -height, PATCOPY );
|
||||||
|
PatBlt( hdc, rect->right - 1, rect->top,
|
||||||
|
-width, rect->bottom - rect->top, PATCOPY );
|
||||||
|
|
||||||
|
if (dlgFrame)
|
||||||
|
{
|
||||||
|
InflateRect( rect, -width, -height );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
INT decYOff = GetSystemMetrics(SM_CXFRAME) +
|
||||||
|
GetSystemMetrics(SM_CXSIZE) - 1;
|
||||||
|
INT decXOff = GetSystemMetrics(SM_CYFRAME) +
|
||||||
|
GetSystemMetrics(SM_CYSIZE) - 1;
|
||||||
|
|
||||||
|
/* Draw inner rectangle */
|
||||||
|
|
||||||
|
SelectObject( hdc, GetStockObject(NULL_BRUSH) );
|
||||||
|
Rectangle( hdc, rect->left + width, rect->top + height,
|
||||||
|
rect->right - width , rect->bottom - height );
|
||||||
|
|
||||||
|
/* Draw the decorations */
|
||||||
|
|
||||||
|
MoveToEx( hdc, rect->left, rect->top + decYOff, NULL );
|
||||||
|
LineTo( hdc, rect->left + width, rect->top + decYOff );
|
||||||
|
MoveToEx( hdc, rect->right - 1, rect->top + decYOff, NULL );
|
||||||
|
LineTo( hdc, rect->right - width - 1, rect->top + decYOff );
|
||||||
|
MoveToEx( hdc, rect->left, rect->bottom - decYOff, NULL );
|
||||||
|
LineTo( hdc, rect->left + width, rect->bottom - decYOff );
|
||||||
|
MoveToEx( hdc, rect->right - 1, rect->bottom - decYOff, NULL );
|
||||||
|
LineTo( hdc, rect->right - width - 1, rect->bottom - decYOff );
|
||||||
|
|
||||||
|
MoveToEx( hdc, rect->left + decXOff, rect->top, NULL );
|
||||||
|
LineTo( hdc, rect->left + decXOff, rect->top + height);
|
||||||
|
MoveToEx( hdc, rect->left + decXOff, rect->bottom - 1, NULL );
|
||||||
|
LineTo( hdc, rect->left + decXOff, rect->bottom - height - 1 );
|
||||||
|
MoveToEx( hdc, rect->right - decXOff, rect->top, NULL );
|
||||||
|
LineTo( hdc, rect->right - decXOff, rect->top + height );
|
||||||
|
MoveToEx( hdc, rect->right - decXOff, rect->bottom - 1, NULL );
|
||||||
|
LineTo( hdc, rect->right - decXOff, rect->bottom - height - 1 );
|
||||||
|
|
||||||
|
InflateRect( rect, -width - 1, -height - 1 );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
VOID
|
||||||
|
UserDoPaintNC(HWND hWnd, HRGN clip)
|
||||||
|
{
|
||||||
|
ULONG Active;
|
||||||
|
HDC hDc;
|
||||||
|
RECT rect;
|
||||||
|
ULONG Style;
|
||||||
|
ULONG ExStyle;
|
||||||
|
|
||||||
|
Active = GetWindowLongW(hWnd, GWL_STYLE) & WIN_NCACTIVATED;
|
||||||
|
Style = GetWindowLong(hWnd, GWL_STYLE);
|
||||||
|
ExStyle = GetWindowLong(hWnd, GWL_EXSTYLE);
|
||||||
|
|
||||||
|
hDc = GetDCEx(hWnd, (clip > 1) ? clip : 0, DCX_USESTYLE | DCX_WINDOW |
|
||||||
|
((clip > 1) ? (DCX_INTERSECTRGN | DCX_KEEPCLIPRGN) : 0));
|
||||||
|
if (hDc == 0)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* FIXME: Test whether we need to draw anything at all. */
|
||||||
|
|
||||||
|
GetWindowRect(hWnd, &rect);
|
||||||
|
rect.right = rect.right - rect.left;
|
||||||
|
rect.bottom = rect.bottom - rect.top;
|
||||||
|
rect.top = rect.left = 0;
|
||||||
|
|
||||||
|
SelectObject(hDc, GetSysColorPen(COLOR_WINDOWFRAME));
|
||||||
|
if (UserHasAnyFrameStyle(Style, ExStyle))
|
||||||
|
{
|
||||||
|
SelectObject(hDc, GetStockObject(NULL_BRUSH));
|
||||||
|
Rectangle(hDc, 0, 0, rect.right, rect.bottom);
|
||||||
|
InflateRect(&rect, -1, -1);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (UserHasThickFrameStyle(Style, ExStyle))
|
||||||
|
{
|
||||||
|
UserDrawFrameNC(hDc, &rect, FALSE, Active);
|
||||||
|
}
|
||||||
|
else if (UserHasDlgFrameStyle(Style, ExStyle))
|
||||||
|
{
|
||||||
|
UserDrawFrameNC(hDc, &rect, TRUE, Active);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Style & WS_CAPTION)
|
||||||
|
{
|
||||||
|
RECT r = rect;
|
||||||
|
r.bottom = rect.top + GetSystemMetrics(SM_CYSIZE);
|
||||||
|
rect.top += GetSystemMetrics(SM_CYSIZE) +
|
||||||
|
GetSystemMetrics(SM_CYBORDER);
|
||||||
|
UserDrawCaptionNC(hDc, &r, hWnd, Style, Active);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* FIXME: Draw menu bar. */
|
||||||
|
|
||||||
|
/* FIXME: Draw scroll bars. */
|
||||||
|
|
||||||
|
/* FIXME: Draw size box. */
|
||||||
|
|
||||||
|
ReleaseDC(hWnd, hDc);
|
||||||
|
}
|
||||||
|
|
||||||
|
LRESULT
|
||||||
|
UserPaintNC(HWND hWnd, HRGN clip)
|
||||||
|
{
|
||||||
|
if (IsWindowVisible(hWnd))
|
||||||
|
{
|
||||||
|
if (IsIconic(hWnd))
|
||||||
|
{
|
||||||
|
UserRedrawIconTitle(hWnd);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
UserDoPaintNC(hWnd, clip);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
LRESULT
|
||||||
|
UserHitTestNC(HWND hWnd, POINT Point)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
LRESULT
|
||||||
|
UserHandleLButtonDownNC(HWND hWnd, WPARAM wParam, LPARAM lParam)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
LRESULT
|
||||||
|
UserHandleLButtonDblClkNC(HWND hWnd, WPARAM wParam, LPARAM lParam)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
LRESULT
|
||||||
|
UserHandleActiveNC(HWND hWnd, WPARAM wParam)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
VOID
|
||||||
|
UserSetRedrawDefWnd(HWND hWnd, WPARAM wParam)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
LRESULT STDCALL
|
||||||
|
User32DefWindowProc(HWND hWnd,
|
||||||
|
UINT Msg,
|
||||||
|
WPARAM wParam,
|
||||||
|
LPARAM lParam)
|
||||||
|
{
|
||||||
|
switch (Msg)
|
||||||
|
{
|
||||||
|
case WM_NCPAINT:
|
||||||
|
{
|
||||||
|
return(UserPaintNC(hWnd, (HRGN)wParam));
|
||||||
|
}
|
||||||
|
|
||||||
|
case WM_NCHITTEST:
|
||||||
|
{
|
||||||
|
POINT Point;
|
||||||
|
Point.x = SLOWORD(lParam);
|
||||||
|
Point.y = SHIWORD(lParam);
|
||||||
|
return(UserHitTestNC(hWnd, Point));
|
||||||
|
}
|
||||||
|
|
||||||
|
case WM_NCLBUTTONDOWN:
|
||||||
|
{
|
||||||
|
return(UserHandleLButtonDownNC(hWnd, wParam, lParam));
|
||||||
|
}
|
||||||
|
|
||||||
|
case WM_LBUTTONDBLCLK:
|
||||||
|
case WM_NCLBUTTONDBLCLK:
|
||||||
|
{
|
||||||
|
return(UserHandleLButtonDblClkNC(hWnd, wParam, lParam));
|
||||||
|
}
|
||||||
|
|
||||||
|
case WM_NCRBUTTONDOWN:
|
||||||
|
{
|
||||||
|
if (wParam == HTCAPTION)
|
||||||
|
{
|
||||||
|
SetCapture(hWnd);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case WM_RBUTTONUP:
|
||||||
|
{
|
||||||
|
if (hWnd == GetCapture())
|
||||||
|
{
|
||||||
|
ReleaseCapture();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case WM_NCRBUTTONUP:
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case WM_CONTEXTMENU:
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case WM_NCACTIVATE:
|
||||||
|
{
|
||||||
|
return(UserHandleActiveNC(hWnd, wParam));
|
||||||
|
}
|
||||||
|
|
||||||
|
case WM_NCDESTROY:
|
||||||
|
{
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
case WM_PRINT:
|
||||||
|
{
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
case WM_PAINTICON:
|
||||||
|
case WM_PAINT:
|
||||||
|
{
|
||||||
|
/* FIXME: Paint the icon if minimized otherwise just paint nothing. */
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
|
#if 0
|
||||||
|
case WM_SYNCPAINT:
|
||||||
|
{
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
case WM_SETREDRAW:
|
||||||
|
{
|
||||||
|
UserSetRedrawDefWnd(hWnd, wParam);
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
case WM_CLOSE:
|
||||||
|
{
|
||||||
|
DestroyWindow(hWnd);
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
case WM_MOUSEACTIVATE:
|
||||||
|
{
|
||||||
|
/* FIXME: Send to parent if child. */
|
||||||
|
return((LOWORD(lParam) >= HTCLIENT) ? MA_ACTIVATE : MA_NOACTIVATE);
|
||||||
|
}
|
||||||
|
|
||||||
|
case WM_ACTIVATE:
|
||||||
|
{
|
||||||
|
if (LOWORD(lParam) != WA_INACTIVE)
|
||||||
|
{
|
||||||
|
/* Check if the window is minimized. */
|
||||||
|
SetFocus(hWnd);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
#if 0
|
||||||
|
case WM_MOUSEWHEEL:
|
||||||
|
{
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
case WM_ERASEBKGND:
|
||||||
|
case WM_ICONERASEBKGND:
|
||||||
|
{
|
||||||
|
RECT rect;
|
||||||
|
HBRUSH hbr = (HBRUSH)GetClassLongW(hWnd, GCL_HBRBACKGROUND);
|
||||||
|
if (!hbr) return 0;
|
||||||
|
|
||||||
|
/* Since WM_ERASEBKGND may receive either a window dc or a */
|
||||||
|
/* client dc, the area to be erased has to be retrieved from */
|
||||||
|
/* the device context. */
|
||||||
|
GetClipBox( (HDC)wParam, &rect );
|
||||||
|
|
||||||
|
/* Always call the Win32 variant of FillRect even on Win16,
|
||||||
|
* since despite the fact that Win16, as well as Win32,
|
||||||
|
* supports special background brushes for a window class,
|
||||||
|
* the Win16 variant of FillRect does not.
|
||||||
|
*/
|
||||||
|
FillRect( (HDC) wParam, &rect, hbr );
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
#if 0
|
||||||
|
case WM_GETDLGCODE:
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
case WM_CTLCOLORMSGBOX:
|
||||||
|
case WM_CTLCOLOREDIT:
|
||||||
|
case WM_CTLCOLORLISTBOX:
|
||||||
|
case WM_CTLCOLORBTN:
|
||||||
|
case WM_CTLCOLORDLG:
|
||||||
|
case WM_CTLCOLORSTATIC:
|
||||||
|
case WM_CTLCOLORSCROLLBAR:
|
||||||
|
return (LRESULT)DEFWND_ControlColor( (HDC)wParam, msg - WM_CTLCOLORMSGBOX );
|
||||||
|
|
||||||
|
case WM_CTLCOLOR:
|
||||||
|
return (LRESULT)DEFWND_ControlColor( (HDC)wParam, HIWORD(lParam) );
|
||||||
|
|
||||||
|
case WM_SETCURSOR:
|
||||||
|
if (wndPtr->dwStyle & WS_CHILD)
|
||||||
|
{
|
||||||
|
/* with the exception of the border around a resizable wnd,
|
||||||
|
* give the parent first chance to set the cursor */
|
||||||
|
if ((LOWORD(lParam) < HTSIZEFIRST) || (LOWORD(lParam) > HTSIZELAST))
|
||||||
|
{
|
||||||
|
if (pSendMessage(wndPtr->parent->hwndSelf, WM_SETCURSOR, wParam, lParam))
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return NC_HandleSetCursor( wndPtr->hwndSelf, wParam, lParam );
|
||||||
|
|
||||||
|
case WM_SYSCOMMAND:
|
||||||
|
{
|
||||||
|
POINT pt;
|
||||||
|
pt.x = SLOWORD(lParam);
|
||||||
|
pt.y = SHIWORD(lParam);
|
||||||
|
return NC_HandleSysCommand( wndPtr->hwndSelf, wParam, pt );
|
||||||
|
}
|
||||||
|
|
||||||
|
case WM_KEYDOWN:
|
||||||
|
if(wParam == VK_F10) iF10Key = VK_F10;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case WM_SYSKEYDOWN:
|
||||||
|
if( HIWORD(lParam) & KEYDATA_ALT )
|
||||||
|
{
|
||||||
|
/* if( HIWORD(lParam) & ~KEYDATA_PREVSTATE ) */
|
||||||
|
if( wParam == VK_MENU && !iMenuSysKey )
|
||||||
|
iMenuSysKey = 1;
|
||||||
|
else
|
||||||
|
iMenuSysKey = 0;
|
||||||
|
|
||||||
|
iF10Key = 0;
|
||||||
|
|
||||||
|
if( wParam == VK_F4 ) /* try to close the window */
|
||||||
|
{
|
||||||
|
HWND hWnd = WIN_GetTopParent( wndPtr->hwndSelf );
|
||||||
|
wndPtr = WIN_FindWndPtr( hWnd );
|
||||||
|
if( wndPtr && !(wndPtr->clsStyle & CS_NOCLOSE) )
|
||||||
|
pPostMessage( hWnd, WM_SYSCOMMAND, SC_CLOSE, 0 );
|
||||||
|
WIN_ReleaseWndPtr(wndPtr);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if( wParam == VK_F10 )
|
||||||
|
iF10Key = 1;
|
||||||
|
else
|
||||||
|
if( wParam == VK_ESCAPE && (GetKeyState(VK_SHIFT) & 0x8000))
|
||||||
|
pSendMessage( wndPtr->hwndSelf, WM_SYSCOMMAND, SC_KEYMENU, VK_SPACE );
|
||||||
|
break;
|
||||||
|
|
||||||
|
case WM_KEYUP:
|
||||||
|
case WM_SYSKEYUP:
|
||||||
|
/* Press and release F10 or ALT */
|
||||||
|
if (((wParam == VK_MENU) && iMenuSysKey) ||
|
||||||
|
((wParam == VK_F10) && iF10Key))
|
||||||
|
pSendMessage( WIN_GetTopParent(wndPtr->hwndSelf),
|
||||||
|
WM_SYSCOMMAND, SC_KEYMENU, 0L );
|
||||||
|
iMenuSysKey = iF10Key = 0;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case WM_SYSCHAR:
|
||||||
|
iMenuSysKey = 0;
|
||||||
|
if (wParam == VK_RETURN && (wndPtr->dwStyle & WS_MINIMIZE))
|
||||||
|
{
|
||||||
|
pPostMessage( wndPtr->hwndSelf, WM_SYSCOMMAND, SC_RESTORE, 0L );
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if ((HIWORD(lParam) & KEYDATA_ALT) && wParam)
|
||||||
|
{
|
||||||
|
if (wParam == VK_TAB || wParam == VK_ESCAPE) break;
|
||||||
|
if (wParam == VK_SPACE && (wndPtr->dwStyle & WS_CHILD))
|
||||||
|
pSendMessage( wndPtr->parent->hwndSelf, msg, wParam, lParam );
|
||||||
|
else
|
||||||
|
pSendMessage( wndPtr->hwndSelf, WM_SYSCOMMAND, SC_KEYMENU, wParam );
|
||||||
|
}
|
||||||
|
else /* check for Ctrl-Esc */
|
||||||
|
if (wParam != VK_ESCAPE) MessageBeep(0);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case WM_SHOWWINDOW:
|
||||||
|
if (!lParam) return 0; /* sent from ShowWindow */
|
||||||
|
if (!(wndPtr->dwStyle & WS_POPUP) || !wndPtr->owner) return 0;
|
||||||
|
if ((wndPtr->dwStyle & WS_VISIBLE) && wParam) return 0;
|
||||||
|
else if (!(wndPtr->dwStyle & WS_VISIBLE) && !wParam) return 0;
|
||||||
|
ShowWindow( wndPtr->hwndSelf, wParam ? SW_SHOWNOACTIVATE : SW_HIDE );
|
||||||
|
break;
|
||||||
|
|
||||||
|
case WM_CANCELMODE:
|
||||||
|
if (wndPtr->parent == WIN_GetDesktop()) EndMenu();
|
||||||
|
if (GetCapture() == wndPtr->hwndSelf) ReleaseCapture();
|
||||||
|
WIN_ReleaseDesktop();
|
||||||
|
break;
|
||||||
|
|
||||||
|
case WM_VKEYTOITEM:
|
||||||
|
case WM_CHARTOITEM:
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
case WM_DROPOBJECT:
|
||||||
|
return DRAG_FILE;
|
||||||
|
|
||||||
|
case WM_QUERYDROPOBJECT:
|
||||||
|
if (wndPtr->dwExStyle & WS_EX_ACCEPTFILES) return 1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case WM_QUERYDRAGICON:
|
||||||
|
{
|
||||||
|
UINT len;
|
||||||
|
|
||||||
|
HICON hIcon = GetClassLongW( wndPtr->hwndSelf, GCL_HICON );
|
||||||
|
if (hIcon) return hIcon;
|
||||||
|
for(len=1; len<64; len++)
|
||||||
|
if((hIcon = LoadIconW(wndPtr->hInstance, MAKEINTRESOURCEW(len))))
|
||||||
|
return (LRESULT)hIcon;
|
||||||
|
return (LRESULT)LoadIconW(0, IDI_APPLICATIONW);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case WM_ISACTIVEICON:
|
||||||
|
return ((wndPtr->flags & WIN_NCACTIVATED) != 0);
|
||||||
|
|
||||||
|
case WM_NOTIFYFORMAT:
|
||||||
|
if (IsWindowUnicode(wndPtr->hwndSelf)) return NFR_UNICODE;
|
||||||
|
else return NFR_ANSI;
|
||||||
|
|
||||||
|
case WM_QUERYOPEN:
|
||||||
|
case WM_QUERYENDSESSION:
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
case WM_SETICON:
|
||||||
|
{
|
||||||
|
int index = (wParam != ICON_SMALL) ? GCL_HICON : GCL_HICONSM;
|
||||||
|
HICON hOldIcon = GetClassLongW(wndPtr->hwndSelf, index);
|
||||||
|
SetClassLongW(wndPtr->hwndSelf, index, lParam);
|
||||||
|
|
||||||
|
SetWindowPos(wndPtr->hwndSelf, 0, 0, 0, 0, 0, SWP_FRAMECHANGED
|
||||||
|
| SWP_NOSIZE | SWP_NOMOVE | SWP_NOACTIVATE
|
||||||
|
| SWP_NOZORDER);
|
||||||
|
|
||||||
|
if( wndPtr->flags & WIN_NATIVE )
|
||||||
|
wndPtr->pDriver->pSetHostAttr(wndPtr, HAK_ICONS, 0);
|
||||||
|
|
||||||
|
return hOldIcon;
|
||||||
|
}
|
||||||
|
|
||||||
|
case WM_GETICON:
|
||||||
|
{
|
||||||
|
int index = (wParam != ICON_SMALL) ? GCL_HICON : GCL_HICONSM;
|
||||||
|
return GetClassLongW(wndPtr->hwndSelf, index);
|
||||||
|
}
|
||||||
|
|
||||||
|
case WM_HELP:
|
||||||
|
pSendMessage( wndPtr->parent->hwndSelf, msg, wParam, lParam );
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
LRESULT STDCALL
|
||||||
|
DefWindowProcA(HWND hWnd,
|
||||||
|
UINT Msg,
|
||||||
|
WPARAM wParam,
|
||||||
|
LPARAM lParam)
|
||||||
|
{
|
||||||
|
LRESULT Result;
|
||||||
|
|
||||||
|
switch (Msg)
|
||||||
|
{
|
||||||
|
case WM_NCCREATE:
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
case WM_NCCALCSIZE:
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
case WM_WINDOWPOSCHANGING:
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
case WM_WINDOWPOSCHANGED:
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
case WM_GETTEXTLENGTH:
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
case WM_GETTEXT:
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
case WM_SETTEXT:
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
default:
|
||||||
|
Result = User32DefWindowProc(hWnd, Msg, wParam, lParam);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return(Result);
|
||||||
|
}
|
||||||
|
|
||||||
|
LRESULT STDCALL
|
||||||
|
DefWindowProcW(HWND hWnd,
|
||||||
|
UINT Msg,
|
||||||
|
WPARAM wParam,
|
||||||
|
LPARAM lParam)
|
||||||
|
{
|
||||||
|
LRESULT Result;
|
||||||
|
|
||||||
|
switch (Msg)
|
||||||
|
{
|
||||||
|
case WM_NCCREATE:
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
case WM_NCCALCSIZE:
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
case WM_WINDOWPOSCHANGING:
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
case WM_WINDOWPOSCHANGED:
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
case WM_GETTEXTLENGTH:
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
case WM_GETTEXT:
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
case WM_SETTEXT:
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
default:
|
||||||
|
Result = User32DefWindowProc(hWnd, Msg, wParam, lParam);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return(Result);
|
||||||
|
}
|
9
reactos/subsys/win32k/include/copybits.h
Normal file
9
reactos/subsys/win32k/include/copybits.h
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
#ifndef __WIN32K_COPYBITS_H
|
||||||
|
#define __WIN32K_COPYBITS_H
|
||||||
|
|
||||||
|
BOOLEAN CopyBitsCopy(SURFOBJ *DestSurf, SURFOBJ *SourceSurf,
|
||||||
|
SURFGDI *DestGDI, SURFGDI *SourceGDI,
|
||||||
|
PRECTL DestRect, POINTL *SourcePoint,
|
||||||
|
ULONG Delta, XLATEOBJ *ColorTranslation);
|
||||||
|
|
||||||
|
#endif /* __WIN32K_COPYBITS_H */
|
11
reactos/subsys/win32k/include/eng.h
Normal file
11
reactos/subsys/win32k/include/eng.h
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
#ifndef __WIN32K_ENG_H
|
||||||
|
#define __WIN32K_ENG_H
|
||||||
|
|
||||||
|
BOOL EngIntersectRect(PRECTL prcDst, PRECTL prcSrc1, PRECTL prcSrc2);
|
||||||
|
BOOL EngBitBlt(SURFOBJ *Dest, SURFOBJ *Source,
|
||||||
|
SURFOBJ *Mask, CLIPOBJ *ClipRegion,
|
||||||
|
XLATEOBJ *ColorTranslation, RECTL *DestRect,
|
||||||
|
POINTL *SourcePoint, POINTL *MaskRect,
|
||||||
|
BRUSHOBJ *Brush, POINTL *BrushOrigin, ROP4 rop4);
|
||||||
|
|
||||||
|
#endif /* __WIN32K_ENG_H */
|
7
reactos/subsys/win32k/include/input.h
Normal file
7
reactos/subsys/win32k/include/input.h
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
#ifndef __WIN32K_MOUSE_H
|
||||||
|
#define __WIN32K_MOUSE_H
|
||||||
|
|
||||||
|
NTSTATUS
|
||||||
|
InitInputImpl(VOID);
|
||||||
|
|
||||||
|
#endif /* __WIN32K_MOUSE_H */
|
7
reactos/subsys/win32k/include/mouse.h
Normal file
7
reactos/subsys/win32k/include/mouse.h
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
#ifndef __WIN32K_MOUSE_H
|
||||||
|
#define __WIN32K_MOUSE_H
|
||||||
|
|
||||||
|
INT MouseSafetyOnDrawStart(PSURFOBJ SurfObj, PSURFGDI SurfGDI, LONG HazardX1, LONG HazardY1, LONG HazardX2, LONG HazardY2);
|
||||||
|
INT MouseSafetyOnDrawEnd(PSURFOBJ SurfObj, PSURFGDI SurfGDI);
|
||||||
|
|
||||||
|
#endif /* __WIN32K_MOUSE_H */
|
6
reactos/subsys/win32k/include/surface.h
Normal file
6
reactos/subsys/win32k/include/surface.h
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
#ifndef __WIN32K_SURFACE_H
|
||||||
|
#define __WIN32K_SURFACE_H
|
||||||
|
|
||||||
|
INT BitsPerFormat(ULONG Format);
|
||||||
|
|
||||||
|
#endif /* __WIN32K_SURFACE_H */
|
166
reactos/subsys/win32k/ntuser/input.c
Normal file
166
reactos/subsys/win32k/ntuser/input.c
Normal file
|
@ -0,0 +1,166 @@
|
||||||
|
/* $Id: input.c,v 1.1 2002/01/14 01:11:58 dwelch Exp $
|
||||||
|
*
|
||||||
|
* COPYRIGHT: See COPYING in the top level directory
|
||||||
|
* PROJECT: ReactOS kernel
|
||||||
|
* PURPOSE: Window classes
|
||||||
|
* FILE: subsys/win32k/ntuser/class.c
|
||||||
|
* PROGRAMER: Casper S. Hornstrup (chorns@users.sourceforge.net)
|
||||||
|
* REVISION HISTORY:
|
||||||
|
* 06-06-2001 CSH Created
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* INCLUDES ******************************************************************/
|
||||||
|
|
||||||
|
#include <ddk/ntddk.h>
|
||||||
|
#include <win32k/win32k.h>
|
||||||
|
#include <win32k/userobj.h>
|
||||||
|
#include <include/class.h>
|
||||||
|
#include <include/error.h>
|
||||||
|
#include <include/winsta.h>
|
||||||
|
#include <include/msgqueue.h>
|
||||||
|
|
||||||
|
#define NDEBUG
|
||||||
|
#include <debug.h>
|
||||||
|
|
||||||
|
/* GLOBALS *******************************************************************/
|
||||||
|
|
||||||
|
static HANDLE KeyboardThreadHandle;
|
||||||
|
static CLIENT_ID KeyboardThreadId;
|
||||||
|
static HANDLE KeyboardDeviceHandle;
|
||||||
|
static KEVENT InputThreadsStart;
|
||||||
|
static BOOLEAN InputThreadsRunning = FALSE;
|
||||||
|
|
||||||
|
/* FUNCTIONS *****************************************************************/
|
||||||
|
|
||||||
|
NTSTATUS STDCALL STATIC
|
||||||
|
KeyboardThreadMain(PVOID StartContext)
|
||||||
|
{
|
||||||
|
UNICODE_STRING KeyboardDeviceName;
|
||||||
|
OBJECT_ATTRIBUTES KeyboardObjectAttributes;
|
||||||
|
IO_STATUS_BLOCK Iosb;
|
||||||
|
NTSTATUS Status;
|
||||||
|
|
||||||
|
RtlInitUnicodeString(&KeyboardDeviceName, L"\\??\\Keyboard");
|
||||||
|
InitializeObjectAttributes(&KeyboardObjectAttributes,
|
||||||
|
&KeyboardDeviceName,
|
||||||
|
0,
|
||||||
|
NULL,
|
||||||
|
NULL);
|
||||||
|
Status = NtOpenFile(&KeyboardDeviceHandle,
|
||||||
|
FILE_ALL_ACCESS,
|
||||||
|
&KeyboardObjectAttributes,
|
||||||
|
&Iosb,
|
||||||
|
0,
|
||||||
|
0);
|
||||||
|
if (!NT_SUCCESS(Status))
|
||||||
|
{
|
||||||
|
DbgPrint("W32K: Failed to open keyboard.\n");
|
||||||
|
return(Status);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (;;)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* Wait to start input.
|
||||||
|
*/
|
||||||
|
Status = KeWaitForSingleObject(&InputThreadsStart,
|
||||||
|
0,
|
||||||
|
UserMode,
|
||||||
|
TRUE,
|
||||||
|
NULL);
|
||||||
|
/*
|
||||||
|
* Receive and process keyboard input.
|
||||||
|
*/
|
||||||
|
while (InputThreadsRunning)
|
||||||
|
{
|
||||||
|
KEY_EVENT_RECORD KeyEvent;
|
||||||
|
LPARAM lParam;
|
||||||
|
|
||||||
|
Status = NtReadFile (KeyboardDeviceHandle,
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
&Iosb,
|
||||||
|
&KeyEvent,
|
||||||
|
sizeof(KEY_EVENT_RECORD),
|
||||||
|
NULL,
|
||||||
|
NULL);
|
||||||
|
if (Status == STATUS_ALERTED && !InputThreadsRunning)
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (!NT_SUCCESS(Status))
|
||||||
|
{
|
||||||
|
DbgPrint("W32K: Failed to read from keyboard.\n");
|
||||||
|
return(Status);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Post a keyboard message.
|
||||||
|
*/
|
||||||
|
if (KeyEvent.bKeyDown)
|
||||||
|
{
|
||||||
|
/* FIXME: Bit 24 indicates if this is an extended key. */
|
||||||
|
lParam = KeyEvent.wRepeatCount |
|
||||||
|
((KeyEvent.wVirtualScanCode << 16) & 0x00FF0000) | 0x40000000;
|
||||||
|
MsqPostKeyboardMessage(WM_KEYDOWN, KeyEvent.wVirtualKeyCode,
|
||||||
|
lParam);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* FIXME: Bit 24 indicates if this is an extended key. */
|
||||||
|
lParam = KeyEvent.wRepeatCount |
|
||||||
|
((KeyEvent.wVirtualScanCode << 16) & 0x00FF0000) | 0xC0000000;
|
||||||
|
MsqPostKeyboardMessage(WM_KEYUP, KeyEvent.wVirtualKeyCode,
|
||||||
|
lParam);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
NTSTATUS STDCALL
|
||||||
|
NtUserAcquireOrReleaseInputOwnership(BOOLEAN Release)
|
||||||
|
{
|
||||||
|
if (Release && InputThreadsRunning)
|
||||||
|
{
|
||||||
|
KeClearEvent(&InputThreadsStart);
|
||||||
|
InputThreadsRunning = FALSE;
|
||||||
|
NtAlertThread(KeyboardThreadHandle);
|
||||||
|
}
|
||||||
|
else if (!Release && !InputThreadsRunning)
|
||||||
|
{
|
||||||
|
InputThreadsRunning = TRUE;
|
||||||
|
KeSetEvent(&InputThreadsStart, IO_NO_INCREMENT, FALSE);
|
||||||
|
}
|
||||||
|
return(STATUS_SUCCESS);
|
||||||
|
}
|
||||||
|
|
||||||
|
NTSTATUS
|
||||||
|
InitInputImpl(VOID)
|
||||||
|
{
|
||||||
|
NTSTATUS Status;
|
||||||
|
|
||||||
|
KeInitializeEvent(&InputThreadsStart, NotificationEvent, FALSE);
|
||||||
|
|
||||||
|
Status = PsCreateSystemThread(&KeyboardThreadHandle,
|
||||||
|
THREAD_ALL_ACCESS,
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
&KeyboardThreadId,
|
||||||
|
KeyboardThreadMain,
|
||||||
|
NULL);
|
||||||
|
if (!NT_SUCCESS(Status))
|
||||||
|
{
|
||||||
|
DbgPrint("W32K: Failed to create keyboard thread.\n");
|
||||||
|
NtClose(KeyboardThreadHandle);
|
||||||
|
}
|
||||||
|
return(STATUS_SUCCESS);
|
||||||
|
}
|
||||||
|
|
||||||
|
NTSTATUS
|
||||||
|
CleanupInputImp(VOID)
|
||||||
|
{
|
||||||
|
return(STATUS_SUCCESS);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* EOF */
|
Loading…
Reference in a new issue