diff --git a/lib/naughty.lua.in b/lib/naughty.lua.in
index f036d284..4c949f92 100644
--- a/lib/naughty.lua.in
+++ b/lib/naughty.lua.in
@@ -310,7 +310,8 @@ end
-- @param callback function that will be called with all arguments
-- the notification will only be displayed if the function returns true
-- note: this function is only relevant to notifications sent via dbus
--- @param actions array of pair of String:String for each action (id:localized text)
+-- @param actions mapping that maps a string to a callback when this action is
+-- selected
-- @usage naughty.notify({ title = "Achtung!", text = "You're idling", timeout = 0 })
-- @return The notification object
function naughty.notify(args)
@@ -445,48 +446,28 @@ function naughty.notify(args)
local actions_max_width = 0
local actions_total_height = 0
if actions then
- local action
- local actionid
- -- create actions box
- for i , v in ipairs(actions) do
- if i % 2 == 1 then
- actionid = v
- if actionid == "default" then
- has_default_action = true;
- end
- elseif actionid ~= nil and actionid ~= "default" then
- action = v
- local actiontextbox = wibox.widget.textbox()
- local actionmarginbox = wibox.layout.margin()
- actionmarginbox:set_margins(margin)
- actionmarginbox:set_widget(actiontextbox)
- actiontextbox:set_valign("middle")
- actiontextbox:set_font(font)
- actiontextbox:set_markup(string.format('%s', action))
- -- calculate the height
- local w, h = actiontextbox:fit(-1, -1)
- local height = h + 2 * margin
+ for action, callback in pairs(actions) do
+ local actiontextbox = wibox.widget.textbox()
+ local actionmarginbox = wibox.layout.margin()
+ actionmarginbox:set_margins(margin)
+ actionmarginbox:set_widget(actiontextbox)
+ actiontextbox:set_valign("middle")
+ actiontextbox:set_font(font)
+ actiontextbox:set_markup(string.format('%s', action))
+ -- calculate the height and width
+ local w, h = actiontextbox:fit(-1, -1)
+ local height = h + 2 * margin
+ local width = w + 2 * margin
- -- calculate the width
- w, h = actiontextbox:fit(-1, -1)
- local width = w + 2 * margin
+ actionmarginbox:buttons(util.table.join(
+ button({ }, 1, callback),
+ button({ }, 3, callback)
+ ))
+ actionslayout:add(actionmarginbox)
- actionmarginbox:buttons(util.table.join(
- button({ }, 1, function()
- sendActionInvoked(notification.id, actionid)
- die(naughty.notificationClosedReason.dismissedByUser)
- end),
- button({ }, 3, function()
- sendActionInvoked(notification.id, actionid)
- die(naughty.notificationClosedReason.dismissedByUser)
- end))
- )
- actionslayout:add(actionmarginbox)
-
- actions_total_height = actions_total_height + height
- if actions_max_width < width then
- actions_max_width = width
- end
+ actions_total_height = actions_total_height + height
+ if actions_max_width < width then
+ actions_max_width = width
end
end
end
@@ -648,7 +629,31 @@ if capi.dbus then
end
end
local preset = args.preset or naughty.config.defaults
- args.actions = actions
+ local notification
+ if actions then
+ args.actions = {}
+
+ local actionid
+ -- create actions callbacks
+ for i , v in ipairs(actions) do
+ if i % 2 == 1 then
+ actionid = v
+ elseif actionid == "default" then
+ args.run = function()
+ sendActionInvoked(notification.id, "default")
+ naughty.destroy(notification, naughty.notificationClosedReason.dismissedByUser)
+ end
+ actionid = nil
+ elseif actionid ~= nil then
+ local action = actionid
+ args.actions[actionid] = function()
+ sendActionInvoked(notification.id, action)
+ naughty.destroy(notification, naughty.notificationClosedReason.dismissedByUser)
+ end
+ actionid = nil
+ end
+ end
+ end
if not preset.callback or (type(preset.callback) == "function" and
preset.callback(data, appname, replaces_id, icon, title, text, actions, hints, expire)) then
if icon ~= "" then
@@ -708,8 +713,8 @@ if capi.dbus then
if expire and expire > -1 then
args.timeout = expire / 1000
end
- local id = naughty.notify(args).id
- return "u", id
+ notification = naughty.notify(args)
+ return "u", notification.id
end
return "u", "0"
elseif data.member == "CloseNotification" then