mirror of
https://github.com/reactos/reactos.git
synced 2025-04-22 13:10:39 +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_WRAP_AT_EOL_OUTPUT 0x0002
|
||||
|
||||
#define KEY_EVENT 1
|
||||
#define MOUSE_EVENT 2
|
||||
#define WINDOW_BUFFER_SIZE_EVENT 4
|
||||
#define MENU_EVENT 8
|
||||
#define FOCUS_EVENT 16
|
||||
#define CAPSLOCK_ON 128
|
||||
#define ENHANCED_KEY 256
|
||||
#define RIGHT_ALT_PRESSED 1
|
||||
#define LEFT_ALT_PRESSED 2
|
||||
#define RIGHT_CTRL_PRESSED 4
|
||||
#define LEFT_CTRL_PRESSED 8
|
||||
#define SHIFT_PRESSED 16
|
||||
#define NUMLOCK_ON 32
|
||||
#define SCROLLLOCK_ON 64
|
||||
#define FROM_LEFT_1ST_BUTTON_PRESSED 1
|
||||
#define RIGHTMOST_BUTTON_PRESSED 2
|
||||
#define FROM_LEFT_2ND_BUTTON_PRESSED 4
|
||||
#define FROM_LEFT_3RD_BUTTON_PRESSED 8
|
||||
#define FROM_LEFT_4TH_BUTTON_PRESSED 16
|
||||
#define MOUSE_MOVED 1
|
||||
#define DOUBLE_CLICK 2
|
||||
#define MOUSE_WHEELED 4
|
||||
/*
|
||||
* Event types
|
||||
*/
|
||||
#define KEY_EVENT 0x0001
|
||||
#define MOUSE_EVENT 0x0002
|
||||
#define WINDOW_BUFFER_SIZE_EVENT 0x0004
|
||||
#define MENU_EVENT 0x0008
|
||||
#define FOCUS_EVENT 0x0010
|
||||
|
||||
/*
|
||||
* ControlKeyState flags
|
||||
*/
|
||||
#define RIGHT_ALT_PRESSED 0x0001
|
||||
#define LEFT_ALT_PRESSED 0x0002
|
||||
#define RIGHT_CTRL_PRESSED 0x0004
|
||||
#define LEFT_CTRL_PRESSED 0x0008
|
||||
#define SHIFT_PRESSED 0x0010
|
||||
#define NUMLOCK_ON 0x0020
|
||||
#define SCROLLLOCK_ON 0x0040
|
||||
#define CAPSLOCK_ON 0x0080
|
||||
#define ENHANCED_KEY 0x0100
|
||||
|
||||
/*
|
||||
* 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 {
|
||||
ULONG nLength;
|
||||
|
|
|
@ -1,4 +1,7 @@
|
|||
|
||||
remove_definitions(-D_WIN32_WINNT=0x502)
|
||||
add_definitions(-D_WIN32_WINNT=0x600)
|
||||
|
||||
include_directories(
|
||||
${REACTOS_SOURCE_DIR}/include/reactos/subsys
|
||||
${REACTOS_SOURCE_DIR}/win32ss/include)
|
||||
|
|
|
@ -48,9 +48,9 @@ ConioInputEventToAnsi(PCONSOLE Console, PINPUT_RECORD InputEvent)
|
|||
}
|
||||
}
|
||||
|
||||
static NTSTATUS FASTCALL
|
||||
ConioProcessChar(PCONSOLE Console,
|
||||
PINPUT_RECORD InputEvent)
|
||||
NTSTATUS FASTCALL
|
||||
ConioProcessInputEvent(PCONSOLE Console,
|
||||
PINPUT_RECORD InputEvent)
|
||||
{
|
||||
ConsoleInput *ConInRec;
|
||||
|
||||
|
@ -273,7 +273,7 @@ ConioProcessKey(PCONSOLE Console, MSG* msg)
|
|||
}
|
||||
return;
|
||||
}
|
||||
ConioProcessChar(Console, &er);
|
||||
ConioProcessInputEvent(Console, &er);
|
||||
}
|
||||
|
||||
static NTSTATUS
|
||||
|
@ -792,7 +792,7 @@ CSR_API(SrvWriteConsoleInput)
|
|||
&AsciiChar);
|
||||
}
|
||||
|
||||
Status = ConioProcessChar(Console, InputRecord++);
|
||||
Status = ConioProcessInputEvent(Console, InputRecord++);
|
||||
}
|
||||
|
||||
ConSrvReleaseInputBuffer(InputBuffer, TRUE);
|
||||
|
|
|
@ -249,6 +249,8 @@ ULONG FASTCALL ConSrvConsoleProcessCtrlEvent(PCONSOLE Console,
|
|||
#define ConSrvReleaseInputBuffer(Buff, IsConsoleLocked) \
|
||||
ConSrvReleaseObject(&(Buff)->Header, (IsConsoleLocked))
|
||||
VOID WINAPI ConioProcessKey(PCONSOLE Console, MSG* msg);
|
||||
NTSTATUS FASTCALL ConioProcessInputEvent(PCONSOLE Console,
|
||||
PINPUT_RECORD InputEvent);
|
||||
|
||||
/* conoutput.c */
|
||||
#define ConioRectHeight(Rect) \
|
||||
|
|
|
@ -885,64 +885,148 @@ GuiConsoleHandleMouse(PGUI_CONSOLE_DATA GuiData, UINT msg, WPARAM wParam, LPARAM
|
|||
goto Quit;
|
||||
}
|
||||
|
||||
switch (msg)
|
||||
if (Console->QuickEdit)
|
||||
{
|
||||
case WM_LBUTTONDOWN:
|
||||
switch (msg)
|
||||
{
|
||||
Console->Selection.dwSelectionAnchor = PointToCoord(GuiData, lParam);
|
||||
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))
|
||||
case WM_LBUTTONDOWN:
|
||||
{
|
||||
GuiConsolePaste(GuiData);
|
||||
}
|
||||
else
|
||||
{
|
||||
GuiConsoleCopy(GuiData);
|
||||
|
||||
/* Clear the selection */
|
||||
GuiConsoleUpdateSelection(Console, NULL);
|
||||
Console->Selection.dwSelectionAnchor = PointToCoord(GuiData, lParam);
|
||||
SetCapture(GuiData->hWindow);
|
||||
Console->Selection.dwFlags |= CONSOLE_SELECTION_IN_PROGRESS | CONSOLE_MOUSE_SELECTION | CONSOLE_MOUSE_DOWN;
|
||||
GuiConsoleUpdateSelection(Console, &Console->Selection.dwSelectionAnchor);
|
||||
break;
|
||||
}
|
||||
|
||||
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;
|
||||
if (!(Console->Selection.dwFlags & CONSOLE_MOUSE_DOWN)) break;
|
||||
case WM_LBUTTONUP:
|
||||
dwButtonState = 0;
|
||||
dwEventFlags = 0;
|
||||
break;
|
||||
|
||||
c = PointToCoord(GuiData, lParam); /* TODO: Scroll buffer to bring c into view */
|
||||
GuiConsoleUpdateSelection(Console, &c);
|
||||
case WM_LBUTTONDBLCLK:
|
||||
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:
|
||||
Ret = FALSE;
|
||||
break;
|
||||
er.EventType = MOUSE_EVENT;
|
||||
er.Event.MouseEvent.dwMousePosition = PointToCoord(GuiData, lParam);
|
||||
er.Event.MouseEvent.dwButtonState = dwButtonState;
|
||||
er.Event.MouseEvent.dwControlKeyState = 0;
|
||||
er.Event.MouseEvent.dwEventFlags = dwEventFlags;
|
||||
|
||||
ConioProcessInputEvent(Console, &er);
|
||||
}
|
||||
|
||||
LeaveCriticalSection(&Console->Lock);
|
||||
|
@ -1340,7 +1424,6 @@ GuiConsoleWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
|
|||
GuiConsoleHandleTimer(GuiData);
|
||||
break;
|
||||
|
||||
case WM_MOUSEMOVE:
|
||||
case WM_LBUTTONDOWN:
|
||||
case WM_LBUTTONUP:
|
||||
case WM_LBUTTONDBLCLK:
|
||||
|
@ -1350,7 +1433,9 @@ GuiConsoleWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
|
|||
case WM_MBUTTONDOWN:
|
||||
case WM_MBUTTONUP:
|
||||
case WM_MBUTTONDBLCLK:
|
||||
case WM_MOUSEMOVE:
|
||||
case WM_MOUSEWHEEL:
|
||||
case WM_MOUSEHWHEEL:
|
||||
{
|
||||
Result = GuiConsoleHandleMouse(GuiData, msg, wParam, lParam);
|
||||
break;
|
||||
|
|
Loading…
Reference in a new issue