mirror of
https://github.com/vincentbernat/i3wm-configuration.git
synced 2025-07-10 10:14:20 +02:00
xrandr: simplify xrandr menu with autorandr
This commit is contained in:
parent
2fa5ff7a38
commit
2463736fdc
1 changed files with 15 additions and 89 deletions
104
rc/xrandr.lua
104
rc/xrandr.lua
|
@ -1,91 +1,16 @@
|
||||||
-- Menu with xrandr choices
|
-- Menu with autorandr choices
|
||||||
|
|
||||||
-- TODO:
|
|
||||||
-- For HiDPI, check the following script:
|
|
||||||
-- https://gist.github.com/wvengen/178642bbc8236c1bdb67
|
|
||||||
|
|
||||||
local icons = loadrc("icons", "vbe/icons")
|
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
|
-- Build available choices
|
||||||
local function menu()
|
local function menu()
|
||||||
local menu = {}
|
return {
|
||||||
local out = outputs()
|
{ "Autodetect", "autorandr --change" },
|
||||||
local choices = arrange(out)
|
{ "Clone", "autorandr --load common" },
|
||||||
|
{ "Horizontal", "autorandr --load horizontal" },
|
||||||
for _, choice in pairs(choices) do
|
{ "Vertical", "autorandr --load vertical" },
|
||||||
local cmd = "xrandr --auto"
|
{ "Keep current configuration", nil },
|
||||||
-- 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
|
|
||||||
end
|
end
|
||||||
|
|
||||||
-- Display xrandr notifications from choices
|
-- Display xrandr notifications from choices
|
||||||
|
@ -101,21 +26,22 @@ local function xrandr()
|
||||||
|
|
||||||
-- Build the list of choices
|
-- Build the list of choices
|
||||||
if not state.iterator then
|
if not state.iterator then
|
||||||
state.iterator = awful.util.table.cycle(menu(),
|
state.iterator = awful.util.table.cycle(
|
||||||
function() return true end)
|
menu(),
|
||||||
|
function() return true end)
|
||||||
end
|
end
|
||||||
|
|
||||||
-- Select one and display the appropriate notification
|
-- Select one and display the appropriate notification
|
||||||
local next = state.iterator()
|
local next = state.iterator()
|
||||||
local label, action, icon
|
local label, action
|
||||||
if not next then
|
if not next then
|
||||||
label, icon = "Keep the current configuration", icons.lookup({ name = "display", type = "devices" })
|
|
||||||
state.iterator = nil
|
state.iterator = nil
|
||||||
|
return xrandr()
|
||||||
else
|
else
|
||||||
label, action, icon = unpack(next)
|
label, action = unpack(next)
|
||||||
end
|
end
|
||||||
state.cid = naughty.notify({ text = label,
|
state.cid = naughty.notify({ text = label,
|
||||||
icon = icon,
|
icon = icons.lookup({ name = "display", type = "devices" }),
|
||||||
timeout = 4,
|
timeout = 4,
|
||||||
screen = mouse.screen, -- Important, not all screens may be visible
|
screen = mouse.screen, -- Important, not all screens may be visible
|
||||||
font = "Free Sans 18",
|
font = "Free Sans 18",
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue