Since I’m using MacOS again for the work, and obviously, I still use Emacs, I wanted to have a functionality which would detect which system theme is being used and load the correct one during Emacs startup.
Previously, I have hacked together just a simple script which depended on GTK theme. Basically, If command returns string Adwaita, load light theme, if it returns Adwaita-dark, load dark theme.
Later I learned that this might not be the good approach at all, even more so since GNOME developed concept of having Dark and Light theme.
Without further ado, this is what I cobbled together:
(defun system-dark-mode-enabled-p () "Check if dark mode is currently enabled." (pcase system-type ('darwin ;; Have to use osascript here as defaults returns inconsistent results ;; - AppleInterfaceStyleSwitchesAutomatically == 1 ;; exists only if the theme is set to auto ;; - AppleInterfaceStyle == Dark ;; exists only if the theme is set to dark ;; How to determine if theme is light or dark when Automatic Theme switching is in place? ;; Luckily, osascript can provide that detail (if (string= (shell-command-to-string "printf %s \"$( osascript -e \'tell application \"System Events\" to tell appearance preferences to return dark mode\' )\"") "true") t)) ('gnu/linux ;; prefer-dark and default are possible options (if (string= (shell-command-to-string "gsettings get org.gnome.desktop.interface color-scheme") "\'prefer-dark\'\n") t))))
This function basically returns t if dark mode is enabled, and nil if not. And with this, I just need to use that variable while loading the theme:
(defun tomica/load-theme () "Load dark/light variant depending on the system theme" (interactive) ;; Load files before loading the theme (modus-themes-load-themes) (if (system-dark-mode-enabled-p) (modus-themes-load-vivendi) (modus-themes-load-operandi)))
What I’d still like to develop here is support for KDE on Linux. But perhaps some other day.
Also, as you can see, I am using great themes provided by Protasilaos Stavrou called modus-themes. If you haven’t already, I recommend you to check them out!