Initialize revelation as a module
This commit is contained in:
commit
70901c8a9f
|
@ -0,0 +1,36 @@
|
||||||
|
# revelation.lua
|
||||||
|
|
||||||
|
Provides Mac OSX like 'Expose' view of all clients.
|
||||||
|
|
||||||
|
## Use
|
||||||
|
(From user's awesome configuration directory, usually ~/.config/awesome)
|
||||||
|
|
||||||
|
1. Clone repository:
|
||||||
|
|
||||||
|
git clone https://bioe007@github.com/bioe007/awesome-revelation.git
|
||||||
|
|
||||||
|
2. put near the top of your rc.lua require("revelation")
|
||||||
|
3. Make a global keybinding for revelation in your rc.lua:
|
||||||
|
|
||||||
|
awful.key({modkey}, "e", revelation)
|
||||||
|
|
||||||
|
**NOTE:** Always double check this key binding syntax against the version of
|
||||||
|
Awesome that you are using.
|
||||||
|
|
||||||
|
4. Reload rc.lua and try the keybinding.
|
||||||
|
|
||||||
|
It should bring all clients to the current tag and set the layout to fair. You
|
||||||
|
can focus clients with __cursor__ or __hjkl__ keys then press __Enter__ to
|
||||||
|
select or __Escape__ to abort.
|
||||||
|
|
||||||
|
This is a modification of the original awesome library that implemented
|
||||||
|
expose like behavior.
|
||||||
|
|
||||||
|
## Credits
|
||||||
|
|
||||||
|
* Perry Hargrave resixian@gmail.com
|
||||||
|
* Espen Wiborg espenhw@grumblesmurf.org
|
||||||
|
* Julien Danjou julien@danjou.info
|
||||||
|
|
||||||
|
## License
|
||||||
|
(c) 2008 Espen Wiborg, Julien Danjou
|
|
@ -0,0 +1,120 @@
|
||||||
|
-- revelation.lua
|
||||||
|
--
|
||||||
|
-- Library that implements Expose like behavior.
|
||||||
|
--
|
||||||
|
-- @author Perry Hargrave resixian@gmail.com
|
||||||
|
-- @author Espen Wiborg espenhw@grumblesmurf.org
|
||||||
|
-- @author Julien Danjou julien@danjou.info
|
||||||
|
--
|
||||||
|
-- @copyright 2008 Espen Wiborg, Julien Danjou
|
||||||
|
--
|
||||||
|
|
||||||
|
local awful = awful
|
||||||
|
local pairs = pairs
|
||||||
|
local setmetatable = setmetatable
|
||||||
|
local table = table
|
||||||
|
local capi = {
|
||||||
|
tag = tag,
|
||||||
|
client = client,
|
||||||
|
keygrabber = keygrabber,
|
||||||
|
mouse = mouse,
|
||||||
|
screen = screen
|
||||||
|
}
|
||||||
|
|
||||||
|
module("revelation")
|
||||||
|
|
||||||
|
-- FIXME: Now unused filter to grab clients based on their class.
|
||||||
|
--
|
||||||
|
-- @param class the class string to find
|
||||||
|
-- @s the screen
|
||||||
|
--
|
||||||
|
function clients(class, s)
|
||||||
|
local clients
|
||||||
|
if class then
|
||||||
|
clients = {}
|
||||||
|
for k, c in pairs(capi.client.get(s)) do
|
||||||
|
if c.class == class then
|
||||||
|
table.insert(clients, c)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
else
|
||||||
|
clients = capi.client.get(s)
|
||||||
|
end
|
||||||
|
return clients
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Executed when user selects a client from expose view.
|
||||||
|
--
|
||||||
|
-- @param restore Function to reset the current tags view.
|
||||||
|
function selectfn(restore)
|
||||||
|
return function(c)
|
||||||
|
restore()
|
||||||
|
-- Pop to client tag
|
||||||
|
awful.tag.viewonly(c:tags()[1], c.screen)
|
||||||
|
-- Focus and raise
|
||||||
|
capi.client.focus = c
|
||||||
|
c:raise()
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Arrow keys and 'hjkl' move focus, Return selects, Escape cancels. Ignores
|
||||||
|
-- modifiers.
|
||||||
|
--
|
||||||
|
-- @param restore a function to call if the user presses escape
|
||||||
|
-- @return keyboardhandler
|
||||||
|
function keyboardhandler (restore)
|
||||||
|
return function (mod, key, event)
|
||||||
|
if event ~= "press" then return true end
|
||||||
|
-- translate vim-style home keys to directions
|
||||||
|
if key == "j" or key == "k" or key == "h" or key == "l" then
|
||||||
|
if key == "j" then
|
||||||
|
key = "Down"
|
||||||
|
elseif key == "k" then
|
||||||
|
key = "Up"
|
||||||
|
elseif key == "h" then
|
||||||
|
key = "Left"
|
||||||
|
elseif key == "l" then
|
||||||
|
key = "Right"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
--
|
||||||
|
if key == "Escape" then
|
||||||
|
restore()
|
||||||
|
return false
|
||||||
|
elseif key == "Return" then
|
||||||
|
selectfn(restore)(capi.client.focus)
|
||||||
|
return false
|
||||||
|
elseif key == "Left" or key == "Right" or
|
||||||
|
key == "Up" or key == "Down" then
|
||||||
|
awful.client.focus.bydirection(key:lower())
|
||||||
|
end
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Implement Exposé (ala Mac OS X).
|
||||||
|
--
|
||||||
|
-- @param class The class of clients to expose, or nil for all clients.
|
||||||
|
-- @param fn A binary function f(t, n) to set the layout for tag t for n
|
||||||
|
-- clients, or nil for the default layout.
|
||||||
|
-- @param s The screen to consider clients of, or nil for "current screen".
|
||||||
|
function expose(class, fn, s)
|
||||||
|
local scr = s or capi.mouse.screen
|
||||||
|
local t = capi.screen[scr]:tags()[1]
|
||||||
|
local oldlayout = awful.tag.getproperty( t, "layout" )
|
||||||
|
|
||||||
|
awful.tag.viewmore( capi.screen[scr]:tags(), t.screen )
|
||||||
|
awful.layout.set(awful.layout.suit.fair,t)
|
||||||
|
|
||||||
|
local function restore()
|
||||||
|
awful.layout.set(oldlayout,t)
|
||||||
|
awful.tag.viewonly(t)
|
||||||
|
|
||||||
|
capi.keygrabber.stop()
|
||||||
|
end
|
||||||
|
|
||||||
|
capi.keygrabber.run(keyboardhandler(restore))
|
||||||
|
end
|
||||||
|
|
||||||
|
setmetatable(_M, { __call = function(_, ...) return expose(...) end })
|
Loading…
Reference in New Issue