Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
122 changes: 66 additions & 56 deletions src/sys/sdl3/sdl3_backend.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1038,7 +1038,7 @@ static bool SDL3_MapWindowMouseToRoutedCursor(float windowMouseX, float windowMo
return false;
}

static bool SDL3_UpdateRoutedMouseDelta(float menuMouseX, float menuMouseY, int &dx, int &dy) {
[[maybe_unused]] static bool SDL3_UpdateRoutedMouseDelta(float menuMouseX, float menuMouseY, int &dx, int &dy) {
float previousX = 0.0f;
float previousY = 0.0f;

Expand Down Expand Up @@ -1106,17 +1106,24 @@ static bool SDL3_SetRoutedCursorFromWindowPosition(float windowMouseX, float win
return false;
}

idUserInterface *activeGui = SDL3_GetActiveMenuGui();
if (activeGui != NULL) {
activeGui->SetCursor(cursorX, cursorY);
}
if (console != NULL && console->Active()) {
console->SetMousePosition(cursorX, cursorY);
} else {
idUserInterface *activeGui = SDL3_GetActiveMenuGui();
if (activeGui != NULL) {
activeGui->SetCursor(cursorX, cursorY);
}
}

s_menuMouseInsideWindow = true;
return SDL3_UpdateRoutedMouseDelta(cursorX, cursorY, dx, dy);
s_menuMouseX = cursorX;
s_menuMouseY = cursorY;
s_haveMenuMousePosition = true;
s_menuMouseRemainderX = 0.0f;
s_menuMouseRemainderY = 0.0f;
s_haveAbsoluteMousePosition = false;
dx = 0;
dy = 0;
return true;
}

static void SDL3_SyncSystemMouseToActiveCursor(void) {
Expand All @@ -1128,66 +1135,55 @@ static void SDL3_SyncSystemMouseToActiveCursor(void) {
return;
}

if (console != NULL && console->Active()) {
float windowMouseX = 0.0f;
float windowMouseY = 0.0f;
(void)SDL_GetMouseState(&windowMouseX, &windowMouseY);

float cursorX = 0.0f;
float cursorY = 0.0f;
if (!SDL3_MapWindowMouseToConsoleCursor(windowMouseX, windowMouseY, cursorX, cursorY)) {
return;
}

console->SetMousePosition(cursorX, cursorY);
s_ignoreNextMenuWarpMotion = false;
s_menuMouseInsideWindow = true;
SDL3_SetMenuMouseTrackingPosition(cursorX, cursorY);
return;
}
float windowMouseX = 0.0f;
float windowMouseY = 0.0f;
(void)SDL_GetMouseState(&windowMouseX, &windowMouseY);

idUserInterface *activeGui = SDL3_GetActiveMenuGui();
if (activeGui != NULL) {
#if defined(OPENQ4_SDL3_POSIX_HOST)
float windowMouseX = 0.0f;
float windowMouseY = 0.0f;
(void)SDL_GetMouseState(&windowMouseX, &windowMouseY);

float cursorX = 0.0f;
float cursorY = 0.0f;
if (!SDL3_MapWindowMouseToGuiCursor(windowMouseX, windowMouseY, cursorX, cursorY)) {
return;
if (SDL3_MapWindowMouseToGuiCursor(windowMouseX, windowMouseY, cursorX, cursorY)) {
activeGui->SetCursor(cursorX, cursorY);
s_ignoreNextMenuWarpMotion = false;
s_menuMouseInsideWindow = true;
SDL3_SetMenuMouseTrackingPosition(cursorX, cursorY);
}

activeGui->SetCursor(cursorX, cursorY);
s_ignoreNextMenuWarpMotion = false;
s_menuMouseInsideWindow = true;
SDL3_SetMenuMouseTrackingPosition(cursorX, cursorY);
return;
#else
sdl3GuiMouseTransform_t transform;
if (!SDL3_BuildGuiMouseTransform(transform)) {
return;
if (SDL3_BuildGuiMouseTransform(transform)) {
const float cursorX = activeGui->CursorX();
const float cursorY = activeGui->CursorY();
const float drawX = (cursorX * transform.xScale) + transform.xOffset;
const float drawY = (cursorY * transform.yScale) + transform.yOffset;
const float pixelMouseX = transform.drawAreaX + drawX * (transform.drawAreaWidth / transform.guiWidth);
const float pixelMouseY = transform.drawAreaY + drawY * (transform.drawAreaHeight / transform.guiHeight);
const float windowMouseX = pixelMouseX * transform.pixelToWindowX;
const float windowMouseY = pixelMouseY * transform.pixelToWindowY;

SDL_WarpMouseInWindow(s_sdlWindow, windowMouseX, windowMouseY);
s_ignoreNextMenuWarpMotion = true;
s_menuWarpWindowX = windowMouseX;
s_menuWarpWindowY = windowMouseY;
s_menuMouseInsideWindow = true;
SDL3_SetMenuMouseTrackingPosition(cursorX, cursorY);
}

const float cursorX = activeGui->CursorX();
const float cursorY = activeGui->CursorY();
const float drawX = (cursorX * transform.xScale) + transform.xOffset;
const float drawY = (cursorY * transform.yScale) + transform.yOffset;
const float pixelMouseX = transform.drawAreaX + drawX * (transform.drawAreaWidth / transform.guiWidth);
const float pixelMouseY = transform.drawAreaY + drawY * (transform.drawAreaHeight / transform.guiHeight);
const float windowMouseX = pixelMouseX * transform.pixelToWindowX;
const float windowMouseY = pixelMouseY * transform.pixelToWindowY;

SDL_WarpMouseInWindow(s_sdlWindow, windowMouseX, windowMouseY);
s_ignoreNextMenuWarpMotion = true;
s_menuWarpWindowX = windowMouseX;
s_menuWarpWindowY = windowMouseY;
s_menuMouseInsideWindow = true;
SDL3_SetMenuMouseTrackingPosition(cursorX, cursorY);
return;
#endif
}

if (console != NULL && console->Active()) {
float cursorX = 0.0f;
float cursorY = 0.0f;
if (SDL3_MapWindowMouseToConsoleCursor(windowMouseX, windowMouseY, cursorX, cursorY)) {
console->SetMousePosition(cursorX, cursorY);
s_ignoreNextMenuWarpMotion = false;
s_menuMouseInsideWindow = true;
if (activeGui == NULL) {
SDL3_SetMenuMouseTrackingPosition(cursorX, cursorY);
}
}
}
}

static int SDL3_ClampJoystickValue(int value) {
Expand Down Expand Up @@ -4783,7 +4779,21 @@ bool Sys_SDL_PumpEvents(void) {
}

if (SDL3_MapWindowMouseToRoutedCursor(event.motion.x, event.motion.y, menuMouseX, menuMouseY)) {
(void)SDL3_UpdateRoutedMouseDelta(menuMouseX, menuMouseY, dx, dy);
idUserInterface *activeGui = SDL3_GetActiveMenuGui();
if ( activeGui ) {
activeGui->SetCursor( menuMouseX, menuMouseY );
}
if ( console != NULL && console->Active() ) {
console->SetMousePosition( menuMouseX, menuMouseY );
}
s_menuMouseX = menuMouseX;
s_menuMouseY = menuMouseY;
s_haveMenuMousePosition = true;
s_menuMouseRemainderX = 0.0f;
s_menuMouseRemainderY = 0.0f;
s_haveAbsoluteMousePosition = false;
s_menuMouseInsideWindow = true;
Sys_QueEvent( eventTime, SE_MOUSE, 0, 0, 0, NULL );
} else {
SDL3_ResetMenuMouseTracking();
}
Expand Down
28 changes: 26 additions & 2 deletions src/ui/DeviceContext.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,8 @@ If you have questions concerning this license or the applicable additional terms
#include "UserInterface.h"
#include "../framework/KeyInput.h"

extern idCVar ui_aspectCorrection;

idVec4 idDeviceContext::colorPurple;
idVec4 idDeviceContext::colorOrange;
idVec4 idDeviceContext::colorYellow;
Expand Down Expand Up @@ -2525,11 +2527,33 @@ void idDeviceContext::CalcVirtualScaleOffset( float width, float height, float &
outYOffset = transform.yOffset;
}

void idDeviceContext::GetVirtualScreenExpansion( float width, float height, float &xExpand, float &yExpand ) const {
bool idDeviceContext::GetVirtualScreenExpansion( float width, float height, float &xExpand, float &yExpand, bool forceAspectCorrect ) const {
xExpand = 0.0f;
yExpand = 0.0f;

const bool effectiveAspectCorrect = ( forceAspectCorrect || aspectCorrect ) && ui_aspectCorrection.GetBool();
if ( !effectiveAspectCorrect ) {
return false;
}

float windowWidth = 0.0f;
float windowHeight = 0.0f;
openQ4_GetCurrentViewportSize( windowWidth, windowHeight );
openQ4_CalcVirtualScreenExpansion( width, height, windowWidth, windowHeight, aspectCorrect, xExpand, yExpand );
openQ4_CalcVirtualScreenExpansion( width, height, windowWidth, windowHeight, effectiveAspectCorrect, xExpand, yExpand );
return true;
}

bool idDeviceContext::GetVirtualScreenExpansion( float *xExpand, float *yExpand, bool forceAspectCorrect ) const {
float localX = 0.0f;
float localY = 0.0f;
const bool active = GetVirtualScreenExpansion( static_cast<float>( VIRTUAL_WIDTH ), static_cast<float>( VIRTUAL_HEIGHT ), localX, localY, forceAspectCorrect );
if ( xExpand != NULL ) {
*xExpand = localX;
}
if ( yExpand != NULL ) {
*yExpand = localY;
}
return active;
}

void idDeviceContext::GetCinematic16x9Bars( float width, float height, idRectangle &topBar, idRectangle &bottomBar, idRectangle &leftBar, idRectangle &rightBar, idRectangle &visibleArea ) const {
Expand Down
3 changes: 2 additions & 1 deletion src/ui/DeviceContext.h
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,8 @@ class idDeviceContext {
void SetSize(float width, float height);
void SetAspectCorrection( bool enabled );
float GetCanvasAspect() const;
void GetVirtualScreenExpansion( float width, float height, float &xExpand, float &yExpand ) const;
bool GetVirtualScreenExpansion( float width, float height, float &xExpand, float &yExpand, bool forceAspectCorrect = false ) const;
bool GetVirtualScreenExpansion( float *xExpand, float *yExpand, bool forceAspectCorrect = false ) const;
void GetCinematic16x9Bars( float width, float height, idRectangle &topBar, idRectangle &bottomBar, idRectangle &leftBar, idRectangle &rightBar, idRectangle &visibleArea ) const;

const idMaterial *GetScrollBarImage(int index);
Expand Down
10 changes: 7 additions & 3 deletions src/ui/UserInterface.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -465,8 +465,12 @@ const char *idUserInterfaceLocal::HandleEvent( const sysEvent_t *event, int _tim
}

if ( event->evType == SE_MOUSE ) {
SetCursor( cursorX + static_cast<float>( event->evValue ),
cursorY + static_cast<float>( event->evValue2 ) );
if ( event->evValue != 0 || event->evValue2 != 0 ) {
SetCursor( cursorX + static_cast<float>( event->evValue ),
cursorY + static_cast<float>( event->evValue2 ) );
} else {
ClampCursor();
}
}

if ( desktop ) {
Expand Down Expand Up @@ -1056,7 +1060,7 @@ void idUserInterfaceLocal::ClampCursor( void ) {
if ( ( desktop->GetFlags() & WIN_MENUGUI ) && ui_aspectCorrection.GetBool() ) {
float xExpand = 0.0f;
float yExpand = 0.0f;
uiManagerLocal.dc.GetVirtualScreenExpansion( maxX, maxY, xExpand, yExpand );
uiManagerLocal.dc.GetVirtualScreenExpansion( &xExpand, &yExpand, ui_aspectCorrection.GetBool() );
if ( std::isfinite( xExpand ) && xExpand >= 0.0f ) {
minX -= xExpand;
maxX += xExpand;
Expand Down