Fixes to awful.client's lazy-loading of awful.screen

At least awful.client.getmaster was broken:

> lib/awful/client.lua:450: attempt to index global 'awful' (a nil value)

This uses a metatable to simplify handling the cyclic dependency to
`awful.screen`.

Follow-up to cbe684e (https://github.com/awesomeWM/awesome/pull/94).
Closes https://github.com/awesomeWM/awesome/pull/334.
This commit is contained in:
Daniel Hahler 2015-07-22 02:42:35 +02:00
parent c602eb4ff7
commit fc950f6921
1 changed files with 21 additions and 23 deletions

View File

@ -24,9 +24,17 @@ local capi =
awesome = awesome, awesome = awesome,
} }
-- we use require("awful.screen") inside functions to prevent circular dependencies. -- We use a metatable to prevent circular dependency loops.
local screen local screen
do
screen = setmetatable({}, {
__index = function(t, k)
screen = require("awful.screen")
return screen[k]
end,
_newindex = error -- Just to be sure in case anything ever does this
})
end
local client = {} local client = {}
-- Private data -- Private data
@ -54,7 +62,6 @@ client.shape = require("awful.client.shape")
-- @client c the client to jump to -- @client c the client to jump to
-- @tparam bool merge If true then merge tags when clients are not visible. -- @tparam bool merge If true then merge tags when clients are not visible.
function client.jumpto(c, merge) function client.jumpto(c, merge)
screen = screen or require("awful.screen")
local s = screen.focused() local s = screen.focused()
-- focus the screen -- focus the screen
if s ~= c.screen then if s ~= c.screen then
@ -205,7 +212,7 @@ end
--- Focus the previous client in history. --- Focus the previous client in history.
function client.focus.history.previous() function client.focus.history.previous()
local sel = capi.client.focus local sel = capi.client.focus
local s = sel and sel.screen or awful.screen.focused() local s = sel and sel.screen or screen.focused()
local c = client.focus.history.get(s, 1) local c = client.focus.history.get(s, 1)
if c then if c then
c:emit_signal("request::activate", "client.focus.history.previous", c:emit_signal("request::activate", "client.focus.history.previous",
@ -316,12 +323,8 @@ end
-- @client[opt] c The client. -- @client[opt] c The client.
-- @tparam[opt=false] boolean stacked Use stacking order? -- @tparam[opt=false] boolean stacked Use stacking order?
function client.focus.global_bydirection(dir, c, stacked) function client.focus.global_bydirection(dir, c, stacked)
screen = screen or require("awful.screen")
local sel = c or capi.client.focus local sel = c or capi.client.focus
local scr = awful.screen.focused() local scr = sel and sel.screen or screen.focused
if sel then
scr = sel.screen
end
-- change focus inside the screen -- change focus inside the screen
client.focus.bydirection(dir, sel) client.focus.bydirection(dir, sel)
@ -329,8 +332,8 @@ function client.focus.global_bydirection(dir, c, stacked)
-- if focus not changed, we must change screen -- if focus not changed, we must change screen
if sel == capi.client.focus then if sel == capi.client.focus then
screen.focus_bydirection(dir, scr) screen.focus_bydirection(dir, scr)
if scr ~= awful.screen.focused() then if scr ~= screen.focused() then
local cltbl = client.visible(awful.screen.focused(), stacked) local cltbl = client.visible(screen.focused(), stacked)
local geomtbl = {} local geomtbl = {}
for i,cl in ipairs(cltbl) do for i,cl in ipairs(cltbl) do
geomtbl[i] = cl:geometry() geomtbl[i] = cl:geometry()
@ -383,12 +386,8 @@ end
-- @param dir The direction, can be either "up", "down", "left" or "right". -- @param dir The direction, can be either "up", "down", "left" or "right".
-- @client[opt] c The client. -- @client[opt] c The client.
function client.swap.global_bydirection(dir, c) function client.swap.global_bydirection(dir, c)
screen = screen or require("awful.screen")
local sel = c or capi.client.focus local sel = c or capi.client.focus
local scr = awful.screen.focused() local scr = sel and sel.screen or screen.focused()
if sel then
scr = sel.screen
end
if sel then if sel then
-- move focus -- move focus
@ -401,7 +400,7 @@ function client.swap.global_bydirection(dir, c)
-- swapping to an empty screen -- swapping to an empty screen
elseif sel.screen ~= c.screen and sel == c then elseif sel.screen ~= c.screen and sel == c then
client.movetoscreen(sel, awful.screen.focused()) client.movetoscreen(sel, screen.focused())
-- swapping to a nonempty screen -- swapping to a nonempty screen
elseif sel.screen ~= c.screen and sel ~= c then elseif sel.screen ~= c.screen and sel ~= c then
@ -432,7 +431,7 @@ end
-- @param[opt] screen The screen where to cycle clients. -- @param[opt] screen The screen where to cycle clients.
-- @tparam[opt=false] boolean stacked Use stacking order? -- @tparam[opt=false] boolean stacked Use stacking order?
function client.cycle(clockwise, screen, stacked) function client.cycle(clockwise, screen, stacked)
local screen = screen or awful.screen.focused() s = s or screen.focused()
local cls = client.visible(screen, stacked) local cls = client.visible(screen, stacked)
-- We can't rotate without at least 2 clients, buddy. -- We can't rotate without at least 2 clients, buddy.
if #cls >= 2 then if #cls >= 2 then
@ -451,10 +450,10 @@ end
--- Get the master window. --- Get the master window.
-- --
-- @param[opt] screen The screen number, otherwise screen mouse is used. -- @param[opt] s The screen number, defaults to focused screen.
-- @return The master window. -- @return The master window.
function client.getmaster(screen) function client.getmaster(s)
local s = screen or awful.screen.focused() s = s or screen.focused()
return client.visible(s)[1] return client.visible(s)[1]
end end
@ -536,7 +535,6 @@ end
-- @client c The client to move. -- @client c The client to move.
-- @param s The screen number, default to current + 1. -- @param s The screen number, default to current + 1.
function client.movetoscreen(c, s) function client.movetoscreen(c, s)
screen = screen or require("awful.screen")
local sel = c or capi.client.focus local sel = c or capi.client.focus
if sel then if sel then
local sc = capi.screen.count() local sc = capi.screen.count()
@ -717,7 +715,7 @@ end
-- @param s The screen to use. -- @param s The screen to use.
-- @return The restored client if some client was restored, otherwise nil. -- @return The restored client if some client was restored, otherwise nil.
function client.restore(s) function client.restore(s)
local s = s or (capi.client.focus and capi.client.focus.screen) or awful.screen.focused() s = s or screen.focused()
local cls = capi.client.get(s) local cls = capi.client.get(s)
local tags = tag.selectedlist(s) local tags = tag.selectedlist(s)
local mcls = {} local mcls = {}