status/network: Show notification when detecting captive portal
When NetworkManager detects limited connectivity, we currently pop up the portal helper window immediately. This can both be disruptive when it happens unexpectedly, and unnoticeable when it happens during screen lock. In any case, it seems better to not pop up a window without explicit user action, so instead show a notification that launches the portal window when activated. Closes: https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/7688 Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/3408>
This commit is contained in:
parent
57de9ee874
commit
4ab1ccf3f2
@ -1951,19 +1951,43 @@ class CaptivePortalHandler extends Signals.EventEmitter {
|
|||||||
|
|
||||||
this._checkUri = checkUri;
|
this._checkUri = checkUri;
|
||||||
this._connectivityQueue = new Set();
|
this._connectivityQueue = new Set();
|
||||||
|
this._notifications = new Map();
|
||||||
this._portalHelperProxy = null;
|
this._portalHelperProxy = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
addConnection(path) {
|
addConnection(name, path) {
|
||||||
if (this._connectivityQueue.has(path))
|
if (this._connectivityQueue.has(path) || this._notifications.has(path))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
this._launchPortalHelper(path).catch(logError);
|
const source = MessageTray.getSystemSource();
|
||||||
|
|
||||||
|
const notification = new MessageTray.Notification({
|
||||||
|
title: _('Sign Into Wi–Fi Network'),
|
||||||
|
body: name,
|
||||||
|
source,
|
||||||
|
});
|
||||||
|
notification.connect('activated',
|
||||||
|
() => this._onNotificationActivated(path));
|
||||||
|
notification.connect('destroy',
|
||||||
|
() => this._notifications.delete(path));
|
||||||
|
this._notifications.set(path, notification);
|
||||||
|
source.addNotification(notification);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
removeConnection(path) {
|
removeConnection(path) {
|
||||||
if (this._connectivityQueue.delete(path))
|
if (this._connectivityQueue.delete(path))
|
||||||
this._portalHelperProxy?.CloseAsync(path);
|
this._portalHelperProxy?.CloseAsync(path);
|
||||||
|
this._notifications.get(path)?.destroy(
|
||||||
|
MessageTray.NotificationDestroyedReason.SOURCE_CLOSED);
|
||||||
|
this._notifications.delete(path);
|
||||||
|
}
|
||||||
|
|
||||||
|
_onNotificationActivated(path) {
|
||||||
|
this._launchPortalHelper(path).catch(logError);
|
||||||
|
|
||||||
|
Main.overview.hide();
|
||||||
|
Main.panel.closeCalendar();
|
||||||
}
|
}
|
||||||
|
|
||||||
_portalHelperDone(parameters) {
|
_portalHelperDone(parameters) {
|
||||||
@ -2014,6 +2038,10 @@ class CaptivePortalHandler extends Signals.EventEmitter {
|
|||||||
for (const item of this._connectivityQueue)
|
for (const item of this._connectivityQueue)
|
||||||
this._portalHelperProxy?.CloseAsync(item);
|
this._portalHelperProxy?.CloseAsync(item);
|
||||||
this._connectivityQueue.clear();
|
this._connectivityQueue.clear();
|
||||||
|
|
||||||
|
for (const n of this._notifications.values())
|
||||||
|
n.destroy(MessageTray.NotificationDestroyedReason.SOURCE_CLOSED);
|
||||||
|
this._notifications.clear();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2167,7 +2195,9 @@ class Indicator extends SystemIndicator {
|
|||||||
if (!isPortal || Main.sessionMode.isGreeter)
|
if (!isPortal || Main.sessionMode.isGreeter)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
this._portalHandler.addConnection(this._mainConnection.get_path());
|
this._portalHandler.addConnection(
|
||||||
|
this._mainConnection.get_id(),
|
||||||
|
this._mainConnection.get_path());
|
||||||
}
|
}
|
||||||
|
|
||||||
_updateIcon() {
|
_updateIcon() {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user