diff --git a/CMakeLists.txt b/CMakeLists.txt index 17e1607..c9c4537 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,5 +1,5 @@ cmake_minimum_required(VERSION 3.24) -project(KSwitcher VERSION 0.6.55 LANGUAGES CXX RC) +project(KSwitcher VERSION 0.6.56 LANGUAGES CXX RC) if(NOT WIN32) message(FATAL_ERROR "KSwitcher uses native Windows APIs") endif() diff --git a/LAN-PREVIEW.md b/LAN-PREVIEW.md index a719dd0..f8b4cf3 100644 --- a/LAN-PREVIEW.md +++ b/LAN-PREVIEW.md @@ -1,17 +1,15 @@ -# LAN mouse and keyboard preview +# LAN mouse and keyboard — v0.6.56 (experimental) KSwitcher discovers other enabled KSwitcher instances, pairs them with the same code on both computers, and shares mouse and keyboard through a screen edge. -The module runs inside the resident process. This preview supports **one active +The module runs inside the resident process. This experimental feature supports **one active pair of computers**, with the neighbour on the left, right, above or below. Several trusted pairs may be saved, but only the selected neighbour is active. Clipboard and file transfer are not implemented yet. ## Set up two computers -1. Extract this preview into a separate writable folder on each Windows PC. - Exit the regular KSwitcher before starting this copy; only one resident runs - per Windows session. Each copy keeps its own data beside the executable. +1. Update both PCs to v0.6.56 or newer using Update in the tray menu. Preserve local data; do not copy pairing identities between PCs. 2. Open Settings → Tools → KSwitcher computers and enable discovery on both PCs. Only running LAN-enabled KSwitcher instances appear, not generic network devices. 3. Match the computer name and instance-ID prefix displayed on the other PC. diff --git a/README.md b/README.md index 2121853..f63fbb5 100644 --- a/README.md +++ b/README.md @@ -10,16 +10,16 @@ The original [Typlo](https://github.com/bitcodepro/Typlo) project and its data r [Donate via Monobank](https://send.monobank.ua/jar/88h2TddKfS) · Thank you for supporting KSwitcher. -## Development preview: KSwitcher computers +## KSwitcher computers — v0.6.56 (experimental) -The development build includes opt-in LAN discovery, same-code pairing and +KSwitcher includes opt-in LAN discovery, same-code pairing and mouse/keyboard sharing for one active pair. Place the neighbour left, right, above or below; moving through that outer screen edge transfers both mouse and keyboard. Ctrl+Alt+Esc returns control in an emergency. See [LAN-PREVIEW.md](LAN-PREVIEW.md) for setup, encryption and validation limits. Clipboard and file sharing are still pending. -**Українською.** У dev-збірці є пошук KSwitcher у мережі, спарювання однаковим +**Українською.** У v0.6.56 є пошук KSwitcher у мережі, спарювання однаковим кодом і передача миші та клавіатури для однієї активної пари ПК. Укажіть, де стоїть сусідній ПК: ліворуч, праворуч, зверху або знизу. Курсор і клавіатура перемикаються разом через відповідний край екрана. Ctrl+Alt+Esc аварійно повертає diff --git a/Release/KSwitcher-win-x64.zip b/Release/KSwitcher-win-x64.zip index f9ae97e..4b8173f 100644 Binary files a/Release/KSwitcher-win-x64.zip and b/Release/KSwitcher-win-x64.zip differ diff --git a/Release/README.md b/Release/README.md index 046a873..dcbf745 100644 --- a/Release/README.md +++ b/Release/README.md @@ -1,14 +1,16 @@ # Latest Windows release -## v0.6.55 — 2026-11-06 +## v0.6.56 — 2026-11-06 ## Changes -- Fix long snippets failing in ChatGPT and Codex desktop editors when only part of the trigger was selected. Selection now uses paced key events in these applications. -- Recover a partial snippet selection only when the copied text matches a suffix of the trigger in a recognized keyboard layout. Verify the complete trigger before replacing it; preserve surrounding text and restore the clipboard. Far Manager keeps its dedicated selection path. -- Existing cross-layout trigger recognition and binding one snippet to multiple applications remain supported. Clarify these behaviors in the bilingual snippet guide; no new syntax or settings are required. +- Experimental, opt-in LAN mouse and keyboard sharing inside the existing resident process; no extra service. +- Discover running KSwitcher instances and pair them using the same generated code on both PCs. Trust is DPAPI-protected locally, outside settings sync/export. +- Arrange the active neighbour left, right, above or below. Select opposite sides on both PCs; mouse and keyboard transfer together through that screen edge. +- Authenticated AES-256-GCM input channel; Ctrl+Alt+Esc emergency return, disconnect recovery and held-key release. +- One active pair. Clipboard/files and remote secure desktops are not supported. Stop MWB before using input sharing. Disabled by default. ## Validation -Passed targeted native partial-selection recovery, including the ChatGPT process selection policy, 776 settings/chat-profile checks, 568 input checks, 332 native checks, 126 sync checks, dictionary equivalence (140,939 words), wheel, StayHere, Utilities, screenshot UI/save/registration, 54 updater checks and updater progress checks. The reporter confirmed successful expansion in the actual chat, including typing in another layout. The broader snippet suite encountered foreground loss in its buffered Enter scenario; that run is not counted as passing. Release package, version, checksum, updater and published Wiki verification are performed as part of publication. +124 input/channel, 41 pairing/configuration/network and 813 settings/chat-profile checks passed before release preparation. Full release regression passed: 124 LAN input, 34 LAN pairing (41 with network lifecycle), 813 chat/settings, 568 input, 332 native, 126 sync, dictionary equivalence (140,939 words), wheel, StayHere, Utilities, screenshot UI/save/registration, 54 updater checks and updater progress. Physical two-PC validation is pending: network tests use loopback and input-state tests simulate desktops. LAN sharing remains experimental; follow LAN-PREVIEW.md on both PCs. ## Upgrade and compatibility Choose **Update** in the tray menu. Legacy v0.3.0–v0.4.1 clients first receive the v0.4.2 compatibility bridge, then the current full release. v0.2.3 and earlier require manual installation. diff --git a/Release/SHA256SUMS.txt b/Release/SHA256SUMS.txt index cbdf204..1a77a10 100644 --- a/Release/SHA256SUMS.txt +++ b/Release/SHA256SUMS.txt @@ -1 +1 @@ -42ffb2ea131983134897bf8a4e74a56ec2716cdc411930e417739fa35c95e6b2 KSwitcher-win-x64.zip +7ddf8545bcd1694e760503e712b6b34f396311446596bca348b3cc27ee838abe KSwitcher-win-x64.zip diff --git a/Release/release-files.json b/Release/release-files.json index 21d3450..51122d5 100644 --- a/Release/release-files.json +++ b/Release/release-files.json @@ -1,81 +1,86 @@ { "schema": 1, - "version": "0.6.55", + "version": "0.6.56", "files": [ { - "sha256": "30f7942d26f049a6abac6a36778696cc285888d31ad42a5ed2b53097aeda72d5", - "path": "KSwitcher.exe", - "size": 1850368 + "sha256": "02f709062f32047f2befc4de67efe5e033c48a8155bb0230bf012496fe20db9b", + "size": 1974784, + "path": "KSwitcher.exe" }, { - "sha256": "1cf6d8f1b5b8a4299edaf8a28cbaede9264b667edbe095c1e5156eedf0ef2089", - "path": "KSwitcher.Config.exe", - "size": 1718784 + "sha256": "9b3ec79ae158ee51e61249f01e46a20917db9c25c6a8f58c52d927f8a6c3ee9c", + "size": 1887232, + "path": "KSwitcher.Config.exe" }, { - "sha256": "daa58f6800b21a6f50f5e0ceb32505ede0637e05aad57c383d8845ccec2420f1", - "path": "KSwitcher.Screenshot.exe", - "size": 2903040 + "sha256": "21a5422be5e97c7f758d46481fe2c9481d2c09b231cc7fe90b6e7a0793f32b9d", + "size": 3046912, + "path": "KSwitcher.Screenshot.exe" }, { "sha256": "d3c81140cce01c26bf6cbf52aa40e0825e1fa35b9a91d1387170a65d2597082c", - "path": "LICENSE", - "size": 4401 + "size": 4401, + "path": "LICENSE" }, { "sha256": "61e08da79c44061654015ce6b0c4061c23ee1dd18237fbf09e9bfda3c0ea2831", - "path": "json-LICENSE.txt", - "size": 1096 + "size": 1096, + "path": "json-LICENSE.txt" }, { - "sha256": "3c9947f562fae119b058c7a1230874bf3430145d8ac8d7bfc5fa89ae708f6a89", - "path": "README.md", - "size": 78153 + "sha256": "6b7b8a912c10c04c8bdddce90572a6a8addcb6c76d478fe8455c2685fc3384d8", + "size": 79329, + "path": "README.md" + }, + { + "sha256": "a8ec24f5a6cc9145324a52b73525418d1f8bd0eb3b4cf75fc93b57dcc7918603", + "size": 6773, + "path": "LAN-PREVIEW.md" }, { "sha256": "d0c022b27b9fbc2ff7b6b8bec723cc1adc4eef517202f9ff77eed5d8bea3acb9", - "path": "dictionaries/en.txt", - "size": 732485 + "size": 732485, + "path": "dictionaries/en.txt" }, { "sha256": "0bdfb0201d1803634f268cdff0993b8349d2c70e956a06dbb667c8dd65254ec5", - "path": "dictionaries/LICENSE-CC-BY-SA-4.0.txt", - "size": 20566 + "size": 20566, + "path": "dictionaries/LICENSE-CC-BY-SA-4.0.txt" }, { "sha256": "3017bf44d3be9d9dfab21bd6778aa52b7947e61acf9ce2bc86b41d6e949ac311", - "path": "dictionaries/README.md", - "size": 2265 + "size": 2265, + "path": "dictionaries/README.md" }, { "sha256": "80e6b6a27815973535f7facb636c597eb845dfee45cfabfc4e9b3341b9332849", - "path": "dictionaries/ru.txt", - "size": 1109134 + "size": 1109134, + "path": "dictionaries/ru.txt" }, { "sha256": "98e5b3fe7304e37705c9e5ff48b0b399ccb16e806736d21f09921b99e5f2a408", - "path": "dictionaries/sources.json", - "size": 1280 + "size": 1280, + "path": "dictionaries/sources.json" }, { "sha256": "d30e990d6ec2983c04f3644a3c61c6c668e8c542323f5931916fdd55b916eebf", - "path": "dictionaries/uk.txt", - "size": 940799 + "size": 940799, + "path": "dictionaries/uk.txt" }, { "sha256": "a34b5161a8315af037e1ec71d816bfc688f7c364141d4ee2347cf0515ef0c82a", - "path": "tools/README.txt", - "size": 993 + "size": 993, + "path": "tools/README.txt" }, { "sha256": "6ef5cf64708d62b7fc63c3c793cc99188a513433ff4774cae01dc014f6664376", - "path": "tools/StayHere.exe", - "size": 134656 + "size": 134656, + "path": "tools/StayHere.exe" }, { "sha256": "ba214e2aca7405e698b3ab21ceb1f41ce088edd996b3e30e4a9d58ff496f9413", - "path": "tools/StayHere-README.md", - "size": 2796 + "size": 2796, + "path": "tools/StayHere-README.md" } ] } diff --git a/package.ps1 b/package.ps1 index 0546be0..1cd6517 100644 --- a/package.ps1 +++ b/package.ps1 @@ -9,13 +9,14 @@ Copy-Item -LiteralPath (Join-Path $root 'build\release\KSwitcher.Screenshot.exe' Copy-Item -LiteralPath (Join-Path $root 'LICENSE') -Destination $destination Copy-Item -LiteralPath (Join-Path $root 'vendor\json-LICENSE.txt') -Destination $destination Copy-Item -LiteralPath (Join-Path $root 'README.md') -Destination $destination +Copy-Item -LiteralPath (Join-Path $root 'LAN-PREVIEW.md') -Destination $destination Copy-Item -LiteralPath (Join-Path $root 'dictionaries') -Destination $destination -Recurse -Force New-Item -ItemType Directory -Force (Join-Path $destination 'tools') | Out-Null Copy-Item -LiteralPath (Join-Path $root 'resources\portable-tools-README.txt') -Destination (Join-Path $destination 'tools\README.txt') -Force Copy-Item -LiteralPath (Join-Path $root 'build\release\tools\StayHere.exe') -Destination (Join-Path $destination 'tools\StayHere.exe') -Force Copy-Item -LiteralPath (Join-Path $root 'utilities\StayHere\README.md') -Destination (Join-Path $destination 'tools\StayHere-README.md') -Force # Enumerate the distributable files explicitly; do not include a user's data directory. -$files = @('KSwitcher.exe','KSwitcher.Config.exe','KSwitcher.Screenshot.exe','LICENSE','json-LICENSE.txt','README.md','dictionaries','tools\README.txt','tools\StayHere.exe','tools\StayHere-README.md') | ForEach-Object { Join-Path $destination $_ } +$files = @('KSwitcher.exe','KSwitcher.Config.exe','KSwitcher.Screenshot.exe','LICENSE','json-LICENSE.txt','README.md','LAN-PREVIEW.md','dictionaries','tools\README.txt','tools\StayHere.exe','tools\StayHere-README.md') | ForEach-Object { Join-Path $destination $_ } $entries = foreach ($path in $files) { foreach ($file in @(Get-ChildItem -LiteralPath $path -File -Recurse)) { @{path=$file.FullName.Substring($destination.Length+1).Replace('\','/'); size=$file.Length; sha256=(Get-FileHash -LiteralPath $file.FullName -Algorithm SHA256).Hash.ToLowerInvariant()} diff --git a/resources/app.rc b/resources/app.rc index 6b91732..64fe7bc 100644 --- a/resources/app.rc +++ b/resources/app.rc @@ -9,8 +9,8 @@ IDC_SCREENSHOT_PENCIL CURSOR "icons/lucide/pencil.cur" 1 RT_MANIFEST "app.manifest" 201 RCDATA "update.ps1" 1 VERSIONINFO - FILEVERSION 0,6,55,0 - PRODUCTVERSION 0,6,55,0 + FILEVERSION 0,6,56,0 + PRODUCTVERSION 0,6,56,0 FILEOS VOS_NT_WINDOWS32 FILETYPE VFT_APP BEGIN @@ -20,7 +20,7 @@ BEGIN BEGIN VALUE "FileDescription", "KSwitcher — native keyboard and clipboard utility" VALUE "ProductName", "KSwitcher" - VALUE "FileVersion", "0.6.55" + VALUE "FileVersion", "0.6.56" END END BLOCK "VarFileInfo" diff --git a/src/update.h b/src/update.h index 1f7cc11..ef7e280 100644 --- a/src/update.h +++ b/src/update.h @@ -2,7 +2,7 @@ #include "platform.h" namespace ks { -inline constexpr wchar_t AppVersion[] = L"0.6.55"; +inline constexpr wchar_t AppVersion[] = L"0.6.56"; inline constexpr UINT UpdateMessage = WM_APP + 7; inline constexpr UINT UpdateCheckIntervalMs = 6 * 60 * 60 * 1000; inline constexpr UINT UpdateNotificationRetryMs = 5 * 60 * 1000;