|
@@ -27,17 +27,12 @@
|
|
|
# include <emscripten.h>
|
|
|
# include <emscripten/html5.h>
|
|
|
#endif
|
|
|
|
|
|
#include "../safeguards.h"
|
|
|
|
|
|
#ifdef __EMSCRIPTEN__
|
|
|
/** Whether we just had a window-enter event. */
|
|
|
static bool _cursor_new_in_window = false;
|
|
|
#endif
|
|
|
|
|
|
void VideoDriver_SDL_Base::MakeDirty(int left, int top, int width, int height)
|
|
|
{
|
|
|
Rect r = {left, top, left + width, top + height};
|
|
|
this->dirty_rect = BoundingRect(this->dirty_rect, r);
|
|
|
}
|
|
|
|
|
@@ -200,15 +195,15 @@ bool VideoDriver_SDL_Base::CreateMainSur
|
|
|
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
bool VideoDriver_SDL_Base::ClaimMousePointer()
|
|
|
{
|
|
|
/* Emscripten never claims the pointer, so we do not need to change the cursor visibility. */
|
|
|
#ifndef __EMSCRIPTEN__
|
|
|
SDL_ShowCursor(0);
|
|
|
#ifdef __EMSCRIPTEN__
|
|
|
SDL_SetRelativeMouseMode(SDL_TRUE);
|
|
|
#endif
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* This is called to indicate that an edit box has gained focus, text input mode should be enabled.
|
|
@@ -374,33 +369,15 @@ bool VideoDriver_SDL_Base::PollEvent()
|
|
|
SDL_Event ev;
|
|
|
|
|
|
if (!SDL_PollEvent(&ev)) return false;
|
|
|
|
|
|
switch (ev.type) {
|
|
|
case SDL_MOUSEMOTION:
|
|
|
#ifdef __EMSCRIPTEN__
|
|
|
if (_cursor_new_in_window) {
|
|
|
/* The cursor just moved into the window; this means we don't
|
|
|
* know the absolutely position yet to move relative from.
|
|
|
* Before this time, SDL didn't know it either, and this is
|
|
|
* why we postpone it till now. Update the absolute position
|
|
|
* for this once, and work relative after. */
|
|
|
_cursor.pos.x = ev.motion.x;
|
|
|
_cursor.pos.y = ev.motion.y;
|
|
|
_cursor.dirty = true;
|
|
|
|
|
|
_cursor_new_in_window = false;
|
|
|
SDL_SetRelativeMouseMode(SDL_TRUE);
|
|
|
} else {
|
|
|
_cursor.UpdateCursorPositionRelative(ev.motion.xrel, ev.motion.yrel);
|
|
|
}
|
|
|
#else
|
|
|
if (_cursor.UpdateCursorPosition(ev.motion.x, ev.motion.y, true)) {
|
|
|
SDL_WarpMouseInWindow(this->sdl_window, _cursor.pos.x, _cursor.pos.y);
|
|
|
}
|
|
|
#endif
|
|
|
HandleMouseEvents();
|
|
|
break;
|
|
|
|
|
|
case SDL_MOUSEWHEEL:
|
|
|
if (ev.wheel.y > 0) {
|
|
|
_cursor.wheel--;
|
|
@@ -499,15 +476,13 @@ bool VideoDriver_SDL_Base::PollEvent()
|
|
|
int h = std::max(ev.window.data2, 64);
|
|
|
CreateMainSurface(w, h, w != ev.window.data1 || h != ev.window.data2);
|
|
|
} else if (ev.window.event == SDL_WINDOWEVENT_ENTER) {
|
|
|
// mouse entered the window, enable cursor
|
|
|
_cursor.in_window = true;
|
|
|
#ifdef __EMSCRIPTEN__
|
|
|
/* Disable relative mouse mode for the first mouse motion,
|
|
|
* so we can pick up the absolutely position again. */
|
|
|
_cursor_new_in_window = true;
|
|
|
/* Ensure pointer lock will not occur. */
|
|
|
SDL_SetRelativeMouseMode(SDL_FALSE);
|
|
|
#endif
|
|
|
} else if (ev.window.event == SDL_WINDOWEVENT_LEAVE) {
|
|
|
// mouse left the window, undraw cursor
|
|
|
UndrawMouseCursor();
|
|
|
_cursor.in_window = false;
|
|
@@ -522,13 +497,15 @@ bool VideoDriver_SDL_Base::PollEvent()
|
|
|
static const char *InitializeSDL()
|
|
|
{
|
|
|
/* Explicitly disable hardware acceleration. Enabling this causes
|
|
|
* UpdateWindowSurface() to update the window's texture instead of
|
|
|
* its surface. */
|
|
|
SDL_SetHint(SDL_HINT_FRAMEBUFFER_ACCELERATION, "0");
|
|
|
#ifndef __EMSCRIPTEN__
|
|
|
SDL_SetHint(SDL_HINT_MOUSE_RELATIVE_MODE_WARP, "1");
|
|
|
#endif
|
|
|
|
|
|
/* Check if the video-driver is already initialized. */
|
|
|
if (SDL_WasInit(SDL_INIT_VIDEO) != 0) return nullptr;
|
|
|
|
|
|
if (SDL_InitSubSystem(SDL_INIT_VIDEO) < 0) return SDL_GetError();
|
|
|
return nullptr;
|