Repository navigation
v92
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,
iswindowsandismacos, 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/rightwinare the command keys andleftalt/rightaltthe 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-sizeis nowposition-history.max-size. Sincehint.typecan 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-variableandreset-variablesare gone. A virtual key does everything a variable did and reads like a key: declare it in the globalvirtual-keyslist, 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.isidlingis 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=valuesuffix 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%} -> 3screen-aliasnames 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.67draws a single pixel at 150%. -
UI hints have their own area:
hint.ui-areaselects the windows UI hints look in (active-screen,all-screens,active-window), instead of borrowinghint.grid-area. The two are now exclusive:grid-areaonly applies tohint.type=grid, and setting it on a UI hint mode is rejected. -
Hint box frames:
box-framedandprefix-box-framed(defaulttrue) 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/todocs/, 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
- Download mousemaster.exe (a portable executable).
- Download one of the existing configuration files:
- neo-mousekeys-ijkl.properties (recommended): an IJKL configuration (see documentation)
- neru.properties: a recursive hint configuration (see documentation)
- neo-mousekeys-wasd.properties: a WASD configuration (see documentation)
- warpd.properties: an HKJL configuration (see documentation)
- mouseable.properties: another HKJL configuration (see documentation)
- author.properties: an IJKL configuration designed to control everything with the right hand only (see documentation)
- Place the executable and the configuration file in the same directory.
- Rename the configuration file to mousemaster.properties.
- Run mousemaster.exe: make sure to run it as administrator if you want the mousemaster overlay to be displayed on top of everything else.
- 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.
- 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.
- Install Karabiner-Elements, which installs the virtual HID device, and allow its system extension when macOS asks.
- Download and unzip mousemaster-macos.zip, then put mousemaster.app in /Applications.
- 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. - Download one of the configuration files above, place it in /Applications next to mousemaster.app, and rename it to mousemaster.properties.
- 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 - 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.