Fix the broken test due to the "soft" merge conflict of two notification pull requests. (#2751)
* naughty.legacy: Fix a regression caused by a prior fix. The title was only set "later" because it was called too early. The intended result was to prevent the code from being executed when there is no leagcy popup, but it had this side effect. * naughty.dbus: Expose the new "private" methods so they can be tested. Because it now uses Gio instead of capi.dbus, it isn't possible to just shim the backend anymore. * shims: Upgrade the dbus shims to also emulate some Gio behavior. As usual, it is the most basic version that produces the correct result. It doesn't try to comply to the real API.
This commit is contained in:
parent
8218c30a84
commit
63e7c68b6c
|
@ -120,10 +120,12 @@ local function convert_icon(w, h, rowstride, channels, data)
|
||||||
return res
|
return res
|
||||||
end
|
end
|
||||||
|
|
||||||
local function protected_method_call(_, sender, object_path, interface, method, parameters, invocation)
|
local notif_methods = {}
|
||||||
if method == "Notify" then
|
|
||||||
|
function notif_methods.Notify(sender, object_path, interface, method, parameters, invocation)
|
||||||
local appname, replaces_id, icon, title, text, actions, hints, expire =
|
local appname, replaces_id, icon, title, text, actions, hints, expire =
|
||||||
unpack(parameters.value)
|
unpack(parameters.value)
|
||||||
|
|
||||||
local args = {}
|
local args = {}
|
||||||
if text ~= "" then
|
if text ~= "" then
|
||||||
args.message = text
|
args.message = text
|
||||||
|
@ -243,28 +245,43 @@ local function protected_method_call(_, sender, object_path, interface, method,
|
||||||
end
|
end
|
||||||
|
|
||||||
invocation:return_value(GLib.Variant("(u)", { nnotif._gen_next_id() }))
|
invocation:return_value(GLib.Variant("(u)", { nnotif._gen_next_id() }))
|
||||||
elseif method == "CloseNotification" then
|
end
|
||||||
|
|
||||||
|
function notif_methods.CloseNotification(_, _, _, _, parameters, invocation)
|
||||||
local obj = naughty.get_by_id(parameters.value[1])
|
local obj = naughty.get_by_id(parameters.value[1])
|
||||||
if obj then
|
if obj then
|
||||||
obj:destroy(cst.notification_closed_reason.dismissed_by_command)
|
obj:destroy(cst.notification_closed_reason.dismissed_by_command)
|
||||||
end
|
end
|
||||||
invocation:return_value(GLib.Variant("()"))
|
invocation:return_value(GLib.Variant("()"))
|
||||||
elseif method == "GetServerInfo" or method == "GetServerInformation" then
|
end
|
||||||
|
|
||||||
|
function notif_methods.GetServerInformation(_, _, _, _, _, invocation)
|
||||||
-- name of notification app, name of vender, version, specification version
|
-- name of notification app, name of vender, version, specification version
|
||||||
invocation:return_value(GLib.Variant("(ssss)", {
|
invocation:return_value(GLib.Variant("(ssss)", {
|
||||||
"naughty", "awesome", capi.awesome.version, "1.0"
|
"naughty", "awesome", capi.awesome.version, "1.0"
|
||||||
}))
|
}))
|
||||||
elseif method == "GetCapabilities" then
|
end
|
||||||
|
|
||||||
|
function notif_methods.GetCapabilities(_, _, _, _, _, invocation)
|
||||||
-- We actually do display the body of the message, we support <b>, <i>
|
-- 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.
|
-- and <u> in the body and we handle static (non-animated) icons.
|
||||||
invocation:return_value(GLib.Variant("(as)", {
|
invocation:return_value(GLib.Variant("(as)", {
|
||||||
{ "body", "body-markup", "icon-static", "actions" }
|
{ "body", "body-markup", "icon-static", "actions" }
|
||||||
}))
|
}))
|
||||||
end
|
end
|
||||||
end
|
|
||||||
|
|
||||||
local function method_call(...)
|
local function method_call(_, sender, object_path, interface, method, parameters, invocation)
|
||||||
protected_call(protected_method_call, ...)
|
if not notif_methods[method] then return end
|
||||||
|
|
||||||
|
protected_call(
|
||||||
|
notif_methods[method],
|
||||||
|
sender,
|
||||||
|
object_path,
|
||||||
|
interface,
|
||||||
|
method,
|
||||||
|
parameters,
|
||||||
|
invocation
|
||||||
|
)
|
||||||
end
|
end
|
||||||
|
|
||||||
local function on_bus_acquire(conn, _)
|
local function on_bus_acquire(conn, _)
|
||||||
|
@ -322,6 +339,9 @@ Gio.bus_own_name(Gio.BusType.SESSION, "org.freedesktop.Notifications",
|
||||||
Gio.BusNameOwnerFlags.NONE, GObject.Closure(on_bus_acquire),
|
Gio.BusNameOwnerFlags.NONE, GObject.Closure(on_bus_acquire),
|
||||||
GObject.Closure(on_name_acquired), GObject.Closure(on_name_lost))
|
GObject.Closure(on_name_acquired), GObject.Closure(on_name_lost))
|
||||||
|
|
||||||
|
-- For testing
|
||||||
|
dbus._notif_methods = notif_methods
|
||||||
|
|
||||||
return dbus
|
return dbus
|
||||||
|
|
||||||
-- vim: filetype=lua:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:textwidth=80
|
-- vim: filetype=lua:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:textwidth=80
|
||||||
|
|
|
@ -211,6 +211,8 @@ local escape_subs = { ['<'] = "<", ['>'] = ">", ['&'] = "&" }
|
||||||
|
|
||||||
-- Cache the markup
|
-- Cache the markup
|
||||||
local function set_escaped_text(self)
|
local function set_escaped_text(self)
|
||||||
|
if not self.box then return end
|
||||||
|
|
||||||
local text = self.message or ""
|
local text = self.message or ""
|
||||||
local title = self.title and self.title .. "\n" or ""
|
local title = self.title and self.title .. "\n" or ""
|
||||||
|
|
||||||
|
@ -370,7 +372,6 @@ function naughty.default_notification_handler(notification, args)
|
||||||
textbox:set_font(font)
|
textbox:set_font(font)
|
||||||
|
|
||||||
notification.textbox = textbox
|
notification.textbox = textbox
|
||||||
set_escaped_text(notification)
|
|
||||||
|
|
||||||
-- Update the content if it changes
|
-- Update the content if it changes
|
||||||
notification:connect_signal("property::message", set_escaped_text)
|
notification:connect_signal("property::message", set_escaped_text)
|
||||||
|
@ -513,10 +514,14 @@ function naughty.default_notification_handler(notification, args)
|
||||||
notification.box.visible = true
|
notification.box.visible = true
|
||||||
|
|
||||||
-- populate widgets
|
-- populate widgets
|
||||||
|
set_escaped_text(notification)
|
||||||
|
|
||||||
local layout = wibox.layout.fixed.horizontal()
|
local layout = wibox.layout.fixed.horizontal()
|
||||||
|
|
||||||
if iconmargin then
|
if iconmargin then
|
||||||
layout:add(iconmargin)
|
layout:add(iconmargin)
|
||||||
end
|
end
|
||||||
|
|
||||||
layout:add(marginbox)
|
layout:add(marginbox)
|
||||||
|
|
||||||
local completelayout = wibox.layout.fixed.vertical()
|
local completelayout = wibox.layout.fixed.vertical()
|
||||||
|
|
|
@ -1,6 +1,40 @@
|
||||||
|
local lgi = require("lgi")
|
||||||
|
local Gio = lgi.Gio
|
||||||
|
|
||||||
local dbus = awesome._shim_fake_class()
|
local dbus = awesome._shim_fake_class()
|
||||||
|
|
||||||
function dbus.notify_send(...)
|
-- Monkeypatch away the real dbus support
|
||||||
|
Gio.bus_own_name = function() end
|
||||||
|
|
||||||
|
--HACK it used to be an internal API, which made testing easy, but now it uses
|
||||||
|
-- GDBus, so this shims a small subset of its API and use some internal APIs
|
||||||
|
-- to access "private" methods. Note that it would be cleaner to implement an
|
||||||
|
-- high level (and testable) binding and use signals again.
|
||||||
|
local ndbus = nil
|
||||||
|
|
||||||
|
local invocation = {
|
||||||
|
return_value = function() end
|
||||||
|
}
|
||||||
|
|
||||||
|
local function parameters_miss(t, k)
|
||||||
|
if k == "get_child_value" then
|
||||||
|
return function(idx) return t[idx-1] end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function dbus.notify_send(_--[[appdata]], ...)
|
||||||
|
ndbus = ndbus or require("naughty.dbus")
|
||||||
|
|
||||||
|
ndbus._notif_methods.Notify(
|
||||||
|
"sender",
|
||||||
|
"/org/freedesktop/Notifications",
|
||||||
|
"org.freedesktop.Notifications",
|
||||||
|
"Notify",
|
||||||
|
setmetatable({value={...}}, {__index=parameters_miss}),
|
||||||
|
invocation
|
||||||
|
)
|
||||||
|
|
||||||
|
-- Legacy API
|
||||||
dbus.emit_signal("org.freedesktop.Notifications", ...)
|
dbus.emit_signal("org.freedesktop.Notifications", ...)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue