client: Honor the client maximization requests again
This implementes the FIXME added a few commits ago. A new request::geometry handler turns client requests into normal lua `c.maximized = true` property changes.
This commit is contained in:
parent
b570e6d347
commit
9bc46e4648
|
@ -9,6 +9,7 @@
|
||||||
local client = client
|
local client = client
|
||||||
local screen = screen
|
local screen = screen
|
||||||
local ipairs = ipairs
|
local ipairs = ipairs
|
||||||
|
local timer = require("gears.timer")
|
||||||
local gtable = require("gears.table")
|
local gtable = require("gears.table")
|
||||||
local aclient = require("awful.client")
|
local aclient = require("awful.client")
|
||||||
local aplace = require("awful.placement")
|
local aplace = require("awful.placement")
|
||||||
|
@ -247,10 +248,6 @@ local context_mapper = {
|
||||||
function ewmh.geometry(c, context, hints)
|
function ewmh.geometry(c, context, hints)
|
||||||
local layout = c.screen.selected_tag and c.screen.selected_tag.layout or nil
|
local layout = c.screen.selected_tag and c.screen.selected_tag.layout or nil
|
||||||
|
|
||||||
--TODO handle `client_maximize_horizontal` and `client_maximize_vertical`
|
|
||||||
-- so the clients can request being maximized. Currently they can set the
|
|
||||||
-- atom, but it is ignored.
|
|
||||||
|
|
||||||
-- Setting the geometry will not work unless the client is floating.
|
-- Setting the geometry will not work unless the client is floating.
|
||||||
if (not c.floating) and (not layout == asuit.floating) then
|
if (not c.floating) and (not layout == asuit.floating) then
|
||||||
return
|
return
|
||||||
|
@ -306,10 +303,72 @@ function ewmh.geometry(c, context, hints)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
--- Merge the 2 requests sent by clients wanting to be maximized.
|
||||||
|
--
|
||||||
|
-- The X clients set 2 flags (atoms) when they want to be maximized. This caused
|
||||||
|
-- 2 request::geometry to be sent. This code gives some time for them to arrive
|
||||||
|
-- and send a new `request::geometry` (through the property change) with the
|
||||||
|
-- combined state.
|
||||||
|
--
|
||||||
|
-- @signalhandler awful.ewmh.merge_maximization
|
||||||
|
-- @tparam client c The client
|
||||||
|
-- @tparam string context The context
|
||||||
|
-- @tparam[opt={}] table hints The hints to pass to the handler
|
||||||
|
function ewmh.merge_maximization(c, context, hints)
|
||||||
|
if context ~= "client_maximize_horizontal" and context ~= "client_maximize_vertical" then
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
if not c._delay_maximization then
|
||||||
|
c._delay_maximization = function()
|
||||||
|
-- This ignores unlikely corner cases like mismatching toggles.
|
||||||
|
-- That's likely to be an accident anyway.
|
||||||
|
if c._delayed_max_h and c._delayed_max_v then
|
||||||
|
c.maximized = c._delayed_max_h or c._delayed_max_v
|
||||||
|
elseif c._delayed_max_h then
|
||||||
|
c.maximized_horizontal = c._delayed_max_h
|
||||||
|
elseif c._delayed_max_v then
|
||||||
|
c.maximized_vertical = c._delayed_max_v
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
timer {
|
||||||
|
timeout = 1/60,
|
||||||
|
autostart = true,
|
||||||
|
single_shot = true,
|
||||||
|
callback = function()
|
||||||
|
if not c.valid then return end
|
||||||
|
|
||||||
|
c._delay_maximization(c)
|
||||||
|
c._delay_maximization = nil
|
||||||
|
c._delayed_max_h = nil
|
||||||
|
c._delayed_max_v = nil
|
||||||
|
end
|
||||||
|
}
|
||||||
|
end
|
||||||
|
|
||||||
|
local function get_value(suffix, long_suffix)
|
||||||
|
if hints.toggle and c["_delayed_max_"..suffix] ~= nil then
|
||||||
|
return not c["_delayed_max_"..suffix]
|
||||||
|
elseif hints.toggle then
|
||||||
|
return not c["maximized_"..long_suffix]
|
||||||
|
else
|
||||||
|
return hints.status
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
if context == "client_maximize_horizontal" then
|
||||||
|
c._delayed_max_h = get_value("h", "horizontal")
|
||||||
|
elseif context == "client_maximize_vertical" then
|
||||||
|
c._delayed_max_v = get_value("v", "vertical")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
client.connect_signal("request::activate", ewmh.activate)
|
client.connect_signal("request::activate", ewmh.activate)
|
||||||
client.connect_signal("request::tag", ewmh.tag)
|
client.connect_signal("request::tag", ewmh.tag)
|
||||||
client.connect_signal("request::urgent", ewmh.urgent)
|
client.connect_signal("request::urgent", ewmh.urgent)
|
||||||
client.connect_signal("request::geometry", ewmh.geometry)
|
client.connect_signal("request::geometry", ewmh.geometry)
|
||||||
|
client.connect_signal("request::geometry", ewmh.merge_maximization)
|
||||||
client.connect_signal("property::border_width", repair_geometry)
|
client.connect_signal("property::border_width", repair_geometry)
|
||||||
client.connect_signal("property::screen", repair_geometry)
|
client.connect_signal("property::screen", repair_geometry)
|
||||||
screen.connect_signal("property::workarea", function(s)
|
screen.connect_signal("property::workarea", function(s)
|
||||||
|
|
Loading…
Reference in New Issue