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>
This commit is contained in:
Florian Müllner 2021-10-26 19:40:08 +02:00 committed by Marge Bot
parent 4d2b008966
commit b93342f72e

View File

@ -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);
});