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 @@ + + + + + + never + 200 + 0 + 1 + + + 1 + + + vertical + 60 + 60 + 30 + 30 + + + + 30 + 10 + Fire Options + 0 + + + + + + + + none + 1 + + + + + + 0 + + + + + Animation Time [ms] + 0 + start + center + 1 + + + + + end + center + 1 + 0 + left + 250 + + + 10000 + 500 + 10 + 100 + + + + + + + edit-clear-symbolic + Reset to Default Value + + + + + + + + + + + + + + + + + + + + + + \ 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