diff options
Diffstat (limited to 'awesome/lib/awful/autofocus.lua')
-rw-r--r-- | awesome/lib/awful/autofocus.lua | 64 |
1 files changed, 64 insertions, 0 deletions
diff --git a/awesome/lib/awful/autofocus.lua b/awesome/lib/awful/autofocus.lua new file mode 100644 index 0000000..5fcd220 --- /dev/null +++ b/awesome/lib/awful/autofocus.lua @@ -0,0 +1,64 @@ +--------------------------------------------------------------------------- +--- Autofocus functions. +-- +-- When loaded, this module makes sure that there's always a client that will +-- have focus on events such as tag switching, client unmanaging, etc. +-- +-- @author Julien Danjou <julien@danjou.info> +-- @copyright 2009 Julien Danjou +-- @module awful.autofocus +--------------------------------------------------------------------------- + +local client = client +local aclient = require("awful.client") +local timer = require("gears.timer") + +--- Give focus when clients appear/disappear. +-- +-- @param obj An object that should have a .screen property. +local function check_focus(obj) + if not obj.screen.valid then return end + -- When no visible client has the focus... + if not client.focus or not client.focus:isvisible() then + local c = aclient.focus.history.get(screen[obj.screen], 0, aclient.focus.filter) + if c then + c:emit_signal("request::activate", "autofocus.check_focus", + {raise=false}) + end + end +end + +--- Check client focus (delayed). +-- @param obj An object that should have a .screen property. +local function check_focus_delayed(obj) + timer.delayed_call(check_focus, {screen = obj.screen}) +end + +--- Give focus on tag selection change. +-- +-- @param tag A tag object +local function check_focus_tag(t) + local s = t.screen + if (not s) or (not s.valid) then return end + s = screen[s] + check_focus({ screen = s }) + if client.focus and screen[client.focus.screen] ~= s then + local c = aclient.focus.history.get(s, 0, aclient.focus.filter) + if c then + c:emit_signal("request::activate", "autofocus.check_focus_tag", + {raise=false}) + end + end +end + +tag.connect_signal("property::selected", function (t) + timer.delayed_call(check_focus_tag, t) +end) +client.connect_signal("unmanage", check_focus_delayed) +client.connect_signal("tagged", check_focus_delayed) +client.connect_signal("untagged", check_focus_delayed) +client.connect_signal("property::hidden", check_focus_delayed) +client.connect_signal("property::minimized", check_focus_delayed) +client.connect_signal("property::sticky", check_focus_delayed) + +-- vim: filetype=lua:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:textwidth=80 |