diff --git a/lib/naughty/constants.lua b/lib/naughty/constants.lua index 59b12e58..6e8a1a52 100644 --- a/lib/naughty/constants.lua +++ b/lib/naughty/constants.lua @@ -48,6 +48,21 @@ ret.config.presets = { }, } +ret.config._urgency = { + low = "\0", + normal = "\1", + critical = "\2" +} + +ret.config.mapping = { + {{urgency = ret.config._urgency.low }, ret.config.presets.low}, --compat + {{urgency = ret.config._urgency.normal }, ret.config.presets.normal}, --compat + {{urgency = ret.config._urgency.critical}, ret.config.presets.critical}, --compat + {{urgency = "low" }, ret.config.presets.low}, + {{urgency = "normal" }, ret.config.presets.normal}, + {{urgency = "critical"}, ret.config.presets.critical}, +} + ret.config.defaults = { timeout = 5, text = "", diff --git a/lib/naughty/core.lua b/lib/naughty/core.lua index 802848b9..e82d21b4 100644 --- a/lib/naughty/core.lua +++ b/lib/naughty/core.lua @@ -224,7 +224,9 @@ local function update_index(n) remove_from_index(n) -- Add to the index again - local s = get_screen(n.screen or n.preset.screen or screen.focused()) + local s = get_screen(n.screen + or (n.preset and n.preset.screen) + or screen.focused()) naughty.notifications[s] = naughty.notifications[s] or {} table.insert(naughty.notifications[s][n.position], n) end @@ -399,6 +401,11 @@ function naughty.get_has_display_handler() return conns["request::display"] and #conns["request::display"] > 0 or false end +-- Presets are "deprecated" when notification rules are used. +function naughty.get__has_preset_handler() + return conns["request::preset"] and #conns["request::preset"] > 0 or false +end + --- Set new notification timeout. -- -- This function is deprecated, use `notification:reset_timeout(new_timeout)`. @@ -545,7 +552,9 @@ local function register(notification, args) rawset(notification, "get_suspended", get_suspended) --TODO v5 uncouple the notifications and the screen - local s = get_screen(args.screen or notification.preset.screen or screen.focused()) + local s = get_screen(args.screen + or (notification.preset and notification.preset.screen) + or screen.focused()) -- insert the notification to the table table.insert(naughty._active, notification) @@ -560,7 +569,7 @@ local function register(notification, args) naughty.emit_signal("added", notification, args) end - assert(rawget(notification, "preset")) + assert(rawget(notification, "preset") or naughty._has_preset_handler) naughty.emit_signal("property::active") diff --git a/lib/naughty/dbus.lua b/lib/naughty/dbus.lua index 27c83b3f..67be524c 100644 --- a/lib/naughty/dbus.lua +++ b/lib/naughty/dbus.lua @@ -12,7 +12,6 @@ local pairs = pairs local type = type local string = string local capi = { awesome = awesome } -local gtable = require("gears.table") local gsurface = require("gears.surface") local gdebug = require("gears.debug") local protected_call = require("gears.protected_call") @@ -56,11 +55,7 @@ local urgency = { -- @tfield table 2 normal urgency -- @tfield table 3 critical urgency -- @table config.mapping -dbus.config.mapping = { - {{urgency = urgency.low}, cst.config.presets.low}, - {{urgency = urgency.normal}, cst.config.presets.normal}, - {{urgency = urgency.critical}, cst.config.presets.critical} -} +dbus.config.mapping = cst.mapping local function sendActionInvoked(notificationId, action) if bus_connection then @@ -149,14 +144,6 @@ function notif_methods.Notify(sender, object_path, interface, method, parameters if appname ~= "" then args.appname = appname end - for _, obj in pairs(dbus.config.mapping) do - local filter, preset = obj[1], obj[2] - if (not filter.urgency or filter.urgency == hints.urgency) and - (not filter.category or filter.category == hints.category) and - (not filter.appname or filter.appname == appname) then - args.preset = gtable.join(args.preset, preset) - end - end local preset = args.preset or cst.config.defaults local notification if actions then diff --git a/lib/naughty/layout/box.lua b/lib/naughty/layout/box.lua index c1936329..79ab70e9 100644 --- a/lib/naughty/layout/box.lua +++ b/lib/naughty/layout/box.lua @@ -148,8 +148,7 @@ end local function init(self, notification) local args = self._private.args - local preset = notification.preset - assert(preset) + local preset = notification.preset or {} local position = args.position or notification.position or beautiful.notification_position or preset.position or "top_right" diff --git a/lib/naughty/layout/legacy.lua b/lib/naughty/layout/legacy.lua index a2b79149..484d4651 100644 --- a/lib/naughty/layout/legacy.lua +++ b/lib/naughty/layout/legacy.lua @@ -309,7 +309,7 @@ function naughty.default_notification_handler(notification, args) return end - local preset = notification.preset + local preset = notification.preset or {} local text = args.message or args.text or preset.message or preset.text local title = args.title or preset.title local s = get_screen(args.screen or preset.screen or screen.focused()) diff --git a/lib/naughty/notification.lua b/lib/naughty/notification.lua index 56f7b22a..fd13beb5 100644 --- a/lib/naughty/notification.lua +++ b/lib/naughty/notification.lua @@ -653,6 +653,33 @@ local function convert_actions(actions) end end +-- The old API used monkey-patched variable presets. +-- +-- Monkey-patched anything is always an issue and prevent module from safely +-- doing anything without stepping on each other foot. In the background, +-- presets were selected with a rule-like API anyway. +local function select_legacy_preset(n, args) + for _, obj in pairs(cst.config.mapping) do + local filter, preset = obj[1], obj[2] + if (not filter.urgency or filter.urgency == args.urgency) and + (not filter.category or filter.category == args.category) and + (not filter.appname or filter.appname == args.appname) then + args.preset = gtable.join(args.preset or {}, preset) + end + end + + -- gather variables together + rawset(n, "preset", gtable.join( + cst.config.defaults or {}, + args.preset or cst.config.presets.normal or {}, + rawget(n, "preset") or {} + )) + + for k, v in pairs(n.preset) do + n._private[k] = v + end +end + --- Create a notification. -- -- @tab args The argument table containing any of the arguments below. @@ -734,22 +761,17 @@ local function create(args) -- Avoid modifying the original table local private = {} + rawset(n, "_private", private) - -- gather variables together - rawset(n, "preset", gtable.join( - cst.config.defaults or {}, - args.preset or cst.config.presets.normal or {}, - rawget(n, "preset") or {} - )) + -- Allow extensions to create override the preset with custom data + if not naughty._has_preset_handler then + select_legacy_preset(n, args) + end if is_old_action then convert_actions(args.actions) end - for k, v in pairs(n.preset) do - private[k] = v - end - for k, v in pairs(args) do private[k] = v end @@ -767,27 +789,30 @@ local function create(args) -- It's an automatic property n.is_expired = false - rawset(n, "_private", private) - gtable.crush(n, notification, true) n.id = n.id or notification._gen_next_id() - -- Allow extensions to create override the preset with custom data - naughty.emit_signal("request::preset", n, args) - -- Register the notification before requesting a widget n:emit_signal("new", args) + -- The rules are attached to this. + if naughty._has_preset_handler then + naughty.emit_signal("request::preset", n, args) + end + -- Let all listeners handle the actual visual aspects - if (not n.ignore) and (not n.preset.ignore) then + if (not n.ignore) and ((not n.preset) or n.preset.ignore ~= true) then naughty.emit_signal("request::display" , n, args) naughty.emit_signal("request::fallback", n, args) end -- Because otherwise the setter logic would not be executed if n._private.timeout then - n:set_timeout(n._private.timeout or n.preset.timeout) + n:set_timeout(n._private.timeout + or (n.preset and n.preset.timeout) + or cst.config.timeout + ) end return n