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
end
local function protected_method_call(_, sender, object_path, interface, method, parameters, invocation)
if method == "Notify" then
local notif_methods = {}
function notif_methods.Notify(sender, object_path, interface, method, parameters, invocation)
local appname, replaces_id, icon, title, text, actions, hints, expire =
unpack(parameters.value)
local args = {}
if text ~= "" then
args.message = text
@ -243,28 +245,43 @@ local function protected_method_call(_, sender, object_path, interface, method,
end
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])
if obj then
obj:destroy(cst.notification_closed_reason.dismissed_by_command)
end
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
invocation:return_value(GLib.Variant("(ssss)", {
"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>
-- and <u> in the body and we handle static (non-animated) icons.
invocation:return_value(GLib.Variant("(as)", {
{ "body", "body-markup", "icon-static", "actions" }
}))
end
end
local function method_call(...)
protected_call(protected_method_call, ...)
local function method_call(_, sender, object_path, interface, method, parameters, invocation)
if not notif_methods[method] then return end
protected_call(
notif_methods[method],
sender,
object_path,
interface,
method,
parameters,
invocation
)
end
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),
GObject.Closure(on_name_acquired), GObject.Closure(on_name_lost))
-- For testing
dbus._notif_methods = notif_methods
return dbus
-- 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
local function set_escaped_text(self)
if not self.box then return end
local text = self.message 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)
notification.textbox = textbox
set_escaped_text(notification)
-- Update the content if it changes
notification:connect_signal("property::message", set_escaped_text)
@ -513,10 +514,14 @@ function naughty.default_notification_handler(notification, args)
notification.box.visible = true
-- populate widgets
set_escaped_text(notification)
local layout = wibox.layout.fixed.horizontal()
if iconmargin then
layout:add(iconmargin)
end
layout:add(marginbox)
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()
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", ...)
end