thornWM/lib/ewmh.lua
2025-05-23 15:41:23 +00:00

61 lines
2.8 KiB
Lua

-- This source code form is subject to the terms of the MPL-v2 https://mozilla.org/MPL/2.0/ --
--* Handles Extended Window Manager Hint (https://specifications.freedesktop.org/wm-spec/latest/) stuff that doesn't really fit in Tree
local Tree
local X = require("x")
local EWMH = {}
local pid = tonumber(io.open("/proc/self/stat"):read(8):match("%d+"))
--* init(str name) Sets up properties to the root and support check windows
function EWMH.init(name)
Tree = require("tree")
local supported = {
X.getAtoms(
"_NET_SUPPORTED", "_NET_SUPPORTING_WM_CHECK", "_NET_WM_NAME", "_NET_WM_PID", "_NET_WM_WINDOW_TYPE",
"_NET_WM_WINDOW_TYPE_DESKTOP", "_NET_WM_WINDOW_TYPE_DOCK", "_NET_WM_WINDOW_TYPE_TOOLBAR", "_NET_WM_WINDOW_TYPE_MENU",
"_NET_WM_WINDOW_TYPE_UTILITY", "_NET_WM_WINDOW_TYPE_SPLASH", "_NET_WM_WINDOW_TYPE_DIALOG", "_NET_WM_WINDOW_TYPE_NORMAL"
)
}
local supportWin = X.createWindow()
X.setProperty(supportWin, X.getAtoms("WM_CLASS"), X.getAtoms("STRING"), 8, X.PropModeReplace, { name, name })
X.setProperty(supportWin, X.getAtoms("_NET_WM_NAME"), X.getAtoms("UTF8_STRING"), 8, X.PropModeReplace, name)
X.setProperty(supportWin, X.getAtoms("_NET_SUPPORTING_WM_CHECK"), X.getAtoms("WINDOW"), 32, X.PropModeReplace, supportWin)
X.setProperty(supportWin, X.getAtoms("_NET_WM_PID"), X.getAtoms("CARDINAL"), 32, X.PropModeReplace, pid)
X.setProperty(X.root, X.getAtoms("_NET_SUPPORTING_WM_CHECK"), X.getAtoms("WINDOW"), 32, X.PropModeReplace, supportWin)
X.setProperty(X.root, X.getAtoms("_NET_SUPPORTED"), X.getAtoms("ATOM"), 32, X.PropModeReplace, supported)
end
--* bool should shouldManage(table win) Returns a boolean on whether the WM should manage the window
function EWMH.shouldManage(win)
local winTypeAtom = X.getProperty(win.id, X.getAtoms("_NET_WM_WINDOW_TYPE"), 0, X.getAtoms("ATOM"))
if not winTypeAtom then return true end
local winType = X.getAtomNames(winTypeAtom)
if winType == "_NET_WM_WINDOW_TYPE_DOCK" then
local attrs = X.getWindowAttributes(win.id)
win.winType = "dock"
if attrs.y == 0 then
-- print(inspect(Tree))
local m = Tree.focusedMonitor.margins
-- print("HHIHIHII", inspect(m))
-- print("m", inspect(attrs))
Tree.focusedMonitor.dockMargins = { top = attrs.height, bottom = 0, left = 0, right = 0 }
Tree.focusedMonitor:setMargins(Tree.focusedMonitor.margins)
end
return false
elseif winType == "_NET_WM_WINDOW_TYPE_SPLASH" then
return false
else
win.winType = winType or "normal"
end
return true
end
--* bool should shouldTile(table win) Returns a boolean on whether the WM should tile the window by default
function EWMH.shouldTile(win)
if win.winType == "_NET_WM_WINDOW_TYPE_DIALOG" then
return false
end
return true
end
return EWMH