mirror of
https://github.com/reactos/reactos.git
synced 2025-05-06 18:31:26 +00:00
[CONSRV]
- Compile with Vista+ defines. - Add basic mouse events support. Tested with Far Manager. svn path=/branches/ros-csrss/; revision=58620
This commit is contained in:
parent
22ecec636a
commit
e1f0919480
5 changed files with 182 additions and 74 deletions
|
@ -53,28 +53,46 @@ extern "C" {
|
||||||
#define ENABLE_PROCESSED_OUTPUT 0x0001
|
#define ENABLE_PROCESSED_OUTPUT 0x0001
|
||||||
#define ENABLE_WRAP_AT_EOL_OUTPUT 0x0002
|
#define ENABLE_WRAP_AT_EOL_OUTPUT 0x0002
|
||||||
|
|
||||||
#define KEY_EVENT 1
|
/*
|
||||||
#define MOUSE_EVENT 2
|
* Event types
|
||||||
#define WINDOW_BUFFER_SIZE_EVENT 4
|
*/
|
||||||
#define MENU_EVENT 8
|
#define KEY_EVENT 0x0001
|
||||||
#define FOCUS_EVENT 16
|
#define MOUSE_EVENT 0x0002
|
||||||
#define CAPSLOCK_ON 128
|
#define WINDOW_BUFFER_SIZE_EVENT 0x0004
|
||||||
#define ENHANCED_KEY 256
|
#define MENU_EVENT 0x0008
|
||||||
#define RIGHT_ALT_PRESSED 1
|
#define FOCUS_EVENT 0x0010
|
||||||
#define LEFT_ALT_PRESSED 2
|
|
||||||
#define RIGHT_CTRL_PRESSED 4
|
/*
|
||||||
#define LEFT_CTRL_PRESSED 8
|
* ControlKeyState flags
|
||||||
#define SHIFT_PRESSED 16
|
*/
|
||||||
#define NUMLOCK_ON 32
|
#define RIGHT_ALT_PRESSED 0x0001
|
||||||
#define SCROLLLOCK_ON 64
|
#define LEFT_ALT_PRESSED 0x0002
|
||||||
#define FROM_LEFT_1ST_BUTTON_PRESSED 1
|
#define RIGHT_CTRL_PRESSED 0x0004
|
||||||
#define RIGHTMOST_BUTTON_PRESSED 2
|
#define LEFT_CTRL_PRESSED 0x0008
|
||||||
#define FROM_LEFT_2ND_BUTTON_PRESSED 4
|
#define SHIFT_PRESSED 0x0010
|
||||||
#define FROM_LEFT_3RD_BUTTON_PRESSED 8
|
#define NUMLOCK_ON 0x0020
|
||||||
#define FROM_LEFT_4TH_BUTTON_PRESSED 16
|
#define SCROLLLOCK_ON 0x0040
|
||||||
#define MOUSE_MOVED 1
|
#define CAPSLOCK_ON 0x0080
|
||||||
#define DOUBLE_CLICK 2
|
#define ENHANCED_KEY 0x0100
|
||||||
#define MOUSE_WHEELED 4
|
|
||||||
|
/*
|
||||||
|
* ButtonState flags
|
||||||
|
*/
|
||||||
|
#define FROM_LEFT_1ST_BUTTON_PRESSED 0x0001
|
||||||
|
#define RIGHTMOST_BUTTON_PRESSED 0x0002
|
||||||
|
#define FROM_LEFT_2ND_BUTTON_PRESSED 0x0004
|
||||||
|
#define FROM_LEFT_3RD_BUTTON_PRESSED 0x0008
|
||||||
|
#define FROM_LEFT_4TH_BUTTON_PRESSED 0x0010
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Mouse event flags
|
||||||
|
*/
|
||||||
|
#define MOUSE_MOVED 0x0001
|
||||||
|
#define DOUBLE_CLICK 0x0002
|
||||||
|
#define MOUSE_WHEELED 0x0004
|
||||||
|
#if (_WIN32_WINNT >= 0x0600)
|
||||||
|
#define MOUSE_HWHEELED 0x0008
|
||||||
|
#endif
|
||||||
|
|
||||||
typedef struct _CONSOLE_READCONSOLE_CONTROL {
|
typedef struct _CONSOLE_READCONSOLE_CONTROL {
|
||||||
ULONG nLength;
|
ULONG nLength;
|
||||||
|
|
|
@ -1,4 +1,7 @@
|
||||||
|
|
||||||
|
remove_definitions(-D_WIN32_WINNT=0x502)
|
||||||
|
add_definitions(-D_WIN32_WINNT=0x600)
|
||||||
|
|
||||||
include_directories(
|
include_directories(
|
||||||
${REACTOS_SOURCE_DIR}/include/reactos/subsys
|
${REACTOS_SOURCE_DIR}/include/reactos/subsys
|
||||||
${REACTOS_SOURCE_DIR}/win32ss/include)
|
${REACTOS_SOURCE_DIR}/win32ss/include)
|
||||||
|
|
|
@ -48,9 +48,9 @@ ConioInputEventToAnsi(PCONSOLE Console, PINPUT_RECORD InputEvent)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static NTSTATUS FASTCALL
|
NTSTATUS FASTCALL
|
||||||
ConioProcessChar(PCONSOLE Console,
|
ConioProcessInputEvent(PCONSOLE Console,
|
||||||
PINPUT_RECORD InputEvent)
|
PINPUT_RECORD InputEvent)
|
||||||
{
|
{
|
||||||
ConsoleInput *ConInRec;
|
ConsoleInput *ConInRec;
|
||||||
|
|
||||||
|
@ -273,7 +273,7 @@ ConioProcessKey(PCONSOLE Console, MSG* msg)
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
ConioProcessChar(Console, &er);
|
ConioProcessInputEvent(Console, &er);
|
||||||
}
|
}
|
||||||
|
|
||||||
static NTSTATUS
|
static NTSTATUS
|
||||||
|
@ -792,7 +792,7 @@ CSR_API(SrvWriteConsoleInput)
|
||||||
&AsciiChar);
|
&AsciiChar);
|
||||||
}
|
}
|
||||||
|
|
||||||
Status = ConioProcessChar(Console, InputRecord++);
|
Status = ConioProcessInputEvent(Console, InputRecord++);
|
||||||
}
|
}
|
||||||
|
|
||||||
ConSrvReleaseInputBuffer(InputBuffer, TRUE);
|
ConSrvReleaseInputBuffer(InputBuffer, TRUE);
|
||||||
|
|
|
@ -249,6 +249,8 @@ ULONG FASTCALL ConSrvConsoleProcessCtrlEvent(PCONSOLE Console,
|
||||||
#define ConSrvReleaseInputBuffer(Buff, IsConsoleLocked) \
|
#define ConSrvReleaseInputBuffer(Buff, IsConsoleLocked) \
|
||||||
ConSrvReleaseObject(&(Buff)->Header, (IsConsoleLocked))
|
ConSrvReleaseObject(&(Buff)->Header, (IsConsoleLocked))
|
||||||
VOID WINAPI ConioProcessKey(PCONSOLE Console, MSG* msg);
|
VOID WINAPI ConioProcessKey(PCONSOLE Console, MSG* msg);
|
||||||
|
NTSTATUS FASTCALL ConioProcessInputEvent(PCONSOLE Console,
|
||||||
|
PINPUT_RECORD InputEvent);
|
||||||
|
|
||||||
/* conoutput.c */
|
/* conoutput.c */
|
||||||
#define ConioRectHeight(Rect) \
|
#define ConioRectHeight(Rect) \
|
||||||
|
|
|
@ -885,64 +885,148 @@ GuiConsoleHandleMouse(PGUI_CONSOLE_DATA GuiData, UINT msg, WPARAM wParam, LPARAM
|
||||||
goto Quit;
|
goto Quit;
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (msg)
|
if (Console->QuickEdit)
|
||||||
{
|
{
|
||||||
case WM_LBUTTONDOWN:
|
switch (msg)
|
||||||
{
|
{
|
||||||
Console->Selection.dwSelectionAnchor = PointToCoord(GuiData, lParam);
|
case WM_LBUTTONDOWN:
|
||||||
SetCapture(GuiData->hWindow);
|
|
||||||
Console->Selection.dwFlags |= CONSOLE_SELECTION_IN_PROGRESS | CONSOLE_MOUSE_SELECTION | CONSOLE_MOUSE_DOWN;
|
|
||||||
GuiConsoleUpdateSelection(Console, &Console->Selection.dwSelectionAnchor);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case WM_LBUTTONUP:
|
|
||||||
{
|
|
||||||
COORD c;
|
|
||||||
|
|
||||||
if (!(Console->Selection.dwFlags & CONSOLE_MOUSE_DOWN)) break;
|
|
||||||
|
|
||||||
c = PointToCoord(GuiData, lParam);
|
|
||||||
Console->Selection.dwFlags &= ~CONSOLE_MOUSE_DOWN;
|
|
||||||
GuiConsoleUpdateSelection(Console, &c);
|
|
||||||
ReleaseCapture();
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case WM_RBUTTONDOWN:
|
|
||||||
{
|
|
||||||
if (!(Console->Selection.dwFlags & CONSOLE_SELECTION_NOT_EMPTY))
|
|
||||||
{
|
{
|
||||||
GuiConsolePaste(GuiData);
|
Console->Selection.dwSelectionAnchor = PointToCoord(GuiData, lParam);
|
||||||
}
|
SetCapture(GuiData->hWindow);
|
||||||
else
|
Console->Selection.dwFlags |= CONSOLE_SELECTION_IN_PROGRESS | CONSOLE_MOUSE_SELECTION | CONSOLE_MOUSE_DOWN;
|
||||||
{
|
GuiConsoleUpdateSelection(Console, &Console->Selection.dwSelectionAnchor);
|
||||||
GuiConsoleCopy(GuiData);
|
break;
|
||||||
|
|
||||||
/* Clear the selection */
|
|
||||||
GuiConsoleUpdateSelection(Console, NULL);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
break;
|
case WM_LBUTTONUP:
|
||||||
}
|
{
|
||||||
|
COORD c;
|
||||||
|
|
||||||
case WM_MOUSEMOVE:
|
if (!(Console->Selection.dwFlags & CONSOLE_MOUSE_DOWN)) break;
|
||||||
|
|
||||||
|
c = PointToCoord(GuiData, lParam);
|
||||||
|
Console->Selection.dwFlags &= ~CONSOLE_MOUSE_DOWN;
|
||||||
|
GuiConsoleUpdateSelection(Console, &c);
|
||||||
|
ReleaseCapture();
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case WM_RBUTTONDOWN:
|
||||||
|
{
|
||||||
|
if (!(Console->Selection.dwFlags & CONSOLE_SELECTION_NOT_EMPTY))
|
||||||
|
{
|
||||||
|
GuiConsolePaste(GuiData);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
GuiConsoleCopy(GuiData);
|
||||||
|
|
||||||
|
/* Clear the selection */
|
||||||
|
GuiConsoleUpdateSelection(Console, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case WM_MOUSEMOVE:
|
||||||
|
{
|
||||||
|
COORD c;
|
||||||
|
|
||||||
|
if (!(wParam & MK_LBUTTON)) break;
|
||||||
|
if (!(Console->Selection.dwFlags & CONSOLE_MOUSE_DOWN)) break;
|
||||||
|
|
||||||
|
c = PointToCoord(GuiData, lParam); /* TODO: Scroll buffer to bring c into view */
|
||||||
|
GuiConsoleUpdateSelection(Console, &c);
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
default:
|
||||||
|
Ret = FALSE;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (Console->InputBuffer.Mode & ENABLE_MOUSE_INPUT)
|
||||||
|
{
|
||||||
|
INPUT_RECORD er;
|
||||||
|
DWORD dwButtonState = 0;
|
||||||
|
DWORD dwEventFlags = 0;
|
||||||
|
|
||||||
|
switch (msg)
|
||||||
{
|
{
|
||||||
COORD c;
|
case WM_LBUTTONDOWN:
|
||||||
|
dwButtonState = FROM_LEFT_1ST_BUTTON_PRESSED;
|
||||||
|
dwEventFlags = 0;
|
||||||
|
break;
|
||||||
|
|
||||||
if (!(wParam & MK_LBUTTON)) break;
|
case WM_LBUTTONUP:
|
||||||
if (!(Console->Selection.dwFlags & CONSOLE_MOUSE_DOWN)) break;
|
dwButtonState = 0;
|
||||||
|
dwEventFlags = 0;
|
||||||
|
break;
|
||||||
|
|
||||||
c = PointToCoord(GuiData, lParam); /* TODO: Scroll buffer to bring c into view */
|
case WM_LBUTTONDBLCLK:
|
||||||
GuiConsoleUpdateSelection(Console, &c);
|
dwButtonState = FROM_LEFT_1ST_BUTTON_PRESSED;
|
||||||
|
dwEventFlags = DOUBLE_CLICK;
|
||||||
|
break;
|
||||||
|
|
||||||
break;
|
case WM_RBUTTONDOWN:
|
||||||
|
dwButtonState = RIGHTMOST_BUTTON_PRESSED;
|
||||||
|
dwEventFlags = 0;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case WM_RBUTTONUP:
|
||||||
|
dwButtonState = 0;
|
||||||
|
dwEventFlags = 0;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case WM_RBUTTONDBLCLK:
|
||||||
|
dwButtonState = RIGHTMOST_BUTTON_PRESSED;
|
||||||
|
dwEventFlags = DOUBLE_CLICK;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case WM_MBUTTONDOWN:
|
||||||
|
dwButtonState = FROM_LEFT_2ND_BUTTON_PRESSED;
|
||||||
|
dwEventFlags = 0;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case WM_MBUTTONUP:
|
||||||
|
dwButtonState = 0;
|
||||||
|
dwEventFlags = 0;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case WM_MBUTTONDBLCLK:
|
||||||
|
dwButtonState = FROM_LEFT_2ND_BUTTON_PRESSED;
|
||||||
|
dwEventFlags = DOUBLE_CLICK;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case WM_MOUSEMOVE:
|
||||||
|
dwButtonState = 0;
|
||||||
|
dwEventFlags = MOUSE_MOVED;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case WM_MOUSEWHEEL:
|
||||||
|
dwButtonState = 0;
|
||||||
|
dwEventFlags = MOUSE_WHEELED;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case WM_MOUSEHWHEEL:
|
||||||
|
dwButtonState = 0;
|
||||||
|
dwEventFlags = MOUSE_HWHEELED;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
Ret = FALSE;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
default:
|
er.EventType = MOUSE_EVENT;
|
||||||
Ret = FALSE;
|
er.Event.MouseEvent.dwMousePosition = PointToCoord(GuiData, lParam);
|
||||||
break;
|
er.Event.MouseEvent.dwButtonState = dwButtonState;
|
||||||
|
er.Event.MouseEvent.dwControlKeyState = 0;
|
||||||
|
er.Event.MouseEvent.dwEventFlags = dwEventFlags;
|
||||||
|
|
||||||
|
ConioProcessInputEvent(Console, &er);
|
||||||
}
|
}
|
||||||
|
|
||||||
LeaveCriticalSection(&Console->Lock);
|
LeaveCriticalSection(&Console->Lock);
|
||||||
|
@ -1340,7 +1424,6 @@ GuiConsoleWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
|
||||||
GuiConsoleHandleTimer(GuiData);
|
GuiConsoleHandleTimer(GuiData);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case WM_MOUSEMOVE:
|
|
||||||
case WM_LBUTTONDOWN:
|
case WM_LBUTTONDOWN:
|
||||||
case WM_LBUTTONUP:
|
case WM_LBUTTONUP:
|
||||||
case WM_LBUTTONDBLCLK:
|
case WM_LBUTTONDBLCLK:
|
||||||
|
@ -1350,7 +1433,9 @@ GuiConsoleWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
|
||||||
case WM_MBUTTONDOWN:
|
case WM_MBUTTONDOWN:
|
||||||
case WM_MBUTTONUP:
|
case WM_MBUTTONUP:
|
||||||
case WM_MBUTTONDBLCLK:
|
case WM_MBUTTONDBLCLK:
|
||||||
|
case WM_MOUSEMOVE:
|
||||||
case WM_MOUSEWHEEL:
|
case WM_MOUSEWHEEL:
|
||||||
|
case WM_MOUSEHWHEEL:
|
||||||
{
|
{
|
||||||
Result = GuiConsoleHandleMouse(GuiData, msg, wParam, lParam);
|
Result = GuiConsoleHandleMouse(GuiData, msg, wParam, lParam);
|
||||||
break;
|
break;
|
||||||
|
|
Loading…
Reference in a new issue