Skip to content

fix: Optimize display management and watchdog - #5

Open
cs0tony wants to merge 4 commits into
Attiv:mainfrom
cs0tony:main
Open

fix: Optimize display management and watchdog#5
cs0tony wants to merge 4 commits into
Attiv:mainfrom
cs0tony:main

Conversation

@cs0tony

@cs0tony cs0tony commented Jul 31, 2026

Copy link
Copy Markdown

概述

主要围绕ClamOpen应用的内置屏幕管理和自动模式功能进行了全面改进,重点解决了手动恢复内置屏幕时的自动模式冲突问题,添加了可配置的看门狗功能,并修复了内置屏幕恢复无效的核心bug。这些改进显著增强了应用的稳定性和用户体验,特别是在显示器插拔场景下的响应能力。

改动内容

  1. 手动恢复与自动模式冲突解决

    问题背景:用户在自动模式下点击"恢复内置屏"菜单项时,由于自动模式的持续监控,内置屏幕可能会被再次关闭,导致恢复操作无效。

    解决方案:

    • 在enable()方法中添加自动模式检查逻辑,手动恢复内置屏前先关闭自动模式
    • 在toggleAuto()方法中改进逻辑,当用户关闭自动模式时,自动调用内置屏幕恢复功能
  2. 看门狗功能完善

    功能描述:改造成可配置的看门狗定时器,作为显示器状态检查的兜底保护机制;减少判断参数获取次数。

    实现细节:

    • 新增watchdogEnabled属性,支持用户配置开关状态并持久化到UserDefaults
    • 实现startWatchdog()和stopWatchdog()方法,用于启动和停止看门狗定时器
    • 添加toggleWatchdog()方法,支持用户通过菜单切换看门狗状态
    • 在菜单中添加看门狗开关选项,实时显示当前状态
    • 每次循环一开始一次性获取判断参数并存储在变量中,减少判断参数获取次数
  3. 内置屏幕恢复核心问题修复

    问题背景:拔掉外接显示器时无法触发内置屏幕恢复,第一个原因是hasExternalDisplay获取到的判断参数错误,第二个原因是builtinDisplay无法获取内置屏ID。

    解决方案:

    • 添加CGSGetDisplayList函数声明和实现,用于获取完整显示器列表
    • 实现allDisplays()方法,获取系统中所有显示器信息
    • 改进builtinDisplay()方法,建立多层缓存机制:
      • 内存缓存提高查询效率
      • UserDefaults持久化保证跨会话稳定性
      • 实时查询作为动态补充
      • NSScreen.screens作为可靠fallback
    • 改进externalDisplays()方法,使用NSScreen.screens获取外接显示器,过滤掉空名称的"ghost display",onlineDisplays、allDisplays方法获取到的不正确

涉及文件

  • Sources/ClamOpen/AppDelegate.swift
  • Sources/ClamOpen/DisplayController.swift

@cs0tony cs0tony changed the title Optimize display management and watchdog fix: Optimize display management and watchdog Jul 31, 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