diff --git a/tests/examples/shims/client.lua b/tests/examples/shims/client.lua index 104c7785..c65e3d03 100644 --- a/tests/examples/shims/client.lua +++ b/tests/examples/shims/client.lua @@ -22,6 +22,45 @@ local function titlebar_meta(c) end end +local properties = {} + +-- Emit the request::geometry signal to make immobilized and awful.ewmh work. +for _, prop in ipairs { + "maximized", "maximized_horizontal", "maximized_vertical", "fullscreen" } do + properties["get_"..prop] = function(self) + return self.data[prop] or false + end + + properties["set_"..prop] = function(self, value) + self.data[prop] = value or false + + if value then + self:emit_signal("request::geometry", prop, nil) + end + + self:emit_signal("property::"..prop, value) + end +end + +function properties.get_screen(self) + return self.data.screen or screen[1] +end + +function properties.set_screen(self, s) + s = screen[s] + self.data.screen = s + + if self.x < s.geometry.x or self.x > s.geometry.x+s.geometry.width then + self:geometry { x = s.geometry.x } + end + + if self.y < s.geometry.y or self.y > s.geometry.y+s.geometry.height then + self:geometry { y = s.geometry.y } + end + + self:emit_signal("property::screen") +end + -- Create fake clients to move around function client.gen_fake(args) local ret = gears_obj() @@ -50,6 +89,7 @@ function client.gen_fake(args) -- Tests should always set a geometry, but just in case for _, v in ipairs{"x","y","width","height"} do ret[v] = ret[v] or 1 + assert((not args[v]) or ret[v] == args[v]) end -- Emulate capi.client.geometry @@ -90,6 +130,10 @@ function client.gen_fake(args) return nil end + function ret:set_xproperty(prop, value) + ret[prop] = value + end + function ret:get_icon(_) return require("beautiful").awesome_icon end @@ -102,6 +146,10 @@ function client.gen_fake(args) --TODO end + function ret:apply_size_hints(w, h) + return w or ret.width, h or ret.height + end + function ret:kill() local old_tags = ret:tags() or {} @@ -123,6 +171,7 @@ function client.gen_fake(args) assert(not ret.valid) end + titlebar_meta(ret) function ret:tags(new) --FIXME @@ -159,14 +208,39 @@ function client.gen_fake(args) return ret.data._struts end + -- Set a dummy one for now since set_screen will corrupt it. + ret._old_geo = {} + + -- Set the screen attributes. + local s = args.screen + + -- Pick the screen from the geometry. + if not s then + for s2 in screen do + local geo = s2.geometry + if geo.x >= ret.x and geo.y >= ret.y and ret.x < geo.x+geo.width + and ret.y < geo.y+geo.height then + s = s2 + end + end + end + + -- This will happen if the screen coords are not {0,0} and the client had + -- an unspecified position. + s = s or screen[1] + + properties.set_screen(ret, s) + + -- Set the geometry *again* because the screen possibly overwrote it. + for _, v in ipairs{"x","y","width","height"} do + ret[v] = args[v] or ret[v] + end + -- Record the geometry ret._old_geo = {} push_geometry(ret) ret._old_geo[1]._hide = args.hide_first - -- Set the attributes - ret.screen = args.screen or screen[1] - -- Good enough for the geometry and border ret.drawin = ret ret.drawable = ret @@ -176,10 +250,6 @@ function client.gen_fake(args) ret.below = false ret.above = false ret.sticky = false - ret.maximized = false - ret.fullscreen = false - ret.maximized_vertical = false - ret.maximized_horizontal = false -- Add to the client list table.insert(clients, ret) @@ -187,8 +257,21 @@ function client.gen_fake(args) client.focus = ret setmetatable(ret, { - __index = function(...) return meta.__index(...) end, - __newindex = function(...) return meta.__newindex(...) end + __index = function(self, key) + if properties["get_"..key] then + return properties["get_"..key](self) + end + + return meta.__index(self, key) + end, + __newindex = function(self, key, value) + + if properties["set_"..key] then + return properties["set_"..key](self, value) + end + + return meta.__newindex(self, key, value) + end }) client.emit_signal("manage", ret)