naughty: introducing urgency levels and presets
Signed-off-by: Julien Danjou <julien@danjou.info>
This commit is contained in:
parent
4ac4cc3ab2
commit
458ae34560
|
@ -25,55 +25,90 @@ module("naughty")
|
||||||
--- Naughty configuration - a table containing common/default popup settings.
|
--- Naughty configuration - a table containing common/default popup settings.
|
||||||
-- You can override some of these for individual popups using args to notify().
|
-- You can override some of these for individual popups using args to notify().
|
||||||
-- @name config
|
-- @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 screen Screen on which the popups will appear number. Default: 1
|
||||||
-- @field position Corner of the workarea the popups will appear.
|
-- @field position Corner of the workarea the popups will appear.
|
||||||
-- Valid values: 'top_right', 'top_left', 'bottom_right', 'bottom_left'.
|
-- Valid values: 'top_right', 'top_left', 'bottom_right', 'bottom_left'.
|
||||||
-- Default: 'top_right'
|
-- Default: 'top_right'
|
||||||
-- @field padding Space between popups and edge of the workarea. Default: 4
|
-- @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 width Width of a popup. Default: 300
|
||||||
-- @field spacing Spacing between popups. Default: 1
|
-- @field spacing Spacing between popups. Default: 1
|
||||||
-- @field ontop Boolean forcing popups to display on top. Default: true
|
-- @field ontop Boolean forcing popups to display on top. Default: true
|
||||||
-- @field margin Space between popup edge and content. Default: 10
|
-- @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()
|
-- @field icon_dirs List of directories that will be checked by getIcon()
|
||||||
-- Default: { "/usr/share/pixmaps/", }
|
-- Default: { "/usr/share/pixmaps/", }
|
||||||
-- @field icon_formats List of formats that will be checked by getIcon()
|
-- @field icon_formats List of formats that will be checked by getIcon()
|
||||||
-- Default: { "png", "gif" }
|
-- 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 border_width Border width. Default: 1
|
||||||
-- @field hover_timeout Delay in seconds after which hovered popup disappears.
|
|
||||||
-- Default: nil
|
|
||||||
-- @class table
|
-- @class table
|
||||||
|
|
||||||
config = {}
|
config = {}
|
||||||
config.timeout = 5
|
|
||||||
config.screen = 1
|
|
||||||
config.position = "top_right"
|
|
||||||
config.padding = 4
|
config.padding = 4
|
||||||
config.height = 16
|
|
||||||
config.width = 300
|
|
||||||
config.spacing = 1
|
config.spacing = 1
|
||||||
config.ontop = true
|
|
||||||
config.margin = 10
|
config.margin = 10
|
||||||
config.icon = nil
|
config.ontop = true
|
||||||
config.icon_size = nil
|
|
||||||
config.icon_dirs = { "/usr/share/pixmaps/", }
|
config.icon_dirs = { "/usr/share/pixmaps/", }
|
||||||
config.icon_formats = { "png", "gif" }
|
config.icon_formats = { "png", "gif" }
|
||||||
|
|
||||||
config.border_width = 1
|
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
|
-- Counter for the notifications
|
||||||
-- Required for later access via DBUS
|
-- Required for later access via DBUS
|
||||||
local counter = 1
|
local counter = 1
|
||||||
|
|
||||||
|
-- DBUS Notification constants
|
||||||
|
local urgency = {
|
||||||
|
low = "\0",
|
||||||
|
normal = "\1",
|
||||||
|
critical = "\2"
|
||||||
|
}
|
||||||
|
|
||||||
--- Index of notifications. See config table for valid 'position' values.
|
--- Index of notifications. See config table for valid 'position' values.
|
||||||
-- Each element is a table consisting of:
|
-- Each element is a table consisting of:
|
||||||
-- @field box Wibox object containing the popup
|
-- @field box Wibox object containing the popup
|
||||||
|
@ -211,21 +246,21 @@ end
|
||||||
-- @return The notification object
|
-- @return The notification object
|
||||||
function notify(args)
|
function notify(args)
|
||||||
-- gather variables together
|
-- gather variables together
|
||||||
local timeout = args.timeout or config.timeout
|
local timeout = args.timeout or (args.preset and args.preset.timeout) or config.presets.normal.timeout
|
||||||
local icon = args.icon or config.icon
|
local icon = args.icon or (args.preset and args.preset.icon) or config.icon
|
||||||
local icon_size = args.icon_size or config.icon_size
|
local icon_size = args.icon_size or (args.preset and args.preset.icon_size) or config.icon_size
|
||||||
local text = args.text or ""
|
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 ontop = args.ontop or config.ontop
|
||||||
local width = args.width or config.width
|
local width = args.width or (args.preset and args.preset.width) or config.presets.normal.width
|
||||||
local hover_timeout = args.hover_timeout or config.hover_timeout
|
local hover_timeout = args.hover_timeout or (args.preset and args.preset.hover_timeout) or config.presets.normal.hover_timeout
|
||||||
|
|
||||||
-- beautiful
|
-- beautiful
|
||||||
local beautiful = bt.get()
|
local beautiful = bt.get()
|
||||||
local font = args.font or config.font or beautiful.font or "Verdana 8"
|
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 beautiful.fg_normal or '#ffffff'
|
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 beautiful.bg_normal or '#535d6c'
|
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 = config.border_color or beautiful.bg_focus 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 = {}
|
local notification = {}
|
||||||
|
|
||||||
-- replace notification if needed
|
-- replace notification if needed
|
||||||
|
@ -248,7 +283,7 @@ function notify(args)
|
||||||
notification.id = counter
|
notification.id = counter
|
||||||
end
|
end
|
||||||
|
|
||||||
notification.position = args.position or config.position
|
notification.position = args.position or (args.preset and args.preset.position) or config.presets.normal.position
|
||||||
notification.idx = #notifications[screen][notification.position] + 1
|
notification.idx = #notifications[screen][notification.position] + 1
|
||||||
|
|
||||||
local title = ""
|
local title = ""
|
||||||
|
@ -300,15 +335,16 @@ function notify(args)
|
||||||
notification.box = wibox({ position = "floating",
|
notification.box = wibox({ position = "floating",
|
||||||
fg = fg,
|
fg = fg,
|
||||||
bg = bg,
|
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 })
|
border_width = config.border_width })
|
||||||
|
|
||||||
-- position the wibox
|
-- position the wibox
|
||||||
local lines = 1; for i in string.gmatch(title..text, "\n") do lines = lines + 1 end
|
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
|
notification.height = iconbox.image.height
|
||||||
else
|
else
|
||||||
notification.height = lines * config.height end
|
notification.height = lines * height end
|
||||||
notification.width = width
|
notification.width = width
|
||||||
local offset = get_offset(screen, notification.position, notification.idx, notification.width, notification.height)
|
local offset = get_offset(screen, notification.position, notification.idx, notification.width, notification.height)
|
||||||
notification.box:geometry({ width = notification.width,
|
notification.box:geometry({ width = notification.width,
|
||||||
|
@ -331,7 +367,7 @@ end
|
||||||
-- DBUS/Notification support
|
-- DBUS/Notification support
|
||||||
|
|
||||||
-- Notify
|
-- 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 = {}
|
args = {}
|
||||||
if data.member == "Notify" then
|
if data.member == "Notify" then
|
||||||
if text ~= "" then
|
if text ~= "" then
|
||||||
|
@ -346,12 +382,22 @@ if data.member == "Notify" then
|
||||||
return nil
|
return nil
|
||||||
end
|
end
|
||||||
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
|
if icon ~= "" then
|
||||||
args.icon = icon
|
args.icon = icon
|
||||||
end
|
end
|
||||||
if replaces_id and replaces_id ~= "" and replaces_id ~= 0 then
|
if replaces_id and replaces_id ~= "" and replaces_id ~= 0 then
|
||||||
args.replaces_id = replaces_id
|
args.replaces_id = replaces_id
|
||||||
end
|
end
|
||||||
|
if expire and expire > -1 then
|
||||||
|
args.timeout = expire / 1000
|
||||||
|
end
|
||||||
local id = notify(args).id
|
local id = notify(args).id
|
||||||
return "i", id
|
return "i", id
|
||||||
elseif data.member == "CloseNotification" then
|
elseif data.member == "CloseNotification" then
|
||||||
|
|
Loading…
Reference in New Issue