- 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:
Hermès Bélusca-Maïto 2013-03-30 22:54:47 +00:00
parent 22ecec636a
commit e1f0919480
5 changed files with 182 additions and 74 deletions

View file

@ -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;

View file

@ -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)

View file

@ -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);

View file

@ -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) \

View file

@ -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;