diff options
Diffstat (limited to 'awesome/lib/awful/client/focus.lua')
-rw-r--r-- | awesome/lib/awful/client/focus.lua | 215 |
1 files changed, 0 insertions, 215 deletions
diff --git a/awesome/lib/awful/client/focus.lua b/awesome/lib/awful/client/focus.lua deleted file mode 100644 index a8b04f2..0000000 --- a/awesome/lib/awful/client/focus.lua +++ /dev/null @@ -1,215 +0,0 @@ ---------------------------------------------------------------------------- ---- Keep track of the focused clients. --- --- @author Julien Danjou <julien@danjou.info> --- @copyright 2008 Julien Danjou --- @submodule client ---------------------------------------------------------------------------- -local grect = require("gears.geometry").rectangle - -local capi = -{ - screen = screen, - client = client, -} - --- We use a metatable to prevent circular dependency loops. -local screen -do - screen = setmetatable({}, { - __index = function(_, k) - screen = require("awful.screen") - return screen[k] - end, - __newindex = error -- Just to be sure in case anything ever does this - }) -end - -local client -do - client = setmetatable({}, { - __index = function(_, k) - client = require("awful.client") - return client[k] - end, - __newindex = error -- Just to be sure in case anything ever does this - }) -end - -local focus = {history = {list = {}}} - -local function get_screen(s) - return s and capi.screen[s] -end - ---- Remove a client from the focus history --- --- @client c The client that must be removed. --- @function awful.client.focus.history.delete -function focus.history.delete(c) - for k, v in ipairs(focus.history.list) do - if v == c then - table.remove(focus.history.list, k) - break - end - end -end - ---- Focus a client by its relative index. --- --- @function awful.client.focus.byidx --- @param i The index. --- @client[opt] c The client. -function focus.byidx(i, c) - local target = client.next(i, c) - if target then - target:emit_signal("request::activate", "client.focus.byidx", - {raise=true}) - end -end - ---- Filter out window that we do not want handled by focus. --- This usually means that desktop, dock and splash windows are --- not registered and cannot get focus. --- --- @client c A client. --- @return The same client if it's ok, nil otherwise. --- @function awful.client.focus.filter -function focus.filter(c) - if c.type == "desktop" - or c.type == "dock" - or c.type == "splash" - or not c.focusable then - return nil - end - return c -end - ---- Update client focus history. --- --- @client c The client that has been focused. --- @function awful.client.focus.history.add -function focus.history.add(c) - -- Remove the client if its in stack - focus.history.delete(c) - -- Record the client has latest focused - table.insert(focus.history.list, 1, c) -end - ---- Get the latest focused client for a screen in history. --- --- @tparam int|screen s The screen to look for. --- @tparam int idx The index: 0 will return first candidate, --- 1 will return second, etc. --- @tparam function filter An optional filter. If no client is found in the --- first iteration, `awful.client.focus.filter` is used by default to get any --- client. --- @treturn client.object A client. --- @function awful.client.focus.history.get -function focus.history.get(s, idx, filter) - s = get_screen(s) - -- When this counter is equal to idx, we return the client - local counter = 0 - local vc = client.visible(s, true) - for _, c in ipairs(focus.history.list) do - if get_screen(c.screen) == s then - if not filter or filter(c) then - for _, vcc in ipairs(vc) do - if vcc == c then - if counter == idx then - return c - end - -- We found one, increment the counter only. - counter = counter + 1 - break - end - end - end - end - end - -- Argh nobody found in history, give the first one visible if there is one - -- that passes the filter. - filter = filter or focus.filter - if counter == 0 then - for _, v in ipairs(vc) do - if filter(v) then - return v - end - end - end -end - ---- Focus the previous client in history. --- @function awful.client.focus.history.previous -function focus.history.previous() - local sel = capi.client.focus - local s = sel and sel.screen or screen.focused() - local c = focus.history.get(s, 1) - if c then - c:emit_signal("request::activate", "client.focus.history.previous", - {raise=false}) - end -end - ---- Focus a client by the given direction. --- --- @tparam string dir The direction, can be either --- `"up"`, `"down"`, `"left"` or `"right"`. --- @client[opt] c The client. --- @tparam[opt=false] boolean stacked Use stacking order? (top to bottom) --- @function awful.client.focus.bydirection -function focus.bydirection(dir, c, stacked) - local sel = c or capi.client.focus - if sel then - local cltbl = client.visible(sel.screen, stacked) - local geomtbl = {} - for i,cl in ipairs(cltbl) do - geomtbl[i] = cl:geometry() - end - - local target = grect.get_in_direction(dir, geomtbl, sel:geometry()) - - -- If we found a client to focus, then do it. - if target then - cltbl[target]:emit_signal("request::activate", - "client.focus.bydirection", {raise=false}) - end - end -end - ---- Focus a client by the given direction. Moves across screens. --- --- @param dir The direction, can be either "up", "down", "left" or "right". --- @client[opt] c The client. --- @tparam[opt=false] boolean stacked Use stacking order? (top to bottom) --- @function awful.client.focus.global_bydirection -function focus.global_bydirection(dir, c, stacked) - local sel = c or capi.client.focus - local scr = get_screen(sel and sel.screen or screen.focused()) - - -- change focus inside the screen - focus.bydirection(dir, sel) - - -- if focus not changed, we must change screen - if sel == capi.client.focus then - screen.focus_bydirection(dir, scr) - if scr ~= get_screen(screen.focused()) then - local cltbl = client.visible(screen.focused(), stacked) - local geomtbl = {} - for i,cl in ipairs(cltbl) do - geomtbl[i] = cl:geometry() - end - local target = grect.get_in_direction(dir, geomtbl, scr.geometry) - - if target then - cltbl[target]:emit_signal("request::activate", - "client.focus.global_bydirection", - {raise=false}) - end - end - end -end - -return focus - --- vim: filetype=lua:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:textwidth=80 |