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>
(cherry picked from commit b93342f72e
)
This commit is contained in:
parent
1297d8dc30
commit
b6b9e755c7
@ -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);
|
||||
});
|
||||
|
Loading…
Reference in New Issue
Block a user