Merge branch 'master' into develop

merge Pull request from github to develop
branch, because the codes are based on
github version of awesome WM.
This commit is contained in:
Quan Guo 2015-09-22 11:08:39 +02:00
commit 77318111e3
1 changed files with 84 additions and 66 deletions

150
init.lua
View File

@ -22,6 +22,7 @@ local table = table
local clock = os.clock local clock = os.clock
local tostring = tostring local tostring = tostring
local capi = { local capi = {
awesome = awesome,
tag = tag, tag = tag,
client = client, client = client,
keygrabber = keygrabber, keygrabber = keygrabber,
@ -29,14 +30,15 @@ local capi = {
mouse = mouse, mouse = mouse,
screen = screen screen = screen
} }
-- the function is still in develop version
--local delayed_call = require("gears.timer").delayed_call
local revelation ={}
local clientData = {} -- table that holds the positions and sizes of floating clients local clientData = {} -- table that holds the positions and sizes of floating clients
charorder = "jkluiopyhnmfdsatgvcewqzx1234567890" local charorder = "jkluiopyhnmfdsatgvcewqzx1234567890"
hintbox = {} -- Table of letter wiboxes with characters as the keys local hintbox = {} -- Table of letter wiboxes with characters as the keys
revelation = { local revelation = {
-- Name of expose tag. -- Name of expose tag.
tag_name = "Revelation", tag_name = "Revelation",
@ -61,7 +63,10 @@ revelation = {
}, },
tags_status = {}, tags_status = {},
is_excluded = false, is_excluded = false,
curr_tag_only = false curr_tag_only = false,
font = "monospace 20",
fg = beautiful.fg_normal,
hintsize = beautiful.xresources.apply_dpi(50)
} }
@ -71,15 +76,12 @@ revelation = {
local function selectfn(restore) local function selectfn(restore)
return function(c) return function(c)
restore() restore()
-- Pop to client tag
awful.tag.viewonly(c:tags()[1], c.screen)
-- Focus and raise -- Focus and raise
if c.minimized then if c.minimized then
c.minimized = false c.minimized = false
end end
capi.client.focus = c awful.client.jumpto(c)
awful.screen.focus(c.screen)
c:raise()
end end
end end
@ -89,18 +91,18 @@ end
-- @param t The tag to give matching clients. -- @param t The tag to give matching clients.
local function match_clients(rule, clients, t, is_excluded) local function match_clients(rule, clients, t, is_excluded)
local mfc = rule.any and revelation.match.any or revelation.match.exact local mfc = rule.any and revelation.match.any or revelation.match.exact
local mf = is_excluded and function(c,rule) return not mfc(c,rule) end or mfc local mf = is_excluded and function(c,_rule) return not mfc(c,_rule) end or mfc
local k,v, flt local flt
for _, c in pairs(clients) do for _, c in pairs(clients) do
if mf(c, rule) then if mf(c, rule) then
-- Store geometry before setting their tags -- Store geometry before setting their tags
clientData[c] = {} clientData[c] = {}
if awful.client.floating.get(c) then if awful.client.floating.get(c) then
clientData[c]["geometry"] = c:geometry() clientData[c]["geometry"] = c:geometry()
flt = awful.client.property.get(c, "floating") flt = awful.client.property.get(c, "floating")
if flt ~= nil then if flt ~= nil then
clientData[c]["floating"] = flt clientData[c]["floating"] = flt
awful.client.property.set(c, "floating", false) awful.client.property.set(c, "floating", false)
end end
end end
@ -108,7 +110,7 @@ local function match_clients(rule, clients, t, is_excluded)
for k,v in pairs(revelation.property_to_watch) do for k,v in pairs(revelation.property_to_watch) do
clientData[c][k] = c[k] clientData[c][k] = c[k]
c[k] = v c[k] = v
end end
awful.client.toggletag(t, c) awful.client.toggletag(t, c)
end end
@ -123,7 +125,7 @@ end
function revelation.expose(args) function revelation.expose(args)
local args = args or {} args = args or {}
local rule = args.rule or {} local rule = args.rule or {}
local is_excluded = args.is_excluded or false local is_excluded = args.is_excluded or false
local curr_tag_only = args.curr_tag_only or false local curr_tag_only = args.curr_tag_only or false
@ -136,9 +138,6 @@ function revelation.expose(args)
for scr=1,capi.screen.count() do for scr=1,capi.screen.count() do
all_tags = awful.tag.gettags(scr)
t[scr] = awful.tag.new({revelation.tag_name}, t[scr] = awful.tag.new({revelation.tag_name},
scr, scr,
awful.layout.suit.fair)[1] awful.layout.suit.fair)[1]
@ -147,43 +146,60 @@ function revelation.expose(args)
awful.layout.suit.fair)[1] awful.layout.suit.fair)[1]
if curr_tag_only then if curr_tag_only then
match_clients(rule, awful.client.visible(scr), t[scr], is_excluded) match_clients(rule, awful.client.visible(scr), t[scr], is_excluded)
else else
match_clients(rule, capi.client.get(scr), t[scr], is_excluded) match_clients(rule, capi.client.get(scr), t[scr], is_excluded)
end end
awful.tag.viewonly(t[scr], t.screen) awful.tag.viewonly(t[scr], t.screen)
end end
capi.awesome.emit_signal("refresh")
revelation.expose_callback(t, zt)
end
---- descrepted
-- this timer is used to want the the geometry of clients are recalcuated. ---- this timer is used to want the the geometry of clients are recalcuated.
-- if timeout = 0.0, it consumes cpu, timeout = 0.001 is good enough. ---- if timeout = 0.0, it consumes cpu, timeout = 0.001 is good enough.
-- ----
local block_timer = timer({ timeout = 0.001 }) --local block_timer = timer({ timeout = 0.001 })
--local hintindex = {} -- Table of visible clients with the hint letter as the keys
--local clientlist = awful.client.visible()
--block_timer:connect_signal("timeout", function ()
--for i,thisclient in pairs(clientlist) do
---- Move wiboxes to center of visible windows and populate hintindex
--local char = charorder:sub(i,i)
--hintindex[char] = thisclient
--hintbox[char].visible = true
--local geom = thisclient.geometry(thisclient)
--hintbox[char].x = geom.x + geom.width/2 - hintsize/2
--hintbox[char].y = geom.y + geom.height/2 - hintsize/2
--hintbox[char].screen = thisclient.screen
--end
--end)
--block_timer:start()
function revelation.expose_callback(t, zt)
local hintindex = {} -- Table of visible clients with the hint letter as the keys local hintindex = {} -- Table of visible clients with the hint letter as the keys
local clientlist = awful.client.visible() local clientlist = awful.client.visible()
for i,thisclient in pairs(clientlist) do
block_timer:connect_signal("timeout", function () -- Move wiboxes to center of visible windows and populate hintindex
for i,thisclient in pairs(clientlist) do local char = charorder:sub(i,i)
-- Move wiboxes to center of visible windows and populate hintindex if char and char ~= '' then
local char = charorder:sub(i,i)
hintindex[char] = thisclient hintindex[char] = thisclient
local geom = thisclient:geometry()
hintbox[char].visible = true hintbox[char].visible = true
local geom = thisclient.geometry(thisclient) hintbox[char].x = math.floor(geom.x + geom.width/2 - revelation.hintsize/2)
hintbox[char].x = geom.x + geom.width/2 - hintsize/2 hintbox[char].y = math.floor(geom.y + geom.height/2 - revelation.hintsize/2)
hintbox[char].y = geom.y + geom.height/2 - hintsize/2
hintbox[char].screen = thisclient.screen hintbox[char].screen = thisclient.screen
end end
end) end
block_timer:start()
local function restore() local function restore()
local k,v
for scr=1, capi.screen.count() do for scr=1, capi.screen.count() do
awful.tag.history.restore(scr) awful.tag.history.restore(scr)
t[scr].screen = nil t[scr].screen = nil
@ -199,7 +215,7 @@ function revelation.expose(args)
local clients local clients
for scr=1, capi.screen.count() do for scr=1, capi.screen.count() do
if revelation.curr_tag_only then if revelation.curr_tag_only then
clients = awful.client.visible(scr) clients = awful.client.visible(scr)
else else
clients = capi.client.get(scr) clients = capi.client.get(scr)
@ -207,12 +223,12 @@ function revelation.expose(args)
for _, c in pairs(clients) do for _, c in pairs(clients) do
if clientData[c] then if clientData[c] then
for k,v in pairs(clientData[c]) do for k,v in pairs(clientData[c]) do
if v ~= nil then if v ~= nil then
if k== "geometry" then if k== "geometry" then
c:geometry(v) c:geometry(v)
elseif k == "floating" then elseif k == "floating" then
awful.client.property.set(c, "floating", v) awful.client.property.set(c, "floating", v)
else else
c[k]=v c[k]=v
end end
@ -230,19 +246,19 @@ function revelation.expose(args)
local zoomed = false local zoomed = false
local zoomedClient = nil local zoomedClient = nil
local keyPressed = false
local keyPressed = false
capi.keygrabber.run(function (mod, key, event) capi.keygrabber.run(function (mod, key, event)
local c = nil local c
local keyPressed = false keyPressed = false
if event == "release" then return true end if event == "release" then return true end
--if awful.util.table.hasitem(mod, "Shift") then --if awful.util.table.hasitem(mod, "Shift") then
--debuginfo("dogx") --debuginfo("dogx")
--debuginfo(string.lower(key)) --debuginfo(string.lower(key))
--end --end
if awful.util.table.hasitem(mod, "Shift") then if awful.util.table.hasitem(mod, "Shift") then
if keyPressed then if keyPressed then
keyPressed = false keyPressed = false
@ -257,15 +273,15 @@ function revelation.expose(args)
awful.tag.history.restore(capi.mouse.screen) awful.tag.history.restore(capi.mouse.screen)
awful.client.toggletag(zt[capi.mouse.screen], zoomedClient) awful.client.toggletag(zt[capi.mouse.screen], zoomedClient)
zoomedClient = nil zoomedClient = nil
zoomed = false zoomed = false
end end
end end
end end
if hintindex[key] then if hintindex[key] then
--client.focus = hintindex[key] --client.focus = hintindex[key]
--hintindex[key]:raise() --hintindex[key]:raise()
selectfn(restore)(hintindex[key]) selectfn(restore)(hintindex[key])
@ -274,7 +290,7 @@ function revelation.expose(args)
end end
return false return false
end end
if key == "Escape" then if key == "Escape" then
for i,j in pairs(hintindex) do for i,j in pairs(hintindex) do
@ -300,9 +316,9 @@ function revelation.expose(args)
hintbox[i].visible = false hintbox[i].visible = false
end end
return false return false
elseif mouse.buttons[2] == true and pressedMiddle == false and c ~= nil then elseif mouse.buttons[2] == true and pressedMiddle == false and c ~= nil then
-- is true whenever the button is down. -- is true whenever the button is down.
pressedMiddle = true pressedMiddle = true
-- extra variable needed to prevent script from spam-closing windows -- extra variable needed to prevent script from spam-closing windows
c:kill() c:kill()
return true return true
@ -318,7 +334,7 @@ function revelation.expose(args)
awful.tag.history.restore(capi.mouse.screen) awful.tag.history.restore(capi.mouse.screen)
awful.client.toggletag(zt[capi.mouse.screen], zoomedClient) awful.client.toggletag(zt[capi.mouse.screen], zoomedClient)
zoomedClient = nil zoomedClient = nil
zoomed = false zoomed = false
end end
end end
@ -333,14 +349,12 @@ end
-- Create the wiboxes, but don't show them -- Create the wiboxes, but don't show them
-- --
function revelation.init(args) function revelation.init(args)
hintsize = 60
local fontcolor = beautiful.fg_normal
local letterbox = {} local letterbox = {}
local args = args or {} args = args or {}
revelation.tag_name = args.tag_name or revelation.tag_name revelation.tag_name = args.tag_name or revelation.tag_name
if args.match then if args.match then
revelation.match.exact = args.match.exact or revelation.match.exact revelation.match.exact = args.match.exact or revelation.match.exact
revelation.match.any = args.match.any or revelation.match.any revelation.match.any = args.match.any or revelation.match.any
end end
@ -350,11 +364,15 @@ function revelation.init(args)
local char = charorder:sub(i,i) local char = charorder:sub(i,i)
hintbox[char] = wibox({fg=beautiful.fg_normal, bg=beautiful.bg_focus, border_color=beautiful.border_focus, border_width=beautiful.border_width}) hintbox[char] = wibox({fg=beautiful.fg_normal, bg=beautiful.bg_focus, border_color=beautiful.border_focus, border_width=beautiful.border_width})
hintbox[char].ontop = true hintbox[char].ontop = true
hintbox[char].width = hintsize hintbox[char].width = revelation.hintsize
hintbox[char].height = hintsize hintbox[char].height = revelation.hintsize
letterbox[char] = wibox.widget.textbox() letterbox[char] = wibox.widget.textbox()
letterbox[char]:set_markup("<span color=\"" .. beautiful.fg_normal.."\"" .. ">" .. char.upper(char) .. "</span>") letterbox[char]:set_markup(
letterbox[char]:set_font("dejavu sans mono 40") "<span color=\"" .. revelation.fg .. "\"" .. ">" ..
char.upper(char) ..
"</span>"
)
letterbox[char]:set_font(revelation.font)
letterbox[char]:set_align("center") letterbox[char]:set_align("center")
hintbox[char]:set_widget(letterbox[char]) hintbox[char]:set_widget(letterbox[char])
end end