diff --git a/lib/awful/placement.lua b/lib/awful/placement.lua index 6e5df3f3..426da79e 100644 --- a/lib/awful/placement.lua +++ b/lib/awful/placement.lua @@ -9,14 +9,16 @@ -- * Turn each function into an API with various common customization parameters. -- * Re-use the same functions for the `mouse`, `client`s, `screen`s and `wibox`es -- --- +-- +--

Compositing

-- -- It is possible to compose placement function using the `+` or `*` operator: -- --- local f = (awful.placement.right + awful.placement.left) --- f(client.focus) +--@DOC_awful_placement_compose_EXAMPLE@ -- --- ### Common arguments +--@DOC_awful_placement_compose2_EXAMPLE@ +-- +--

Common arguments

-- -- **pretend** (*boolean*): -- @@ -86,6 +88,7 @@ local capi = local client = require("awful.client") local layout = require("awful.layout") local a_screen = require("awful.screen") +local util = require("awful.util") local dpi = require("beautiful").xresources.apply_dpi local function get_screen(s) @@ -137,7 +140,7 @@ local function compose(...) for k, f in ipairs(queue) do if k == #queue then - args.pretent = pretend_real + args.pretend = pretend_real or false end local r = {f(d, args, ...)} @@ -286,11 +289,19 @@ end -- @param d The drawin -- @tparam[opt=nil] table new_geo A new geometry -- @tparam[opt=false] boolean ignore_border_width Ignore the border +-- @tparam table args the method arguments -- @treturn The drawin's area. -local function area_common(d, new_geo, ignore_border_width) +local function area_common(d, new_geo, ignore_border_width, args) -- The C side expect no arguments, nil isn't valid local geometry = new_geo and d:geometry(new_geo) or d:geometry() local border = ignore_border_width and 0 or d.border_width or 0 + + -- When using the placement composition along with the "pretend" + -- option, it is necessary to keep a "virtual" geometry. + if args and args.override_geometry then + geometry = util.table.clone(args.override_geometry) + end + geometry.width = geometry.width + 2 * border geometry.height = geometry.height + 2 * border return geometry @@ -322,15 +333,9 @@ local function geometry_common(obj, args, new_geo, ignore_border_width) -- It is either a drawable or something that implement its API if type(geo) == "function" then local dgeo = area_common( - obj, fix_new_geometry(new_geo, args), ignore_border_width + obj, fix_new_geometry(new_geo, args), ignore_border_width, args ) - -- When using the placement composition along with the "pretend" - -- option, it is necessary to keep a "virtual" geometry. - if args.override_geometry then - dgeo = args.override_geometry - end - -- Apply the margins if args.margins then local delta = type(args.margins) == "table" and args.margins or { @@ -1100,6 +1105,10 @@ function placement.scale(d, args) end end + local bw = d.border_width or 0 + ngeo.width = ngeo.width - 2*bw + ngeo.height = ngeo.height - 2*bw + geometry_common(d, args, ngeo) attach(d, placement.maximize, args) diff --git a/tests/examples/awful/placement/compose.lua b/tests/examples/awful/placement/compose.lua index 28098677..f6710762 100644 --- a/tests/examples/awful/placement/compose.lua +++ b/tests/examples/awful/placement/compose.lua @@ -1,9 +1,11 @@ -screen[1]._resize {width = 128, height = 96} --DOC_HIDE +screen[1]._resize {x = 175, width = 128, height = 96} --DOC_NO_USAGE --DOC_HIDE local awful = {placement = require("awful.placement")} --DOC_HIDE -local c = client.gen_fake {x = 45, y = 35, width=40, height=30} --DOC_HIDE +local c = client.gen_fake {x = 220, y = 35, width=40, height=30} --DOC_HIDE -local f = (awful.placement.right + awful.placement.left) -f(client.focus) + -- "right" will be replaced by "left" + local f = (awful.placement.right + awful.placement.left) + f(client.focus) -assert(c.x == 0 and c.y==screen[1].geometry.height/2-30/2-c.border_width--DOC_HIDE +local sg = screen[1].geometry--DOC_HIDE +assert(c.x == sg.x and c.y==sg.height/2-30/2-c.border_width--DOC_HIDE and c.width==40 and c.height==30)--DOC_HIDE diff --git a/tests/examples/awful/placement/compose2.lua b/tests/examples/awful/placement/compose2.lua new file mode 100644 index 00000000..68cbf5b3 --- /dev/null +++ b/tests/examples/awful/placement/compose2.lua @@ -0,0 +1,19 @@ +screen[1]._resize {x = 175, width = 128, height = 96} --DOC_NO_USAGE --DOC_HIDE +local awful = {placement = require("awful.placement")} --DOC_HIDE +local c = client.gen_fake {x = 220, y = 35, width=40, height=30} --DOC_HIDE + + + -- Simulate Windows 7 "edge snap" (also called aero snap) feature + local axis = "vertically" + + local f = awful.placement.scale + + awful.placement.left + + (axis and awful.placement["maximize_"..axis] or nil) + + local geo = f(client.focus, {honor_workarea=true, to_percent = 0.5}) + +local wa = screen[1].workarea--DOC_HIDE +assert(c.x == wa.x and geo.x == wa.x)--DOC_HIDE +assert(c.y == wa.y) --DOC_HIDE +assert(c.width == wa.width/2 - 2*c.border_width)--DOC_HIDE +assert(c.height == wa.height - 2*c.border_width)--DOC_HIDE