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:
parent
c602eb4ff7
commit
fc950f6921
|
@ -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 = {}
|
||||||
|
|
Loading…
Reference in New Issue