github RedBearAK/Toshy Toshy_v26.07.0
Toshy v26.07.0

8 hours ago

Releases from this project are meant only as records of major changes. There will be automatic attachments generated by GitHub, but to get the latest version download the zip from the green <> Code ▼ button on the main page, or use the quick-install one-liner command.

Changes

This release covers roughly mid-June through mid-July 2026.

Caution

Existing users: The keyboard layout correction API call lives in an editable section of the config (keymapper_api). Reinstalling Toshy splices your existing editable slices into the new default config to preserve your customizations, which means a new or changed API call will not magically appear on its own, even after reinstalling.

The first parameter has been renamed from enabled to correction_enabled (the old name was far too generic for a name landing in the config's global namespace). If you tried the layout correction feature from the last release, a leftover keyboard_layout_correction(enabled=True) in your config will now raise a TypeError and your config will fail to load. The try/except NameError guard does not catch this.

Open your config, find the keymapper_api section, and replace any older keyboard_layout_correction() call with this one — or add it, if you installed Toshy before the feature existed. Then restart Toshy with the toshy-services-restart command (or the restart item in the tray indicator menu) so the edited config is reloaded:

# Requires xwaykeyz v1.23.0 or later
try:
    keyboard_layout_correction(
        correction_enabled  = False,
        correct_number_row  = False,
        symbol_miss_policy  = 'fold',
        folded_miss_policy  = 'placeholder',
        symbol_placeholder  = '?'
    )
except NameError:
    pass

Flip correction_enabled to True to turn the feature on. It remains off by default until I can get more feedback from users of international keyboard layouts.

Note

Toshy now vendors the keymapper. xwaykeyz (and the KWin application switcher script) are kept in the repo under vendors/, pinned to a specific upstream commit, and the installer installs from those in-tree copies instead of cloning from another repo mid-install. A release now carries the exact keymapper revision it was tested against, so a regression or incompatibility landing in the keymapper's main branch can no longer reach a Toshy release after the fact.

This pins the keymapper, and only the keymapper. An older Toshy release still installs pip packages into its venv and still depends on native system packages, and those keep moving — a distro renaming a package, or a major version jump in something like PyGObject, can break an older release regardless of which keymapper is embedded in it. Vendoring is not a time machine.

New features and improvements

  • Non-US keyboard layout correction, phase 2: symbol correction^ (still off by default). Phase 1 corrected shortcut matching, but it could not correct typed strings — a macro that types Class: mode came out as Clqss: ,ode on French AZERTY, because every character was emitted at its US key position. Toshy now builds a per-layout symbol table — every character reachable on the active layout, mapped to the exact keystroke sequence that produces it, including Shift and AltGr levels and dead-key sequences — and the keymapper's string and Unicode output paths consult it instead of assuming a US layout. String macros and Unicode codepoint entry now produce the intended characters on non-US layouts. A new kblayout_symtable module builds the table; it is rebuilt and cached on each layout switch.
  • Miss policies for unreachable characters.^^ Some characters simply cannot be typed on a given layout. symbol_miss_policy decides what happens: refuse (emit nothing for the whole string, and name the character loudly in the log), fold (transliterate toward ASCII, so é becomes e), or placeholder (substitute a visible marker and keep going). folded_miss_policy covers a character still unreachable even after folding, and symbol_placeholder sets the marker.
  • Keymapper and KWin app-switcher script are now vendored in-repo (see the note above). A new sync_vendors.sh script syncs vendors/xwaykeyz-main, vendors/xwaykeyz-dev_beta, and vendors/kwin-application-switcher, each pinned by a .vendored-ref file recording the upstream URL, branch, and exact commit. Installing from a release zip no longer reaches out to other repos for these specific components partway through, under normal circumstances.
  • The --dev-keymapper install option installs the vendored dev_beta branch of the keymapper instead of main. Any other branch or commit reference will still go out to the remote keymapper repo.
  • The macro tester also names the active layout in its output, which makes diagnosing layout problems far easier.
  • toshy-versions now reports the version of the new kblayout_symtable module.
  • openSUSE Slowroll is now recognized as a distro ID (handled as Tumbleweed).
  • The update-check question during setup is skipped when there is no sensible reason to ask it.
  • The bootstrap installer can now fetch any tag or commit, not just a branch. The ref prompt offers main, dev_beta, or a custom ref, which accepts a branch name, a release tag, or a commit SHA. This makes it possible to install a specific older release, or to hunt down the commit that broke something. Still no git required to install Toshy.
  • The installer now fails fast and clearly on unsupported systems. Running the bootstrap on macOS, Windows shells, or WSL — or launching the setup script there directly — stops immediately with an explanation, instead of failing partway through with a confusing error.

Fixes

  • A bad or unrecognized keyboard layout name no longer crashes the keymapper at startup. Whatever goes wrong, the cost is layout correction — never your keyboard.
  • Settings database no longer errors under heavy startup load.
  • Multi-tap actions were bypassing output layout correction entirely.
  • Font installer function made more robust.
  • Unicode hex input is no longer run through output correction and corrupted (keymapper-side).
  • Improved multipurpose key handling, again (keymapper-side).
  • The keymapper's virtual/"fake" modifier keycodes moved above XKB's hard cap, so a leaked event cannot trigger unintended behavior.
  • Improved pointer monitoring and suspend/resume handling (keymapper-side).

Known limitations

  • Number-row output hole. Output correction for a combo or bare key works by a flat keycode swap, which can only reach symbols that sit at base level on the active layout. Where a wanted symbol has migrated onto the number row — the common case being - on AZERTY, which lives on the physical 6 key — it is left uncorrected by default, because the digit row is deliberately held positional so that Cmd/Ctrl + 19 keep firing from the physical number keys. Enabling correct_number_row reaches those symbols, at the possible cost of those positional digit shortcuts (depending on how Linux applications deal with number row shortcuts in non-US layouts). Typed strings are unaffected: they go through the symbol table and can reach the whole layout.
  • Long macros can still run slower depending on how they are triggered. If a macro begins emitting while the modifiers of its trigger chord are still held, those modifiers get lifted and re-pressed around every emitted character, roughly tripling the event count and the time the macro takes. Multi-tap triggers now wait a short grace period before emitting, which lets the trigger modifiers clear first and largely avoids this — but that is a mitigation on one path, not a fix to the underlying behavior, so other modifier-holding triggers can still hit the slow path.

^ Shortcut and macro rules in the default config are written against US key positions. Phase 1 (last release) fixed matching — the right rule fires from the right physical key. Phase 2 fixes output — the characters that come out from the string processor are the ones you asked to be "typed", if the active keyboard layout is able to type them.

^^ Folding uses the anyascii package when it is available, falling back to a built-in unicodedata fold when it is not. It is a soft dependency — Toshy installs and runs without it. Folding is lossy by consent: a folded string meant to trigger an action could behave differently than the string you actually typed.


Auto-generated full release notes (CLICK TO EXPAND):

What's Changed

Full Changelog: Toshy_v26.06.0...Toshy_v26.07.0

Don't miss a new Toshy release

NewReleases is sending notifications on new releases.