mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-09 03:04:10 -04:00
Add xdg-desktop-portal based notifier backend that works without special priviledges in Linux sandbox contexts
This commit is contained in:
parent
92870512d9
commit
59818ed377
@ -30,7 +30,13 @@ class Notifier(object):
|
|||||||
|
|
||||||
class DBUSNotifier(Notifier):
|
class DBUSNotifier(Notifier):
|
||||||
|
|
||||||
|
#XXX: Really, this should instead just send the themable icon name
|
||||||
|
#
|
||||||
|
# Doing that however, requires Calibre to first be converted to use
|
||||||
|
# its AppID everywhere and then we still need a fallback for portable
|
||||||
|
# installations.
|
||||||
ICON = I('lt.png')
|
ICON = I('lt.png')
|
||||||
|
ICON_DATA = I('lt.png', data=True)
|
||||||
|
|
||||||
def __init__(self, session_bus):
|
def __init__(self, session_bus):
|
||||||
self.ok, self.err = True, None
|
self.ok, self.err = True, None
|
||||||
@ -66,11 +72,38 @@ class FDONotifier(DBUSNotifier):
|
|||||||
traceback.print_exc()
|
traceback.print_exc()
|
||||||
|
|
||||||
|
|
||||||
|
class XDPNotifier(DBUSNotifier):
|
||||||
|
|
||||||
|
SERVICE = 'org.freedesktop.portal.Desktop', '/org/freedesktop/portal/desktop', 'org.freedesktop.portal.Notification'
|
||||||
|
|
||||||
|
def __call__(self, body, summary=None, replaces_id=None, timeout=0):
|
||||||
|
if replaces_id is None:
|
||||||
|
replaces_id = self.dbus.UInt32()
|
||||||
|
_, body, summary = self.get_msg_parms(timeout, body, summary)
|
||||||
|
# Note: This backend does not natively support the notion of timeouts
|
||||||
|
#
|
||||||
|
# While the effect may be emulated by manually withdrawing the notifi-
|
||||||
|
# cation from the Calibre side, this resulted in a less than optimal
|
||||||
|
# User Experience. Based on this, KG decided it to be better to not
|
||||||
|
# support timeouts at all for this backend.
|
||||||
|
#
|
||||||
|
# See discussion at https://github.com/kovidgoyal/calibre/pull/1268.
|
||||||
|
try:
|
||||||
|
self._notify.AddNotification(str(replaces_id), self.dbus.Dictionary({
|
||||||
|
"title": self.dbus.String(summary),
|
||||||
|
"body": self.dbus.String(body),
|
||||||
|
"icon": self.dbus.Struct(("bytes", self.dbus.ByteArray(self.ICON_DATA, variant_level=1)), signature='sv'),
|
||||||
|
}, signature='sv'))
|
||||||
|
except:
|
||||||
|
import traceback
|
||||||
|
traceback.print_exc()
|
||||||
|
|
||||||
|
|
||||||
def get_dbus_notifier():
|
def get_dbus_notifier():
|
||||||
import dbus
|
import dbus
|
||||||
session_bus = dbus.SessionBus()
|
session_bus = dbus.SessionBus()
|
||||||
names = frozenset(session_bus.list_names())
|
names = frozenset(session_bus.list_names())
|
||||||
for srv in (FDONotifier,):
|
for srv in (FDONotifier, XDPNotifier):
|
||||||
if srv.SERVICE[0] in names:
|
if srv.SERVICE[0] in names:
|
||||||
ans = srv(session_bus)
|
ans = srv(session_bus)
|
||||||
if ans.ok:
|
if ans.ok:
|
||||||
|
Loading…
x
Reference in New Issue
Block a user