Fix partial snippet selection in desktop chat editors

This commit is contained in:
agrynco committed 2026-11-06 14:58:24 +02:00
1 parent 63b7b879a3
commit 99db99e603
5 files changed
+45 -10

No files matched your search

+24 -3
View File
@@ -22,6 +22,7 @@ namespace
ks::App *app{};
HWND host{}, field{};
ks::Clip saved;
bool snippetRecoveryOnly = false;
bool captured = false, failed = false;
bool conversionOnly = false;
bool typosOnly = false;
@@ -588,10 +589,29 @@ LRESULT CALLBACK procedure(HWND w, UINT msg, WPARAM wp, LPARAM lp)
require(ks::readClipboard(app->window).text() == sentinel, "selected and repeated conversions restore clipboard");
finish();
break;
case 62:
case 64:
saved = ks::readClipboard(app->window, 64 * 1024 * 1024);
captured = true;
app->ownSequence = ks::writeClipboard(app->window, ks::textClip(sentinel));
app->settings.snippets = {{L";repo-changes-jira", L"expanded{cursor}"}};
ActivateKeyboardLayout(app->layouts[en].handle, 0);
prepare(L"prefix ;repo-changes-jira", false);
record(L";repo-changes-jira");
droppedSelectionKeys = 10;
enterPresses = 0;
app->transform(0, 0);
break;
case 65:
require(text() == L"prefix expanded", "long snippet recovers partial selection and preserves prefix");
require(droppedSelectionKeys == 0 && enterPresses == 0, "snippet recovery consumes missing arrows without Enter");
require(ks::readClipboard(app->window).text() == sentinel, "snippet recovery restores clipboard");
if (snippetRecoveryOnly) { finish(); break; }
stage = 62;
break;
case 62:
if (!captured) saved = ks::readClipboard(app->window, 64 * 1024 * 1024);
captured = true;
app->ownSequence = ks::writeClipboard(app->window, ks::textClip(sentinel));
app->settings.snippets = {{L";r", L"unexpected{enter}"}};
ActivateKeyboardLayout(app->layouts[en].handle, 0);
prepare(L"prefix ", false);
@@ -1038,8 +1058,9 @@ int main(int argc, char **argv)
SetWindowSubclass(field, observeEnter, 1, 0);
if (typosOnly || (argc > 1 && std::string(argv[1]) == "--typing-only"))
stage = 20;
if (argc > 1 && std::string(argv[1]) == "--snippets-only")
stage = 62;
snippetRecoveryOnly = argc > 1 && std::string(argv[1]) == "--snippet-recovery-only";
if (snippetRecoveryOnly || (argc > 1 && std::string(argv[1]) == "--snippets-only"))
stage = 64;
SetTimer(host, 1, 100, nullptr);
auto forwarding = SetWindowsHookExW(WH_KEYBOARD_LL,forwardingHook,GetModuleHandleW(nullptr),0);
require(forwarding!=nullptr,"downstream forwarding fixture installed before application hook");