【发布时间】:2020-10-22 10:32:23
【问题描述】:
从 macOS (10.16 "Beta"/11.0) "Big Sur" 开始,菜单栏和系统托盘不再支持桌面暗模式首选项,因此很难为该桌面正确设置系统托盘图标的主题。
以前,使用 shell 命令default read,可以检测到暗模式:
defaults read -g AppleInterfaceStyle
# "Dark"
这仍然适用于检测 Window 主题,但不适用于菜单栏和系统托盘主题。
由于这个区域似乎是由壁纸亮度/白度/亮度驱动的,我们如何检测黑暗的系统托盘?
如何在(例如)Objective-C/C++ 中检测到这一点?欢迎任何解决方案,因为大多数都可以调整。
问题也发布到 Apple 开发者论坛:https://developer.apple.com/forums/thread/652540
Qt5.6 有一个名为setIsMask(...) 的功能,它允许操作系统自动处理这个问题。这实际上是 NSImage::setTemplate:Yes 的别名
更多参考 macOS “黑暗模式”:
AdoptOpenJDK 上游错误报告:
关键字:NSStatusBar、Menu Bar Extras
【问题讨论】:
-
我也对解决方案很感兴趣。
-
@inexcitus 我们已经放弃从 Apple 获得帮助并开始重写我们的应用程序以使用
NSImage:isTemplate。这是不幸的,因为它需要对我们正在使用的框架进行补丁。在我们的例子中,我们寄希望于未来的 Java 版本可以本地处理这个问题。如果您还使用框架来绘制图标,您可以使用我们的代码作为您正在使用的任何框架的功能请求中的参考点:github.com/AdoptOpenJDK/openjdk-support/issues/…。如果你的应用是原生 C++ 或 Objective-C 应用,你应该考虑直接使用NSImage:isTemplate。 -
* 更正,API是
NSImage:setTemplate(true)(不是isTemplate)。 -
> NSView with text我们不得不将代码切换为使用按钮(技术上是实现NSMenuDelegate的NSObject)。随意使用尽可能多的代码。 github.com/AdoptOpenJDK/openjdk-jdk11u/compare/…。除了建议您使用不同的 API 之外,我认为 Apple 无法提供帮助。 -
@inexcitus 还注意到我们选择在 Java diff 中使用的 API 是 10.5+,所以它们已经存在了大约 13 年,应该不会导致回归。
标签: java c++ objective-c statusbar