Cleanup: minor refactoring of pointer event handling

Ref D6675
This commit is contained in:
Nicholas Rishel 2020-03-27 17:21:43 +01:00 committed by Brecht Van Lommel
parent 4e4bf241c8
commit 3d8c57f4da
4 changed files with 86 additions and 82 deletions

View File

@ -920,6 +920,14 @@ GHOST_EventButton *GHOST_SystemWin32::processButtonEvent(GHOST_TEventType type,
GHOST_TButtonMask mask)
{
GHOST_SystemWin32 *system = (GHOST_SystemWin32 *)getSystem();
if (type == GHOST_kEventButtonDown) {
window->updateMouseCapture(MousePressed);
}
else if (type == GHOST_kEventButtonUp) {
window->updateMouseCapture(MouseReleased);
}
if (window->useTabletAPI(GHOST_kTabletNative)) {
window->setTabletData(NULL);
}
@ -927,63 +935,63 @@ GHOST_EventButton *GHOST_SystemWin32::processButtonEvent(GHOST_TEventType type,
system->getMilliSeconds(), type, window, mask, window->getTabletData());
}
GHOST_Event *GHOST_SystemWin32::processPointerEvent(GHOST_TEventType type,
GHOST_WindowWin32 *window,
WPARAM wParam,
LPARAM lParam,
bool &eventHandled)
void GHOST_SystemWin32::processPointerEvents(
UINT type, GHOST_WindowWin32 *window, WPARAM wParam, LPARAM lParam, bool &eventHandled)
{
GHOST_PointerInfoWin32 pointerInfo;
GHOST_SystemWin32 *system = (GHOST_SystemWin32 *)getSystem();
if (!window->useTabletAPI(GHOST_kTabletNative)) {
return NULL;
return;
}
if (window->getPointerInfo(&pointerInfo, wParam, lParam) != GHOST_kSuccess) {
return NULL;
return;
}
if (!pointerInfo.isPrimary) {
eventHandled = true;
return NULL; // For multi-touch displays we ignore these events
return; // For multi-touch displays we ignore these events
}
system->setCursorPosition(pointerInfo.pixelLocation.x, pointerInfo.pixelLocation.y);
switch (type) {
case GHOST_kEventButtonDown:
case WM_POINTERDOWN:
/* Update window tablet data to be included in event. */
window->setTabletData(&pointerInfo.tabletData);
eventHandled = true;
return new GHOST_EventButton(system->getMilliSeconds(),
GHOST_kEventButtonDown,
window,
pointerInfo.buttonMask,
pointerInfo.tabletData);
case GHOST_kEventButtonUp:
eventHandled = true;
return new GHOST_EventButton(system->getMilliSeconds(),
GHOST_kEventButtonUp,
window,
pointerInfo.buttonMask,
window->getTabletData());
case GHOST_kEventCursorMove:
system->pushEvent(new GHOST_EventButton(system->getMilliSeconds(),
GHOST_kEventButtonDown,
window,
pointerInfo.buttonMask,
pointerInfo.tabletData));
window->updateMouseCapture(MousePressed);
break;
case WM_POINTERUPDATE:
/* Update window tablet data to be included in event. */
eventHandled = true;
return new GHOST_EventCursor(system->getMilliSeconds(),
GHOST_kEventCursorMove,
window,
pointerInfo.pixelLocation.x,
pointerInfo.pixelLocation.y,
pointerInfo.tabletData);
system->pushEvent(GHOST_EventCursor(system->getMilliSeconds(),
GHOST_kEventCursorMove,
window,
pointerInfo.pixelLocation.x,
pointerInfo.pixelLocation.y,
pointerInfo.tabletData));
break;
case WM_POINTERUP:
system->pushEvent(new GHOST_EventButton(system->getMilliSeconds(),
GHOST_kEventButtonUp,
window,
pointerInfo.buttonMask,
window->getTabletData()));
window->updateMouseCapture(MouseReleased);
break;
default:
return NULL;
break;
}
eventHandled = true;
}
GHOST_EventCursor *GHOST_SystemWin32::processCursorEvent(GHOST_TEventType type,
GHOST_WindowWin32 *window)
GHOST_EventCursor *GHOST_SystemWin32::processCursorEvent(GHOST_WindowWin32 *window)
{
GHOST_TInt32 x_screen, y_screen;
GHOST_SystemWin32 *system = (GHOST_SystemWin32 *)getSystem();
@ -1417,39 +1425,23 @@ LRESULT WINAPI GHOST_SystemWin32::s_wndProc(HWND hwnd, UINT msg, WPARAM wParam,
// Pointer events, processed
////////////////////////////////////////////////////////////////////////
case WM_POINTERDOWN:
event = processPointerEvent(
GHOST_kEventButtonDown, window, wParam, lParam, eventHandled);
if (event && eventHandled) {
window->registerMouseClickEvent(0);
}
break;
case WM_POINTERUP:
event = processPointerEvent(GHOST_kEventButtonUp, window, wParam, lParam, eventHandled);
if (event && eventHandled) {
window->registerMouseClickEvent(1);
}
break;
case WM_POINTERUPDATE:
event = processPointerEvent(
GHOST_kEventCursorMove, window, wParam, lParam, eventHandled);
case WM_POINTERUP:
processPointerEvents(msg, window, wParam, lParam, eventHandled);
break;
////////////////////////////////////////////////////////////////////////
// Mouse events, processed
////////////////////////////////////////////////////////////////////////
case WM_LBUTTONDOWN:
window->registerMouseClickEvent(0);
event = processButtonEvent(GHOST_kEventButtonDown, window, GHOST_kButtonMaskLeft);
break;
case WM_MBUTTONDOWN:
window->registerMouseClickEvent(0);
event = processButtonEvent(GHOST_kEventButtonDown, window, GHOST_kButtonMaskMiddle);
break;
case WM_RBUTTONDOWN:
window->registerMouseClickEvent(0);
event = processButtonEvent(GHOST_kEventButtonDown, window, GHOST_kButtonMaskRight);
break;
case WM_XBUTTONDOWN:
window->registerMouseClickEvent(0);
if ((short)HIWORD(wParam) == XBUTTON1) {
event = processButtonEvent(GHOST_kEventButtonDown, window, GHOST_kButtonMaskButton4);
}
@ -1458,19 +1450,15 @@ LRESULT WINAPI GHOST_SystemWin32::s_wndProc(HWND hwnd, UINT msg, WPARAM wParam,
}
break;
case WM_LBUTTONUP:
window->registerMouseClickEvent(1);
event = processButtonEvent(GHOST_kEventButtonUp, window, GHOST_kButtonMaskLeft);
break;
case WM_MBUTTONUP:
window->registerMouseClickEvent(1);
event = processButtonEvent(GHOST_kEventButtonUp, window, GHOST_kButtonMaskMiddle);
break;
case WM_RBUTTONUP:
window->registerMouseClickEvent(1);
event = processButtonEvent(GHOST_kEventButtonUp, window, GHOST_kButtonMaskRight);
break;
case WM_XBUTTONUP:
window->registerMouseClickEvent(1);
if ((short)HIWORD(wParam) == XBUTTON1) {
event = processButtonEvent(GHOST_kEventButtonUp, window, GHOST_kButtonMaskButton4);
}
@ -1479,7 +1467,7 @@ LRESULT WINAPI GHOST_SystemWin32::s_wndProc(HWND hwnd, UINT msg, WPARAM wParam,
}
break;
case WM_MOUSEMOVE:
event = processCursorEvent(GHOST_kEventCursorMove, window);
event = processCursorEvent(window);
break;
case WM_MOUSEWHEEL: {
/* The WM_MOUSEWHEEL message is sent to the focus window

View File

@ -310,27 +310,29 @@ class GHOST_SystemWin32 : public GHOST_System {
GHOST_TButtonMask mask);
/**
* Creates pointer event.
* \param type The type of event to create.
* Creates tablet events from Wintab events.
* \param type The type of pointer event
* \param window The window receiving the event (the active window).
*/
static GHOST_TSuccess processWintabEvents(GHOST_TEventType type, GHOST_WindowWin32 *window);
/**
* Creates tablet events from pointer events.
* \param type The type of pointer event
* \param window The window receiving the event (the active window).
* \param wParam The wParam from the wndproc
* \param lParam The lParam from the wndproc
* \param eventhandled true if the method handled the event
* \return The event created.
*/
static GHOST_Event *processPointerEvent(GHOST_TEventType type,
GHOST_WindowWin32 *window,
WPARAM wParam,
LPARAM lParam,
bool &eventhandled);
static void processPointerEvents(
UINT type, GHOST_WindowWin32 *window, WPARAM wParam, LPARAM lParam, bool &eventhandled);
/**
* Creates cursor event.
* \param type The type of event to create.
* \param window The window receiving the event (the active window).
* \return The event created.
*/
static GHOST_EventCursor *processCursorEvent(GHOST_TEventType type, GHOST_WindowWin32 *window);
static GHOST_EventCursor *processCursorEvent(GHOST_WindowWin32 *window);
/**
* Handles a mouse wheel event.

View File

@ -785,21 +785,20 @@ bool GHOST_WindowWin32::isDialog() const
return (parent != 0) && (style & WS_POPUPWINDOW);
}
void GHOST_WindowWin32::registerMouseClickEvent(int press)
void GHOST_WindowWin32::updateMouseCapture(GHOST_MouseCaptureEventWin32 event)
{
switch (press) {
case 0:
switch (event) {
case MousePressed:
m_nPressedButtons++;
break;
case 1:
case MouseReleased:
if (m_nPressedButtons)
m_nPressedButtons--;
break;
case 2:
case OperatorGrab:
m_hasGrabMouse = true;
break;
case 3:
case OperatorUngrab:
m_hasGrabMouse = false;
break;
}
@ -814,6 +813,11 @@ void GHOST_WindowWin32::registerMouseClickEvent(int press)
}
}
bool GHOST_WindowWin32::getMousePressed() const
{
return m_nPressedButtons;
}
HCURSOR GHOST_WindowWin32::getStandardCursor(GHOST_TStandardCursor shape) const
{
// Convert GHOST cursor to Windows OEM cursor
@ -977,7 +981,7 @@ GHOST_TSuccess GHOST_WindowWin32::setWindowCursorGrab(GHOST_TGrabCursorMode mode
if (mode == GHOST_kGrabHide)
setWindowCursorVisibility(false);
}
registerMouseClickEvent(2);
updateMouseCapture(OperatorGrab);
}
else {
if (m_cursorGrab == GHOST_kGrabHide) {
@ -997,7 +1001,7 @@ GHOST_TSuccess GHOST_WindowWin32::setWindowCursorGrab(GHOST_TGrabCursorMode mode
* can be incorrect on exit. */
setCursorGrabAccum(0, 0);
m_cursorGrabBounds.m_l = m_cursorGrabBounds.m_r = -1; /* disable */
registerMouseClickEvent(3);
updateMouseCapture(OperatorUngrab);
}
return GHOST_kSuccess;

View File

@ -206,6 +206,13 @@ struct GHOST_PointerInfoWin32 {
GHOST_TabletData tabletData;
};
typedef enum {
MousePressed,
MouseReleased,
OperatorGrab,
OperatorUngrab
} GHOST_MouseCaptureEventWin32;
/**
* GHOST window on M$ Windows OSs.
*/
@ -364,17 +371,14 @@ class GHOST_WindowWin32 : public GHOST_Window {
GHOST_TSuccess endProgressBar();
/**
* Register a mouse click event (should be called
* Register a mouse capture state (should be called
* for any real button press, controls mouse
* capturing).
*
* \param press
* 0 - mouse pressed
* 1 - mouse released
* 2 - operator grab
* 3 - operator ungrab
* \param event Whether mouse was pressed and released, or an operator grabbed or ungrabbed the
* mouse
*/
void registerMouseClickEvent(int press);
void updateMouseCapture(GHOST_MouseCaptureEventWin32 event);
/**
* Inform the window that it has lost mouse capture,
@ -419,6 +423,12 @@ class GHOST_WindowWin32 : public GHOST_Window {
GHOST_TUns16 getDPIHint() override;
/**
* Get whether there are currently any mouse buttons pressed
* \return True if there are any currently pressed mouse buttons
*/
bool getMousePressed() const;
GHOST_TSuccess getPointerInfo(GHOST_PointerInfoWin32 *pointerInfo, WPARAM wParam, LPARAM lParam);
/** if the window currently resizing */