Skip to content

Commit cb1b603

Browse files
authored
feat: Add meeting clock and weather clock modules with alerts and UI (#42)
* feat(meeting-clock): add meeting clock module with event handling and alerts - Implemented meeting clock logic to normalize calendar events and extract meeting URLs. - Added options for alerts, snooze duration, and exclusion of all-day events in preferences. - Created styles for the meeting clock widget and integrated it into the main application. - Developed unit tests for meeting clock functionalities and integration tests for module toggling. - Updated registry and metadata to include the new meeting clock module. * feat: add Weather Clock module to display weather information next to the clock - Implemented Weather Clock functionality with integration to GNOME Weather. - Added options to show weather after the clock and handle alerts for events without links. - Created logic for normalizing weather snapshots and deriving weather presentations. - Developed UI components for the weather clock display and integrated it into the existing clock pill layout. - Added styles for the weather clock widget and ensured compatibility with existing modules. - Included unit tests for weather clock logic and integration tests for module functionality.
1 parent 1cb594b commit cb1b603

28 files changed

Lines changed: 3046 additions & 45 deletions

CREDITS.md

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,3 +26,17 @@ The **XWayland Indicator** module is inspired by
2626
[**swsnr/gnome-shell-extension-xwayland-indicator**](https://codeberg.org/swsnr/gnome-shell-extension-xwayland-indicator/).
2727
Thanks to [@swsnr](https://codeberg.org/swsnr) for the original idea of surfacing which
2828
windows run under XWayland.
29+
30+
## Weather Clock
31+
32+
The **Weather Clock** module is inspired by
33+
[**CleoMenezesJr/weather-oclock**](https://github.com/CleoMenezesJr/weather-oclock).
34+
Thanks to [@CleoMenezesJr](https://github.com/CleoMenezesJr) for the GNOME Weather clock
35+
integration pattern.
36+
37+
## Meeting Clock
38+
39+
The **Meeting Clock** module is inspired by
40+
[**danmoz/meetingtime**](https://github.com/danmoz/meetingtime).
41+
Thanks to [@danmoz](https://github.com/danmoz) for the meeting reminder behavior and
42+
calendar-driven workflow.

README.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@ Aurora is split into independent modules, so you can enable only what you want.
2222
| **Dock** | Replaces the stock dash with a smart per-monitor dock with intellihide and edge reveal |
2323
| **Volume Mixer** | Adds per-application volume sliders to Quick Settings with fast access to Sound Settings |
2424
| **XWayland Indicator** | Adds an indicator to the app activities in Ctrl + Tab to indicate where XWayland is running |
25+
| **Weather Clock** | Shows GNOME Weather next to the panel clock |
26+
| **Meeting Clock** | Shows upcoming calendar events next to the panel clock and notifies when meetings are about to start |
2527
| **Tray Icons** | System tray in the panel that shows SNI app icons and GNOME background apps, with configurable icon limit, icon size, attention notifications, and smart SNI/background-app deduplication |
2628
| **DND on Screen Share** | Automatically enables Do Not Disturb mode when screen sharing or recording is active |
2729
| **Icon Weave** | Automatically fixes missing app icons by matching untracked windows to their apps in-memory |
@@ -73,6 +75,8 @@ We welcome contributions! Please see [CONTRIBUTING.md](CONTRIBUTING.md) for info
7375
Aurora Shell builds on the work of the wider GNOME community. Special thanks to:
7476

7577
- [**maniacx/Bluetooth-Battery-Meter**](https://github.com/maniacx/Bluetooth-Battery-Meter) the animated Bluetooth icons used by the Bluetooth Menu module come from this project.
78+
- [**CleoMenezesJr/weather-oclock**](https://github.com/CleoMenezesJr/weather-oclock) inspired the Weather Clock module.
79+
- [**danmoz/meetingtime**](https://github.com/danmoz/meetingtime) inspired the Meeting Clock module.
7680
- [**swsnr/gnome-shell-extension-xwayland-indicator**](https://codeberg.org/swsnr/gnome-shell-extension-xwayland-indicator/) the inspiration behind the XWayland Indicator module.
7781

7882
See [CREDITS.md](CREDITS.md) for the full list of attributed work.

data/po/pt_BR.po

Lines changed: 119 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ msgid ""
66
msgstr ""
77
"Project-Id-Version: aurora-shell\n"
88
"Report-Msgid-Bugs-To: https://github.com/luminusOS/aurora-shell/issues\n"
9-
"POT-Creation-Date: 2026-05-31 18:10-0300\n"
9+
"POT-Creation-Date: 2026-06-02 18:21-0300\n"
1010
"PO-Revision-Date: 2026-03-09 18:00-0300\n"
1111
"Last-Translator: Aurora Shell Contributors\n"
1212
"Language-Team: Portuguese (Brazil)\n"
@@ -65,43 +65,43 @@ msgid ""
6565
"Shows battery level and animated icons in the Bluetooth Quick Settings panel"
6666
msgstr ""
6767

68-
#: dist/modules/clipboardHistory/clipboardHistory.js:126
69-
#: dist/modules/clipboardHistory/clipboardPanel.js:43 dist/prefsMetadata.js:187
68+
#: dist/modules/clipboardHistory/clipboardHistory.js:146
69+
#: dist/modules/clipboardHistory/clipboardPanel.js:43 dist/prefsMetadata.js:267
7070
msgid "Clipboard History"
7171
msgstr ""
7272

73-
#: dist/modules/clipboardHistory/clipboardHistory.js:127
74-
#: dist/prefsMetadata.js:188
73+
#: dist/modules/clipboardHistory/clipboardHistory.js:147
74+
#: dist/prefsMetadata.js:268
7575
msgid "Searchable clipboard history with pinning and keyboard navigation"
7676
msgstr ""
7777

78-
#: dist/modules/clipboardHistory/clipboardHistory.js:131
79-
#: dist/prefsMetadata.js:192
78+
#: dist/modules/clipboardHistory/clipboardHistory.js:151
79+
#: dist/prefsMetadata.js:272
8080
msgid "Open Shortcut"
8181
msgstr ""
8282

83-
#: dist/modules/clipboardHistory/clipboardHistory.js:132
84-
#: dist/prefsMetadata.js:193
83+
#: dist/modules/clipboardHistory/clipboardHistory.js:152
84+
#: dist/prefsMetadata.js:273
8585
msgid "Keyboard shortcut to open the clipboard history panel"
8686
msgstr ""
8787

88-
#: dist/modules/clipboardHistory/clipboardHistory.js:137
89-
#: dist/prefsMetadata.js:198
88+
#: dist/modules/clipboardHistory/clipboardHistory.js:157
89+
#: dist/prefsMetadata.js:278
9090
msgid "Max History Items"
9191
msgstr ""
9292

93-
#: dist/modules/clipboardHistory/clipboardHistory.js:138
94-
#: dist/prefsMetadata.js:199
93+
#: dist/modules/clipboardHistory/clipboardHistory.js:158
94+
#: dist/prefsMetadata.js:279
9595
msgid "Number of non-pinned entries to retain"
9696
msgstr ""
9797

98-
#: dist/modules/clipboardHistory/clipboardHistory.js:145
99-
#: dist/prefsMetadata.js:206
98+
#: dist/modules/clipboardHistory/clipboardHistory.js:165
99+
#: dist/prefsMetadata.js:286
100100
msgid "Poll Interval (ms)"
101101
msgstr ""
102102

103-
#: dist/modules/clipboardHistory/clipboardHistory.js:146
104-
#: dist/prefsMetadata.js:207
103+
#: dist/modules/clipboardHistory/clipboardHistory.js:166
104+
#: dist/prefsMetadata.js:287
105105
msgid "How often to check the clipboard for changes"
106106
msgstr ""
107107

@@ -146,6 +146,92 @@ msgstr ""
146146
msgid "Automatically fixes missing app icons using an in-memory approach"
147147
msgstr ""
148148

149+
#: dist/modules/meetingClock/meetingClock.js:320
150+
msgid "Meeting starting soon"
151+
msgstr ""
152+
153+
#: dist/modules/meetingClock/meetingClock.js:328
154+
msgid "Join"
155+
msgstr ""
156+
157+
#: dist/modules/meetingClock/meetingClock.js:329
158+
msgid "Snooze"
159+
msgstr ""
160+
161+
#: dist/modules/meetingClock/meetingClock.js:330
162+
msgid "Dismiss"
163+
msgstr ""
164+
165+
#: dist/modules/meetingClock/meetingClock.js:331
166+
msgid "Ignore"
167+
msgstr ""
168+
169+
#: dist/modules/meetingClock/meetingClock.js:465
170+
#: dist/modules/meetingClock/meetingClock.js:497 dist/prefsMetadata.js:151
171+
msgid "Meeting Clock"
172+
msgstr ""
173+
174+
#: dist/modules/meetingClock/meetingClock.js:498 dist/prefsMetadata.js:152
175+
msgid "Shows upcoming calendar events next to the clock"
176+
msgstr ""
177+
178+
#: dist/modules/meetingClock/meetingClock.js:502 dist/prefsMetadata.js:156
179+
msgid "Meeting Alerts"
180+
msgstr ""
181+
182+
#: dist/modules/meetingClock/meetingClock.js:503 dist/prefsMetadata.js:157
183+
msgid "Show a notification when a meeting is about to start"
184+
msgstr ""
185+
186+
#: dist/modules/meetingClock/meetingClock.js:508 dist/prefsMetadata.js:162
187+
msgid "Alert Lead Time (minutes)"
188+
msgstr ""
189+
190+
#: dist/modules/meetingClock/meetingClock.js:509 dist/prefsMetadata.js:163
191+
msgid "Minutes before a meeting starts to show the alert"
192+
msgstr ""
193+
194+
#: dist/modules/meetingClock/meetingClock.js:516 dist/prefsMetadata.js:170
195+
msgid "Snooze Duration (minutes)"
196+
msgstr ""
197+
198+
#: dist/modules/meetingClock/meetingClock.js:517 dist/prefsMetadata.js:171
199+
msgid "Minutes to wait before showing a snoozed alert again"
200+
msgstr ""
201+
202+
#: dist/modules/meetingClock/meetingClock.js:524 dist/prefsMetadata.js:178
203+
msgid "Alert Events Without Links"
204+
msgstr ""
205+
206+
#: dist/modules/meetingClock/meetingClock.js:525 dist/prefsMetadata.js:179
207+
msgid "Show meeting alerts for calendar events that do not include a join link"
208+
msgstr ""
209+
210+
#: dist/modules/meetingClock/meetingClock.js:530 dist/prefsMetadata.js:184
211+
msgid "Panel Reveal Interval (minutes)"
212+
msgstr ""
213+
214+
#: dist/modules/meetingClock/meetingClock.js:531 dist/prefsMetadata.js:185
215+
msgid "Minutes between automatic Meeting Clock slide reveals in the panel"
216+
msgstr ""
217+
218+
#: dist/modules/meetingClock/meetingClock.js:538 dist/prefsMetadata.js:192
219+
msgid "Panel Lookahead (minutes)"
220+
msgstr ""
221+
222+
#: dist/modules/meetingClock/meetingClock.js:539 dist/prefsMetadata.js:193
223+
msgid ""
224+
"Maximum minutes before an event starts for it to appear in the panel clock"
225+
msgstr ""
226+
227+
#: dist/modules/meetingClock/meetingClock.js:546 dist/prefsMetadata.js:200
228+
msgid "Hide All-Day Events"
229+
msgstr ""
230+
231+
#: dist/modules/meetingClock/meetingClock.js:547 dist/prefsMetadata.js:201
232+
msgid "Exclude all-day events from the clock and alerts"
233+
msgstr ""
234+
149235
#: dist/modules/noOverview/noOverview.js:36 dist/prefsMetadata.js:19
150236
msgid "No Overview"
151237
msgstr "Sem Visão Geral"
@@ -290,6 +376,22 @@ msgstr ""
290376
msgid "Per-application volume control in Quick Settings"
291377
msgstr "Controle de volume por aplicativo nas Configurações Rápidas"
292378

379+
#: dist/modules/weatherClock/weatherClock.js:383 dist/prefsMetadata.js:136
380+
msgid "Weather Clock"
381+
msgstr ""
382+
383+
#: dist/modules/weatherClock/weatherClock.js:384 dist/prefsMetadata.js:137
384+
msgid "Shows GNOME Weather next to the clock"
385+
msgstr ""
386+
387+
#: dist/modules/weatherClock/weatherClock.js:388 dist/prefsMetadata.js:141
388+
msgid "Show Weather After Clock"
389+
msgstr ""
390+
391+
#: dist/modules/weatherClock/weatherClock.js:389 dist/prefsMetadata.js:142
392+
msgid "Place the weather indicator after the clock instead of before it"
393+
msgstr ""
394+
293395
#: dist/modules/xwaylandIndicator/xwaylandIndicator.js:108
294396
#: dist/prefsMetadata.js:62
295397
msgid "XWayland Indicator"

data/schemas/org.gnome.shell.extensions.aurora-shell.gschema.xml

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,60 @@
9595
<summary>Enable Bluetooth Menu module</summary>
9696
<description>Enhances the Bluetooth Quick Settings panel with battery levels and animated icons</description>
9797
</key>
98+
<key name="module-meeting-clock" type="b">
99+
<default>true</default>
100+
<summary>Enable Meeting Clock module</summary>
101+
<description>Shows upcoming calendar events next to the clock</description>
102+
</key>
103+
<key name="module-weather-clock" type="b">
104+
<default>true</default>
105+
<summary>Enable Weather Clock module</summary>
106+
<description>Shows GNOME Weather next to the clock</description>
107+
</key>
108+
<key name="weather-clock-after-clock" type="b">
109+
<default>false</default>
110+
<summary>Show Weather Clock after the clock</summary>
111+
<description>Place the weather indicator after the clock instead of before it</description>
112+
</key>
113+
<key name="meeting-clock-alerts-enabled" type="b">
114+
<default>true</default>
115+
<summary>Enable Meeting Clock alerts</summary>
116+
<description>Show a notification when a meeting is about to start</description>
117+
</key>
118+
<key name="meeting-clock-alert-minutes-before" type="i">
119+
<range min="0" max="60"/>
120+
<default>1</default>
121+
<summary>Meeting Clock alert lead time</summary>
122+
<description>Minutes before a meeting starts to show the alert</description>
123+
</key>
124+
<key name="meeting-clock-snooze-minutes" type="i">
125+
<range min="1" max="60"/>
126+
<default>5</default>
127+
<summary>Meeting Clock snooze duration</summary>
128+
<description>Minutes to wait before showing a snoozed alert again</description>
129+
</key>
130+
<key name="meeting-clock-alert-events-without-link" type="b">
131+
<default>false</default>
132+
<summary>Alert events without meeting links</summary>
133+
<description>Show Meeting Clock alerts for calendar events that do not include a join link</description>
134+
</key>
135+
<key name="meeting-clock-panel-reveal-interval-minutes" type="i">
136+
<range min="1" max="60"/>
137+
<default>5</default>
138+
<summary>Meeting Clock panel reveal interval</summary>
139+
<description>Minutes between automatic Meeting Clock slide reveals in the panel</description>
140+
</key>
141+
<key name="meeting-clock-panel-lookahead-minutes" type="i">
142+
<range min="0" max="1440"/>
143+
<default>60</default>
144+
<summary>Meeting Clock panel lookahead</summary>
145+
<description>Maximum minutes before an event starts for it to appear in the panel clock</description>
146+
</key>
147+
<key name="meeting-clock-exclude-all-day-events" type="b">
148+
<default>true</default>
149+
<summary>Hide all-day events in Meeting Clock</summary>
150+
<description>Exclude all-day events from the clock and alerts</description>
151+
</key>
98152
<key name="module-tray-icons" type="b">
99153
<default>true</default>
100154
<summary>Enable Tray Icons module</summary>

src/dev/devTool.ts

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,9 @@ import { loadIcon } from '~/shared/icons.ts';
1313

1414
import { ClipboardHistoryDevTool } from './clipboardHistoryDevTool.ts';
1515
import { GeneralDevTool } from './generalDevTool.ts';
16+
import { MeetingClockDevTool } from './meetingClockDevTool.ts';
1617
import { TrayIconsDevTool } from './trayIconsDevTool.ts';
18+
import { WeatherClockDevTool } from './weatherClockDevTool.ts';
1719

1820
const DEVTOOL_ID = 'aurora-devtool';
1921

@@ -36,6 +38,8 @@ export class DevTool extends Module {
3638
private _generalTool: GeneralDevTool | null = null;
3739
private _clipboardHistoryTool: ClipboardHistoryDevTool | null = null;
3840
private _trayIconsTool: TrayIconsDevTool | null = null;
41+
private _weatherClockTool: WeatherClockDevTool | null = null;
42+
private _meetingClockTool: MeetingClockDevTool | null = null;
3943
private _sections: DevToolSection[] = [];
4044
private _activeSectionKey = 'general';
4145
private _sectionDropdownOpen = false;
@@ -63,7 +67,21 @@ export class DevTool extends Module {
6367
() => this._rebuildMenu(),
6468
);
6569
this._trayIconsTool = new TrayIconsDevTool(() => this._rebuildMenu());
66-
this._sections = [this._generalTool, this._clipboardHistoryTool, this._trayIconsTool];
70+
this._weatherClockTool = new WeatherClockDevTool(
71+
(key) => this._callbacks.getModule(key),
72+
() => this._rebuildMenu(),
73+
);
74+
this._meetingClockTool = new MeetingClockDevTool(
75+
(key) => this._callbacks.getModule(key),
76+
() => this._rebuildMenu(),
77+
);
78+
this._sections = [
79+
this._generalTool,
80+
this._clipboardHistoryTool,
81+
this._trayIconsTool,
82+
this._weatherClockTool,
83+
this._meetingClockTool,
84+
];
6785

6886
const menu = this._getMenu();
6987
if (!menu) return;
@@ -86,6 +104,8 @@ export class DevTool extends Module {
86104
this._generalTool = null;
87105
this._clipboardHistoryTool = null;
88106
this._trayIconsTool = null;
107+
this._weatherClockTool = null;
108+
this._meetingClockTool = null;
89109

90110
if (this._menuOpenStateId && this._button) {
91111
this._getMenu()?.disconnect(this._menuOpenStateId);
@@ -109,6 +129,14 @@ export class DevTool extends Module {
109129
return this._generalTool;
110130
}
111131

132+
get meetingClockTool(): MeetingClockDevTool | null {
133+
return this._meetingClockTool;
134+
}
135+
136+
get weatherClockTool(): WeatherClockDevTool | null {
137+
return this._weatherClockTool;
138+
}
139+
112140
private _rebuildMenu(): void {
113141
const menu = this._getMenu();
114142
if (!menu) return;

0 commit comments

Comments
 (0)