Skip to content

Add allowlist mode for app filtering #165

@artginzburg

Description

@artginzburg
  • I couldn't find this feature described in a dedicated issue or the docs.
  • The suggestion is relevant for the trackpad.
  • The suggestion is relevant for Magic Mouse.

Is your feature request related to a problem? Please describe.
ignoredAppBundles works as a denylist: MiddleClick is active everywhere except the listed apps. For users who only want MiddleClick in one or two specific apps (e.g. VLC), this requires enumerating every other app they use — impractical and incomplete.

Describe the solution you'd like
Add a list mode alongside the existing ignoredAppBundles, toggling its semantics between denylist and allowlist. These are mutually exclusive philosophies — no reason to support both at the same time.

Config

Add a new default, e.g.:

defaults write art.ginzburg.MiddleClick appBundleListMode -string allow  # or "ignore" (default)

When mode = ignore (default): behavior is unchanged — the existing list acts as a denylist.
When mode = allow: the same list acts as an allowlist — MiddleClick only activates for the apps in it.

The underlying storage (ignoredAppBundles) can be kept for backward compatibility, or renamed to something neutral like appBundles via UserDefaultsMigration.swift.

UI

The menu already has a single "Ignore (current app)" entry at the top. With this change, its label should flip based on mode:

  • Mode = Ignore, app not in list: "Ignore "
  • Mode = Ignore, app in list: "Stop ignoring "
  • Mode = Allow, app not in list: "Enable only for "
  • Mode = Allow, app in list: "Disable for "

Mode toggle itself can live in a submenu or an "Advanced" section — it's a rarely-flipped setting, no need for prominence.

Describe alternatives you've considered

  • Having two parallel lists (ignoredAppBundles + allowedAppBundles) with a precedence rule — rejected because it allows semantically contradictory state and clutters the UI with two buttons.
  • Exposing only via defaults with no UI — works, but the existing one-click "Ignore current app" UX is valuable and shouldn't regress.

Additional context
Originally requested in #148. Core filtering logic lives near AppUtils.isIgnoredAppBundle() (called from TouchHandler.swift). Should be a small change: one mode check, one UI label branch.

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions