make hyprland-monitors a template
This commit is contained in:
@@ -0,0 +1,272 @@
|
||||
local workspace_rules = {}
|
||||
|
||||
{{ if eq .chezmoi.hostname "ia-frank-xps13" -}}
|
||||
hl.monitor({
|
||||
output = "eDP-1",
|
||||
scale = 1,
|
||||
position = "0x0",
|
||||
mode = "1920x1200@120"
|
||||
})
|
||||
|
||||
hl.monitor({
|
||||
output = "desc:Dell Inc. DELL U2724DE BD19MF4",
|
||||
scale = 1,
|
||||
position = "-2560x0",
|
||||
mode = "2560x1440@120"
|
||||
})
|
||||
|
||||
hl.monitor({
|
||||
output = "desc:Dell Inc. DELL U2724D 1CQFMF4",
|
||||
scale = 1,
|
||||
position = "-5120x0",
|
||||
mode = "2560x1440@120"
|
||||
})
|
||||
local workspace_rules = {
|
||||
{ workspace = "6", monitor = "desc:Dell Inc. DELL U2724D 1CQFMF4", default = true, persistent = true },
|
||||
{ workspace = "7", monitor = "desc:Dell Inc. DELL U2724D 1CQFMF4", persistent = true },
|
||||
{ workspace = "8", monitor = "desc:Dell Inc. DELL U2724D 1CQFMF4", persistent = true },
|
||||
{ workspace = "1", monitor = "desc:Dell Inc. DELL U2724DE BD19MF4", default = true, persistent = true },
|
||||
{ workspace = "2", monitor = "desc:Dell Inc. DELL U2724DE BD19MF4", persistent = true },
|
||||
{ workspace = "3", monitor = "desc:Dell Inc. DELL U2724DE BD19MF4", persistent = true },
|
||||
{ workspace = "4", monitor = "desc:Dell Inc. DELL U2724DE BD19MF4", persistent = true },
|
||||
{ workspace = "5", monitor = "desc:Dell Inc. DELL U2724DE BD19MF4", persistent = true },
|
||||
{ workspace = "9", monitor = "eDP-1", default = true, persistent = true },
|
||||
{ workspace = "10", monitor = "eDP-1", persistent = true },
|
||||
}
|
||||
{{- else if eq .chezmoi.hostname "arch-next" -}}
|
||||
hl.monitor({
|
||||
output = "desc:GIGA-BYTE TECHNOLOGY CO. LTD. M34WQ 0x00000B52",
|
||||
scale = 1,
|
||||
position = "0x0",
|
||||
mode = "3440x1440@120",
|
||||
})
|
||||
|
||||
hl.monitor({
|
||||
output = "desc:Dell Inc. DELL U2724D DL7R834",
|
||||
scale = 1,
|
||||
position = "3440x0",
|
||||
mode = "2560x1440@120",
|
||||
})
|
||||
|
||||
hl.monitor({
|
||||
output = "desc:Dell Inc. DELL U2414H 292K475V26JL",
|
||||
scale = 1,
|
||||
position = "760x-1080",
|
||||
mode = "1920x1080@60",
|
||||
})
|
||||
local workspace_rules = {
|
||||
{ workspace = "1", monitor = "desc:GIGA-BYTE TECHNOLOGY CO. LTD. M34WQ 0x00000B52", default = true, persistent = true},
|
||||
{ workspace = "9", monitor = "desc:Dell Inc. DELL U2724D DL7R834", default = true, persistent = true},
|
||||
{ workspace = "10", monitor = "desc:Dell Inc. DELL U2414H 292K475V26JL", default = true, persistent = true},
|
||||
}
|
||||
{{- end }}
|
||||
|
||||
|
||||
|
||||
for _, rule in ipairs(workspace_rules) do
|
||||
hl.workspace_rule(rule)
|
||||
end
|
||||
|
||||
|
||||
-- if multiple profiles match, profile with highest priority wins.
|
||||
-- if no profile match at all, the fallback_profile will be applied anyways.
|
||||
local fallback_profile="laptop"
|
||||
local profiles = {
|
||||
home_docked = {
|
||||
priority = 10,
|
||||
monitors = {
|
||||
"desc:GIGA-BYTE TECHNOLOGY CO. LTD. M34WQ 0x00000B52",
|
||||
"desc:Dell Inc. DELL U2724D DL7R834",
|
||||
"desc:Dell Inc. DELL U2414H 292K475V26JL",
|
||||
},
|
||||
disable_other_monitors = true,
|
||||
monitor_config = {
|
||||
["desc:GIGA-BYTE TECHNOLOGY CO. LTD. M34WQ 0x00000B52"] = {disabled=false, scale=1, position="0x0", mode="3440x1440@60"},
|
||||
["desc:Dell Inc. DELL U2724D DL7R834"] = {disabled=false, scale=1, position="3440x0", mode="2556x1440@60"},
|
||||
["desc:Dell Inc. DELL U2414H 292K475V26JL"] = {disabled=false, scale=1, position="760x-1080", mode="1920x1080@60"},
|
||||
},
|
||||
workspace_rules = {
|
||||
},
|
||||
},
|
||||
home_pc = {
|
||||
priority = 20,
|
||||
monitors = {
|
||||
"desc:GIGA-BYTE TECHNOLOGY CO. LTD. M34WQ 0x00000B52",
|
||||
"desc:Dell Inc. DELL U2724D DL7R834",
|
||||
"desc:Dell Inc. DELL U2414H 292K475V26JL",
|
||||
},
|
||||
disable_other_monitors = true,
|
||||
monitor_config = {
|
||||
["desc:GIGA-BYTE TECHNOLOGY CO. LTD. M34WQ 0x00000B52"] = {disabled=false, scale=1, position="0x0", mode="3440x1440@120"},
|
||||
["desc:Dell Inc. DELL U2414H 292K475V26JL"] = {disabled=false, scale=1, position="760x-1080", mode="1920x1080@60"},
|
||||
["desc:Dell Inc. DELL U2724D DL7R834"] = {disabled=false, scale=1, position="3440x0", mode="2560x1440@120"},
|
||||
},
|
||||
workspace_rules = {
|
||||
{ workspace = "1", monitor = "desc:GIGA-BYTE TECHNOLOGY CO. LTD. M34WQ 0x00000B52", default = true, persistent = true},
|
||||
{ workspace = "9", monitor = "desc:Dell Inc. DELL U2724D DL7R834", default = true, persistent = true},
|
||||
{ workspace = "10", monitor = "desc:Dell Inc. DELL U2414H 292K475V26JL", default = true, persistent = true},
|
||||
}
|
||||
},
|
||||
work = {
|
||||
priority = 10,
|
||||
monitors = {
|
||||
"desc:Dell Inc. DELL U2724D 1CQFMF4",
|
||||
"desc:Dell Inc. DELL U2724DE BD19MF4",
|
||||
"eDP-1",
|
||||
},
|
||||
disable_other_monitors = false,
|
||||
monitor_config = {
|
||||
["desc:Dell Inc. DELL U2724D 1CQFMF4"] = {disabled=false, scale=1, position="-5120x0", mode="2560x1440@120"},
|
||||
["desc:Dell Inc. DELL U2724DE BD19MF4"] = {disabled=false, scale=1, position="-2560x0", mode="2560x1440@120"},
|
||||
["eDP-1"] = {disabled=false, scale=1, position="0x0", mode="1920x1200@120"},
|
||||
},
|
||||
workspace_rules = {
|
||||
{ workspace = "6", monitor = "desc:Dell Inc. DELL U2724D 1CQFMF4", default = true, persistent = true },
|
||||
{ workspace = "7", monitor = "desc:Dell Inc. DELL U2724D 1CQFMF4", persistent = true },
|
||||
{ workspace = "8", monitor = "desc:Dell Inc. DELL U2724D 1CQFMF4", persistent = true },
|
||||
{ workspace = "1", monitor = "desc:Dell Inc. DELL U2724DE BD19MF4", default = true, persistent = true },
|
||||
{ workspace = "2", monitor = "desc:Dell Inc. DELL U2724DE BD19MF4", persistent = true },
|
||||
{ workspace = "3", monitor = "desc:Dell Inc. DELL U2724DE BD19MF4", persistent = true },
|
||||
{ workspace = "4", monitor = "desc:Dell Inc. DELL U2724DE BD19MF4", persistent = true },
|
||||
{ workspace = "5", monitor = "desc:Dell Inc. DELL U2724DE BD19MF4", persistent = true },
|
||||
{ workspace = "9", monitor = "eDP-1", default = true, persistent = true },
|
||||
{ workspace = "10", monitor = "eDP-1", persistent = true },
|
||||
},
|
||||
},
|
||||
laptop = {
|
||||
priority = 0,
|
||||
monitors = {
|
||||
"eDP-1",
|
||||
},
|
||||
disable_other_monitors = false,
|
||||
monitor_config = {
|
||||
["eDP-1"] = {disabled=false, scale=1, position="0x0", mode="1920x1200@60"},
|
||||
},
|
||||
workspace_rules = {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
local apply_monitor_request_queue = {}
|
||||
|
||||
local function apply_workspace_rules(workspace_rules)
|
||||
if #workspace_rules < 1 then return end
|
||||
for _, rules in ipairs(workspace_rules) do
|
||||
hl.workspace_rule(rules)
|
||||
end
|
||||
debug_notify("Workspace Rules Applied")
|
||||
end
|
||||
|
||||
local function apply_selected_profile(profile_name, profile)
|
||||
-- do we want to disable other monitors that are not used in this profile?
|
||||
if profile.disable_other_monitors then
|
||||
local monitors = hl.get_monitors()
|
||||
table.insert(monitors, hl.get_monitor("eDP-1"))
|
||||
|
||||
for _, monitor in ipairs(monitors) do
|
||||
if monitor ~= nil then
|
||||
local name = monitor.name
|
||||
local description = monitor.description
|
||||
if not any(
|
||||
profile.monitors,
|
||||
function(wanted)
|
||||
return
|
||||
wanted == name or
|
||||
wanted == "desc:"..description
|
||||
end
|
||||
) then
|
||||
debug_notify("Disabling output "..name.." ("..description..")")
|
||||
hl.monitor({output = name, disabled = true})
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
-- use the configuration in the profile and apply it to hyprland
|
||||
for _, monitor_selector in ipairs(profile.monitors) do
|
||||
local config = profile.monitor_config[monitor_selector] or {}
|
||||
config.output = monitor_selector
|
||||
hl.monitor(config)
|
||||
end
|
||||
debug_notify("Profile " .. profile_name .. " was applied")
|
||||
|
||||
apply_workspace_rules(profile.workspace_rules)
|
||||
end
|
||||
|
||||
local function apply_monitor_profile()
|
||||
if #apply_monitor_request_queue < 1 then
|
||||
return
|
||||
end
|
||||
|
||||
table.remove(apply_monitor_request_queue)
|
||||
-- make sure we know the up-to-date state of the system
|
||||
hl.exec_scheduled_prop_refresh_immediately()
|
||||
|
||||
-- try to find all profiles that match current monitors
|
||||
local matching_profiles = {}
|
||||
for profile_name, profile in pairs(profiles) do
|
||||
if all(
|
||||
profile.monitors,
|
||||
function(monitor_selector)
|
||||
local found =
|
||||
-- if the monitor exists, hyprland should be able to return this monitor
|
||||
hl.get_monitor(monitor_selector) ~= nil
|
||||
if not found then
|
||||
debug_notify("not able to find monitor "..monitor_selector.." for profile "..profile_name)
|
||||
end
|
||||
return found
|
||||
end
|
||||
)
|
||||
then
|
||||
table.insert(matching_profiles, {name = profile_name, profile = profile})
|
||||
end
|
||||
end
|
||||
|
||||
-- if no profile was found, do nothing
|
||||
if #matching_profiles < 1 then
|
||||
local profile = profiles[fallback_profile] or nil
|
||||
if profile == nil then
|
||||
debug_notify("No profiles are matching the current monitors and no fallback with name '"..fallback_profile.."' available!")
|
||||
return
|
||||
end
|
||||
debug_notify("No profiles are matching the current monitors, applying fallback")
|
||||
apply_selected_profile("fallback", profile)
|
||||
return
|
||||
end
|
||||
|
||||
-- if multiple profiles are matching, select the correct one by priority
|
||||
table.sort(matching_profiles, function(a, b) return a.profile.priority > b.profile.priority end)
|
||||
local matching_profile = matching_profiles[1]
|
||||
local profile_name, profile = matching_profile.name, matching_profile.profile
|
||||
debug_notify("Matching monitor profile found: " .. profile_name)
|
||||
apply_selected_profile(profile_name, profile)
|
||||
end
|
||||
|
||||
local monitor_profile_timer = nil
|
||||
function request_apply_monitor_profile(data)
|
||||
debug_notify("requested monitor profile update")
|
||||
table.insert(apply_monitor_request_queue, data or {})
|
||||
if monitor_profile_timer == nil or not monitor_profile_timer:is_enabled() then
|
||||
monitor_profile_timer = hl.timer(apply_monitor_profile, { timeout = 3000, type = "repeat" })
|
||||
debug_notify("monitor profile apply timer has been restarted")
|
||||
end
|
||||
end
|
||||
|
||||
hl.on("hyprland.start", function()
|
||||
debug_notify("hyprland start :)")
|
||||
hl.dispatch(function()
|
||||
hl.monitor({output = "eDP-1", disabled = false})
|
||||
hl.dispatch(function() request_apply_monitor_profile() end)
|
||||
end)
|
||||
end)
|
||||
|
||||
hl.on("monitor.layout_changed", request_apply_monitor_profile)
|
||||
hl.bind("SUPER + P", function()
|
||||
hl.monitor({output = "eDP-1", disabled = true})
|
||||
request_apply_monitor_profile()
|
||||
end, {locked=true, description="Detect & Apply Monitor Profile"})
|
||||
hl.bind("SUPER + SHIFT + P", function()
|
||||
hl.monitor({output = "eDP-1", disabled = false})
|
||||
hl.dispatch(function() request_apply_monitor_profile() end)
|
||||
end, {locked=true, description="Detect & Apply Monitor Profile"})
|
||||
Reference in New Issue
Block a user