205e5c5a59
apple / swift (push) Successful in 1m20s
android / android (push) Has been cancelled
apple / screenshots (push) Has been cancelled
arch / build-publish (push) Has been cancelled
ci / web (push) Successful in 52s
ci / docs-site (push) Successful in 1m17s
ci / rust (push) Has been cancelled
ci / bench (push) Has been cancelled
deb / build-publish (push) Has been cancelled
decky / build-publish (push) Successful in 24s
docker / build-push (., web/Dockerfile, punktfunk-web) (push) Successful in 12s
docker / build-push (ci, ci/fedora-rpm.Dockerfile, punktfunk-fedora-rpm) (push) Successful in 17s
docker / build-push (ci, ci/rust-ci.Dockerfile, punktfunk-rust-ci) (push) Successful in 18s
docker / build-push (docs-site, docs-site/Dockerfile, punktfunk-docs) (push) Successful in 18s
docker / deploy-docs (push) Has been cancelled
docker / build-push (--build-arg FEDORA_VERSION=44, ci, ci/fedora-rpm.Dockerfile, punktfunk-fedora44-rpm) (push) Has been cancelled
release / apple (push) Has been cancelled
rpm / build-publish (44, fedora-44, punktfunk-fedora44-rpm) (push) Has been cancelled
rpm / build-publish (43, bazzite, punktfunk-fedora-rpm) (push) Has been cancelled
The W7/W8 client refactor (extracting FullscreenController/ApprovalRequest out of ContentView, splitting Settings) landed the DefaultsKeys + scaffolding but dropped the feature WIRING, which was uncommitted WIP shelved in a stash during the 16:28 clipboard/v4 reconcile. Recovered from that stash (+ its untracked-files parent for the whole new ModifierLayout.swift) and re-ported onto the refactored tree: - invertScroll: applied in InputCapture.sendScroll (the one scroll sink) + Settings toggle - modifierLayout (Cmd/Option switch): restored ModifierLayout.swift enum + KeyMaps .applyModifierLayout + InputCapture.emitKey wire-boundary + Settings picker - fullscreen shortcut (Ctrl+Cmd+F): InputCapture ⌃⌘F interception + onToggleFullscreen + StreamView wiring + Stream-menu item (the .punktfunkToggleFullscreen sink + FullscreenController observer already survived on main) - render scale: Settings picker + MatchWindowFollower renderScale/maxDimension application + StreamView/StreamViewIOS plumbing (RenderScale.swift already on main) StreamCommands re-ported by hand (the stash hunk deleted the since-landed clipboard item — kept it, added the fullscreen item alongside). Recovered ModifierLayout + RenderScale tests. swift build green; 15 tests pass. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
52 lines
2.2 KiB
Swift
52 lines
2.2 KiB
Swift
import XCTest
|
|
|
|
import PunktfunkShared
|
|
@testable import PunktfunkKit
|
|
|
|
/// Pins the location-based modifier remap (`InputCapture.applyModifierLayout`) — the wire-boundary
|
|
/// swap that relocates the Alt/Super role between the physical ⌥/⌘ keys per side, without touching
|
|
/// Control/Shift or the physical detection upstream.
|
|
final class ModifierLayoutMappingTests: XCTestCase {
|
|
// The four physical modifier VKs the remap can touch, and everything else it must not.
|
|
private let lWin: UInt32 = 0x5B, rWin: UInt32 = 0x5C
|
|
private let lAlt: UInt32 = 0xA4, rAlt: UInt32 = 0xA5
|
|
|
|
func testMacLayoutIsIdentity() {
|
|
for vk: UInt32 in [lWin, rWin, lAlt, rAlt, 0xA0, 0xA2, 0x41, 0x1B] {
|
|
XCTAssertEqual(InputCapture.applyModifierLayout(vk, .mac), vk)
|
|
}
|
|
}
|
|
|
|
func testWindowsLayoutSwapsAltAndSuperPerSide() {
|
|
XCTAssertEqual(InputCapture.applyModifierLayout(lWin, .windows), lAlt) // L ⌘ → L Alt
|
|
XCTAssertEqual(InputCapture.applyModifierLayout(rWin, .windows), rAlt) // R ⌘ → R Alt
|
|
XCTAssertEqual(InputCapture.applyModifierLayout(lAlt, .windows), lWin) // L ⌥ → L Win
|
|
XCTAssertEqual(InputCapture.applyModifierLayout(rAlt, .windows), rWin) // R ⌥ → R Win
|
|
}
|
|
|
|
func testWindowsLayoutKeepsSideNeverCrossesLeftRight() {
|
|
// A left key never becomes a right VK or vice-versa.
|
|
XCTAssertNotEqual(InputCapture.applyModifierLayout(lWin, .windows), rAlt)
|
|
XCTAssertNotEqual(InputCapture.applyModifierLayout(rWin, .windows), lAlt)
|
|
}
|
|
|
|
func testControlShiftAndRegularKeysNeverMove() {
|
|
for vk: UInt32 in [
|
|
0xA0, 0xA1, // L/R Shift
|
|
0xA2, 0xA3, // L/R Control
|
|
0x41, 0x5A, // A, Z
|
|
0x1B, 0x0D, // Esc, Return
|
|
] {
|
|
XCTAssertEqual(InputCapture.applyModifierLayout(vk, .windows), vk)
|
|
}
|
|
}
|
|
|
|
func testWindowsRemapIsItsOwnInverse() {
|
|
// Down-remapped then the same key up-remapped land on the same host VK — no stuck modifier.
|
|
for vk: UInt32 in [lWin, rWin, lAlt, rAlt] {
|
|
let once = InputCapture.applyModifierLayout(vk, .windows)
|
|
XCTAssertEqual(InputCapture.applyModifierLayout(once, .windows), vk)
|
|
}
|
|
}
|
|
}
|