Skip to content

Releases: RedBearAK/Toshy

Toshy v26.08.0

Choose a tag to compare

@RedBearAK RedBearAK released this 06 Aug 01:46
c39ee06

Toshy v26.08.0

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](https://github.com/RedBearAK/toshy/wiki/How-to-install-Toshy-with-a-single-command).

Changes

This release covers roughly mid-July through early August 2026. The headline items are experimental NixOS support, Alpine Linux support, and automatic detection of native desktop environment shortcuts (screenshots, app launcher, input source switching) so that the remaps match whatever the DE is actually using.

New distro support

  • Add experimental support for NixOS^ — Nix flake with both a NixOS module and a Home Manager module, a runtime environment seam so launchers and services resolve the right interpreter and PATH, an install-user-files install path for declaratively-managed systems, and a scaffold script for fresh NixOS installs.
  • Add support for Alpine Linux^^ — bootstrap.sh converted to POSIX sh for dash/busybox, bash and shadow added to the package list, eudev quirk handling.
  • Add artix and devuan distro IDs, which follow the existing non-systemd install path (systemd-related packages are dropped automatically; the config process has to be launched manually or autostarted at login by whatever method the DE provides).
  • Let list-distros setup sub-command count NixOS/nix in its totals, and update its output notes. Setup script now supports 12 package manager types, 19 base Linux distro types, and knows 58 specific distro IDs.

New features and improvements

  • Read native screenshot shortcuts from the desktop environment and generate matching remaps automatically, instead of relying on hard-coded defaults that may not match the user's DE version or their customizations^^^
  • Detect the DE's live native app launcher and input source switching shortcuts the same way, with a new setting that swaps which Toshy shortcut lands on each: with the swap enabled, Cmd+Space and Shift+Cmd+Space cycle keyboard layouts and the launcher moves to Ctrl+Space, matching Mac OS X Tiger and earlier, before Spotlight took over Cmd+Space
  • Add toshy-terminal-menu, a fully functional terminal-based alternative to the tray icon and GTK preferences apps, for systems having trouble with the GTK apps or unable to install the packages they need
  • Migrate multi-tap handling into the keymapper (xwaykeyz 1.25.0)
  • Support conditional timeouts in the keymapper (xwaykeyz 1.24.0)
  • Add toshy-share command for getting text out of VMs
  • Cinnamon: fix the menu applet's shortcut on install and revert it on uninstall, and avoid triggering the bug reporter dialog on Cinnamon 6.8+
  • GTK4 preferences app: reduce window height for small screens, consolidate theming into a single CSS module, rework the Tools panel
  • Installer: pre-flight the keymapper and move the admin privileges question earlier in the run
  • Add toshy-detector-check diagnostic command for auto-detected shortcuts
  • Update Thunderbird, VSCode, and other app keymaps
  • Flip the suspend timeout default in the config

Fixes

  • Fix buggy lock key toggle notification functions
  • Lift the CapsLock mode submenu up to the main menu level, working around a nested sub-submenu bug observed on both COSMIC and GNOME (submenu collapsed instead of expanding to reveal 3rd-level submenu items)
  • Prevent excess doas password prompts by preserving the persist ticket across elevated calls^^
  • Don't show bogus privilege prompts on doas systems
  • Prevent detached processes from emitting output into the terminal that launched them
  • Handle a missing Cinnamon screenshot shortcut instead of failing on it
  • Correct the terminal and GUI screenshot remaps, and use a nested keymap for the Spectacle window screenshot
  • Fix PATH resolution on NixOS for services, bin commands, pgrep, and device checks
  • Let NixOS users actually run the reinstall command
  • Work around a deprecated setuptools error and pin python-xlib==0.31 via overlay on Nix
  • Fix executable bits on several scripts
  • Reduce total file read calls during shortcut detection

Installer/setup tweaks

  • Standardize scripts on the /usr/bin/env bash shebang, with bootstrap.sh as the deliberate POSIX sh exception
  • Migrate launchers and services to the shared runtime environment script
  • Show the resolved interpreter path alongside versions in toshy-versions
  • Vendor sync xwaykeyz 1.24.0, 1.25.0, and 1.25.1
  • Ignore the branch reset script

^ NixOS works in testing, but expect rough edges, and expect the mechanics to change significantly over time. NixOS needs the Toshy files installed into the user's home while the Python environment and binaries come from Nix, so the install grew an install-user-files path and a runtime environment seam that resolves interpreter and PATH at launch time rather than at install time. The flake exposes a NixOS module and a Home Manager module.

^^ Alpine uses doas rather than sudo, and doas keys its persist ticket on the parent process PID. Running elevated commands through a shell gave doas a fresh, disposable /bin/sh parent every time, which defeated the ticket and caused a password prompt on every single call during the install.

^^^ Screenshot shortcuts vary widely between desktop environments, between versions of the same DE, and between users who have customized them. Toshy now reads the actual configured shortcuts at config load time and resolves them through a tiered fallback to hard-coded defaults when nothing can be read. Tested on GNOME, KDE, Cinnamon and COSMIC. The auto-generated remaps can still be overridden with a custom keymap per DE in the editable "user_apps" slice of the config, and toshy-detector-check will show the keymaps that were generated automatically, to be used as a starting copy for those overrides.


Auto-generated full release notes (click to expand):

What's Changed

Full Changelog: Toshy_v26.07.1...Toshy_v26.08.0

Toshy v26.07.1

Choose a tag to compare

@RedBearAK RedBearAK released this 16 Jul 09:52
822e199

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

A point release, roughly two days of work after v26.07.0. The headline is a rebuilt CapsLock options system and a new interactive key-identity diagnostic.

Note

Existing users with a CapsLock option set: The old Caps2Cmd and Caps2Esc_Cmd toggles have been replaced by a single CapsLock Mode selector (see below), and there is no automatic migration between them. On first start after upgrading, if Toshy finds one of the old settings active, it sends a notification and clears it — so your previous CapsLock behavior will revert to default until you re-select what you want from the new CapsLock Mode menu, in the tray icon or the Preferences app. This is a one-time step. Nothing else you have set is affected.

New features and improvements

  • CapsLock Mode selector, replacing the two independent Caps2Cmd / Caps2Esc_Cmd toggles with a single list of mutually exclusive modes. One CapsLock behavior is active at a time, chosen by name, which removes the old problem of two overlapping toggles producing an ambiguous or contradictory result. The available modes:
    • Caps is Caps (default) — a normal CapsLock toggle. Nothing is remapped.
    • Caps is Caps & Cmd — tap for the CapsLock toggle (useful on international layouts that have Caps-layer characters), hold for Cmd.
    • Caps is Cmd — hold for Cmd, in both GUI apps and terminals. No CapsLock toggle in this mode.
    • Caps is Esc & Cmd — tap for Escape, hold for Cmd.
    • Caps is Esc & LCtrl always — tap for Escape, hold for a real, literal Ctrl even in GUI apps (so native Linux Ctrl shortcuts respond — handy for Emacs in a GUI window). The physical Left Ctrl is untouched.
    • Caps is Esc & LCtrl role swap — tap for Escape, hold takes over Left Ctrl's usual Toshy role (Super in GUI apps, real Ctrl in terminals); the physical Left Ctrl becomes the CapsLock toggle.
    • Caps is LCtrl role swap — Caps and Left Ctrl trade places, with no Escape behavior.
  • Several of the modes now cover terminals as well as GUI apps on Mac and Windows keyboards. The old Caps2Cmd toggle was GUI-only, which left CapsLock as a live toggle in terminal windows — a gap the mode system closes.
  • toshy-keycheck, a new interactive diagnostic command. It shows a single card in the terminal with the real hardware identity of the last key you released, what it was remapped to, and which modmap or multi-purpose modmap was responsible. Multi-purpose keys (like a CapsLock key in one of the tap/hold modes above) show both of their identities and how the press actually resolved — tap, hold-timeout, or a second key pressed while holding. It is a focused alternative to reading the full toshy-debug log stream. Like toshy-debug, it stops the Toshy services first (it explains this and asks before doing so), and reminds you to run toshy-services-restart when you exit.
  • The tray menu and GTK4 Preferences app were reorganized into columns with colored section headers, to fit the new CapsLock Mode group without crowding.

Fixes

  • The .git folder is no longer copied into the install location. Beyond wasting space, a stray .git in the installed tree could confuse tooling that walks up looking for a repository root.
  • The version script handles mistyped options more gracefully instead of failing unhelpfully.
  • Duplicate settings-change events no longer flood the debug log, which made real events hard to spot when tailing the output.
  • The vendor sync script (a maintainer-side tool) is no longer copied into user installs.

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

What's Changed

Full Changelog: Toshy_v26.07.0...Toshy_v26.07.1

Toshy v26.07.0

Choose a tag to compare

@RedBearAK RedBearAK released this 14 Jul 22:30
df4b857

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

Toshy v26.06.0

Choose a tag to compare

@RedBearAK RedBearAK released this 16 Jun 05:35
e29abe4

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-May through mid-June 2026.

Note: Some capabilities in this release depend on the matching xwaykeyz release, which provides the keymapper-side layout-correction support, the Level 3 Shift mapping, the related config APIs, a hardware quirk for the T2 Mac Touch Bar Fn key, and full touchpad support in suspend/resume logic. A fresh Toshy install pulls the required xwaykeyz version automatically.

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 API call like this one will not magically appear on its own, even after reinstalling. To try it, add the following to that section of your config manually, 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.18.0 or later
try:
    keyboard_layout_correction(
        enabled             = True,
        correct_number_row  = False,
    )
except NameError:
    pass

The try/except NameError guard keeps the config working even if the running keymapper predates the API. Which shouldn't happen.

New features and improvements

  • Non-US keyboard layout correction^ (off by default). Toshy can now detect the active XKB layout (and layout switching events) and correct the keymapper's US-positional keycode remapping rules so they fire on the correct physical keys for non-US layouts. This is a basic first pass that works in the most common desktop environments. A new kblayout_detect package provides priority-ranked backends for GNOME, KDE, Cinnamon, COSMIC, and a generic Wayland fallback, plus an X11/Xorg backend that covers any possible window manager or desktop environment running in an X11/Xorg session. The KeyboardLayoutAnalyzer builds the key-to-key correction map at startup or layout switch, and kblayout_setup wires it into the default config and the keymapper.
  • toshy-kblayout-check command and module, for testing whether Toshy can detect the active layout and layout switching, including a dedicated test script for Sway/wlroots sessions.
  • Level 3 Shift from the left Option position^^ (on by default, controlled by an overlay flag). The left-side Option key can now act as a Level 3 shift for the alphanumeric and punctuation block, giving access to any level 3/4 characters on layouts that have such layers, from the Option key position on both sides, in imitation of macOS special characters. (For use with layouts like the US English "Macintosh, ANSI" variant, or any layout in any language that has a Level 3 Shift key on the layout, and extra characters beyond the basic Shift layer.)
  • Alt_Gr on the Menu key (on by default). Maps the PC-laptop context-menu key to Right Alt, enabling a clean virtual right Cmd on laptops where the modifier rotation would otherwise not have a right-side virtualized Option/Alt key position. (Right-side Alt key on PC keyboards is typically turned into another virtualized Cmd key.)
  • Optional Super/Meta tap pass-through (off by default). Lets a bare Meta/Super tap fall through on the Option or Cmd positions instead of being consumed. Useful for desktop environments where you still want a tap of the usual Meta key position to still activate an app launcher, app menu or overview UI, even with Toshy's Mac-like scheme in operation. (GNOME users may still need to re-enable the overlay-key shortcut in the terminal.)
  • Process launcher that prevents zombie processes. Replaces the prior signal-based child reaping with an explicit launcher, fixing interaction with the GLib event loop on newer distros.
  • Distro-group tweak maps. Package and quirk tweaks can now target whole distro groups rather than being repeated per distro, and package/distro ID lists were flattened for easier maintenance.
  • Updated JetBrains keymap style, and fixed some JetBrains remaps.
  • Mac startup sound (boot chime) volume script made more user-friendly, with more consistent output info.
  • One-liner quick-install link added to the top of the README.
  • toshy-versions now reports versions for the overlay_context and kblayout_setup modules and the kblayout_detect package and its sub-modules, if called with --all option.

GUI and tray menu

  • The Preferences app and the tray indicator menu's Preferences submenu now expose controls for the new options. Added a toggle for Alt_Gr on the Menu key, and a new "Super Tap Passthru" group with switches for making the left Option and left Command positions act as Super/Meta when tapped (and their normal key when held or used in a combo).

Fixes

  • Remove SIGCHLD=SIG_IGN that broke the GLib event loop on newer distros. Community PR from @AhmedShaalan
  • Arch quirks handler for the libinput-tools package split.
  • Fix Chimera package list (remove libinput-tools).
  • Add the Wayland dev package to more distro package lists.
  • Keep diagnostic dialog text out of the journal, and indent it in the terminal for readability.

^ Shortcut rules in the default config are written against US key positions. On a non-US physical layout, the key at a given position differs, so those rules would otherwise fire on the wrong keys. It is off by default while the feature matures. The detection backends are priority-ranked. A desktop-environment-specific backend (GNOME, KDE, Cinnamon, COSMIC) is preferred when available, falling back to a generic Wayland backend, then X11, which keeps detection accurate across the desktop environments Toshy supports without assuming any single mechanism is present. The analyzer turns the detected layout into a key-to-key correction map that the keymapper applies on the hot path.

^^ This generates Left Alt → Right Alt combo rewrites for the alphanumeric and punctuation block, so holding the left Option key reaches the Alt_Gr (which is Level 3 Shift on some layouts) layer. It is on by default and can be toggled through the overlay flag system.


Auto-generated full release notes (click to expand):

What's Changed

New Contributors

Full Changelog: Toshy_v26.05.0...Toshy_v26.06.0

Toshy v26.05.0

Choose a tag to compare

@RedBearAK RedBearAK released this 07 May 12:01
317df08

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 March through early May 2026.

New distro support

  • Add support for NebiOS (Ubuntu-based, nebios distro ID), with detection of the NebiDE desktop environment via Wayfire config file path, and a NebiDE-specific keymap

New features and improvements

  • Default config overlays^ — group-level enable/disable for sets of default-config keymaps, with a new submenu in the tray indicator icon menu and a GTK4 dialog for managing overlay state at runtime
  • toshy-libinput command for inspecting libinput devices and managing the Toshy DWT quirk^^, with installer integration that prompts for reboot when the quirk is freshly installed
  • toshy-xkb-check command and module — detects XKB option choices that break Toshy's virtual Cmd key^^^, including a check of the KDE Plasma XKB rc file in addition to live session settings
  • XKB check integrated into the default config — surfaces a warning at startup when a conflicting XKB option is active so users aren't left wondering why shortcuts don't work
  • Pre-check infrastructure for matchProps — frequent context conditions (keyboard-type checks, overlay state) are evaluated once per event into booleans rather than re-evaluated inside every per-keymap closure, reducing redundant work on hot paths
  • Flatten functions and remove lambda wrappers in default config (continuation of the performance refactor started in v26.03.0)
  • Prevent SIGINT from Cmd+C in terminals (Ptyxis, Konsole) when no text is selected, by routing Cmd+C to a non-SIGINT shortcut in those apps
  • Cmd+Q remap for Brave browser — works once the user assigns the shortcut inside Brave's keybind settings (Brave does not bind one by default)
  • Dolphin Cmd+W now correctly handles the settings dialog

Fixes

  • Detect bad locale settings and sanitize Unicode strings when the locale cannot be repaired, with a diagnostic dialog explaining the situation
  • Adapt to Deskflow process consolidation in v1.24+ (single deskflow-core binary replaces the prior deskflow-server/deskflow-client split)
  • Improvements for Chimera Linux: BSD sed incompatibility in setup, AppIndicator quirks handler, and prompting the user to run apk update && apk upgrade before install
  • Catch fresh install of the libinput DWT quirk so the post-install reboot is not skipped, and start the service with the DWT flag in the correct state
  • Better error message when libinput quirks install fails
  • Detect Zorin OS 18 appindicator extension UUID
  • Adapt to missing systemd1 service name on some configurations
  • Prevent a file error when checking desktop environment versions
  • Improve the wlroots-dbus service exit log message
  • Convert remaining isKBtype conditional callables to booleans (correctness + perf)
  • Fix typo in install flag parsing

Installer/setup tweaks

  • Prompt for reboot when the libinput quirk was just installed, instead of bypassing the post-install reboot notice
  • Add libinput-tools (and related utilities) to more package lists across distros
  • Enhance attention-grabbing on bail/error messages during install
  • Add toshy-perf-test script for internal config-performance measurement

^ The overlays system lets users selectively disable groups of keymaps from the default config without editing the file. Each overlay is tracked in settings and can be toggled from the "Overlays" submenu in the tray indicator icon's menu, or a GTK4 dialog in the Toshy Preferences app, making it easy to turn off, e.g., browser-specific or terminal-specific keymap blocks when they conflict with the user's workflow.

^^ DWT (Disable While Typing) is a libinput feature that ignores touchpad input while the user is typing. The toshy-libinput command makes it straightforward to install/remove the Toshy DWT quirk, list devices, and inspect libinput state without hand-editing system files under /etc/libinput/.

^^^ XKB options like compose:rctrl redefine Right Ctrl in ways that break Toshy's virtual Cmd key, which is mapped to RIGHT_CTRL. The check identifies these conflicts at startup — including the case on KDE Plasma where the option is set in the rc file but not yet reflected in the live session — and warns the user before they hit confusing shortcut breakage.


Auto-generated full release notes (click to expand):

What's Changed

Full Changelog: Toshy_v26.03.0...Toshy_v26.05.0

Toshy_v26.03.0

Choose a tag to compare

@RedBearAK RedBearAK released this 01 Mar 14:19
619b32e

Toshy v26.03.0

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 is a catch-up release covering roughly August 2025 through February 2026.

New distro support

  • Add support for Gentoo Linux (portage/emerge, USE flags, Wayland emerge support)
  • Add support for AerynOS (moss package manager)^ — community PR from @armerpunkt
  • Add LMDE 7 support (handles linuxmint distro ID)
  • Support Omarchy on ARM (archarm distro ID)

New features and improvements

  • Optimize matchProps calls by hoisting repeated variables out of per-keymap lambda closures — significant config refactor reducing redundant evaluations
  • VSCode embedded terminal: copy/paste override for the integrated terminal (disabled paste override that conflicted with selection buffer)
  • VSCode Find: Replace All (Cmd+Enter) remap added
  • Enter-to-rename made more reliable in file managers
  • More robust systemd service setup script, with verbose debug mode split into a separate file
  • D-Bus services now handle SIGTERM cleanly and unbuffer output for better log visibility
  • Warn about Cinnamon Wayland session bugs when detected
  • Handle wrapped process names on NixOS (e.g., /nix/store/.../firefox style paths)
  • Show how to open Cinnamon Menu with Cmd+Space in post-install notes
  • Bypass the initial install reboot notice when feasible (uinput already loaded)

Fixes

  • Fix memory leak in wlroots-dbus service^^ — community PR from @higorprado
  • Fix GNOME extension check to look for both user-installed and system-installed extensions (was missing user extensions on Ubuntu)
  • Fix numbered tab navigation in Firefox and Chrome browsers
  • Fix delete/kill line shortcut in KWrite (uses Ctrl+K)
  • Fix Contour terminal decrease font size shortcut
  • Catch firefox_firefox app class variant (snap/flatpak naming)
  • Update Ghostty app class and keymap for recent Ghostty changes
  • Add firefox-nightly to Firefox app class list
  • Pin PyGObject<=3.50.0 on systems without GLib>=2.80 (fixes install failures on older distros)^^^
  • Handle libgirepository-2.0-dev on newer Debian/Ubuntu (GObject introspection API change)
  • Add wayland-devel to RHEL-based package list
  • Fix package name and quirks handler for Solus (older versions)
  • Install more GTK4 support packages on newer Debian/Ubuntu
  • Fix bootstrap script repo directory case after rename — community PR from @keith-ferney
  • Fix broken README link for unrecognized keyboards — community PR from @robstrong
  • Fix reinstall command script, fix Ark not creating symlinks from zip file
  • Remove broken symlinks to service scripts (from previous refactor)
  • Remove Dict import, stringify remaining type hints (Python 3.6/3.14+ compat)

Installer/setup tweaks

  • Improve logging and quirks handling on Solus (color codes contaminating search output)
  • Refine logging of PyGObject version pinning decisions
  • Stage future Ayatana Indicators package for Debian/Ubuntu
  • Promote repeat_cache keymapper option over ignore_repeating_keys in config
  • Update Apple keyboard devices list
  • Adjust default throttle delays (8ms/12ms)
  • Bootstrap script: reorder options first, quiet unzip

^ AerynOS uses the moss package manager, which required a new package handler type in the setup script.

^^ The wlroots D-Bus service had a file descriptor leak that could gradually consume resources, possibly only on smithay-based compositors like Niri.

^^^ PyGObject 3.52+ requires GLib 2.80+, which isn't available on distros like RHEL 8/9, older Ubuntu LTS, etc. The installer now detects this and pins automatically instead of failing cryptically during pip install.


Auto-generated full release notes (click to expand):

What's Changed

New Contributors

Full Changelog: Toshy_v25.08.0...Toshy_v26.03.0

Toshy v25.08.0

Choose a tag to compare

@RedBearAK RedBearAK released this 31 Jul 05:45
236b5e4

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

  • Complete refactor of GUI app from single script into multi-module Python package
  • Port refactored tkinter Preferences app GUI to GTK-4 (dependencies unchanged)
  • GTK-4 app updated to have feature parity with tray icon indicator app menu^
  • Expanded the list of files checked by toshy-versions script for revision dates
  • Mac startup sound/boot chime script warns re: low volume values (may be inaudible)
  • Install icons the more correct way, in hicolor theme folders (freedesktop spec)
  • Reduce ram usage, maybe? (by using exec to drop extra shell layers)^^
  • Improve some process names (also from using exec to drop extra shell layers)
  • Add script to install necessary shell extensions in GNOME automatically [UNTESTED]
  • Added toshy-reinstall command (starts bootstrap script, offers to reinstall)

^ For those who can't (or don't want to) run the GTK-3 tray indicator app, the new refactored and ported GTK-4 Toshy Preferences app has controls for all the same preferences, options and actions that have previously only been fully available in the tray icon menu. The ported Preferences app uses the same gi.repository as the indicator app, so there were no new packages or Python imports required to make it work. The Preferences app will now work on Linux distros that don't have a Python tkinter package available (e.g., Chimera).

^^ It's possible the reduced RAM usage might make Toshy have less of an issue on a very low-memory system. Hard to say. Having a multi-core CPU vs. single or dual-core has more of an impact in most cases that I've seen. But those extra shell layers could be using anywhere from 30-100MB each while apparently doing nothing but waiting for the process they launched to exit.

Auto-generated full release notes (click to expand):

What's Changed

Full Changelog: Toshy_v25.07.0...Toshy_v25.08.0

Toshy v25.07.0

Choose a tag to compare

@RedBearAK RedBearAK released this 30 Jun 02:54
d37af5d

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 single command.

Changes

  • Make setting PATH for access to local-bin more robust
  • Adapt to some bugs on Deepin Desktop Environment and deepin-terminal
  • Add support for Mageia Linux (related to Mandrake, OpenMandriva)
  • Make sure to handle Tk 9 and updated theme module for GUI app
  • Log which sub-method logic branch is used in DNF distro handler
    • (DNF handler deals with Fedora, Mageia, OpenMandriva, and RHEL distro types)
  • Refine terminal output from Mac startup sound volume control script
  • Add asyncio based multi-tap support (see notes)

Notes on Multi-Tap Implementation

Replacing the rough "hack" in the config that just detected if something hit the function twice, which unfortunately blocked the normal single-tap usage of the same combo globally, there is now an experimental implementation of true multi-tap support, using asyncio to deal with the time delays and repeated input that happens (or doesn't happen before the delay times out) before emitting the final action "later". Default timing is 0.25s between tap levels.

If the same input combo is designated as the single-tap action, it is effectively non-blocking for the original combo, while also allowing double-tap or higher (up to a 5-tap action is allowed) uses of the same combo to instead perform some different combo or action. Anything beyond 5 taps of the same input will be ignored/blocked.

The rest of the config has no interaction with the multi-tap logic at all if no multi-tap combo is encountered, so no latency or performance difference should be seen for any other kind of remapped input. The diagnostic dialog will still appear for either Shift+Opt+Cmd+I,I or Shift+Opt+Cmd+H,H (double-taps of the final key in the combo, just like before).

Actions allowed in a multi-tap combo

  • Keys (only useful for emitting modifier key presses alone)
  • Combos (normal way to emit any key or Mod[s]+key shortcut)
  • String processor calls (the ST() alias)
  • Macros (lists of things like Keys, Combos, strings, sleeps, etc.)
  • Arbitrary function calls (e.g. diagnostic dialog, macro test functions)

Syntax for multi-tap combos inside keymaps:

Several examples for the multi-tap syntax are in the newer diagnostic shortcuts keymap at the end of the default config files.

Using None will block a tap level action. Designating the same combo as the single-tap action will make the multi-tap combo "transparent" as far as apps are concerned (i.e., it will work normally in addition to the multi-tap actions, in any app that will do something in response to that combo). Arbitrary functions and lambdas can be used as actions, such as the function that produces the diagnostic dialog.

Anything with a string output action should be tested in a text editor. Print commands in custom functions or lambdas will only appear in terminal logging (what you see when using the toshy-debug command).

keymap("Diagnostics (isMultiTap)", {

    C("Shift-Alt-RC-i"): isMultiTap(
                            # tap_1_action=None,  # Block single tap
                            tap_1_action=C("Shift-Alt-C-i"),    # Keep original single-tap combo
                            tap_2_action=notify_context,
                        ),

    C("Shift-Alt-RC-h"): isMultiTap(
                            tap_1_action=C("Shift-Alt-RC-h"),   # Keep original single-tap combo
                            tap_2_action=notify_context,
                            tap_3_action=lambda: print("\nTriple tap!\n"),  # Shows in terminal
                        ),

    C("Shift-Alt-RC-t"): isMultiTap(
                            tap_1_action=C("C-n"),          # Test single-tap by opening new window
                            tap_2_action=macro_tester,      # Types out a long test macro text
                            tap_3_action=[
                                ST("You tapped Shift-Alt-C-t 3 times!!!"),
                                C("Enter"), C("Enter")],
                            tap_4_action=[
                                ST("You tapped Shift-Alt-C-t 4 times!!!!"),
                                C("Enter"), C("Enter")],
                            tap_5_action=[
                                ST("You tapped Shift-Alt-C-t 5 times!!!!!"),
                                C("Enter"), C("Enter")],
                        ),

}, when = lambda ctx: ctx is ctx)
Auto-generated full release notes (click to expand):

What's Changed

Full Changelog: Toshy_v25.06.1...Toshy_v25.07.0

Toshy v25.06.1

Choose a tag to compare

@RedBearAK RedBearAK released this 13 Jun 06:47
2e0749a

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 single command.

Changes

  • Clean up indicator (tray icon) menu items with new submenu
  • Some shortcut fixes for Vivaldi browsers (numbered tab navigation, preferences)
  • Fix the Cmd+Space remap on Xfce, on AlmaLinux/Rocky Linux
  • Make Mac startup sound volume control script more user friendly
  • Services restart script may be more reliable in edge cases
  • Plasma KWin script for window context now detects window title changes (e.g., what happens when switching tabs in browsers, terminals, file managers, etc.) without needing a full windowActivated event signal, by subscribing to captionChanged signal for each activated window. Plasma window context accuracy (in regard to window titles) will now be on par with other Wayland environments (and X11).
Auto-generated full release notes (click to expand):

What's Changed

Full Changelog: Toshy_v25.06.0...Toshy_v25.06.1

Toshy v25.06.0

Choose a tag to compare

@RedBearAK RedBearAK released this 04 Jun 05:39
cbe8247

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 single command.

Changes

  • Add sudo-rs as another sudo alternative for setup script (untested for now)
  • Support another Ubuntu variant, AnduinOS (Windows-like GNOME-based UI)
  • Use thread-safe GUI update methods in preferences app, to prevent segfault in Tk 9.0
  • Prevent version check error in GUI app when used with Tk 9.0 ( seen on OpenMandriva)
  • Use thread-safe menu/icon update methods in tray indicator app
Auto-generated full release notes (click to expand):

What's Changed

Full Changelog: Toshy_v25.05.1...Toshy_v25.06.0