Skip to content

Mouse cursor confined and shifting area when stream (4K) exceeds native (1440p) with 200% scaling #137

@WilliamFriconneau

Description

@WilliamFriconneau

What happened?

Description:
When using OpenNow on a 1440p monitor with a 200% scaling factor (HiDPI), the cursor becomes confined to a restricted rectangular zone that is smaller than the window. This happens specifically when the stream resolution is set to 4K (3840x2160) while the monitor is 1440p.

Key Findings:

Constraint area shift: The boundary of the cursor's movement is not static; it shifts its position within the window depending on which side of the screen is clicked first.

Scaling conflict: With 200% scaling active on Gnome/Niri, the 4K stream seems to miscalculate the pointer constraints relative to the 1440p physical display.

Visuals: The cursor appears very small, suggesting the application is rendering the cursor at 4K scale without accounting for the compositor's downscaling to 1440p.

Environment:

OS: CachyOS (Wayland)

Compositors: Gnome and Niri (Consistent behavior on both)

Display: 1440p at 120Hz (System preference)

Scaling: 200%

Stream settings: 4K at 240Hz

App state: Fullscreen

Steps to reproduce:

Set system scaling to 200% on a 1800p monitor.

Launch OpenNow in fullscreen with 4K or more stream settings.

Start BF6 / Silksong but probably any other games .

Observe the cursor being trapped in a sub-rectangle of the screen.

Operating System

macOS

GeForce NOW Tier

Free

Logs (required)

(I had trouble rejoining a session and had to wait for it to be killed before restarting btw)

OpenNOW Logs Export
Generated: 2026-02-26T22:25:45.847Z
Source: main
Total Entries: 82
============================================================

2026-02-26T22:23:31.980Z   LOG [main] Resolved membership tier: ULTIMATE
2026-02-26T22:23:32.072Z   LOG [Main] Permission check: media from 
2026-02-26T22:23:32.072Z   LOG [Main] Permission check: media from 
2026-02-26T22:23:32.072Z   LOG [Main] Permission check: web-app-installation from 
2026-02-26T22:23:32.072Z   LOG [Main] Permission check: geolocation from 
2026-02-26T22:23:32.458Z   LOG [main] Loaded 14 providers
2026-02-26T22:23:32.526Z   LOG [main] Resolved membership tier: ULTIMATE
2026-02-26T22:23:36.265Z ERROR [main] Error occurred in handler for 'gfn:claim-session': {"httpStatus":400,"statusCode":0,"statusDescription":"UNKNOWN 8A8C0000","unifiedErrorCode":0,"sessionErrorCode":1,"gfnErrorCode":0,"title":"Error","description":"An error occurred (HTTP 400)."}
2026-02-26T22:23:43.692Z ERROR [main] Error occurred in handler for 'gfn:claim-session': {"httpStatus":400,"statusCode":0,"statusDescription":"UNKNOWN 8A8C0000","unifiedErrorCode":0,"sessionErrorCode":1,"gfnErrorCode":0,"title":"Error","description":"An error occurred (HTTP 400)."}
2026-02-26T22:23:47.526Z ERROR [main] Error occurred in handler for 'gfn:claim-session': {"httpStatus":400,"statusCode":0,"statusDescription":"UNKNOWN 8A8C0000","unifiedErrorCode":0,"sessionErrorCode":1,"gfnErrorCode":0,"title":"Error","description":"An error occurred (HTTP 400)."}
2026-02-26T22:23:47.880Z ERROR [main] Error occurred in handler for 'gfn:create-session': {"httpStatus":403,"statusCode":11,"statusDescription":"SESSION_LIMIT_EXCEEDED_STATUS 41F1C0A5","unifiedErrorCode":1106362533,"sessionErrorCode":1,"gfnErrorCode":3237093643,"title":"Session Limit Exceeded","description":"You have reached your session limit. Another session may already be running on your account."}
2026-02-26T22:23:55.607Z ERROR [main] Error occurred in handler for 'gfn:claim-session': {"httpStatus":400,"statusCode":0,"statusDescription":"UNKNOWN 8A8C0000","unifiedErrorCode":0,"sessionErrorCode":1,"gfnErrorCode":0,"title":"Error","description":"An error occurred (HTTP 400)."}
2026-02-26T22:23:58.441Z ERROR [main] Error occurred in handler for 'gfn:claim-session': {"httpStatus":400,"statusCode":0,"statusDescription":"UNKNOWN 8A8C0000","unifiedErrorCode":0,"sessionErrorCode":1,"gfnErrorCode":0,"title":"Error","description":"An error occurred (HTTP 400)."}
2026-02-26T22:25:01.253Z   LOG [CloudMatch] resolveMediaConnectionInfo: usage=14 candidate: ip=np-par-07.cloudmatchbeta.nvidiagrid.net, port=48322 (serverIp fallback=np-par-07.cloudmatchbeta.nvidiagrid.net)
2026-02-26T22:25:01.253Z   LOG [CloudMatch] toSessionInfo: status=1, queuePosition=n/a, connectionInfo=2 entries, serverIp=np-par-07.cloudmatchbeta.nvidiagrid.net, signalingServer=np-par-07.cloudmatchbeta.nvidiagrid.net:443, signalingUrl=wss://np-par-07.cloudmatchbeta.nvidiagrid.net:443/nvst/
2026-02-26T22:25:01.253Z   LOG [CloudMatch] conn: usage=14 ip=null port=322 resourcePath=rtsps://.cloudmatchbeta.nvidiagrid.net:322
2026-02-26T22:25:01.253Z   LOG [CloudMatch] conn: usage=14 ip=null port=48322 resourcePath=rtsps://.cloudmatchbeta.nvidiagrid.net:48322
2026-02-26T22:25:03.284Z   LOG [CloudMatch] resolveMediaConnectionInfo: usage=14 candidate: ip=[Redacted for privacy].net, port=48322 (serverIp fallback=[Redacted for privacy].net)
2026-02-26T22:25:03.284Z   LOG [CloudMatch] toSessionInfo: status=1, queuePosition=n/a, connectionInfo=2 entries, serverIp=[Redacted for privacy].net, signalingServer=[Redacted for privacy].net:443, signalingUrl=wss://[Redacted for privacy].net:443/nvst/
2026-02-26T22:25:03.284Z   LOG [CloudMatch] conn: usage=14 ip=null port=322 resourcePath=rtsps://[Redacted for privacy].net:322
2026-02-26T22:25:03.284Z   LOG [CloudMatch] conn: usage=14 ip=null port=48322 resourcePath=rtsps://[Redacted for privacy].net:48322
2026-02-26T22:25:05.318Z   LOG [CloudMatch] resolveMediaConnectionInfo: usage=14 candidate: ip=[Redacted for privacy].net, port=48322 (serverIp fallback=[Redacted for privacy].net)
2026-02-26T22:25:05.318Z   LOG [CloudMatch] toSessionInfo: status=1, queuePosition=n/a, connectionInfo=2 entries, serverIp=[Redacted for privacy].net, signalingServer=[Redacted for privacy].net:443, signalingUrl=wss://[Redacted for privacy].net:443/nvst/
2026-02-26T22:25:05.318Z   LOG [CloudMatch] conn: usage=14 ip=null port=322 resourcePath=rtsps://[Redacted for privacy].net:322
2026-02-26T22:25:05.318Z   LOG [CloudMatch] conn: usage=14 ip=null port=48322 resourcePath=rtsps://[Redacted for privacy].net:48322
2026-02-26T22:25:07.349Z   LOG [CloudMatch] resolveMediaConnectionInfo: usage=14 candidate: ip=[Redacted for privacy].net, port=48322 (serverIp fallback=[Redacted for privacy].net)
2026-02-26T22:25:07.349Z   LOG [CloudMatch] toSessionInfo: status=1, queuePosition=n/a, connectionInfo=2 entries, serverIp=[Redacted for privacy].net, signalingServer=[Redacted for privacy].net:443, signalingUrl=wss://[Redacted for privacy].net:443/nvst/
2026-02-26T22:25:07.349Z   LOG [CloudMatch] conn: usage=14 ip=null port=322 resourcePath=rtsps://[Redacted for privacy].net:322
2026-02-26T22:25:07.349Z   LOG [CloudMatch] conn: usage=14 ip=null port=48322 resourcePath=rtsps://[Redacted for privacy].net:48322
2026-02-26T22:25:09.380Z   LOG [CloudMatch] resolveMediaConnectionInfo: usage=14 candidate: ip=[Redacted for privacy].net, port=48322 (serverIp fallback=[Redacted for privacy].net)
2026-02-26T22:25:09.380Z   LOG [CloudMatch] toSessionInfo: status=1, queuePosition=n/a, connectionInfo=2 entries, serverIp=[Redacted for privacy].net, signalingServer=[Redacted for privacy].net:443, signalingUrl=wss://[Redacted for privacy].net:443/nvst/
2026-02-26T22:25:09.380Z   LOG [CloudMatch] conn: usage=14 ip=null port=322 resourcePath=rtsps://[Redacted for privacy].net:322
2026-02-26T22:25:09.380Z   LOG [CloudMatch] conn: usage=14 ip=null port=48322 resourcePath=rtsps://[Redacted for privacy].net:48322
2026-02-26T22:25:11.412Z   LOG [CloudMatch] resolveMediaConnectionInfo: usage=14 candidate: ip=[Redacted for privacy].net, port=48322 (serverIp fallback=[Redacted for privacy].net)
2026-02-26T22:25:11.412Z   LOG [CloudMatch] toSessionInfo: status=1, queuePosition=n/a, connectionInfo=2 entries, serverIp=[Redacted for privacy].net, signalingServer=[Redacted for privacy].net:443, signalingUrl=wss://[Redacted for privacy].net:443/nvst/
2026-02-26T22:25:11.412Z   LOG [CloudMatch] conn: usage=14 ip=null port=322 resourcePath=rtsps://[Redacted for privacy].net:322
2026-02-26T22:25:11.412Z   LOG [CloudMatch] conn: usage=14 ip=null port=48322 resourcePath=rtsps://[Redacted for privacy].net:48322
2026-02-26T22:25:13.447Z   LOG [CloudMatch] resolveMediaConnectionInfo: usage=14 candidate: ip=[Redacted for privacy].net, port=48322 (serverIp fallback=[Redacted for privacy].net)
2026-02-26T22:25:13.447Z   LOG [CloudMatch] toSessionInfo: status=2, queuePosition=n/a, connectionInfo=2 entries, serverIp=[Redacted for privacy].net, signalingServer=[Redacted for privacy].net:443, signalingUrl=wss://[Redacted for privacy].net:443/nvst/
2026-02-26T22:25:13.447Z   LOG [CloudMatch] conn: usage=14 ip=null port=322 resourcePath=rtsps://[Redacted for privacy].net:322
2026-02-26T22:25:13.447Z   LOG [CloudMatch] conn: usage=14 ip=null port=48322 resourcePath=rtsps://[Redacted for privacy].net:48322
2026-02-26T22:25:13.448Z   LOG [Signaling] URL: wss://[Redacted for privacy].net:443/nvst/sign_in?peer_id=peer-8099897058&version=2 (server: [Redacted for privacy].net:443 , signalingUrl: wss://[Redacted for privacy].net:443/nvst/ )
2026-02-26T22:25:13.448Z   LOG [Signaling] Connecting to: wss://[Redacted for privacy].net:443/nvst/sign_in?peer_id=peer-8099897058&version=2
2026-02-26T22:25:13.448Z   LOG [Signaling] Session ID: 8e019548-3db4-f692-5fb1-e883ec761ec3
2026-02-26T22:25:13.448Z   LOG [Signaling] Protocol: x-nv-sessionid.8e019548-3db4-f692-5fb1-e883ec761ec3
2026-02-26T22:25:13.556Z   LOG [Signaling] Received OFFER SDP (2730 chars), first 500 chars:
2026-02-26T22:25:13.556Z   LOG [main] v=0
o=- 4373647202393833435 2 IN IP4 [Redacted IP]
s=odrerir
t=0 0
a=group:BUNDLE 0 1 2
a=ice-options:trickle
a=ice-lite
a=ice-ufrag:590a27f6
a=ice-pwd:a0514f0a-8cb9-45f1-be11-1696fc2f4200
a=fingerprint:sha-256 BA:35:36:C1:43:47:10:84:62:31:24:FF:08:30:83:00:42:AB:D6:7E:13:04:F9:DD:32:9C:E1:09:4B:AF:DE:2A
a=setup:actpass
m=audio 47998 UDP/TLS/RTP/SAVPF 63 111
c=IN IP4 [Redacted IP]
a=rtcp:47998 IN IP4 [Redacted IP]
a=mid:0
a=extmap:3 http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-ext
2026-02-26T22:25:13.573Z   LOG [Main] Permission check: media from file:///
2026-02-26T22:25:13.573Z   LOG [Main] Permission check: media from file:///
2026-02-26T22:25:13.575Z   LOG [Main] Permission check: media from file:///
2026-02-26T22:25:13.636Z   LOG [Main] Permission check: media from file:///
2026-02-26T22:25:13.650Z   LOG [Signaling] Sending local ICE candidate: candidate:3210989404 1 udp 2122063615 [Redacted IP] 43420 typ host generation 0 ufrag pw0c network-id 1 network-cost 10 (sdpMid=0)
2026-02-26T22:25:13.650Z   LOG [Signaling] Sending local ICE candidate: candidate:3281637765 1 udp 2122265343 fd85:dd57:5f64:0:fae7:d218:d9bc:e157 42078 typ host generation 0 ufrag pw0c network-id 3 network-cost 10 (sdpMid=0)
2026-02-26T22:25:13.650Z   LOG [Signaling] Sending local ICE candidate: candidate:3454371272 1 udp 2122199807 fdfe:c59a:db50:43df:6d70:5405:ab73:ee2b 60701 typ host generation 0 ufrag pw0c network-id 4 network-cost 10 (sdpMid=0)
2026-02-26T22:25:13.650Z   LOG [Signaling] Sending local ICE candidate: candidate:312515065 1 udp 2122131711 2a01:e0a:b5b:8180:29d7:498:4d05:be2 41761 typ host generation 0 ufrag pw0c network-id 2 network-cost 10 (sdpMid=0)
2026-02-26T22:25:13.680Z   LOG [Signaling] Sending local ICE candidate: candidate:271134306 1 udp 1685855999 [Redacted IP] 43420 typ srflx raddr [Redacted IP] rport 43420 generation 0 ufrag pw0c network-id 1 network-cost 10 (sdpMid=0)
2026-02-26T22:25:13.771Z   LOG [Signaling] Sending local ICE candidate: candidate:3249286596 1 tcp 1518083839 [Redacted IP] 9 typ host tcptype active generation 0 ufrag pw0c network-id 1 network-cost 10 (sdpMid=0)
2026-02-26T22:25:13.772Z   LOG [Signaling] Sending local ICE candidate: candidate:3176543005 1 tcp 1518285567 fd85:dd57:5f64:0:fae7:d218:d9bc:e157 9 typ host tcptype active generation 0 ufrag pw0c network-id 3 network-cost 10 (sdpMid=0)
2026-02-26T22:25:13.772Z   LOG [Signaling] Sending local ICE candidate: candidate:3005900624 1 tcp 1518220031 fdfe:c59a:db50:43df:6d70:5405:ab73:ee2b 9 typ host tcptype active generation 0 ufrag pw0c network-id 4 network-cost 10 (sdpMid=0)
2026-02-26T22:25:13.772Z   LOG [Signaling] Sending local ICE candidate: candidate:1819245409 1 tcp 1518151935 2a01:e0a:b5b:8180:29d7:498:4d05:be2 9 typ host tcptype active generation 0 ufrag pw0c network-id 2 network-cost 10 (sdpMid=0)
2026-02-26T22:25:18.652Z   LOG [Signaling] Sending ANSWER SDP (3044 chars), first 500 chars:
2026-02-26T22:25:18.652Z   LOG [main] v=0
o=- 3748159627102816310 2 IN IP4 [Redacted IP]
s=-
t=0 0
a=group:BUNDLE 0 1 2
a=msid-semantic: WMS
m=audio 43420 UDP/TLS/RTP/SAVPF 63 111
c=IN IP4 [Redacted IP]
b=AS:128
a=rtcp:9 IN IP4 [Redacted IP]
a=candidate:3210989404 1 udp 2122063615 [Redacted IP] 43420 typ host generation 0 network-id 1 network-cost 10
a=candidate:3281637765 1 udp 2122265343 fd85:dd57:5f64:0:fae7:d218:d9bc:e157 42078 typ host generation 0 network-id 3 network-cost 10
a=candidate:3454371272 1 udp 2122199807 fdfe:c59a
2026-02-26T22:25:18.652Z   LOG [Signaling] Sending nvstSdp (3285 chars):
2026-02-26T22:25:18.653Z   LOG [main] v=0
o=SdpTest test_id_13 14 IN IPv4 [Redacted IP]
s=-
t=0 0
a=general.icepassword: [Redacted for privacy]
a=general.iceUserNameFragment:pw0c
a=general.dtlsFingerprint:7C:91:1C:3F:4A:D7:7D:D1:A2:88:96:2B:D3:38:19:0A:15:1E:8A:3F:D5:1F:2C:3C:10:B7:2C:EB:3F:86:7A:A7
m=video 0 RTP/AVP
a=msid:fbc-video-0
a=vqos.fec.rateDropWindow:10
a=vqos.fec.minRequiredFecPackets:2
a=vqos.fec.repairMinPercent:5
a=vqos.fec.repairPercent:5
a=vqos.fec.repairMaxPercent:35
a=vqos.drc.enable:0
a=vqos.dfc.enable:0
a=video.dx9EnableNv12:1
a=video.dx9EnableHdr:1
a=vqos.qpg.enable:1
a=vqos.resControl.qp.qpg.featureSetting:7
a=bwe.useOwdCongestionControl:1
a=video.enableRtpNack:1
a=vqos.bw.txRxLag.minFeedbackTxDeltaMs:200
a=vqos.drc.bitrateIirFilterFactor:18
a=video.packetSize:1140
a=packetPacing.minNumPacketsPerGroup:15
a=bwe.iirFilterFactor:8
a=video.encoderFeatureSetting:47
a=video.encoderPreset:6
a=vqos.resControl.cpmRtc.badNwSkipFramesCount:600
a=vqos.resControl.cpmRtc.decodeTimeThresholdMs:9
a=video.fbcDynamicFpsGrabTimeoutMs:18
a=vqos.resControl.cpmRtc.serverResolutionUpdateCoolDownCount:12000
a=video.enableNextCaptureMode:1
a=vqos.maxStreamFpsEstimate:240
a=video.videoSplitEncodeStripsPerFrame:3
a=video.updateSplitEncodeStateDynamically:1
a=vqos.adjustStreamingFpsDuringOutOfFocus:1
a=vqos.resControl.cpmRtc.ignoreOutOfFocusWindowState:1
a=vqos.[Redacted for privacy]:1
a=vqos.resControl.cpmRtc.featureMask:0
a=vqos.resControl.cpmRtc.enable:0
a=vqos.resControl.cpmRtc.minResolutionPercent:100
a=vqos.resControl.cpmRtc.resolutionChangeHoldonMs:999999
a=packetPacing.numGroups:5
a=packetPacing.maxDelayUs:1000
a=packetPacing.minNumPacketsFrame:10
a=video.rtpNackQueueLength:1024
a=video.rtpNackQueueMaxPackets:512
a=video.rtpNackMaxPacketCount:25
a=vqos.drc.qpMaxResThresholdAdj:4
a=vqos.grc.qpMaxResThresholdAdj:4
a=vqos.drc.iirFilterFactor:100
a=vqos.drc.minQpHeadroom:20
a=vqos.drc.lowerQpThreshold:100
a=vqos.drc.upperQpThreshold:200
a=vqos.drc.minAdaptiveQpThreshold:180
a=vqos.drc.qpCodecThresholdAdj:0
a=vqos.drc.qpMaxResThresholdAdj:20
a=vqos.dfc.minQpHeadroom:20
a=vqos.dfc.qpLowerLimit:100
a=vqos.dfc.qpMaxUpperLimit:200
a=vqos.dfc.qpMinUpperLimit:180
a=vqos.dfc.qpMaxResThresholdAdj:20
a=vqos.dfc.qpCodecThresholdAdj:0
a=vqos.grc.minQpHeadroom:20
a=vqos.grc.lowerQpThreshold:100
a=vqos.grc.upperQpThreshold:200
a=vqos.grc.minAdaptiveQpThreshold:180
a=vqos.grc.qpMaxResThresholdAdj:20
a=vqos.grc.qpCodecThresholdAdj:0
a=video.minQp:25
a=video.enableAv1RcPrecisionFactor:1
a=video.clientViewportWd:2560
a=video.clientViewportHt:1600
a=video.maxFPS:240
a=video.initialBitrateKbps:105000
a=video.initialPeakBitrateKbps:150000
a=vqos.bw.maximumBitrateKbps:150000
a=vqos.bw.minimumBitrateKbps:52500
a=vqos.bw.peakBitrateKbps:150000
a=vqos.bw.serverPeakBitrateKbps:150000
a=vqos.bw.enableBandwidthEstimation:1
a=vqos.bw.disableBitrateLimit:0
a=vqos.grc.maximumBitrateKbps:150000
a=vqos.grc.enable:0
a=video.maxNumReferenceFrames:4
a=video.mapRtpTimestampsToFrames:1
a=video.encoderCscMode:3
a=video.dynamicRangeMode:0
a=video.bitDepth:10
a=video.scalingFeature1:1
a=video.prefilterParams.prefilterModel:0
m=audio 0 RTP/AVP
a=msid:audio
m=mic 0 RTP/AVP
a=msid:mic
a=rtpmap:0 PCMU/8000
m=application 0 RTP/AVP
a=msid:input_1
a=ri.partialReliableThresholdMs:300

2026-02-26T22:25:18.766Z   LOG [Signaling] Received remote ICE candidate: candidate:1467211956 1 udp 2130569217 [Redacted IP] 13111 typ host
2026-02-26T22:25:24.347Z   LOG [Main] Permission check: automatic-fullscreen from file:///
2026-02-26T22:25:24.348Z   LOG [Main] Permission request: fullscreen from file:///tmp/.mount_opennof4a7lA/resources/app.asar/dist/index.html
2026-02-26T22:25:24.348Z   LOG [Main] Granting permission: fullscreen
2026-02-26T22:25:24.350Z   LOG [Main] Permission request: keyboardLock from file:///tmp/.mount_opennof4a7lA/resources/app.asar/dist/index.html
2026-02-26T22:25:24.350Z   LOG [Main] Granting permission: keyboardLock
2026-02-26T22:25:24.354Z   LOG [Main] Permission request: keyboardLock from file:///tmp/.mount_opennof4a7lA/resources/app.asar/dist/index.html
2026-02-26T22:25:24.354Z   LOG [Main] Granting permission: keyboardLock
2026-02-26T22:25:24.356Z   LOG [Main] Permission request: pointerLock from file:///tmp/.mount_opennof4a7lA/resources/app.asar/dist/index.html
2026-02-26T22:25:24.356Z   LOG [Main] Granting permission: pointerLock
2026-02-26T22:25:26.870Z   LOG [Main] Permission request: keyboardLock from file:///tmp/.mount_opennof4a7lA/resources/app.asar/dist/index.html
2026-02-26T22:25:26.870Z   LOG [Main] Granting permission: keyboardLock
2026-02-26T22:25:26.881Z   LOG [Main] Permission request: pointerLock from file:///tmp/.mount_opennof4a7lA/resources/app.asar/dist/index.html
2026-02-26T22:25:26.881Z   LOG [Main] Granting permission: pointerLock
2026-02-26T22:25:26.881Z   LOG [Main] Permission request: pointerLock from file:///tmp/.mount_opennof4a7lA/resources/app.asar/dist/index.html
2026-02-26T22:25:26.881Z   LOG [Main] Granting permission: pointerLock
2026-02-26T22:25:29.500Z   LOG [Main] Permission request: keyboardLock from file:///tmp/.mount_opennof4a7lA/resources/app.asar/dist/index.html
2026-02-26T22:25:29.501Z   LOG [Main] Granting permission: keyboardLock

Screenshots (optional)

No response

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions