首页 > 解决方案 > 如何在 MacOS 上订阅系统更改?

问题描述

我正在帮助某人编写一个 Emacs 插件,以便在系统配色方案更改时让 Emacs 自动更改其主题。

目前它的工作方式是轮询系统的配色方案。我们希望它改为订阅更新,类似于 Linux 上的 DBus 允许您使用其信号进行 pubsub。

MacOS 上是否有某种方式可以订阅而不是轮询?

标签: macos

解决方案


假设这个插件正在运行一个 AppKit 上下文——也就是说,它所插入的主应用程序是基于 AppKit 的——那么你可以键值观察对象effectiveAppearance的:NSApplication

[NSApp addObserver:self
        forKeyPath:@"effectiveAppearance"
           options:NSKeyValueObservingOptionInitial
           context:someValueUniqueToYourClass];

您需要-observeValueForKeyPath:ofObject:change:context:在您的班级中实施以接收更改通知。

当它发生变化时,您可以调用:

NSAppearanceName* match = [NSApp.effectiveAppearance bestMatchFromAppearancesWithNames:
                               @[NSAppearanceNameAqua, NSAppearanceNameDarkAqua]];
if ([match isEqual:NSAppearanceNameDarkAqua])
     // switch Emacs to dark mode
else
     // switch Emacs to light mode

推荐阅读