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:
Emmanuel Lepage Vallée 2019-04-15 13:07:53 -04:00 committed by GitHub
parent 8218c30a84
commit 63e7c68b6c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 200 additions and 141 deletions

View File

@ -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

View File

@ -211,6 +211,8 @@ local escape_subs = { ['<'] = "&lt;", ['>'] = "&gt;", ['&'] = "&amp;" }
-- 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()

View File

@ -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