bool SDLCursor(bool on) { if (on != cursor) { if ((cursor = !cursor)) { if (fullscreen) SDL_SetWindowGrab(_sdl_window, SDL_FALSE); SDL_ShowCursor(1); SDL_SetRelativeMouseMode(SDL_FALSE); } else { if (fullscreen) SDL_SetWindowGrab(_sdl_window, SDL_TRUE); SDL_ShowCursor(0); SDL_SetRelativeMouseMode(SDL_TRUE); clearfingers(false); } } return cursor; }
bool SDLCursor(bool on) { if (on != cursor) { cursor = !cursor; if (cursor) { if (fullscreen) SDL_SetWindowGrab(_sdl_window, SDL_FALSE); SDL_ShowCursor(1); SDL_SetRelativeMouseMode(SDL_FALSE); } else { if (fullscreen) SDL_SetWindowGrab(_sdl_window, SDL_TRUE); SDL_ShowCursor(0); #if defined(_WIN32) || defined(__APPLE__) // This is broken on Linux, gives bogus xrel/yrel in SDL_MOUSEMOVE SDL_SetRelativeMouseMode(SDL_TRUE); #endif clearfingers(false); } } return cursor; }
bool SDLFrame(int2 &screensize) { for (;;) { int millis = SDL_GetTicks(); frametime = millis-lastmillis; if (frametime < 10) { SDL_Delay(1); continue; } lastmillis = millis; frames++; break; } for (auto &it : keymap) it.second.FrameReset(); mousewheeldelta = 0; clearfingers(true); if (minimized) SDL_Delay(10); // save CPU/battery else SDL_GL_SwapWindow(_sdl_window); //SDL_Delay(1000); if (!cursor) clearfingers(false); bool closebutton = false; SDL_Event event; while(SDL_PollEvent(&event)) switch(event.type) { case SDL_QUIT: closebutton = true; break; case SDL_KEYDOWN: case SDL_KEYUP: { const char *kn = SDL_GetKeyName(event.key.keysym.sym); if (!*kn) break; string name = kn; std::transform(name.begin(), name.end(), name.begin(), ::tolower); updatebutton(name, event.key.state==SDL_PRESSED, 0); break; } // This #ifdef is needed, because on e.g. OS X we'd otherwise get SDL_FINGERDOWN in addition to SDL_MOUSEBUTTONDOWN on laptop touch pads. #ifdef PLATFORM_MOBILE // FIXME: if we're in cursor==0 mode, only update delta, not position case SDL_FINGERDOWN: { int i = updatedragpos(event.tfinger, event.type, screensize); updatemousebutton(1, i, true); break; } case SDL_FINGERUP: { int i = findfinger(event.tfinger.fingerId, true); updatemousebutton(1, i, false); break; } case SDL_FINGERMOTION: { updatedragpos(event.tfinger, event.type, screensize); break; } #else case SDL_MOUSEBUTTONDOWN: case SDL_MOUSEBUTTONUP: { updatemousebutton(event.button.button, 0, event.button.state != 0); if (cursor) { fingers[0].mousepos = int2(event.button.x, event.button.y) * screenscalefactor; } break; } case SDL_MOUSEMOTION: fingers[0].mousedelta += int2(event.motion.xrel, event.motion.yrel); if (cursor) { fingers[0].mousepos = int2(event.motion.x, event.motion.y) * screenscalefactor; } else { //if (skipmousemotion) { skipmousemotion--; break; } //if (event.motion.x == screensize.x / 2 && event.motion.y == screensize.y / 2) break; //auto delta = int3(event.motion.xrel, event.motion.yrel); //fingers[0].mousedelta += delta; //auto delta = int3(event.motion.x, event.motion.y) - screensize / 2; //fingers[0].mousepos -= delta; //SDL_WarpMouseInWindow(_sdl_window, screensize.x / 2, screensize.y / 2); } break; case SDL_MOUSEWHEEL: mousewheeldelta += event.wheel.y; break; #endif case SDL_JOYAXISMOTION: { const int deadzone = 800; // FIXME if (event.jaxis.axis < MAXAXES) { joyaxes[event.jaxis.axis] = abs(event.jaxis.value) > deadzone ? event.jaxis.value / (float)0x8000 : 0; }; break; } case SDL_JOYHATMOTION: break; case SDL_JOYBUTTONDOWN: case SDL_JOYBUTTONUP: { string name = "joy"; name += '0' + (char)event.jbutton.button; updatebutton(name, event.jbutton.state == SDL_PRESSED, 0); break; } case SDL_WINDOWEVENT: switch (event.window.event) { case SDL_WINDOWEVENT_RESIZED: screensize = int2(event.window.data1, event.window.data2); // reload and bind shaders/textures here break; case SDL_WINDOWEVENT_LEAVE: // never gets hit? /* for (int i = 1; i <= 5; i++) updatemousebutton(i, false); */ break; } break; case SDL_WINDOWEVENT_MINIMIZED: //minimized = true; break; case SDL_WINDOWEVENT_MAXIMIZED: case SDL_WINDOWEVENT_RESTORED: /* #ifdef __IOS__ SDL_Delay(10); // IOS crashes in SDL_GL_SwapWindow if we start rendering straight away #endif minimized = false; */ break; } // simulate mouse up events, since SDL won't send any if the mouse leaves the window while down // doesn't work /* for (int i = 1; i <= 5; i++) if (!(SDL_GetMouseState(nullptr, nullptr) & SDL_BUTTON(i))) updatemousebutton(i, false); */ /* if (SDL_GetMouseFocus() != _sdl_window) { int A = 1; } */ return closebutton; }