From aa4952fdefebb7416c56a79f9d789a083a621c3b Mon Sep 17 00:00:00 2001 From: "Ryan C. Gordon" Date: Tue, 21 Apr 2015 10:10:59 -0400 Subject: [PATCH] Added SDL_WINDOWEVENT_HIT_TEST. This lets windows know when they are dropping a mouse event because their hit test reported something other than SDL_HITTEST_NORMAL. It lets them know exactly where in the event queue this happened. This patch is based on work in Unreal Engine 4's fork of SDL, compliments of Epic Games. --- include/SDL_video.h | 4 ++-- src/video/cocoa/SDL_cocoawindow.m | 3 +++ src/video/windows/SDL_windowsevents.c | 20 +++++++++++--------- src/video/x11/SDL_x11events.c | 1 + 4 files changed, 17 insertions(+), 11 deletions(-) diff --git a/include/SDL_video.h b/include/SDL_video.h index 7488b3a05cf6c..8e9c1002b90df 100644 --- a/include/SDL_video.h +++ b/include/SDL_video.h @@ -160,8 +160,8 @@ typedef enum SDL_WINDOWEVENT_LEAVE, /**< Window has lost mouse focus */ SDL_WINDOWEVENT_FOCUS_GAINED, /**< Window has gained keyboard focus */ SDL_WINDOWEVENT_FOCUS_LOST, /**< Window has lost keyboard focus */ - SDL_WINDOWEVENT_CLOSE /**< The window manager requests that the - window be closed */ + SDL_WINDOWEVENT_CLOSE, /**< The window manager requests that the window be closed */ + SDL_WINDOWEVENT_HIT_TEST /** Window had a hit test that wasn't SDL_HITTEST_NORMAL. */ } SDL_WindowEventID; /** diff --git a/src/video/cocoa/SDL_cocoawindow.m b/src/video/cocoa/SDL_cocoawindow.m index 16b617b326185..0256525ed3e3b 100644 --- a/src/video/cocoa/SDL_cocoawindow.m +++ b/src/video/cocoa/SDL_cocoawindow.m @@ -852,6 +852,7 @@ - (void)mouseDown:(NSEvent *)theEvent } if ([self processHitTest:theEvent]) { + SDL_SendWindowEvent(_data->window, SDL_WINDOWEVENT_HIT_TEST, 0, 0); return; /* dragging, drop event. */ } @@ -894,6 +895,7 @@ - (void)mouseUp:(NSEvent *)theEvent int button; if ([self processHitTest:theEvent]) { + SDL_SendWindowEvent(_data->window, SDL_WINDOWEVENT_HIT_TEST, 0, 0); return; /* stopped dragging, drop event. */ } @@ -937,6 +939,7 @@ - (void)mouseMoved:(NSEvent *)theEvent int x, y; if ([self processHitTest:theEvent]) { + SDL_SendWindowEvent(window, SDL_WINDOWEVENT_HIT_TEST, 0, 0); return; /* dragging, drop event. */ } diff --git a/src/video/windows/SDL_windowsevents.c b/src/video/windows/SDL_windowsevents.c index 3fc99375afcab..ee08de1be1a1a 100644 --- a/src/video/windows/SDL_windowsevents.c +++ b/src/video/windows/SDL_windowsevents.c @@ -928,15 +928,17 @@ WIN_WindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) const SDL_Point point = { (int) winpoint.x, (int) winpoint.y }; const SDL_HitTestResult rc = window->hit_test(window, &point, window->hit_test_data); switch (rc) { - case SDL_HITTEST_DRAGGABLE: return HTCAPTION; - case SDL_HITTEST_RESIZE_TOPLEFT: return HTTOPLEFT; - case SDL_HITTEST_RESIZE_TOP: return HTTOP; - case SDL_HITTEST_RESIZE_TOPRIGHT: return HTTOPRIGHT; - case SDL_HITTEST_RESIZE_RIGHT: return HTRIGHT; - case SDL_HITTEST_RESIZE_BOTTOMRIGHT: return HTBOTTOMRIGHT; - case SDL_HITTEST_RESIZE_BOTTOM: return HTBOTTOM; - case SDL_HITTEST_RESIZE_BOTTOMLEFT: return HTBOTTOMLEFT; - case SDL_HITTEST_RESIZE_LEFT: return HTLEFT; + #define POST_HIT_TEST(ret) { SDL_SendWindowEvent(data->window, SDL_WINDOWEVENT_HIT_TEST, 0, 0); return ret; } + case SDL_HITTEST_DRAGGABLE: POST_HIT_TEST(HTCAPTION); + case SDL_HITTEST_RESIZE_TOPLEFT: POST_HIT_TEST(HTTOPLEFT); + case SDL_HITTEST_RESIZE_TOP: POST_HIT_TEST(HTTOP); + case SDL_HITTEST_RESIZE_TOPRIGHT: POST_HIT_TEST(HTTOPRIGHT); + case SDL_HITTEST_RESIZE_RIGHT: POST_HIT_TEST(HTRIGHT); + case SDL_HITTEST_RESIZE_BOTTOMRIGHT: POST_HIT_TEST(HTBOTTOMRIGHT); + case SDL_HITTEST_RESIZE_BOTTOM: POST_HIT_TEST(HTBOTTOM); + case SDL_HITTEST_RESIZE_BOTTOMLEFT: POST_HIT_TEST(HTBOTTOMLEFT); + case SDL_HITTEST_RESIZE_LEFT: POST_HIT_TEST(HTLEFT); + #undef POST_HIT_TEST case SDL_HITTEST_NORMAL: return HTCLIENT; } } diff --git a/src/video/x11/SDL_x11events.c b/src/video/x11/SDL_x11events.c index 312dd087be8a3..6a5ea1115af65 100644 --- a/src/video/x11/SDL_x11events.c +++ b/src/video/x11/SDL_x11events.c @@ -1011,6 +1011,7 @@ X11_DispatchEvent(_THIS) int button = xevent.xbutton.button; if(button == Button1) { if (ProcessHitTest(_this, data, &xevent)) { + SDL_SendWindowEvent(data->window, SDL_WINDOWEVENT_HIT_TEST, 0, 0); break; /* don't pass this event on to app. */ } }