hammerspoon icon indicating copy to clipboard operation
hammerspoon copied to clipboard

Feature request: built-in automatic light and dark mode for the console

Open MoltenMonster opened this issue 1 year ago • 5 comments

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

CleanShot 2024-12-17 at 05 27 23@2x CleanShot 2024-12-17 at 05 27 13@2x

MoltenMonster avatar Dec 10 '24 06:12 MoltenMonster

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

samcarter avatar Dec 16 '24 13:12 samcarter

Where do I get the darkmode module?

MoltenMonster avatar Dec 16 '24 16:12 MoltenMonster

@Oneechan69 Oh, sorry, I forgot that this wasn't standard. You can get it from

https://github.com/Hammerspoon/hammerspoon/issues/2386#issuecomment-648421532

samcarter avatar Dec 16 '24 16:12 samcarter

How do i use it?

MoltenMonster avatar Dec 17 '24 10:12 MoltenMonster

Place the file as darkmode.lua in the same folder as your init.lua

samcarter avatar Dec 17 '24 10:12 samcarter