awful.rules: Add 'placement' property

This commit is contained in:
Emmanuel Lepage Vallee 2016-04-17 03:52:33 -04:00
parent b0aedcda67
commit 7cd76e0529
1 changed files with 40 additions and 1 deletions

View File

@ -16,6 +16,7 @@ local type = type
local ipairs = ipairs
local pairs = pairs
local atag = require("awful.tag")
local a_place = require("awful.placement")
local rules = {}
@ -258,7 +259,7 @@ rules.delayed_properties = {}
local force_ignore = {
titlebars_enabled=true, focus=true, screen=true, x=true,
y=true, width=true, height=true, geometry=true
y=true, width=true, height=true, geometry=true,placement=true,
}
function rules.high_priority_properties.tag(c, value)
@ -332,6 +333,29 @@ function rules.high_priority_properties.new_tag(c, value)
return t
end
function rules.extra_properties.placement(c, value)
-- Avoid problems
if awesome.startup and
(c.size_hints.user_position or c.size_hints.program_position) then
return
end
local ty = type(value)
local args = {
honor_workarea = true,
honor_padding = true
}
if ty == "function" or (ty == "table" and
getmetatable(value) and getmetatable(value).__call
) then
value(c, args)
elseif ty == "string" and a_place[value] then
a_place[value](c, args)
end
end
--- Apply properties and callbacks to a client.
-- @client c The client.
-- @tab props Properties to apply.
@ -367,6 +391,21 @@ function rules.execute(c, props, callbacks)
rules.extra_properties.placement(c, props.placement, props)
end
-- Make sure the tag is selected before the main rules are called.
-- Otherwise properties like "urgent" or "focus" may fail because they
-- will be overiden by various callbacks.
-- Previously, this was done in a second client.manage callback, but caused
-- a race condition where the order the require() would change the output.
c:emit_signal("request::tag", nil, {reason="rules"})
-- By default, rc.lua use no_overlap+no_offscreen placement. This has to
-- be executed before x/y/width/height/geometry as it would otherwise
-- always override the user specified position with the default rule.
if props.placement then
-- It may be a function, so this one doesn't execute it like others
rules.extra_properties.placement(c, props.placement, props)
end
-- Now that the tags and screen are set, handle the geometry
if props.height or props.width or props.x or props.y or props.geometry then
rules.extra_properties.geometry(c, nil, props)