[object Object]

← back to Ticket System

beacon: pin to Steve's screen 1 by display ID (LG ULTRAWIDE, id 5) not macOS primary; defaults-overridable via beaconDisplayID (TK-11693)

0616e22bb0e92b5ac6d56ee016e861fe57bbc89b · 2026-09-13 23:58:04 -0700 · Steve Abrams

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q3N4rPMPvxXqQPbpQfHorw

Files touched

Diff

commit 0616e22bb0e92b5ac6d56ee016e861fe57bbc89b
Author: Steve Abrams <steve@designerwallcoverings.com>
Date:   Sun Sep 13 23:58:04 2026 -0700

    beacon: pin to Steve's screen 1 by display ID (LG ULTRAWIDE, id 5) not macOS primary; defaults-overridable via beaconDisplayID (TK-11693)
    
    Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
    Claude-Session: https://claude.ai/code/session_01Q3N4rPMPvxXqQPbpQfHorw
---
 desktop-bar/TicketBar.swift | 19 ++++++++++++++++---
 1 file changed, 16 insertions(+), 3 deletions(-)

diff --git a/desktop-bar/TicketBar.swift b/desktop-bar/TicketBar.swift
index 2e7fba9c..adc05613 100644
--- a/desktop-bar/TicketBar.swift
+++ b/desktop-bar/TicketBar.swift
@@ -677,10 +677,23 @@ private final class BarController: NSObject, NSApplicationDelegate, NSWindowDele
     if dots.count != beaconCount { NSLog("TicketBar beacon COUNT %d", dots.count); beaconCount = dots.count }
   }
 
-  // Pin to screen 1 = NSScreen.screens.first (the (0,0)/menu-bar screen), top-center
-  // just under the menu bar. Zero screens → no-op (never crash).
+  // Steve's "screen 1" is NOT the macOS menu-bar/primary (that's NSScreen.screens.first).
+  // Pin to the display whose CGDirectDisplayID matches the "beaconDisplayID" default
+  // (default 5 = LG ULTRAWIDE, confirmed by Steve TK-11693). Override without a rebuild:
+  //   defaults write ticket-desktop-bar beaconDisplayID -int <N>
+  // Fall back to main/first screen if that display is disconnected. Zero screens → no-op.
+  private func beaconTargetScreen() -> NSScreen? {
+    let want = (UserDefaults.standard.object(forKey: "beaconDisplayID") as? Int) ?? 5
+    for s in NSScreen.screens {
+      if let n = s.deviceDescription[NSDeviceDescriptionKey("NSScreenNumber")] as? NSNumber,
+         n.intValue == want { return s }
+    }
+    return NSScreen.main ?? NSScreen.screens.first
+  }
+
+  // Pin to Steve's screen 1 (see beaconTargetScreen), top-center just under the menu bar.
   private func positionBeacon(lineCount: Int) {
-    guard let screen = NSScreen.screens.first else { return }
+    guard let screen = beaconTargetScreen() else { return }
     let full = screen.frame
     let visible = screen.visibleFrame
     let width: CGFloat = 620

← 30a93d61 TK-11676: mechanically cap masterdot-* tk-new authority (ded  ·  back to Ticket System  ·  run-ticket: close finished ticket window via /cs + /compact 94b9bb86 →