[gnome-shell] dbusServices/extensions: Only allow one dialog at a time
- From: Marge Bot <marge-bot src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-shell] dbusServices/extensions: Only allow one dialog at a time
- Date: Sat, 30 Oct 2021 21:57:24 +0000 (UTC)
commit b93342f72e871dc8472a9e92b23b45e0e7ded282
Author: Florian Müllner <fmuellner gnome org>
Date: Tue Oct 26 19:40:08 2021 +0200
dbusServices/extensions: Only allow one dialog at a time
Showing multiple preference dialogs at the same time (for instance
by repeated `gnome-extensions prefs` calls) may or may not work as
expected, depending on whether any of the dialogs is modal or not
(read: opened via the Extensions app).
The easiest way to address this is to disallow more than a single
dialog at the time. It's arguably also the more predictable behavior,
and means extensions don't have to deal with inconsistent state
caused by multiple dialogs.
https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/4564
Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/2013>
js/dbusServices/extensions/extensionsService.js | 19 +++++++++++++------
1 file changed, 13 insertions(+), 6 deletions(-)
---
diff --git a/js/dbusServices/extensions/extensionsService.js b/js/dbusServices/extensions/extensionsService.js
index 7fa32fe808..10743d4cc7 100644
--- a/js/dbusServices/extensions/extensionsService.js
+++ b/js/dbusServices/extensions/extensionsService.js
@@ -116,30 +116,37 @@ var ExtensionsService = class extends ServiceImplementation {
if (this._handleError(invocation, error))
return;
+ if (this._prefsDialog) {
+ this._handleError(invocation,
+ new Error('Already showing a prefs dialog'));
+ return;
+ }
+
const [serialized] = res;
const extension = ExtensionUtils.deserializeExtension(serialized);
- const window = new ExtensionPrefsDialog(extension);
- window.connect('realize', () => {
+ this._prefsDialog = new ExtensionPrefsDialog(extension);
+ this._prefsDialog.connect('realize', () => {
let externalWindow = null;
if (parentWindow)
externalWindow = Shew.ExternalWindow.new_from_handle(parentWindow);
if (externalWindow)
- externalWindow.set_parent_of(window.get_surface());
+ externalWindow.set_parent_of(this._prefsDialog.get_surface());
});
if (options.modal)
- window.modal = options.modal.get_boolean();
+ this._prefsDialog.modal = options.modal.get_boolean();
- window.connect('close-request', () => {
+ this._prefsDialog.connect('close-request', () => {
+ delete this._prefsDialog;
this.release();
return false;
});
this.hold();
- window.show();
+ this._prefsDialog.show();
invocation.return_value(null);
});
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]