Feature request: built-in automatic light and dark mode for the console
The Hammerspoon console is a native app window so like most native apps it should have an automatic light and dark theme. As shown in the comments below, this is a way of getting it right now without it built-in:
init.lua:
dm = require "darkmode"
dm.addHandler(
function(dm2)
if dm2 then
hs.console.darkMode(true)
else
hs.console.darkMode(false)
end
end
)
if dm.getDarkMode() then
hs.console.darkMode(true)
else
hs.console.darkMode(false)
end
darkmode.lua places in .hammerspoon (from here):
-- --------------------------------------------------------------------------
--
-- Implementation of a dark mode library for detecting and setting dark
-- mode in MacOS.
--
-- --------------------------------------------------------------------------
--
-- Example:
--
-- dm = require "darkmode"
-- dm.addHandler(function(dm2) print('darkmode changed:',dm2) end)
-- print('darkmode:',dm.getDarkMode())
-- dm.setDarkMode(not dm.getDarkMode())
-- print('darkmode:',dm.getDarkMode())
-- dm.setDarkMode(not dm.getDarkMode())
--
-- --------------------------------------------------------------------------
-- --------------------------------------------------------------------------
-- internal Data which should not be garbage collected
-- --------------------------------------------------------------------------
local internalData = {
darkmode = false,
watcher = nil,
handler = {}
}
-- --------------------------------------------------------------------------
-- General functions
-- --------------------------------------------------------------------------
local function getDarkModeFromSystem()
-- local _, darkmode = hs.osascript.applescript('tell application "System Events"\nreturn dark mode of appearance preferences\nend tell')
local _, darkmode = hs.osascript.javascript("Application('System Events').appearancePreferences.darkMode.get()")
return darkmode
end
local function getDarkMode()
return internalData.darkmode
end
local function setDarkMode(state)
hs.osascript.javascript(string.format("Application('System Events').appearancePreferences.darkMode.set(%s)",state))
end
local function addHandler(fn)
-- add it here...
internalData.handler[#internalData.handler+1] = fn
end
-- --------------------------------------------------------------------------
-- Internal functions
-- --------------------------------------------------------------------------
local function initialize()
internalData.darkmode = getDarkModeFromSystem()
end
local function initializeWatcher()
-- exit if already watching
if internalData.watcher ~= nil then return end
internalData.watcher = hs.distributednotifications.new(function(name, object, userInfo)
local hasDarkMode = getDarkModeFromSystem()
if hasDarkMode ~= internalData.darkmode then
internalData.darkmode = hasDarkMode
-- execute each handler with the darkmode as parameter (may change in future)
for index, fn in ipairs(internalData.handler) do
fn(hasDarkMode)
end
end
end,'AppleInterfaceThemeChangedNotification')
internalData.watcher:start()
end
-- --------------------------------------------------------------------------
-- Initialization
-- --------------------------------------------------------------------------
initialize()
initializeWatcher()
local module = {
_ = internalData,
setDarkMode = setDarkMode,
getDarkMode = getDarkMode,
addHandler = addHandler
}
return module
Maybe try something like
dm = require "darkmode"
dm.addHandler(
function(dm2)
if dm2 then
hs.console.darkMode(true)
else
hs.console.darkMode(false)
end
end
)
if dm.getDarkMode() then
hs.console.darkMode(true)
else
hs.console.darkMode(false)
end
in your hammerspoon config
Where do I get the darkmode module?
@Oneechan69 Oh, sorry, I forgot that this wasn't standard. You can get it from
https://github.com/Hammerspoon/hammerspoon/issues/2386#issuecomment-648421532
How do i use it?
Place the file as darkmode.lua in the same folder as your init.lua