awful.screen: Add a method to apply various paddings.

This avoid code duplications.
This commit is contained in:
Emmanuel Lepage Vallee 2016-03-26 03:07:20 -04:00
parent 9fd329c449
commit e66166ccee
1 changed files with 60 additions and 0 deletions

View File

@ -30,6 +30,19 @@ data.padding = {}
screen.mouse_per_screen = {} screen.mouse_per_screen = {}
--- Take an input geometry and substract/add a delta
-- @tparam table geo A geometry (width, height, x, y) table
-- @tparam table delta A delata table (top, bottom, x, y)
-- @treturn table A geometry (width, height, x, y) table
local function apply_geometry_ajustments(geo, delta)
return {
x = geo.x + (delta.left or 0),
y = geo.y + (delta.top or 0),
width = geo.width - (delta.left or 0) - (delta.right or 0),
height = geo.height - (delta.top or 0) - (delta.bottom or 0),
}
end
-- @param s Screen -- @param s Screen
-- @param x X coordinate of point -- @param x X coordinate of point
-- @param y Y coordinate of point -- @param y Y coordinate of point
@ -173,6 +186,53 @@ function screen.focused()
return capi.mouse.screen return capi.mouse.screen
end end
--- Get a placement bounding geometry.
-- This method compute different variants of the "usable" screen geometry.
--
-- Valid arguments are:
--
-- * **honor_padding**: Honor the screen padding.
-- * **honor_workarea**: Honor the screen workarea
-- * **margins**: Apply some margins on the output. This can wither be a number
-- or a table with *left*, *right*, *top* and *bottom* keys.
-- * **tag**: Use the tag screen instead of `s`
-- * **parent**: A parent drawable to use a base geometry
-- * **bounding_rect**: A bounding rectangle. This parameter is incompatible with
-- `honor_workarea`.
--
-- @tparam[opt=mouse.screen] screen s A screen
-- @tparam[opt={}] table args The arguments
-- @treturn table A table with *x*, *y*, *width* and *height*.
function screen.get_bounding_geometry(s, args)
args = args or {}
-- If the tag has a geometry, assume it is right
if args.tag then
s = args.tag.screen
end
s = get_screen(s or capi.mouse.screen)
local geo = args.bounding_rect or (args.parent and args.parent:geometry()) or
s[args.honor_workarea and "workarea" or "geometry"]
if (not args.parent) and (not args.bounding_rect) and args.honor_padding then
local padding = screen.padding(s)
geo = apply_geometry_ajustments(geo, padding)
end
if args.margins then
geo = apply_geometry_ajustments(geo,
type(args.margins) == "table" and args.margins or {
left = args.margins, right = args.margins,
top = args.margins, bottom = args.margins,
}
)
end
return geo
end
capi.screen.add_signal("padding") capi.screen.add_signal("padding")
return screen return screen