Compare commits

..

1 Commits

8 changed files with 26 additions and 16 deletions
+1 -1
View File
@@ -1,5 +1,5 @@
cmake_minimum_required(VERSION 3.24)
project(KSwitcher VERSION 0.6.31 LANGUAGES CXX RC)
project(KSwitcher VERSION 0.6.32 LANGUAGES CXX RC)
if(NOT WIN32)
message(FATAL_ERROR "KSwitcher uses native Windows APIs")
endif()
+2 -1
View File
@@ -170,7 +170,8 @@ for shapes.
**Canvas zoom:** use **Ctrl++ / Ctrl+-** (including numpad keys) or **Ctrl+mouse wheel**.
Each step changes the view by 25%; the wheel zooms around the cursor, keyboard shortcuts around
the viewport center. **Ctrl+0** restores the initial fit. Drag with the **middle mouse button**
to pan an enlarged image. Zoom ranges from 0.1× to 16× the initial fit; the status bar shows the
to pan an enlarged image. Panning is limited to axes where the image exceeds the viewport;
an image that fits stays centered. Zoom ranges from 0.1× to 16× the initial fit; the status bar shows the
actual image scale. Zoom and pan do not change annotations, export resolution or undo history.
The wheel without Ctrl still adjusts the object under the cursor.
Binary file not shown.
+7 -9
View File
@@ -1,19 +1,17 @@
# Latest Windows release
## v0.6.31 — 2026-11-03
## v0.6.32 — 2026-11-03
## Changes
- Fix conversion failures when an editor such as Viber omits trailing ASCII spaces from Ctrl+C. KSwitcher recovers those spaces only when Windows accessibility confirms the full selection in the target application's focused, non-password control. Exact recent-text and previous-result checks still apply.
- Recheck the same control and full selection before pasting a recovered range. Read back the replacement even when Write log is disabled; an unknown or mismatching result does not seed repeat conversion or switch the layout.
- The shared copy path supports manual conversion, automatic dictionary correction, repeat conversion and Undo. No shortcut, setting or default has changed.
- Fix the screenshot panning regression test for high-DPI displays. It now derives the image zoom from the actual viewport dimensions, centers the image, and checks that both axes have enough clearance for the tested drag.
- At 240 DPI (250% scaling), the previous fixture's 1600 × 1200 image still fit inside the 2468 × 1389 viewport. The editor correctly prevented panning, but the test incorrectly expected a 15 × 10 pixel movement.
- Application behavior, shortcuts, defaults and settings are unchanged. The verified Viber trailing-space recovery from v0.6.31 remains included. No screenshot-editor workaround is needed for this test failure.
## Validation
Live Viber validation converted `Ghbdsn ` to `Привіт ` and confirmed the retained trailing space without sending a message. Final isolated conversion and typo integration runs passed, including real clipboard-space stripping, two spaces within surrounding text, repeat conversion, Undo, missing/unrelated selection rejection, and blocked-paste state clearing with logging disabled. 483 native, 541 input/UI, 105 sync and 48 updater checks passed, as did wheel batching, screenshot PNG saving, screenshot registration and updater progress checks. Earlier integration attempts encountered clipboard contention/restoration and log-rotation assertions; the isolated final rerun passed. The unchanged screenshot UI suite still fails at `middle drag pans enlarged canvas`; screenshot implementation and test source are unchanged from v0.6.30. All three packaged executable versions and all 12 manifest file sizes/hashes were verified; no personal data is packaged.
The full `build.ps1 -Stage -Test` run passed: 105 sync checks, shared wheel batching, 483 native regressions, 541 input/UI checks at 240 DPI, the full screenshot editor UI suite (including the corrected pan test), PNG saving, screenshot registration, 48 updater regressions and updater progress UI checks. All three packaged executable versions and all 12 manifest file sizes/SHA-256 hashes were verified; the package contains no personal data.
## Limitations
Recovery requires a non-empty clipboard prefix and a single readable accessibility selection whose only additional characters are trailing ordinary spaces. Tabs, line breaks, missing letters, ambiguous or inaccessible selections are not reconstructed. Accessibility and editor timing can still prevent a conversion. This is not a general fix for all asynchronous editor failures.
**Upgrade:** 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.
## Upgrade
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.
For manual installation, exit KSwitcher, close screenshot editors and extract the entire ZIP into its installation folder. Keep personal `data/` and customized dictionaries.
Download **KSwitcher-win-x64.zip** with **SHA256SUMS.txt**. Keep all three executables together. The package contains no personal settings, credentials or clipboard history.
+1 -1
View File
@@ -1 +1 @@
c02b422a6a7af97f7ffc64d7a526a9fae523583493fcddeb4b80c9aee254667a KSwitcher-win-x64.zip
37c8ba8a27279141ac74318c24adf8b4ff4f573d68d4abff571a2abef7e739a1 KSwitcher-win-x64.zip
+3 -3
View File
@@ -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,31,0
PRODUCTVERSION 0,6,31,0
FILEVERSION 0,6,32,0
PRODUCTVERSION 0,6,32,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.31"
VALUE "FileVersion", "0.6.32"
END
END
BLOCK "VarFileInfo"
+1 -1
View File
@@ -2,7 +2,7 @@
#include "platform.h"
namespace ks
{
inline constexpr wchar_t AppVersion[] = L"0.6.31";
inline constexpr wchar_t AppVersion[] = L"0.6.32";
inline constexpr UINT UpdateMessage = WM_APP + 7;
inline constexpr UINT UpdateCheckIntervalMs = 6 * 60 * 60 * 1000;
inline constexpr UINT UpdateNotificationRetryMs = 5 * 60 * 1000;
+11
View File
@@ -225,6 +225,17 @@ int main(int argc, char **argv)
require(c.zoom>zoom && std::abs(before.x-after.x)<=1 && std::abs(before.y-after.y)<=1,
"Ctrl+wheel zoom keeps image point under cursor");
require(!c.history.canUndo(),"zoom does not add image edits to undo history");
// A fixed zoom can still fit inside a high-DPI editor. Size the
// fixture from the actual viewport, with room for the tested drag
// on both axes, then start from a centered view.
const double panZoom=std::max({1.0,
double(c.canvas.right-c.canvas.left+128)/(c.view.right-c.view.left),
double(c.canvas.bottom-c.canvas.top+128)/(c.view.bottom-c.view.top)});
ks::zoomCanvas(window,c,panZoom,center);
c.panX=c.panY=0; ks::layout(window,c);
require(c.view.left+15<c.canvas.left && c.view.top+10<c.canvas.top &&
c.view.right>c.canvas.right && c.view.bottom>c.canvas.bottom,
"pan fixture has drag clearance on both axes within the supported zoom range");
auto view=c.view;
SendMessageW(window,WM_MBUTTONDOWN,MK_MBUTTON,MAKELPARAM(center.x,center.y));
SendMessageW(window,WM_MOUSEMOVE,MK_MBUTTON,MAKELPARAM(center.x+15,center.y+10));