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.

--HG--
extra : histedit_source : 28a87f5e035dcf9b84e2a343c36e55795e2d4dcc
This commit is contained in:
Ryan C. Gordon 2015-04-21 10:10:59 -04:00
parent cdd64f2020
commit 8c55bb48fe
4 changed files with 17 additions and 11 deletions

View file

@ -160,8 +160,8 @@ typedef enum
SDL_WINDOWEVENT_LEAVE, /**< Window has lost mouse focus */ SDL_WINDOWEVENT_LEAVE, /**< Window has lost mouse focus */
SDL_WINDOWEVENT_FOCUS_GAINED, /**< Window has gained keyboard focus */ SDL_WINDOWEVENT_FOCUS_GAINED, /**< Window has gained keyboard focus */
SDL_WINDOWEVENT_FOCUS_LOST, /**< Window has lost keyboard focus */ SDL_WINDOWEVENT_FOCUS_LOST, /**< Window has lost keyboard focus */
SDL_WINDOWEVENT_CLOSE /**< The window manager requests that the SDL_WINDOWEVENT_CLOSE, /**< The window manager requests that the window be closed */
window be closed */ SDL_WINDOWEVENT_HIT_TEST /** Window had a hit test that wasn't SDL_HITTEST_NORMAL. */
} SDL_WindowEventID; } SDL_WindowEventID;
/** /**

View file

@ -852,6 +852,7 @@ SetWindowStyle(SDL_Window * window, unsigned int style)
} }
if ([self processHitTest:theEvent]) { if ([self processHitTest:theEvent]) {
SDL_SendWindowEvent(_data->window, SDL_WINDOWEVENT_HIT_TEST, 0, 0);
return; /* dragging, drop event. */ return; /* dragging, drop event. */
} }
@ -894,6 +895,7 @@ SetWindowStyle(SDL_Window * window, unsigned int style)
int button; int button;
if ([self processHitTest:theEvent]) { if ([self processHitTest:theEvent]) {
SDL_SendWindowEvent(_data->window, SDL_WINDOWEVENT_HIT_TEST, 0, 0);
return; /* stopped dragging, drop event. */ return; /* stopped dragging, drop event. */
} }
@ -937,6 +939,7 @@ SetWindowStyle(SDL_Window * window, unsigned int style)
int x, y; int x, y;
if ([self processHitTest:theEvent]) { if ([self processHitTest:theEvent]) {
SDL_SendWindowEvent(window, SDL_WINDOWEVENT_HIT_TEST, 0, 0);
return; /* dragging, drop event. */ return; /* dragging, drop event. */
} }

View file

@ -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_Point point = { (int) winpoint.x, (int) winpoint.y };
const SDL_HitTestResult rc = window->hit_test(window, &point, window->hit_test_data); const SDL_HitTestResult rc = window->hit_test(window, &point, window->hit_test_data);
switch (rc) { switch (rc) {
case SDL_HITTEST_DRAGGABLE: return HTCAPTION; #define POST_HIT_TEST(ret) { SDL_SendWindowEvent(data->window, SDL_WINDOWEVENT_HIT_TEST, 0, 0); return ret; }
case SDL_HITTEST_RESIZE_TOPLEFT: return HTTOPLEFT; case SDL_HITTEST_DRAGGABLE: POST_HIT_TEST(HTCAPTION);
case SDL_HITTEST_RESIZE_TOP: return HTTOP; case SDL_HITTEST_RESIZE_TOPLEFT: POST_HIT_TEST(HTTOPLEFT);
case SDL_HITTEST_RESIZE_TOPRIGHT: return HTTOPRIGHT; case SDL_HITTEST_RESIZE_TOP: POST_HIT_TEST(HTTOP);
case SDL_HITTEST_RESIZE_RIGHT: return HTRIGHT; case SDL_HITTEST_RESIZE_TOPRIGHT: POST_HIT_TEST(HTTOPRIGHT);
case SDL_HITTEST_RESIZE_BOTTOMRIGHT: return HTBOTTOMRIGHT; case SDL_HITTEST_RESIZE_RIGHT: POST_HIT_TEST(HTRIGHT);
case SDL_HITTEST_RESIZE_BOTTOM: return HTBOTTOM; case SDL_HITTEST_RESIZE_BOTTOMRIGHT: POST_HIT_TEST(HTBOTTOMRIGHT);
case SDL_HITTEST_RESIZE_BOTTOMLEFT: return HTBOTTOMLEFT; case SDL_HITTEST_RESIZE_BOTTOM: POST_HIT_TEST(HTBOTTOM);
case SDL_HITTEST_RESIZE_LEFT: return HTLEFT; 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; case SDL_HITTEST_NORMAL: return HTCLIENT;
} }
} }

View file

@ -1011,6 +1011,7 @@ X11_DispatchEvent(_THIS)
int button = xevent.xbutton.button; int button = xevent.xbutton.button;
if(button == Button1) { if(button == Button1) {
if (ProcessHitTest(_this, data, &xevent)) { if (ProcessHitTest(_this, data, &xevent)) {
SDL_SendWindowEvent(data->window, SDL_WINDOWEVENT_HIT_TEST, 0, 0);
break; /* don't pass this event on to app. */ break; /* don't pass this event on to app. */
} }
} }