Skip to content

[Bug] 菜单栏状态图标位置在锁屏/解锁后重置 #1153

Description

@xuelingkang

簡要描述 Bug:
Squirrel 的菜单栏状态图标(显示"中"/"A"的位置),用 Command + 拖拽调整顺序后,锁屏再解锁(或注销重新登录)会回到最前面(最左侧),无法固定位置。

預期行爲:
调整后的菜单栏图标位置应在锁屏/重启/注销后保持。

實際行爲:
锁屏再解锁后,Squirrel 的状态图标总是回到菜单栏的最前面(最左侧),需要每次手动重新拖拽排列。

環境

  • 系統版本: macOS 15.x(macOS 11 Big Sur 起均受影响)
  • 鼠鬚管版本: 1.1.2 / master (latest)
  • 方案: 不限,与方案无关

我試過:

  • 我換了內置的方案(如朙月拼音)後問題仍存在
  • 在 Issues(包括已關閉的 Issue) 中未找到相關的報告

根因分析(由 AI 辅助完成):
macOS Big Sur 起要求 NSStatusItem 设置 autosaveName,系统才能记住其在菜单栏中的位置并在会话恢复(锁屏/注销/重启)后还原。Squirrel 在创建状态图标时未设置此项。

代码定位:
SquirrelApplicationDelegate.swift 中的 setupStatusItem() 方法(约 L353-362):

func setupStatusItem() {
    let item = NSStatusBar.system.statusItem(withLength: NSStatusItem.variableLength)
    if let button = item.button {
      button.font = NSFont.systemFont(ofSize: NSFont.systemFontSize, weight: .semibold)
      button.toolTip = NSLocalizedString("Squirrel", comment: "")
    }
    statusItem = item
    applyStatusIcon(asciiMode: false, schemaLabel: nil)
    updateStatusItemVisibility()
}

缺少 item.autosaveName = "SquirrelStatusItem"

修复建议:
在 L354 之后添加一行:

item.autosaveName = "SquirrelStatusItem"

即可让 macOS 记住该状态项的位置。改动极小,不存在兼容性问题(autosaveName 是 NSStatusItem 从 macOS 10.x 就有的属性,Big Sur 起成为必选项)。

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions