-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Hi,

as told in IRC here is my patch for naughty. It adds urgency level
(DBUS) and maps them to according presets. I also added support for the
DBUS expire field.

Test with:
# urgency level critical
notify-send -u critical hey joe
# expires in 2 seconds
notify-send -t 2000 hey

Patch is also available via:
http://www.morpgnet.org/~leon/naughty_dbus_urgency_level_and_presets.patch

Thanks to jd for enhancing DBUS support :)

Regards,
Leon Winter
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.9 (GNU/Linux)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org

iEYEARECAAYFAkktTdQACgkQ3qn9m9SfDYceBwCeNwNQ9t0UyvFWXBqrb7trPxGC
mb4An0Rmc7Y+JZAu19nTiBE4LL45fPaz
=vKen
-----END PGP SIGNATURE-----
diff --git a/lib/naughty.lua.in b/lib/naughty.lua.in
index e84a4d8..43c6835 100644
--- a/lib/naughty.lua.in
+++ b/lib/naughty.lua.in
@@ -25,55 +25,90 @@ module("naughty")
 --- Naughty configuration - a table containing common/default popup settings.
 -- You can override some of these for individual popups using args to notify().
 -- @name config
--- @field timeout Number of seconds after which popups disappear.
---   Set to 0 for no timeout. Default: 5
 -- @field screen Screen on which the popups will appear number. Default: 1
 -- @field position Corner of the workarea the popups will appear.
 --   Valid values: 'top_right', 'top_left', 'bottom_right', 'bottom_left'.
 --   Default: 'top_right'
 -- @field padding Space between popups and edge of the workarea. Default: 4
--- @field height Height of a single line of text. Default: 16
 -- @field width Width of a popup. Default: 300
 -- @field spacing Spacing between popups. Default: 1
 -- @field ontop Boolean forcing popups to display on top. Default: true
 -- @field margin Space between popup edge and content. Default: 10
--- @field font Popup font. Default: beautiful.font or "Verdana 8"
--- @field icon Popup icon. Default: nil
--- @field icon_size Size of the icon in pixels. Default: nil
 -- @field icon_dirs List of directories that will be checked by getIcon()
 --   Default: { "/usr/share/pixmaps/", }
 -- @field icon_formats List of formats that will be checked by getIcon()
 --   Default: { "png", "gif" }
--- @field fg Foreground color. Default: beautiful.fg_focus or '#ffffff'
--- @field bg Background color. Default: beautiful.bg_focus or '#535d6c'
--- @field border_color Border color.
---   Default:  beautiful.border_focus or '#535d6c'
 -- @field border_width Border width. Default: 1
--- @field hover_timeout Delay in seconds after which hovered popup disappears.
---   Default: nil
 -- @class table
 
 config = {}
-config.timeout = 5
-config.screen = 1
-config.position = "top_right"
 config.padding = 4
-config.height = 16
-config.width = 300
 config.spacing = 1
 config.margin = 10
-config.icon = nil
-config.icon_size = nil
 config.icon_dirs = { "/usr/share/pixmaps/", }
 config.icon_formats = { "png", "gif" }
 config.border_width = 1
-config.hover_timeout = nil
+
+--- Notification Presets - a table containing presets for different purposes
+-- You have to pass a reference of a preset in your notify() call to use the preset
+-- At least the default preset named "normal" has to be defined
+-- The presets "low", "normal" and "critical" are used for notifications over DBUS
+-- @name config.presets
+-- @field low The preset for notifications with low urgency level
+-- @field normal The default preset for every notification without a preset that will also be used for normal urgency level
+-- @field critical The preset for notifications with a critical urgency level
+-- @class table
+
+--- Default preset for notifications
+-- @name config.presets.normal
+-- @field timeout Number of seconds after which popups disappear.
+--   Set to 0 for no timeout. Default: 5
+-- @field hover_timeout Delay in seconds after which hovered popup disappears.
+--   Default: nil
+-- @field border_color Border color.
+--   Default:  beautiful.border_focus or '#535d6c'
+-- @field fg Foreground color. Default: beautiful.fg_focus or '#ffffff'
+-- @field bg Background color. Default: beautiful.bg_focus or '#535d6c'
+-- @field font Popup font. Default: beautiful.font or "Verdana 8"
+-- @field height Height of a single line of text. Default: 16
+-- @field icon Popup icon. Default: nil
+-- @field icon_size Size of the icon in pixels. Default: nil
+
+config.presets = {
+    low = {
+        timeout = 5
+    },
+    normal = {
+        timeout = 8,
+        hover_timeout = nil,
+        position = "top_right",
+        screen = 1,
+        width = 300,
+        height = 16,
+        icon = nil,
+        icon_size = nil
+    },
+    critical = {
+        bg = "#ff0000",
+        fg = "#ffffff",
+        timeout = 0,
+        height = 25
+    }
+}
 
 -- Counter for the notifications
 -- Required for later access via DBUS
 local counter = 1
 
+-- DBUS Notification constants
+local urgency = {
+    low = "\0",
+    normal = "\1",
+    critical = "\2"
+}
+
 --- Index of notifications. See config table for valid 'position' values.
 -- Each element is a table consisting of:
 -- @field box Wibox object containing the popup
@@ -211,21 +246,21 @@ end
 -- @return The notification object
 function notify(args)
     -- gather variables together
-    local timeout = args.timeout or config.timeout
-    local icon = args.icon or config.icon
-    local icon_size = args.icon_size or config.icon_size
+    local timeout = args.timeout or (args.preset and args.preset.timeout) or config.presets.normal.timeout
+    local icon = args.icon or (args.preset and args.preset.icon) or config.icon
+    local icon_size = args.icon_size or (args.preset and args.preset.icon_size) or config.icon_size
     local text = args.text or ""
-    local screen = args.screen or config.screen
+    local screen = args.screen or (args.preset and args.preset.screen) or config.presets.normal.screen
     local ontop = args.ontop or config.ontop
-    local width = args.width or config.width
-    local hover_timeout = args.hover_timeout or config.hover_timeout
+    local width = args.width or (args.preset and args.preset.width) or config.presets.normal.width
+    local hover_timeout = args.hover_timeout or (args.preset and args.preset.hover_timeout) or config.presets.normal.hover_timeout
 
     -- beautiful
     local beautiful = bt.get()
-    local font = args.font or config.font or beautiful.font or "Verdana 8"
-    local fg = args.fg or config.fg or beautiful.fg_normal or '#ffffff'
-    local bg = args.bg or config.bg or beautiful.bg_normal or '#535d6c'
-    local border_color = config.border_color or beautiful.bg_focus or '#535d6c'
+    local font = args.font or config.font or (args.preset and args.preset.font) or config.presets.normal.font or beautiful.font or "Verdana 8"
+    local fg = args.fg or config.fg or (args.preset and args.preset.fg) or config.presets.normal.fg or beautiful.fg_normal or '#ffffff'
+    local bg = args.bg or config.bg or (args.preset and args.preset.bg) or config.presets.normal.bg or beautiful.bg_normal or '#535d6c'
+    local border_color = (args.preset and args.preset.border_color) or config.presets.normal.border_color or beautiful.bg_focus or '#535d6c'
     local notification = {}
 
     -- replace notification if needed
@@ -248,7 +283,7 @@ function notify(args)
         notification.id = counter
     end
 
-    notification.position = args.position or config.position
+    notification.position = args.position or args.preset.position or config.presets.normal.position
     notification.idx = #notifications[screen][notification.position] + 1
 
     local title = ""
@@ -301,15 +336,16 @@ function notify(args)
                                position = "floating",
                                fg = fg,
                                bg = bg,
-                               border_color = config.border_color,
+                               border_color = args.preset and args.preset.border_color or config.presets.normal.border_color,
                                border_width = config.border_width })
 
     -- position the wibox
     local lines = 1; for i in string.gmatch(title..text, "\n") do lines = lines + 1 end
-    if iconbox and iconbox.image.height > lines * config.height then
+    local height = args.preset and args.preset.height or config.presets.normal.height
+    if iconbox and iconbox.image.height > lines * height then
         notification.height = iconbox.image.height
     else
-        notification.height = lines * config.height end
+        notification.height = lines * height end
     notification.width = width
     local offset = get_offset(screen, notification.position, notification.idx, notification.width, notification.height)
     notification.box:geometry({ width = notification.width,
@@ -332,7 +368,7 @@ end
 -- DBUS/Notification support
 
 -- Notify
-awful.hooks.dbus.register("org.freedesktop.Notifications", function (data, arg1, replaces_id, icon, title, text)
+awful.hooks.dbus.register("org.freedesktop.Notifications", function (data, arg1, replaces_id, icon, title, text, actions, hints, expire)
 args = {}
 if data.member == "Notify" then
     if text ~= "" then
@@ -347,12 +383,22 @@ if data.member == "Notify" then
             return nil
         end
     end
+    if hints.urgency == urgency.low then
+        args.preset = config.presets.low
+    elseif hints.urgency == urgency.normal then
+        args.preset = config.presets.normal
+    elseif hints.urgency == urgency.critical then
+        args.preset = config.presets.critical
+    end
     if icon ~= "" then
         args.icon = icon
     end
     if replaces_id and replaces_id ~= "" and replaces_id ~= 0 then
         args.replaces_id = replaces_id
     end
+    if expire and expire > -1 then
+        args.timeout = expire / 1000
+    end
     local id = notify(args).id
     return "i", id
 elseif data.member == "CloseNotification" then

Reply via email to