xrandr: simplify xrandr menu with autorandr

This commit is contained in:
Vincent Bernat 2020-01-29 05:16:25 +01:00
parent 2fa5ff7a38
commit 2463736fdc

View file

@ -1,91 +1,16 @@
-- Menu with xrandr choices
-- TODO:
-- For HiDPI, check the following script:
-- https://gist.github.com/wvengen/178642bbc8236c1bdb67
-- Menu with autorandr choices
local icons = loadrc("icons", "vbe/icons")
-- Get active outputs
local function outputs()
local outputs = {}
local xrandr = io.popen("xrandr -q")
if xrandr then
for line in xrandr:lines() do
output = line:match("^([%w-]+) connected ")
if output then
outputs[#outputs + 1] = output
end
end
xrandr:close()
end
return outputs
end
local function arrange(out)
-- We need to enumerate all the way to combinate output. We assume
-- we want only an horizontal layout.
local choices = {}
local previous = { {} }
for i = 1, #out do
-- Find all permutation of length `i`: we take the permutation
-- of length `i-1` and for each of them, we create new
-- permutations by adding each output at the end of it if it is
-- not already present.
local new = {}
for _, p in pairs(previous) do
for _, o in pairs(out) do
if not awful.util.table.hasitem(p, o) then
new[#new + 1] = awful.util.table.join(p, {o})
end
end
end
choices = awful.util.table.join(choices, new)
previous = new
end
return choices
end
-- Build available choices
local function menu()
local menu = {}
local out = outputs()
local choices = arrange(out)
for _, choice in pairs(choices) do
local cmd = "xrandr --auto"
-- Enabled outputs
for i, o in pairs(choice) do
cmd = cmd .. " --output " .. o .. " --auto"
if i > 1 then
cmd = cmd .. " --right-of " .. choice[i-1]
end
end
-- Disabled outputs
for _, o in pairs(out) do
if not awful.util.table.hasitem(choice, o) then
cmd = cmd .. " --output " .. o .. " --off"
end
end
local label = ""
if #choice == 1 then
label = 'Only <span weight="bold">' .. choice[1] .. '</span>'
else
for i, o in pairs(choice) do
if i > 1 then label = label .. " + " end
label = label .. '<span weight="bold">' .. o .. '</span>'
end
end
menu[#menu + 1] = { label,
cmd,
icons.lookup({ name = "display", type = "devices" }) }
end
return menu
return {
{ "Autodetect", "autorandr --change" },
{ "Clone", "autorandr --load common" },
{ "Horizontal", "autorandr --load horizontal" },
{ "Vertical", "autorandr --load vertical" },
{ "Keep current configuration", nil },
}
end
-- Display xrandr notifications from choices
@ -101,21 +26,22 @@ local function xrandr()
-- Build the list of choices
if not state.iterator then
state.iterator = awful.util.table.cycle(menu(),
function() return true end)
state.iterator = awful.util.table.cycle(
menu(),
function() return true end)
end
-- Select one and display the appropriate notification
local next = state.iterator()
local label, action, icon
local label, action
if not next then
label, icon = "Keep the current configuration", icons.lookup({ name = "display", type = "devices" })
state.iterator = nil
return xrandr()
else
label, action, icon = unpack(next)
label, action = unpack(next)
end
state.cid = naughty.notify({ text = label,
icon = icon,
icon = icons.lookup({ name = "display", type = "devices" }),
timeout = 4,
screen = mouse.screen, -- Important, not all screens may be visible
font = "Free Sans 18",