From 2463736fdc1b6fdd8fea3ab1508be3a1aecb78db Mon Sep 17 00:00:00 2001 From: Vincent Bernat Date: Wed, 29 Jan 2020 05:16:25 +0100 Subject: [PATCH] xrandr: simplify xrandr menu with autorandr --- rc/xrandr.lua | 104 ++++++++------------------------------------------ 1 file changed, 15 insertions(+), 89 deletions(-) diff --git a/rc/xrandr.lua b/rc/xrandr.lua index 847f9ae..5c36be7 100644 --- a/rc/xrandr.lua +++ b/rc/xrandr.lua @@ -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 ' .. choice[1] .. '' - else - for i, o in pairs(choice) do - if i > 1 then label = label .. " + " end - label = label .. '' .. o .. '' - 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",