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:
Malkierian
2025-10-15 18:06:25 -04:00
committed by GitHub
parent 76267b6bac
commit 9abb6790d3
7 changed files with 30 additions and 21 deletions
+1 -1
View File
@@ -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;
+1 -1
View File
@@ -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;
+1 -1
View File
@@ -206,7 +206,7 @@ void Fast3dWindow::HandleEvents() {
}
void Fast3dWindow::SetCursorVisibility(bool visible) {
mWindowManagerApi->SetCursorVisability(visible);
mWindowManagerApi->SetCursorVisibility(visible);
}
uint32_t Fast3dWindow::GetWidth() {
+3 -3
View File
@@ -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();
}
+1 -1
View File
@@ -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
View File
@@ -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--;
}
}