diff options
author | Kristóf Marussy <kristof@marussy.com> | 2023-03-15 17:26:13 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-03-15 17:26:13 +0100 |
commit | f1152d3dbb4c6deefea168d66f15f77b7155a5fe (patch) | |
tree | 22c27234b6e3a2dfe47ade037ece47b2533f7039 /src/lib/DBus.ts | |
parent | 6.2.6-nightly.5 [skip ci] (diff) | |
download | ferdium-app-f1152d3dbb4c6deefea168d66f15f77b7155a5fe.tar.gz ferdium-app-f1152d3dbb4c6deefea168d66f15f77b7155a5fe.tar.zst ferdium-app-f1152d3dbb4c6deefea168d66f15f77b7155a5fe.zip |
Basic D-Bus API (#866)
* feat: basic D-Bus API
Expose muted state and the number of unread message over D-Bus when
running on Linux. This is useful for, e.g., displaying notifications on
a window manager status bar.
Signed-off-by: Kristóf Marussy <kristof@marussy.com>
* docs: create docs directory
Move the documentation to a separate directory so that new documentation
can be added into one place.
We keep the following files still in the repository root by convention:
* CHANGELOG.md
* CODE_OF_CONDUCT.md
* CONTRIBUTING.md
* LICENSE.md
* README.md
* SECURITY.md
Signed-off-by: Kristóf Marussy <kristof@marussy.com>
* docs: D-Bus usage example
Signed-off-by: Kristóf Marussy <kristof@marussy.com>
* fix: remove unneeded D-Bus signals
Only notify clients that the message counts or the mute status has
changed if there actually was a change.
Signed-off-by: Kristóf Marussy <kristof@marussy.com>
* docs: rewrite sample bar client
* docs: better unread --services help
* docs: update dbus docs
* docs: use ferdium-dbus in dbus bar example
* docs: make command argument required in bar example
---------
Signed-off-by: Kristóf Marussy <kristof@marussy.com>
Co-authored-by: Victor Bonnelle <victor.bonnelle@protonmail.com>
Diffstat (limited to 'src/lib/DBus.ts')
-rw-r--r-- | src/lib/DBus.ts | 69 |
1 files changed, 67 insertions, 2 deletions
diff --git a/src/lib/DBus.ts b/src/lib/DBus.ts index bbff405c4..530e30c85 100644 --- a/src/lib/DBus.ts +++ b/src/lib/DBus.ts | |||
@@ -1,28 +1,92 @@ | |||
1 | import { ipcMain } from 'electron'; | ||
2 | import { comparer } from 'mobx'; | ||
3 | |||
1 | import { MessageBus, sessionBus } from 'dbus-next'; | 4 | import { MessageBus, sessionBus } from 'dbus-next'; |
2 | import { isLinux } from '../environment'; | 5 | import { isLinux } from '../environment'; |
3 | import TrayIcon from './Tray'; | 6 | import TrayIcon from './Tray'; |
7 | import Ferdium, { type UnreadServices } from './dbus/Ferdium'; | ||
4 | 8 | ||
5 | export default class DBus { | 9 | export default class DBus { |
6 | bus: MessageBus | null = null; | 10 | private bus: MessageBus | null = null; |
7 | 11 | ||
8 | trayIcon: TrayIcon; | 12 | trayIcon: TrayIcon; |
9 | 13 | ||
14 | private ferdium: Ferdium | null = null; | ||
15 | |||
16 | muted = false; | ||
17 | |||
18 | unreadDirectMessageCount = 0; | ||
19 | |||
20 | unreadIndirectMessageCount = 0; | ||
21 | |||
22 | unreadServices: UnreadServices = []; | ||
23 | |||
10 | constructor(trayIcon: TrayIcon) { | 24 | constructor(trayIcon: TrayIcon) { |
11 | this.trayIcon = trayIcon; | 25 | this.trayIcon = trayIcon; |
26 | ipcMain.on('initialAppSettings', (_, appSettings) => { | ||
27 | this.updateSettings(appSettings); | ||
28 | }); | ||
29 | ipcMain.on('updateAppSettings', (_, appSettings) => { | ||
30 | this.updateSettings(appSettings); | ||
31 | }); | ||
32 | ipcMain.on( | ||
33 | 'updateDBusUnread', | ||
34 | ( | ||
35 | _, | ||
36 | unreadDirectMessageCount, | ||
37 | unreadIndirectMessageCount, | ||
38 | unreadServices, | ||
39 | ) => { | ||
40 | this.setUnread( | ||
41 | unreadDirectMessageCount, | ||
42 | unreadIndirectMessageCount, | ||
43 | unreadServices, | ||
44 | ); | ||
45 | }, | ||
46 | ); | ||
47 | } | ||
48 | |||
49 | private updateSettings(appSettings): void { | ||
50 | const muted = !!appSettings.data.isAppMuted; | ||
51 | if (this.muted !== muted) { | ||
52 | this.muted = muted; | ||
53 | this.ferdium?.emitMutedChanged(); | ||
54 | } | ||
12 | } | 55 | } |
13 | 56 | ||
14 | start() { | 57 | private setUnread( |
58 | unreadDirectMessageCount: number, | ||
59 | unreadIndirectMessageCount: number, | ||
60 | unreadServices: UnreadServices, | ||
61 | ): void { | ||
62 | if ( | ||
63 | this.unreadDirectMessageCount !== unreadDirectMessageCount || | ||
64 | this.unreadIndirectMessageCount !== unreadIndirectMessageCount || | ||
65 | !comparer.structural(this.unreadServices, unreadServices) | ||
66 | ) { | ||
67 | this.unreadDirectMessageCount = unreadDirectMessageCount; | ||
68 | this.unreadIndirectMessageCount = unreadIndirectMessageCount; | ||
69 | this.unreadServices = unreadServices; | ||
70 | this.ferdium?.emitUnreadChanged(); | ||
71 | } | ||
72 | } | ||
73 | |||
74 | async start() { | ||
15 | if (!isLinux || this.bus) { | 75 | if (!isLinux || this.bus) { |
16 | return; | 76 | return; |
17 | } | 77 | } |
18 | 78 | ||
19 | try { | 79 | try { |
20 | this.bus = sessionBus(); | 80 | this.bus = sessionBus(); |
81 | await this.bus.requestName('org.ferdium.Ferdium', 0); | ||
21 | } catch { | 82 | } catch { |
22 | // Error connecting to the bus. | 83 | // Error connecting to the bus. |
23 | return; | 84 | return; |
24 | } | 85 | } |
25 | 86 | ||
87 | this.ferdium = new Ferdium(this); | ||
88 | this.bus.export('/org/ferdium', this.ferdium); | ||
89 | |||
26 | // HACK Hook onto the MessageBus to track StatusNotifierWatchers | 90 | // HACK Hook onto the MessageBus to track StatusNotifierWatchers |
27 | // @ts-expect-error Property '_addMatch' does not exist on type 'MessageBus'. | 91 | // @ts-expect-error Property '_addMatch' does not exist on type 'MessageBus'. |
28 | this.bus._addMatch( | 92 | this.bus._addMatch( |
@@ -56,5 +120,6 @@ export default class DBus { | |||
56 | 120 | ||
57 | this.bus.disconnect(); | 121 | this.bus.disconnect(); |
58 | this.bus = null; | 122 | this.bus = null; |
123 | this.ferdium = null; | ||
59 | } | 124 | } |
60 | } | 125 | } |