Skip to content

v2 edition: language switch, night mode, macOS 27 and crash fixes - #11

Open
hakanotal wants to merge 9 commits into
huberdf:mainfrom
hakanotal:turkish-english-edition
Open

hakanotal wants to merge 9 commits into
huberdf:mainfrom
hakanotal:turkish-english-edition

Conversation

@hakanotal

Copy link
Copy Markdown

Hi, I maintain a fork of FreeDisplay with a new UI and a set of fixes: https://github.com/hakanotal/FreeDisplay

I'm opening this mainly so people browsing the PRs can find it. I don't expect it to be merged as-is: the fork makes new changes in UI language (English/Turkish is one click away in Settings) and replaces the Chinese planning docs. The crash fixes below don't depend on the translation and may be worth cherry-picking.

What's new

  • Turkish + English UI with a live language switch in Settings
  • Night mode: blue light filter, always on or on a daily schedule
  • macOS 27: the menu no longer collapses to just the footer, and it shrinks back when sections collapse (likely the same issue as feat: Sidecar portrait mode + fix blank menu bar panel on macOS 26 #9 on macOS 26)
  • Auto-restart after a crash (per-user launchd agent); HiDPI asks for the admin password once per monitor instead of on every toggle
  • Universal build without Xcode (./scripts/build-dmg.sh); ready-made DMG on the releases page

Crash fixes worth cherry-picking

Crash Cause Fix
Changing brightness or applying a preset DDC completion closures were inferred @MainActor but called on the DDC queue, so Swift 6's runtime isolation check trapped @Sendable completions in DDCService
Choosing a color profile CMYK, gray, Lab and abstract ICC profiles passed to ColorSyncDeviceSetCustomProfiles abort inside SkyLight only list mntr + RGB profiles in ColorProfileService
Resolution switch fallback CGSConfigureDisplayMode was called with a connection ID instead of a CGDisplayConfigRef real signature inside a configuration transaction in ResolutionService
Display arrangement CGCancelDisplayConfiguration after a failed CGCompleteDisplayConfiguration, which already invalidates the config (use-after-free) ArrangementService
Brightness pop-up XPC error handler inferred @MainActor but called on the XPC queue @Sendable handler in BrightnessHUDService

More detail in docs/LESSONS.md.

hakanotal and others added 9 commits October 2, 2026 21:57
- Replace all hardcoded Chinese UI strings (labels, buttons, tooltips,
  alerts, VoiceOver labels, error messages, default names) with Turkish
- Translate the screen-capture permission prompt and copyright string
  (project.yml + project.pbxproj)
- Widen a few fixed-width labels to fit longer Turkish text
  (brightness value label, virtual display form labels)
- Add in-app credit row in Settings linking to github.com/hakanotal
- Add Contributors section to README and an Unreleased CHANGELOG entry

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Add in-app UI language switch (Settings → Dil / Language, Türkçe/English),
  persisted under fd.language; all UI strings go through L("tr", "en") and
  re-render live via an Observable LanguageStore
- macOS 27: pin the menu ScrollView to its measured content height (the panel
  was sized to the content's minimum and collapsed to the footer) and use
  .windowResizability(.contentSize) so the panel shrinks when sections collapse
- Fix Swift 6 runtime isolation traps: DDC read/write completions and the
  brightness OSD XPC error handler are now @sendable (crashed when changing
  brightness or applying presets)
- Color profile subtitle shows the active ICC profile description (e.g. the
  monitor's EDID profile) instead of "Unknown", refreshing on color space change
- Remove built-in "Native Mode"/"HiDPI Mode" preset buttons from the menu;
  right-align Settings switches; remove in-app translator credit row
- Bump version to 2.0; README "What's Changed in This Fork" + CHANGELOG

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- NightModeService: Off / On / Scheduled modes, start/end times (overnight
  ranges supported), warmth setting, 1.5 s fades; re-evaluates every 30 s,
  on wake and on clock/time zone changes
- GammaService: global night tint multiplied into every transfer write,
  alongside image adjustments and software brightness; restored on wake,
  hot-plug, pause and reset
- BrightnessService delegates to GammaService while night mode is on
- NightModeView + Night Mode row in the menu's Tools section (TR/EN)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Remove autopilot logs, phase roadmaps, per-folder CLAUDE.md files and the
  old docs/ tree; add docs/ARCHITECTURE.md and docs/LESSONS.md
- Rewrite AGENTS.md / CLAUDE.md for the fork
- Translate remaining Chinese code comments to English (comments only)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…sh fixes

- Launch at login is now a per-user launchd agent with KeepAlive
  SuccessfulExit=false: relaunches after a crash, not after Quit; migrates the
  old SMAppService login item; a launchd-started copy replaces a manual one
- HiDPI: first enable/disable makes the vendor override folder user-writable
  (one admin prompt); later toggles write the plist directly
- Menu panel: drop the flexible maxHeight frame so the window shrinks back
  to its content when sections collapse (no gaps on macOS 27)
- Color profiles: only list RGB display-class profiles (applying CMYK, gray,
  Lab or abstract profiles aborted inside SkyLight); read ICC header
  signatures from raw profile bytes
- English code comments in the touched files

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- scripts/build-app-clt.sh: universal (arm64 + x86_64) build with only the
  Command Line Tools; build-dmg.sh falls back to it without Xcode and writes
  build/FreeDisplay-<version>.dmg + SHA-256; release.sh publishes it with the
  matching CHANGELOG section as notes
- Ad-hoc signing instead of the upstream team ID; build number 2
- Add MIT LICENSE; stop tracking the old upstream DMG; ignore release artifacts
- README: fork links, macOS 15+ first-launch steps, build without Xcode;
  CHANGELOG/README: night mode and the color profile fix

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- ResolutionService: call the private CGSConfigureDisplayMode with its real
  signature (CGDisplayConfigRef inside a configuration transaction); it was
  passed a connection ID and dereferenced a bogus pointer on fallback
- ArrangementService/MirrorService: never cancel a configuration after
  CGCompleteDisplayConfiguration, which invalidates it even on failure
- BrightnessKeyService: return pass-through events unretained (leaked one
  CGEvent per media key press)
- DDCService: release IOAVService objects that fail the I2C probe
- BrightnessHUDService: explicitly @sendable XPC handlers; DisplayManager:
  skip HiDPI auto-enable for FreeDisplay's own virtual displays
- Version 2.1 (build 3); CHANGELOG, README and docs/LESSONS.md updated

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@hakanotal hakanotal changed the title Turkish/English edition: language switch, night mode, macOS 27 and crash fixes v2 edition: language switch, night mode, macOS 27 and crash fixes Oct 3, 2026
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.

1 participant