From 1ee80cd5d088d9681d8a70bf2461bb80430c0686 Mon Sep 17 00:00:00 2001
From: "Ignas Anikevicius (gns_ank)"
Date: Mon, 13 Sep 2010 23:48:16 +0300
Subject: [PATCH] Add match_any function and rule_any definition for different
client matching.
Signed-off-by: Ignas Anikevicius (gns_ank)
Signed-off-by: Uli Schlachter
---
lib/awful/rules.lua.in | 31 ++++++++++++++++++++++++++++++-
1 file changed, 30 insertions(+), 1 deletion(-)
diff --git a/lib/awful/rules.lua.in b/lib/awful/rules.lua.in
index c536c353..5e942660 100644
--- a/lib/awful/rules.lua.in
+++ b/lib/awful/rules.lua.in
@@ -62,6 +62,15 @@ module("awful.rules")
-- put in this global rules table. If the value of a rule is a string, then the
-- match function is used to determine if the client matches the rule.
--
+-- To match multiple clients to a rule one need to use slightly different
+-- syntax:
+--
+--
+-- { rule_any = { class = { "MPlayer", "Nitrogen" }, instance = { "xterm" } },
+-- properties = { floating = true } }
+--
+--
+--
-- @class table
-- @name rules
rules = {}
@@ -87,13 +96,33 @@ function match(c, rule)
return true
end
+--- Check if a client match a rule. Multiple clients can be matched
+-- @param c The client.
+-- @param rules The rule to check.
+-- @return True if at least one rule is matched, false otherwise.
+function match_any(c, rule)
+ for field, values in pairs(rule) do
+ if c[field] then
+ for _, value in ipairs(values) do
+ if c[field] == value then
+ return true
+ elseif type(c[field]) == "string" and c[field]:match(value) then
+ return true
+ end
+ end
+ end
+ end
+ return false
+end
+
--- Apply rules to a client.
-- @param c The client.
function apply(c)
local props = {}
local callbacks = {}
for _, entry in ipairs(rules) do
- if match(c, entry.rule) then
+ if (entry.rule and match(c, entry.rule)) or
+ (entry.rule_any and match_any(c, entry.rule_any)) then
if entry.properties then
for property, value in pairs(entry.properties) do
props[property] = value