Skip to content

v92

Choose a tag to compare

@github-actions github-actions released this 12 Aug 10:38
· 435 commits to main since this release

New features and improvements

  • macOS support: mousemaster now runs on macOS, with everything Windows has: mouse movement, clicks and scrolling, the grid, the indicator, hints (grid, position history and UI hints), zoom, key remapping and macros. Download mousemaster-macos.zip below — it holds a universal app bundle that runs on both Apple Silicon and Intel. The keyboard is read through the Karabiner virtual HID device, so Karabiner-Elements has to be installed, and mousemaster has to be started as root. macOS asks for a few permissions: Input Monitoring always, Accessibility for UI hints, and Screen Recording for zoom. See the installation steps. macOS support is new and testers are wanted: please report what does and does not work in an issue.

    Two built-in keys, iswindows and ismacos, let one configuration file cover both:

    ui-hint-mode.hint.font-size=10 | _{ismacos} -> 13
    hint1-mode.hint.font-name=Segoe UI Symbol | _{ismacos} -> Helvetica Neue

    On macOS, leftwin/rightwin are the command keys and leftalt/rightalt the option keys.

  • Several position histories: a history is named like a mode, ending in -position-history, and every command and hint mode names the one it acts on. A history can also keep a separate list per app, so a position saved in one app never shows up in another.

    browser-position-history.max-size=8
    browser-position-history.isolation=active-app
    app-alias.browserapp=firefox.exe chrome.exe edge.exe
    normal-mode.browser-position-history.save-position=_{browserapp} +f2
    browser-hint-mode.hint.type=browser-position-history

    The global max-position-history-size is now position-history.max-size. Since hint.type can be combo-triggered, one hint mode can show different histories: position-hint-mode.hint.type=position-history | _{browserapp} -> browser-position-history.

  • Virtual keys replace variables: variable., set-variable, unset-variable and reset-variables are gone. A virtual key does everything a variable did and reads like a key: declare it in the global virtual-keys list, press it from a macro with #/+, release it with ~/-, and test it with _{}/^{}. Unlike a variable, it can share a precondition block with a real key. A + prefix in the declaration makes it pressed from the start. isidling is now a built-in virtual key.

    virtual-keys=iszoom +showkeys
    hint-mode.macro.setiszoom=^{iszoom} +z -> #iszoom
    hint-mode.macro.unsetiszoom=_{iszoom} +z -> ~iszoom
    hint-mode.zoom.percent=1.0 | _{iszoom} -> 2.0
    hint-mode.hint.box-color=#000000 | _{iszoom rightalt} -> #FF00FF
  • Screen-specific values are a precondition now: the property.3840x2160=value suffix is replaced by a branch on the screen, like a branch on a key. A filter is a resolution (3840x2160), a scale (150%), or both (3840x2160-150%), and it can sit in the same block as a key. Each screen resolves its own value when the hints are drawn, so a hint mesh covering several screens gets a value per screen.

    hint1-mode.hint.box-border-radius=1 | _{200%} -> 3

    screen-alias names a set of screens once, like a key alias, so a screen is written down in one place instead of once per property:

    screen-alias.largescreen=3840x2160-100% 3440x1440-100%
    hint1-mode.hint.grid-max-column-count=25 | _{largescreen} -> 40

    The built-in configurations were rewritten around this and lost about a thousand lines of per-resolution duplication.

  • Every length scales with the screen: paddings, border thicknesses, radiuses, border lengths, shadow blurs and offsets and grid line thicknesses are now in the pixels of a 100% screen, and the screen's scale grows them, exactly as it already grew font sizes. Hints and grids therefore keep their proportions on a 200% or 300% screen with no per-screen value at all. To pin a length to a pixel count on one scale, override it there and divide: hint.box-border-thickness=1 | _{150%} -> 0.67 draws a single pixel at 150%.

  • UI hints have their own area: hint.ui-area selects the windows UI hints look in (active-screen, all-screens, active-window), instead of borrowing hint.grid-area. The two are now exclusive: grid-area only applies to hint.type=grid, and setting it on a UI hint mode is rejected.

  • Hint box frames: box-framed and prefix-box-framed (default true) choose whether the outer frame around the whole grid is drawn, or only the lines between the boxes. A border is also never drawn where an enclosing one already draws it, so hint boxes no longer double the prefix box's border.

  • Also: The documentation moved from configuration/ to docs/, and every built-in configuration now has a keyboard layout image and is linked from the readme. The neo-mousekeys configurations gained a recursive hint mode, on r, drilling with u i o j k l m , .. mousemaster now exits when the console it was started from is closed, and the executable carries proper version information in the Windows Task Manager.

Installation on Windows

  1. Download mousemaster.exe (a portable executable).
  2. Download one of the existing configuration files:
  3. Place the executable and the configuration file in the same directory.
  4. Rename the configuration file to mousemaster.properties.
  5. Run mousemaster.exe: make sure to run it as administrator if you want the mousemaster overlay to be displayed on top of everything else.
  6. Feel free to open a GitHub Issue or join the Discord if you need help creating your own configuration. If you have ideas for a better configuration that you would like to share, I'd love to hear from you.
  7. If you enjoy mousemaster, consider making a donation or stop by the Discord to show your support!

Installation on macOS

mousemaster reads the keyboard through the Karabiner virtual HID device, so that driver and a few permissions are needed.

  1. Install Karabiner-Elements, which installs the virtual HID device, and allow its system extension when macOS asks.
  2. Download and unzip mousemaster-macos.zip, then put mousemaster.app in /Applications.
  3. mousemaster is not signed or notarized, and macOS refuses to start a quarantined app that is not notarized. A browser download marks it as quarantined, so clear that before the first launch: xattr -dr com.apple.quarantine /Applications/mousemaster.app. Or let macOS refuse it once, then allow it under System Settings > Privacy & Security > Security, where an Open Anyway button appears for it.
  4. Download one of the configuration files above, place it in /Applications next to mousemaster.app, and rename it to mousemaster.properties.
  5. Run it from a terminal, as root, which the virtual HID device requires. The configuration is read from the working directory, so start it from where you put it: cd /Applications && sudo mousemaster.app/Contents/MacOS/mousemaster
  6. Grant the permissions macOS asks for, under System Settings > Privacy & Security, then quit and relaunch:
    • Input Monitoring, to read the keys you press. Always needed.
    • Accessibility, only for UI hints (hint.type=ui).
    • Screen Recording, only for zoom (mode.zoom).

License

mousemaster.exe and mousemaster.app embed Qt and QtJambi, used under the GNU Lesser General Public License. Run mousemaster with --licenses for the third-party notices and the full license texts.