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.
Is your feature request related to a problem? Please describe.
ignoredAppBundlesworks 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 likeappBundlesviaUserDefaultsMigration.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 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
ignoredAppBundles+allowedAppBundles) with a precedence rule — rejected because it allows semantically contradictory state and clutters the UI with two buttons.defaultswith 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 fromTouchHandler.swift). Should be a small change: one mode check, one UI label branch.