client: Add an `active` property to check if a client has focus.
This follows in the footsteps of: * request::activate * awful.ewmh.add_activate_filter * c:activate{}
This commit is contained in:
parent
067bcaca60
commit
58f3ea740f
|
@ -1419,6 +1419,7 @@ end
|
||||||
-- @tparam[opt=false] boolean args.toggle_minimization
|
-- @tparam[opt=false] boolean args.toggle_minimization
|
||||||
-- @see awful.ewmh.add_activate_filter
|
-- @see awful.ewmh.add_activate_filter
|
||||||
-- @see request::activate
|
-- @see request::activate
|
||||||
|
-- @see active
|
||||||
function client.object.activate(c, args)
|
function client.object.activate(c, args)
|
||||||
local new_args = setmetatable({}, {__index = args or {}})
|
local new_args = setmetatable({}, {__index = args or {}})
|
||||||
|
|
||||||
|
@ -1454,6 +1455,62 @@ function client.object.activate(c, args)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
--- Return true if the client is active (has focus).
|
||||||
|
--
|
||||||
|
-- This property is **READ ONLY**. Use `c:activate { context = "myreason" }`
|
||||||
|
-- to change the focus.
|
||||||
|
--
|
||||||
|
-- The reason for this is that directly setting the focus
|
||||||
|
-- (which can also be done using `client.focus = c`) will bypass the focus
|
||||||
|
-- stealing filters. This is easy at first, but as this gets called from more
|
||||||
|
-- and more places, it quickly become unmanageable. This coding style is
|
||||||
|
-- recommended for maintainable code:
|
||||||
|
--
|
||||||
|
-- -- Check if a client has focus:
|
||||||
|
-- if c.active then
|
||||||
|
-- -- do something
|
||||||
|
-- end
|
||||||
|
--
|
||||||
|
-- -- Check if there is a active (focused) client:
|
||||||
|
-- if client.focus ~= nil then
|
||||||
|
-- -- do something
|
||||||
|
-- end
|
||||||
|
--
|
||||||
|
-- -- Get the active (focused) client:
|
||||||
|
-- local c = client.focus
|
||||||
|
--
|
||||||
|
-- -- Set the focus:
|
||||||
|
-- c:activate {
|
||||||
|
-- context = "myreason",
|
||||||
|
-- switch_to_tag = true,
|
||||||
|
-- }
|
||||||
|
--
|
||||||
|
-- @property active
|
||||||
|
-- @tparam boolean active
|
||||||
|
-- @see activate
|
||||||
|
-- @see request::activate
|
||||||
|
-- @see awful.ewmh.add_activate_filter
|
||||||
|
|
||||||
|
function client.object.get_active(c)
|
||||||
|
return capi.client.focus == c
|
||||||
|
end
|
||||||
|
|
||||||
|
function client.object.set_active(c, value)
|
||||||
|
if value then
|
||||||
|
-- Do it, but print an error popup. Setting the focus without a context
|
||||||
|
-- breaks the filters. This seems a good idea at first, then cause
|
||||||
|
-- endless pain. QtWidgets also enforces this.
|
||||||
|
c:activate()
|
||||||
|
assert(false, "You cannot set `active` directly, use `c:activate()`.")
|
||||||
|
else
|
||||||
|
-- Be permissive given the alternative is a bit convoluted.
|
||||||
|
capi.client.focus = nil
|
||||||
|
gdebug.print_warning(
|
||||||
|
"Consider using `client.focus = nil` instead of `c.active = false"
|
||||||
|
)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
-- Register standards signals
|
-- Register standards signals
|
||||||
|
|
||||||
--- The last geometry when client was floating.
|
--- The last geometry when client was floating.
|
||||||
|
|
Loading…
Reference in New Issue