diff --git a/extension.js b/extension.js
index 493caa8b..216cc5d1 100644
--- a/extension.js
+++ b/extension.js
@@ -34,16 +34,25 @@ class Extension {
// from GNOME Tweaks, when you log in or when the screen is unlocked.
enable() {
- imports.ui.windowManager.DESTROY_WINDOW_ANIMATION_TIME = 2000;
-
// Store a reference to the settings object.
- // this._settings = ExtensionUtils.getSettings();
+ this._settings = ExtensionUtils.getSettings();
// We will monkey-patch these three methods. Let's store the original ones.
this._origWindowRemoved = Workspace.prototype._windowRemoved;
this._origDoRemoveWindow = Workspace.prototype._doRemoveWindow;
this._origShouldAnimateActor = WindowManager.prototype._shouldAnimateActor;
+ // We may also override these animation times.
+ this._origDestroyTime = imports.ui.windowManager.DESTROY_WINDOW_ANIMATION_TIME;
+
+ const loadAnimationTimes = () => {
+ imports.ui.windowManager.DESTROY_WINDOW_ANIMATION_TIME =
+ this._settings.get_int('destroy-animation-time');
+ };
+
+ this._settings.connect('changed::destroy-animation-time', loadAnimationTimes);
+ loadAnimationTimes();
+
// We will use extensionThis to refer to the extension inside the patched methods of
// the WorkspacesView.
const extensionThis = this;
@@ -210,7 +219,9 @@ class Extension {
Workspace.prototype._doRemoveWindow = this._origDoRemoveWindow;
WindowManager.prototype._shouldAnimateActor = this._origShouldAnimateActor;
- // this._settings = null;
+ imports.ui.windowManager.DESTROY_WINDOW_ANIMATION_TIME = this._origDestroyTime;
+
+ this._settings = null;
}
// ----------------------------------------------------------------------- private stuff
diff --git a/prefs.js b/prefs.js
new file mode 100644
index 00000000..82f5b7da
--- /dev/null
+++ b/prefs.js
@@ -0,0 +1,101 @@
+//////////////////////////////////////////////////////////////////////////////////////////
+// ) ( //
+// ( /( ( ( ) ( ( ( ( )\ ) ( ( //
+// )\()) ))\ )( ( ( )\ ) )\))( )\ ( (()/( ( )\))( ( //
+// ((_)\ /((_|()\ )\ ) )\ '(()/( ((_)()((_) )\ ) ((_)))\((_)()\ )\ //
+// | |(_|_))( ((_)_(_/( _((_)) )(_)) _(()((_|_)_(_/( _| |((_)(()((_|(_) //
+// | '_ \ || | '_| ' \)) | ' \()| || | \ V V / | ' \)) _` / _ \ V V (_-< //
+// |_.__/\_,_|_| |_||_| |_|_|_| \_, | \_/\_/|_|_||_|\__,_\___/\_/\_//__/ //
+// |__/ //
+// Copyright (c) 2021 Simon Schneegans //
+// Released under the GPLv3 or later. See LICENSE file for details. //
+//////////////////////////////////////////////////////////////////////////////////////////
+
+'use strict';
+
+const {Gio, Gtk} = imports.gi;
+
+const ExtensionUtils = imports.misc.extensionUtils;
+const Me = imports.misc.extensionUtils.getCurrentExtension();
+const utils = Me.imports.utils;
+
+//////////////////////////////////////////////////////////////////////////////////////////
+// For now, the preferences dialog of this extension is very simple. In the future, if //
+// we might consider to improve its layout... //
+//////////////////////////////////////////////////////////////////////////////////////////
+
+var PreferencesDialog = class PreferencesDialog {
+ // ------------------------------------------------------------ constructor / destructor
+
+ constructor() {
+ // Load all of our resources.
+ this._resources = Gio.Resource.load(Me.path + '/resources/burn-my-windows.gresource');
+ Gio.resources_register(this._resources);
+
+ // Load the user interface file.
+ this._builder = new Gtk.Builder();
+ this._builder.add_from_resource(`/ui/settings.ui`);
+
+ // This is our top-level widget which we will return later.
+ this._widget = this._builder.get_object('settings-widget');
+
+ // Store a reference to the settings object.
+ this._settings = ExtensionUtils.getSettings();
+
+ // Bind all properties.
+ this._bindAdjustment('destroy-animation-time');
+
+ // As we do not have something like a destructor, we just listen for the destroy
+ // signal of our main widget.
+ this._widget.connect('destroy', () => {
+ // Unregister our resources.
+ Gio.resources_unregister(this._resources);
+ });
+ }
+
+ // -------------------------------------------------------------------- public interface
+
+ // Returns the widget used for the settings of this extension.
+ getWidget() {
+ return this._widget;
+ }
+
+ // ----------------------------------------------------------------------- private stuff
+
+ // Connects a Gtk.Adjustment (or anything else which has a 'value' property) to a
+ // settings key. It also binds the corresponding reset button.
+ _bindAdjustment(settingsKey) {
+ this._bind(settingsKey, 'value');
+ }
+
+ // Connects a Gtk.Switch (or anything else which has an 'active' property) to a settings
+ // key. It also binds the corresponding reset button.
+ _bindSwitch(settingsKey) {
+ this._bind(settingsKey, 'active');
+ }
+
+ // Connects any widget's property to a settings key. The widget must have the same ID as
+ // the settings key. It also binds the corresponding reset button.
+ _bind(settingsKey, property) {
+ this._settings.bind(
+ settingsKey, this._builder.get_object(settingsKey), property,
+ Gio.SettingsBindFlags.DEFAULT);
+
+ const resetButton = this._builder.get_object('reset-' + settingsKey);
+ resetButton.connect('clicked', () => {
+ this._settings.reset(settingsKey);
+ });
+ }
+}
+
+// Nothing to do for now...
+function init() {}
+
+// This function is called when the preferences window is created to build and return a
+// Gtk widget. We create a new instance of the PreferencesDialog class each time this
+// method is called. This way we can actually open multiple settings windows and interact
+// with all of them properly.
+function buildPrefsWidget() {
+ var dialog = new PreferencesDialog();
+ return dialog.getWidget();
+}
diff --git a/resources/ui/settings.ui b/resources/ui/settings.ui
new file mode 100644
index 00000000..f285ce2b
--- /dev/null
+++ b/resources/ui/settings.ui
@@ -0,0 +1,102 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/schemas/org.gnome.shell.extensions.burn-my-windows.gschema.xml b/schemas/org.gnome.shell.extensions.burn-my-windows.gschema.xml
index aee205ba..a3bdb20a 100644
--- a/schemas/org.gnome.shell.extensions.burn-my-windows.gschema.xml
+++ b/schemas/org.gnome.shell.extensions.burn-my-windows.gschema.xml
@@ -1,6 +1,14 @@
-
+
+
+
+ 2000
+ Destroy Animation Time
+ The time it takes to burn the windows.
+
+
+
\ No newline at end of file