Add xrandr.lua multiple monitor recipe (#73)
This commit is contained in:
parent
12734ef793
commit
d12b5f5c0e
|
@ -12,3 +12,6 @@ The recipes section is where you can find useful snippets and tutorials on how t
|
|||
|
||||
* [Lain Widget Library](https://github.com/copycat-killer/lain)
|
||||
* [[MPD current song|recipes/mpc]]
|
||||
|
||||
## Others
|
||||
* [[Swap Monitor Snippet|recipes/xrandr]]
|
||||
|
|
|
@ -0,0 +1,147 @@
|
|||
--- Separating Multiple Monitor functions as a separeted module (taken from awesome wiki)
|
||||
|
||||
local awful = require("awful")
|
||||
local naughty = require("naughty")
|
||||
local beautiful = require("beautiful");
|
||||
|
||||
-- A path to a fancy icon
|
||||
local icon_path = "";
|
||||
|
||||
-- Get active outputs
|
||||
local function outputs()
|
||||
local outputs = {}
|
||||
local xrandr = io.popen("xrandr -q --current")
|
||||
|
||||
if xrandr then
|
||||
for line in xrandr:lines() do
|
||||
local 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 permutations of horizontal outputs.
|
||||
|
||||
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"
|
||||
-- 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,
|
||||
icon_path}
|
||||
end
|
||||
|
||||
return menu
|
||||
end
|
||||
|
||||
-- Display xrandr notifications from choices
|
||||
local state = { iterator = nil,
|
||||
timer = nil,
|
||||
cid = nil }
|
||||
local function xrandr()
|
||||
-- Stop any previous timer
|
||||
if state.timer then
|
||||
state.timer:stop()
|
||||
state.timer = nil
|
||||
end
|
||||
|
||||
-- Build the list of choices
|
||||
if not state.index then
|
||||
state.menu = menu()
|
||||
state.index = 1
|
||||
end
|
||||
|
||||
-- Select one and display the appropriate notification
|
||||
local label, action, icon
|
||||
local next = state.menu[state.index]
|
||||
state.index = state.index + 1
|
||||
|
||||
if not next then
|
||||
label, icon = "Keep the current configuration", icon_path
|
||||
state.iterator = nil
|
||||
else
|
||||
label, action, icon = unpack(next)
|
||||
end
|
||||
state.cid = naughty.notify({ text = label,
|
||||
icon = icon,
|
||||
timeout = 4,
|
||||
screen = mouse.screen,
|
||||
font = beautiful.font,
|
||||
replaces_id = state.cid }).id
|
||||
|
||||
-- Setup the timer
|
||||
state.timer = timer { timeout = 4 }
|
||||
state.timer:connect_signal("timeout",
|
||||
function()
|
||||
state.timer:stop()
|
||||
state.timer = nil
|
||||
state.iterator = nil
|
||||
if action then
|
||||
awful.util.spawn(action, false)
|
||||
end
|
||||
end)
|
||||
state.timer:start()
|
||||
end
|
||||
|
||||
return {
|
||||
outputs = outputs,
|
||||
arrange = arrange,
|
||||
menu = menu,
|
||||
xrandr = xrandr
|
||||
}
|
|
@ -0,0 +1,23 @@
|
|||
# Multiple Monitor Helper
|
||||
|
||||
This page is intended to show how to user `xrandr.lua` script to help the way you deal with multiple monitors.
|
||||
Using this snippet you can set a keybinding where you swap to all possible arrangements of monitors.
|
||||
|
||||
The process of setting up this script goes as follow:
|
||||
|
||||
1. Create a file called `xrandr.lua` in your file system (preferably in awesome's folder) with the [script](xrandr.lua) content.
|
||||
|
||||
2. Import the script in your `rc.lua`
|
||||
|
||||
local xrandr = require("/path/to/file/xrandr")
|
||||
|
||||
3. Create a keybinding to the script in the appropriated globalkeys table
|
||||
|
||||
Pressing this key binding will open a popup with a possible screen arrangement.
|
||||
Pressing the key again will replace this popup with another possibility, eventually arriving at "keep the current configuration".
|
||||
|
||||
If the key is not pressed again within four seconds, the configuration described in the current popup is applied.
|
||||
|
||||
|
||||
awful.key({}, "Some Key", function() xrandr.xrandr() end)
|
||||
|
Loading…
Reference in New Issue