Skip to content

v0.2.0 — multi-entry mode

Latest

Choose a tag to compare

@mattabott mattabott released this 24 Apr 11:14

What's new

  • Multi-entry mode. Pass --entry MONITOR:DIRECTION repeatably on the CLI to ferry to a single Android device from multiple monitor edges at once. Example: mouseferry --entry 1:right --entry 2:bottom triggers the ferry both from the right edge of monitor 1 and from the bottom edge of monitor 2.
  • All four directions. top and bottom join left and right as valid edges (top/bottom available only via --entry, not in single-entry config mode).
  • Dynamic return. By default, the cursor returns based on your sweep direction: sweep left/right → warp to the monitor of an entry with right/left direction; sweep up/down → warp to an entry with top/bottom. No need to remember which entry triggered the ferry — the sweep itself picks where to come back. A new pure helper winning_entry() evaluates all configured entries against the current sweep accumulator.
  • --return MONITOR override. Forces a fixed return target (warp to center of that monitor regardless of sweep direction) for users who prefer the static behavior.
  • Conflict-tolerant CLI. Passing --left/--right/--monitor alongside --entry prints a warning (not an error) and proceeds in multi-entry mode. Safe for incremental migration.
  • Pre-flight validation. Malformed --entry values fail fast with a clear message and exit 2, before any X/adb/evdev I/O. Works cleanly in headless/CI contexts too.

Fixed

  • entry_matches bounding-box bug. The edge check now verifies the cursor is inside the target monitor's full bounding box before checking proximity to the named edge. Previously --entry DisplayPort-2:bottom could match instantly at launch if the cursor was on a different monitor located below DisplayPort-2. The same bug existed latently in v0.1.1 but was invisible in most setups. 4 regression tests added.

Tests & CI

  • 61 unit tests (up from 24 in v0.1.0). New coverage for parse_entry_spec (8), direction_return_config (5), entry_matches happy path + cursor-past-edge regressions (13), winning_entry (7), plus threshold/whitespace edge cases. CI (ruff + pytest) green on every push.

Compatibility

  • 100% backward compatible. No --entry? Same behavior as v0.1.1 — config-driven single-entry on left/right.
  • Multi-entry is CLI-only by design (no [entries] config section). Use shell aliases for recurring setups:
    alias mf-office='mouseferry --entry 1:right --entry 2:bottom'
  • Linux / X11 only (Wayland unchanged). Hotplug still requires restart.

Closes

  • #1 — Multi-entry monitors with per-monitor direction