Implement native Windows KSwitcher with configurable hotkeys and clipboard history

This commit is contained in:
2026-10-27 22:14:06 +02:00
commit f683e4178c
37 changed files with 31288 additions and 0 deletions
+77
View File
@@ -0,0 +1,77 @@
#pragma once
#include <cstdint>
#include <functional>
#include <optional>
#include <string>
#include <vector>
#include <windows.h>
namespace ks
{
struct Layout
{
HKL handle{};
std::wstring id, name, normal, shifted;
bool convertible = true;
int code(wchar_t ch) const;
wchar_t at(int code) const;
bool hasLetter(wchar_t ch) const;
};
bool letter(wchar_t ch);
std::wstring lower(std::wstring text);
std::wstring upper(std::wstring text);
std::wstring convert(const std::wstring &, const Layout &, const Layout &, bool force = false);
int detect(const std::wstring &, const std::vector<Layout> &, int preferred = -1);
std::wstring convertTo(const std::wstring &, const std::vector<Layout> &, int target, int hint);
std::wstring cycleCase(const std::wstring &);
std::wstring transliterate(const std::wstring &);
struct Snippet
{
std::wstring trigger, text;
};
struct Template
{
std::wstring text, suffix;
int cursors = 0;
};
Template parseTemplate(const std::wstring &);
struct Hotkey
{
UINT modifiers{}, key{};
bool operator==(const Hotkey &) const = default;
static std::optional<Hotkey> parse(std::wstring);
std::wstring format() const;
};
struct Settings
{
bool recent = true, switchLayout = true, history = true, autostart = false, awake = false;
bool elevatedAutostart = false;
int maxItems = 500, maxMiB = 200, maxImageMiB = 20;
std::wstring toggle = L"Ctrl+Alt+Shift+Space", casing = L"Ctrl+Alt+Shift+C",
translit = L"Ctrl+Alt+Shift+T", undo = L"Ctrl+Alt+Shift+Z", clipboard = L"Ctrl+Shift+V";
std::vector<std::wstring> cycle, direct, directIds;
std::vector<std::wstring> excluded{L"KeePass", L"KeePassXC", L"1Password", L"Bitwarden"};
std::vector<Snippet> snippets;
};
// Consume repeats and key-up for intercepted chords, even if settings change.
struct HotkeyHook
{
bool pressed[256]{};
// 0: pass through, -1: consume only, positive: dispatch that action once.
int update(UINT key, bool down, UINT modifiers, const std::vector<std::pair<int, Hotkey>> &bindings);
};
std::string utf8(const std::wstring &);
std::wstring wide(const std::string &);
struct Run
{
HWND window{};
HKL layout{};
ULONGLONG at{};
std::wstring keys;
bool overflow{};
void reset();
void record(wchar_t, HWND, HKL, ULONGLONG);
void backspace(HWND, ULONGLONG);
int match(const std::wstring &, const std::vector<Layout> &, const Layout &physical) const;
};
} // namespace ks