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.
This commit is contained in:
Ryan C. Gordon 2015-04-21 10:10:59 -04:00
parent d4aedf9951
commit aa4952fdef
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_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;
/**

View file

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

View file

@ -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. */
}
}