summaryrefslogtreecommitdiff
path: root/awesome/lib/naughty/dbus.lua
diff options
context:
space:
mode:
Diffstat (limited to 'awesome/lib/naughty/dbus.lua')
-rw-r--r--awesome/lib/naughty/dbus.lua261
1 files changed, 0 insertions, 261 deletions
diff --git a/awesome/lib/naughty/dbus.lua b/awesome/lib/naughty/dbus.lua
deleted file mode 100644
index c49dc7e..0000000
--- a/awesome/lib/naughty/dbus.lua
+++ /dev/null
@@ -1,261 +0,0 @@
----------------------------------------------------------------------------
--- DBUS/Notification support
--- Notify
---
--- @author koniu <gkusnierz@gmail.com>
--- @copyright 2008 koniu
--- @module naughty.dbus
----------------------------------------------------------------------------
-
-assert(dbus)
-
--- Package environment
-local pairs = pairs
-local type = type
-local string = string
-local capi = { awesome = awesome,
- dbus = dbus }
-local util = require("awful.util")
-local cairo = require("lgi").cairo
-
-local schar = string.char
-local sbyte = string.byte
-local tcat = table.concat
-local tins = table.insert
-local unpack = unpack or table.unpack -- luacheck: globals unpack (compatibility with Lua 5.1)
-local naughty = require("naughty.core")
-
---- Notification library, dbus bindings
-local dbus = { config = {} }
-
--- DBUS Notification constants
-local urgency = {
- low = "\0",
- normal = "\1",
- critical = "\2"
-}
-
---- DBUS notification to preset mapping.
--- The first element is an object containing the filter.
--- If the rules in the filter match, the associated preset will be applied.
--- The rules object can contain the following keys: urgency, category, appname.
--- The second element is the preset.
--- @tfield table 1 low urgency
--- @tfield table 2 normal urgency
--- @tfield table 3 critical urgency
--- @table config.mapping
-dbus.config.mapping = {
- {{urgency = urgency.low}, naughty.config.presets.low},
- {{urgency = urgency.normal}, naughty.config.presets.normal},
- {{urgency = urgency.critical}, naughty.config.presets.critical}
-}
-
-local function sendActionInvoked(notificationId, action)
- if capi.dbus then
- capi.dbus.emit_signal("session", "/org/freedesktop/Notifications",
- "org.freedesktop.Notifications", "ActionInvoked",
- "u", notificationId,
- "s", action)
- end
-end
-
-local function sendNotificationClosed(notificationId, reason)
- if capi.dbus then
- capi.dbus.emit_signal("session", "/org/freedesktop/Notifications",
- "org.freedesktop.Notifications", "NotificationClosed",
- "u", notificationId,
- "u", reason)
- end
-end
-
-local function convert_icon(w, h, rowstride, channels, data)
- -- Do the arguments look sane? (e.g. we have enough data)
- local expected_length = rowstride * (h - 1) + w * channels
- if w < 0 or h < 0 or rowstride < 0 or (channels ~= 3 and channels ~= 4) or
- string.len(data) < expected_length then
- w = 0
- h = 0
- end
-
- local format = cairo.Format[channels == 4 and 'ARGB32' or 'RGB24']
-
- -- Figure out some stride magic (cairo dictates rowstride)
- local stride = cairo.Format.stride_for_width(format, w)
- local append = schar(0):rep(stride - 4 * w)
- local offset = 0
-
- -- Now convert each row on its own
- local rows = {}
-
- for _ = 1, h do
- local this_row = {}
-
- for i = 1 + offset, w * channels + offset, channels do
- local R, G, B, A = sbyte(data, i, i + channels - 1)
- tins(this_row, schar(B, G, R, A or 255))
- end
-
- -- Handle rowstride, offset is stride for the input, append for output
- tins(this_row, append)
- tins(rows, tcat(this_row))
-
- offset = offset + rowstride
- end
-
- return cairo.ImageSurface.create_for_data(tcat(rows), format, w, h, stride)
-end
-
-capi.dbus.connect_signal("org.freedesktop.Notifications", function (data, appname, replaces_id, icon, title, text, actions, hints, expire)
- local args = { }
- if data.member == "Notify" then
- if text ~= "" then
- args.text = text
- if title ~= "" then
- args.title = title
- end
- else
- if title ~= "" then
- args.text = title
- else
- return
- end
- end
- 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 = util.table.join(args.preset, preset)
- end
- end
- local preset = args.preset or naughty.config.defaults
- local notification
- if actions then
- args.actions = {}
-
- for i = 1,#actions,2 do
- local action_id = actions[i]
- local action_text = actions[i + 1]
-
- if action_id == "default" then
- args.run = function()
- sendActionInvoked(notification.id, "default")
- naughty.destroy(notification, naughty.notificationClosedReason.dismissedByUser)
- end
- elseif action_id ~= nil and action_text ~= nil then
- args.actions[action_text] = function()
- sendActionInvoked(notification.id, action_id)
- naughty.destroy(notification, naughty.notificationClosedReason.dismissedByUser)
- end
- end
- end
- end
- args.destroy = function(reason)
- sendNotificationClosed(notification.id, reason)
- 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
- args.icon = icon
- elseif hints.icon_data or hints.image_data then
- if hints.icon_data == nil then hints.icon_data = hints.image_data end
-
- -- icon_data is an array:
- -- 1 -> width
- -- 2 -> height
- -- 3 -> rowstride
- -- 4 -> has alpha
- -- 5 -> bits per sample
- -- 6 -> channels
- -- 7 -> data
- local w, h, rowstride, _, _, channels, icon_data = unpack(hints.icon_data)
- args.icon = convert_icon(w, h, rowstride, channels, icon_data)
- 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
- notification = naughty.notify(args)
- return "u", notification.id
- end
- return "u", "0"
- elseif data.member == "CloseNotification" then
- local obj = naughty.getById(appname)
- if obj then
- naughty.destroy(obj, naughty.notificationClosedReason.dismissedByCommand)
- end
- elseif data.member == "GetServerInfo" or data.member == "GetServerInformation" then
- -- name of notification app, name of vender, version, specification version
- return "s", "naughty", "s", "awesome", "s", capi.awesome.version, "s", "1.0"
- elseif data.member == "GetCapabilities" then
- -- We actually do display the body of the message, we support <b>, <i>
- -- and <u> in the body and we handle static (non-animated) icons.
- return "as", { "s", "body", "s", "body-markup", "s", "icon-static", "s", "actions" }
- end
-end)
-
-capi.dbus.connect_signal("org.freedesktop.DBus.Introspectable", function (data)
- if data.member == "Introspect" then
- local xml = [=[<!DOCTYPE node PUBLIC "-//freedesktop//DTD D-BUS Object
- Introspection 1.0//EN"
- "http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd">
- <node>
- <interface name="org.freedesktop.DBus.Introspectable">
- <method name="Introspect">
- <arg name="data" direction="out" type="s"/>
- </method>
- </interface>
- <interface name="org.freedesktop.Notifications">
- <method name="GetCapabilities">
- <arg name="caps" type="as" direction="out"/>
- </method>
- <method name="CloseNotification">
- <arg name="id" type="u" direction="in"/>
- </method>
- <method name="Notify">
- <arg name="app_name" type="s" direction="in"/>
- <arg name="id" type="u" direction="in"/>
- <arg name="icon" type="s" direction="in"/>
- <arg name="summary" type="s" direction="in"/>
- <arg name="body" type="s" direction="in"/>
- <arg name="actions" type="as" direction="in"/>
- <arg name="hints" type="a{sv}" direction="in"/>
- <arg name="timeout" type="i" direction="in"/>
- <arg name="return_id" type="u" direction="out"/>
- </method>
- <method name="GetServerInformation">
- <arg name="return_name" type="s" direction="out"/>
- <arg name="return_vendor" type="s" direction="out"/>
- <arg name="return_version" type="s" direction="out"/>
- <arg name="return_spec_version" type="s" direction="out"/>
- </method>
- <method name="GetServerInfo">
- <arg name="return_name" type="s" direction="out"/>
- <arg name="return_vendor" type="s" direction="out"/>
- <arg name="return_version" type="s" direction="out"/>
- </method>
- <signal name="NotificationClosed">
- <arg name="id" type="u" direction="out"/>
- <arg name="reason" type="u" direction="out"/>
- </signal>
- <signal name="ActionInvoked">
- <arg name="id" type="u" direction="out"/>
- <arg name="action_key" type="s" direction="out"/>
- </signal>
- </interface>
- </node>]=]
- return "s", xml
- end
-end)
-
--- listen for dbus notification requests
-capi.dbus.request_name("session", "org.freedesktop.Notifications")
-
-return dbus
-
--- vim: filetype=lua:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:textwidth=80