kdeconnect-kde/plugins/notifications
Weixuan Xiao f1843cb492 Improve D-Bus implementation on macOS
Better patch to replace !218.

- Auto and quick detection of previous D-Bus instance;
- Remove private D-Bus compile definition, only use it on macOS without an existing D-Bus instance;
- Safe reboot after crashes because the indicator is not relating on the kdeconnectd to run a D-Bus session;
- Safe exit after clicking on `Quit` in the systray.


More details in commit logs:

Only enable private D-Bus on macOS because the other platforms do not
need them.
The app should be able to easily detect the session bus from the env
DBUS_LAUNCHD_SESSION_BUS_SOCKET from launchd through launchctl.
Because https://gitlab.freedesktop.org/dbus/dbus/-/blob/master/dbus/dbus-sysdeps-unix.c#L4392
shows that it is the only probing method on macOS with launchd.

The D-Bus session bus can be easily found from launchd/launchctl
with DBUS_LAUNCHD_SESSION_BUS_SOCKET env. It can be an external one
(installed from HomeBrew) or an internal one (launched by a previous
instance followed by a crash).

The indicator helper on macOS can now automatically detect whether we can use a potentially
(with launchd/launchctl env set, or KDE Connect macOS
private_bus_address set) existed and usable session bus.
If previous bus is usable, just try to launch the kdeconnectd with us.
Otherwise, launch a private D-Bus daemon, export the launchd/launchctl
env, and run a kdeconnectd instance.

Everything works better and quicker now :)
2022-04-12 05:40:03 +00:00
..
CMakeLists.txt Clean up unneeded JSON parameter in kcoreaddons_add_plugin 2021-06-28 20:33:52 +02:00
kdeconnect_notifications.json SVN_SILENT made messages (.desktop file) - always resolve ours 2021-11-24 01:36:30 +00:00
notification.cpp Mark notifications as resident 2021-03-19 08:05:29 +00:00
notification.h Make use of KNotification's quick reply feature 2021-03-17 14:29:08 +01:00
notificationsplugin.cpp Improve D-Bus implementation on macOS 2022-04-12 05:40:03 +00:00
notificationsplugin.h [plugins/notifications] Merge notificationsdbusinterface and notificationsplugin 2020-10-18 21:42:06 +00:00
README Improve notificationsplugin README 2018-06-30 23:05:38 +02:00
sendreplydialog.cpp [sendreplydialog] Submit on enter, enter newline on shift+enter 2021-09-22 15:45:58 +02:00
sendreplydialog.h [sendreplydialog] Submit on enter, enter newline on shift+enter 2021-09-22 15:45:58 +02:00
sendreplydialog.ui [sendreplydialog] Move focus on tab 2021-09-26 17:27:42 +00:00

This plugin listens to packages with type "kdeconnect.notification" that will
contain all the information of the other device notifications.

The other device will report us every notification that is created or dismissed,
so we can keep in sync a local list of notifications.

At the beginning we can request the already existing notifications by sending a
package with the boolean "request" set to true.

The received packages will contain the following fields:

"id" (string): A unique notification id.
"appName" (string): The app that generated the notification
"ticker" (string): The title or headline of the notification, for compatibility with older Android versions.
"isClearable" (boolean): True if we can request to dismiss the notification.
"isCancel" (boolean): True if the notification was dismissed in the peer device.
"requestAnswer" (boolean): True if this is an answer to a "request" package.
"title" (string): The title of the notification.
"text" (string): The text/content of the notification.
"requestReplyId" (string): Used to reply to messages.
"silent" (bool): Handle this notification silent, i.e. don't show a notification, but show it in the plasmoid.

Additionally the package can contain a payload with the icon of the notification
in PNG format. If there another field will be present:

"payloadHash" (string): MD5 hash of the payload. Used as a filename to store the payload.

The content of these fields is used to display the notifications to the user.
Note that if we receive a second notification with the same "id", the existing notification is updated.

If the user dismisses a notification from this device, we have to request the
other device to remove it. This is done by sending a package with the fields
"id" set to the id of the notification we want to dismiss and a boolean "cancel"
set to true. The other device will answer with a notification package with
"isCancel" set to true when it is dismissed.