Skip to content

feature: Sound suppression settings (focus/visibility modes)#39

Open
akdoan1 wants to merge 2 commits into
farouqaldori:mainfrom
akdoan1:feature/sound-suppression-settings
Open

feature: Sound suppression settings (focus/visibility modes)#39
akdoan1 wants to merge 2 commits into
farouqaldori:mainfrom
akdoan1:feature/sound-suppression-settings

Conversation

@akdoan1

@akdoan1 akdoan1 commented Jan 14, 2026

Copy link
Copy Markdown

Summary

Add a setting to suppress notification sounds based on terminal/app focus or visibility state.

image

Fixes #38

Changes

  • Add three-way "Sound Suppression" picker: Never, When Focused, When Visible
  • Fix terminal focus detection for iTerm/Warp child process architecture
  • Add accurate window occlusion detection using OcclusionKit

Dependencies

  • OcclusionKit - Swift library for macOS window occlusion detection (added as Swift Package dependency)

New Files

  • ClaudeIsland/Core/SuppressionSelector.swift - Picker state management
  • ClaudeIsland/UI/Components/SuppressionPickerRow.swift - Picker UI component

Modified Files

  • Settings.swift - Add SoundSuppression enum and setting
  • NotchViewModel.swift - Observe suppression selector
  • NotchMenuView.swift - Add picker to menu
  • NotchView.swift - Update sound logic
  • TerminalVisibilityDetector.swift - Fix focus detection, add occlusion detection via OcclusionKit

Test plan

  • Never mode: Sound always plays
  • When Focused + Claude Island focused: Suppressed
  • When Focused + Terminal focused: Suppressed
  • When Visible + Terminal visible: Suppressed
  • When Visible + Terminal minimized: Sound plays
  • When Visible + Terminal on different desktop: Sound plays
  • When Visible + Terminal >50% covered: Sound plays
  • When Visible + Terminal ≤50% covered: Suppressed

🤖 Generated with Claude Code

- Add three-way picker: Never, When Focused, When Visible
- When Focused: Suppress when Claude Island or terminal is active
- When Visible: Suppress when terminal is visible (>50% unobscured)
- Fix terminal focus detection for iTerm/Warp child process architecture
- Add window occlusion detection using z-order and bounds overlap

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
@akdoan1 akdoan1 changed the title Feature: Sound suppression settings (focus/visibility modes) feature: Sound suppression settings (focus/visibility modes) Jan 15, 2026
Replace custom occlusion logic with OcclusionKit library for more
accurate window visibility detection in session state dots.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
pjh4993 pushed a commit to pjh4993/claude-island that referenced this pull request Feb 20, 2026
…roj (farouqaldori#39)

agvtool new-marketing-version doesn't work when Info.plist uses
$(MARKETING_VERSION) variable references - it fails silently.

This fix:
- Uses sed to directly update MARKETING_VERSION in project.pbxproj
- Uses sed to directly update CURRENT_PROJECT_VERSION in project.pbxproj
- Also manually sets project.pbxproj to 1.3.3 (the correct version after
  the v1.3.3 release, which was built with the buggy workflow)

Tested: sed commands correctly update both version fields in project.pbxproj
Kel-Antony added a commit to Kel-Antony/claude-island that referenced this pull request Apr 10, 2026
Phase 3 features:
- farouqaldori#35/farouqaldori#53: Terminal focus without Yabai. Walks the process tree to find
  the parent terminal (Ghostty/iTerm2/Warp/Terminal.app/Alacritty) and
  activates via NSWorkspace. Adds non-tmux message send via AppleScript
  and System Events.
- farouqaldori#40: Session state dots in the collapsed island. Shows colored dots
  (blue=approval, orange=processing, green=waiting for input) when
  multiple sessions are active. Rendered in both notch and pill modes.
- farouqaldori#45: External display pill mode. Uniform rounded PillShape for
  displays without a physical notch, with a compact "X running / Y idle"
  status row.

Phase 4 fixes from upstream:
- farouqaldori#78: security/correctness/perf bugs - socket 0o600, stable SHA256 IDs
  in MessageBlock (replaces randomized hashValue), GenericResult equality
  with rawData, Bool-before-NSNumber in MCPToolFormatter, cached
  ISO8601DateFormatter, generate-keys key pair bug + chmod, create-release
  in-place sed, build.sh set -eo pipefail with error reporting.
- farouqaldori#51: Local.xcconfig support in build.sh plus .gitignore entry.
- farouqaldori#39: Sound suppression picker (Never / When Focused / When Visible).
- farouqaldori#34: Periodic 3s session recheck in SessionStore detects dead
  processes and re-syncs active ones.
- farouqaldori#61: Quit/menu hover fix - moves .contentShape onto the Button.

UX polish:
- Hover-to-open delay reduced from 1.0s to 0.1s; auto-close on mouse
  leave after 0.15s for hover-opened panels (chat mode stays sticky).
- Opened-panel hit rect now uses full menu height so tall menus with
  expanded pickers stay hoverable all the way down to Quit.
- Right-click anywhere on the pill shows a "Quit Claude Island"
  context menu via a global rightMouseDown event monitor.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Feature: Sound suppression settings (focus/visibility modes)

1 participant