mirror of
https://github.com/izzy2lost/libultraship.git
synced 2026-06-19 01:16:13 -07:00
Cursor Visibility Tweaks (#944)
* Fixed typo (ForceCursorVisability -> ForceCursorVisibility). Tweaked the cursor visibility tick to only call SetCursorVisibility(false) once per visibility cycle. * Fix SetCursorVisibility in DXGI to not need looping. * Undo previous, and add better presentation for `CursorTimeoutTick()`.
This commit is contained in:
@@ -23,7 +23,7 @@ class GfxWindowBackendDXGI final : public GfxWindowBackend {
|
||||
void SetFullscreenChangedCallback(void (*onnFullscreenChanged)(bool is_now_fullscreen)) override;
|
||||
void SetFullscreen(bool fullscreen) override;
|
||||
void GetActiveWindowRefreshRate(uint32_t* refreshRate) override;
|
||||
void SetCursorVisability(bool visability) override;
|
||||
void SetCursorVisibility(bool visability) override;
|
||||
void SetMousePos(int32_t posX, int32_t posY) override;
|
||||
void GetMousePos(int32_t* x, int32_t* y) override;
|
||||
void GetMouseDelta(int32_t* x, int32_t* y) override;
|
||||
|
||||
@@ -16,7 +16,7 @@ class GfxWindowBackendSDL2 final : public GfxWindowBackend {
|
||||
void SetFullscreenChangedCallback(void (*onFullscreenChanged)(bool is_now_fullscreen)) override;
|
||||
void SetFullscreen(bool fullscreen) override;
|
||||
void GetActiveWindowRefreshRate(uint32_t* refreshRate) override;
|
||||
void SetCursorVisability(bool visability) override;
|
||||
void SetCursorVisibility(bool visability) override;
|
||||
void SetMousePos(int32_t posX, int32_t posY) override;
|
||||
void GetMousePos(int32_t* x, int32_t* y) override;
|
||||
void GetMouseDelta(int32_t* x, int32_t* y) override;
|
||||
|
||||
@@ -15,7 +15,7 @@ class GfxWindowBackend {
|
||||
virtual void SetFullscreenChangedCallback(void (*mOnFullscreenChanged)(bool is_now_fullscreen)) = 0;
|
||||
virtual void SetFullscreen(bool fullscreen) = 0;
|
||||
virtual void GetActiveWindowRefreshRate(uint32_t* refreshRate) = 0;
|
||||
virtual void SetCursorVisability(bool visability) = 0;
|
||||
virtual void SetCursorVisibility(bool visability) = 0;
|
||||
virtual void SetMousePos(int32_t posX, int32_t posY) = 0;
|
||||
virtual void GetMousePos(int32_t* x, int32_t* y) = 0;
|
||||
virtual void GetMouseDelta(int32_t* x, int32_t* y) = 0;
|
||||
|
||||
@@ -206,7 +206,7 @@ void Fast3dWindow::HandleEvents() {
|
||||
}
|
||||
|
||||
void Fast3dWindow::SetCursorVisibility(bool visible) {
|
||||
mWindowManagerApi->SetCursorVisability(visible);
|
||||
mWindowManagerApi->SetCursorVisibility(visible);
|
||||
}
|
||||
|
||||
uint32_t Fast3dWindow::GetWidth() {
|
||||
|
||||
@@ -606,7 +606,7 @@ void GfxWindowBackendDXGI::SetFullscreenChangedCallback(void (*mOnFullscreenChan
|
||||
mOnFullscreenChanged = mOnFullscreenChanged;
|
||||
}
|
||||
|
||||
void GfxWindowBackendDXGI::SetCursorVisability(bool visible) {
|
||||
void GfxWindowBackendDXGI::SetCursorVisibility(bool visible) {
|
||||
// https://learn.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-showcursor
|
||||
// https://devblogs.microsoft.com/oldnewthing/20091217-00/?p=15643
|
||||
// ShowCursor uses a counter, not a boolean value, and increments or decrements that value when called
|
||||
@@ -678,12 +678,12 @@ void GfxWindowBackendDXGI::SetMouseCapture(bool capture) {
|
||||
mIsMouseCaptured = capture;
|
||||
if (capture) {
|
||||
ApplyMouseCaptureClip();
|
||||
SetCursorVisability(false);
|
||||
SetCursorVisibility(false);
|
||||
SetCapture(h_wnd);
|
||||
mHasMousePosition = false;
|
||||
} else {
|
||||
ClipCursor(nullptr);
|
||||
SetCursorVisability(true);
|
||||
SetCursorVisibility(true);
|
||||
ReleaseCapture();
|
||||
UpdateMousePrevPos();
|
||||
}
|
||||
|
||||
@@ -443,7 +443,7 @@ void GfxWindowBackendSDL2::SetFullscreen(bool enable) {
|
||||
SetFullscreenImpl(enable, true);
|
||||
}
|
||||
|
||||
void GfxWindowBackendSDL2::SetCursorVisability(bool visible) {
|
||||
void GfxWindowBackendSDL2::SetCursorVisibility(bool visible) {
|
||||
if (visible) {
|
||||
SDL_ShowCursor(SDL_ENABLE);
|
||||
} else {
|
||||
|
||||
+22
-13
@@ -607,19 +607,28 @@ void Gui::HandleMouseCapture() {
|
||||
|
||||
void Gui::CursorTimeoutTick() {
|
||||
auto wnd = std::dynamic_pointer_cast<Fast::Fast3dWindow>(Context::GetInstance()->GetWindow());
|
||||
if (!wnd->ShouldForceCursorVisibility()) {
|
||||
Ship::Coords mousePos = wnd->GetMousePos();
|
||||
if ((!wnd->IsMouseCaptured()) &&
|
||||
(abs(mousePos.x - mPrevMousePos.x) > 0 || abs(mousePos.y - mPrevMousePos.y) > 0)) {
|
||||
wnd->SetCursorVisibility(true);
|
||||
mCursorVisibleTicks = mCursorVisibleSeconds * wnd->GetTargetFps();
|
||||
}
|
||||
if (mCursorVisibleTicks > 0) {
|
||||
mCursorVisibleTicks--;
|
||||
} else {
|
||||
wnd->SetCursorVisibility(false);
|
||||
}
|
||||
mPrevMousePos = mousePos;
|
||||
if (wnd->ShouldForceCursorVisibility() || wnd->IsMouseCaptured()) {
|
||||
return;
|
||||
}
|
||||
|
||||
Ship::Coords mousePos = wnd->GetMousePos();
|
||||
bool mouseMoved = abs(mousePos.x - mPrevMousePos.x) > 0 || abs(mousePos.y - mPrevMousePos.y) > 0;
|
||||
mPrevMousePos = mousePos;
|
||||
|
||||
if (mouseMoved) {
|
||||
wnd->SetCursorVisibility(true);
|
||||
mCursorVisibleTicks = mCursorVisibleSeconds * wnd->GetTargetFps();
|
||||
return;
|
||||
}
|
||||
|
||||
if (mCursorVisibleTicks == 0) {
|
||||
wnd->SetCursorVisibility(false);
|
||||
mCursorVisibleTicks = -1;
|
||||
return;
|
||||
}
|
||||
|
||||
if (mCursorVisibleTicks > 0) {
|
||||
mCursorVisibleTicks--;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user