summaryrefslogtreecommitdiff
path: root/raveos-gnome-theme/theme-data/extensions/installed/burn-my-windows@schneegans.github.com/src/ProfileManager.js
diff options
context:
space:
mode:
authorNippy <nippy@rp1.hu>2026-06-01 18:57:29 +0200
committerNippy <nippy@rp1.hu>2026-06-01 18:57:29 +0200
commit2e5a7d93476c0819b5a23f5740e4c843eaedc73a (patch)
tree84279c63b84126eb8f6d9d94a42c44aabbe22336 /raveos-gnome-theme/theme-data/extensions/installed/burn-my-windows@schneegans.github.com/src/ProfileManager.js
parente1f0fac166056bb106284be4a3fec0c558525927 (diff)
downloadRaveOS-PKGBUILD-2e5a7d93476c0819b5a23f5740e4c843eaedc73a.tar.gz
RaveOS-PKGBUILD-2e5a7d93476c0819b5a23f5740e4c843eaedc73a.zip
Raveos gnome update
Diffstat (limited to 'raveos-gnome-theme/theme-data/extensions/installed/burn-my-windows@schneegans.github.com/src/ProfileManager.js')
-rw-r--r--raveos-gnome-theme/theme-data/extensions/installed/burn-my-windows@schneegans.github.com/src/ProfileManager.js186
1 files changed, 186 insertions, 0 deletions
diff --git a/raveos-gnome-theme/theme-data/extensions/installed/burn-my-windows@schneegans.github.com/src/ProfileManager.js b/raveos-gnome-theme/theme-data/extensions/installed/burn-my-windows@schneegans.github.com/src/ProfileManager.js
new file mode 100644
index 0000000..91233be
--- /dev/null
+++ b/raveos-gnome-theme/theme-data/extensions/installed/burn-my-windows@schneegans.github.com/src/ProfileManager.js
@@ -0,0 +1,186 @@
+//////////////////////////////////////////////////////////////////////////////////////////
+// ) ( //
+// ( /( ( ( ) ( ( ( ( )\ ) ( ( //
+// )\()) ))\ )( ( ( )\ ) )\))( )\ ( (()/( ( )\))( ( //
+// ((_)\ /((_|()\ )\ ) )\ '(()/( ((_)()((_) )\ ) ((_)))\((_)()\ )\ //
+// | |(_|_))( ((_)_(_/( _((_)) )(_)) _(()((_|_)_(_/( _| |((_)(()((_|(_) //
+// | '_ \ || | '_| ' \)) | ' \()| || | \ V V / | ' \)) _` / _ \ V V (_-< //
+// |_.__/\_,_|_| |_||_| |_|_|_| \_, | \_/\_/|_|_||_|\__,_\___/\_/\_//__/ //
+// |__/ //
+//////////////////////////////////////////////////////////////////////////////////////////
+
+// SPDX-FileCopyrightText: Simon Schneegans <code@simonschneegans.de>
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+'use strict';
+
+import Gio from 'gi://Gio';
+import GLib from 'gi://GLib';
+
+//////////////////////////////////////////////////////////////////////////////////////////
+// Burn-My-Windows allows applying different sets of effect settings under specific //
+// circumstances. These settings are called "effect profiles". The ProfileManager //
+// provides access to all currently configured effect profiles. It can be used in both //
+// the settings dialog and the in the actual extension. //
+// The profiles are stored in ~/.config/burn-my-windows/profiles and can be accessed //
+// via Gio.Settings objects. //
+//////////////////////////////////////////////////////////////////////////////////////////
+
+export class ProfileManager {
+ // ------------------------------------------------------------------------- constructor
+
+ constructor(metadata) {
+ this._metadata = metadata;
+
+ this._makeProfilesDir();
+ this.reloadProfiles();
+ }
+
+ // -------------------------------------------------------------------- public interface
+
+ // Returns an array of effect profiles. Each effect profile is an object with two
+ // properties: The 'path' points to the file which contains the effect profile
+ // settings (located in ~/.config/burn-my-windows/profiles). The 'settings' property
+ // contains a Gio.Settings object for the profile. The former can be used to uniquely
+ // identify the profile, the latter can be used to access the profile's settings. This
+ // method will always return at least one profile. If none is configured, a default
+ // profile will be created.
+ getProfiles() {
+ if (this._profiles.length == 0) {
+ this.createProfile();
+ }
+
+ return this._profiles;
+ }
+
+ // This will create a new profile. If no content is given, all values will be
+ // initialized to their defaults. The method will return an effect profile object (as
+ // described above). We will use the current system time in microseconds as profile
+ // name. This ensures that they are always sorted according to their creation date.
+ createProfile(content = '') {
+ const path = `${GLib.get_user_config_dir()}/burn-my-windows/profiles/${
+ GLib.get_real_time()}.conf`;
+ const file = Gio.File.new_for_path(path);
+ file.create(Gio.FileCreateFlags.NONE, null);
+
+ if (content != '') {
+ file.replace_contents(content, null, false, Gio.FileCreateFlags.REPLACE_DESTINATION,
+ null);
+ }
+
+ const profile = {'path': path, 'settings': this._getProfileSettings(path)};
+
+ // Add the profile to our internal list of profiles.
+ this._profiles.push(profile);
+
+ return profile;
+ }
+
+ // Removes a profile defined by its file path. This will actually remove the file from
+ // the disk, so there's no going back.
+ deleteProfile(profilePath) {
+ const profileDir = `${GLib.get_user_config_dir()}/burn-my-windows/profiles`;
+ const file = Gio.File.new_for_path(profilePath);
+ if (file.has_prefix(Gio.File.new_for_path(profileDir)) && file.query_exists(null)) {
+ file.delete(null);
+ }
+
+ // Remove the profile from our internal list of profiles.
+ this._profiles = this._profiles.filter(p => p.path != profilePath);
+ }
+
+ // Reloads all profiles from ~/.config/burn-my-windows/profiles. If you called the
+ // createProfile() and deleteProfile() methods above, there is no need to reload the
+ // profiles.
+ reloadProfiles() {
+ const dir =
+ Gio.File.new_for_path(GLib.get_user_config_dir() + '/burn-my-windows/profiles');
+
+ const files =
+ dir.enumerate_children('standard::*', Gio.FileQueryInfoFlags.NONE, null);
+
+ let profilePaths = [];
+
+ while (true) {
+ const presetInfo = files.next_file(null);
+
+ if (presetInfo == null) {
+ break;
+ }
+
+ if (presetInfo.get_file_type() == Gio.FileType.REGULAR) {
+ const suffixPos = presetInfo.get_display_name().indexOf('.conf');
+ if (suffixPos > 0) {
+ profilePaths.push(dir.get_child(presetInfo.get_name()).get_path());
+ }
+ }
+ }
+
+ // Sort profiles alphabetically, that is by their creation time.
+ profilePaths.sort();
+
+ this._profiles = [];
+
+ profilePaths.forEach(path => {
+ this._profiles.push({'path': path, 'settings': this._getProfileSettings(path)});
+ });
+ }
+
+ // Each profile has a priority. It is higher, the more specific it is.
+ getProfilePriority(settings) {
+ let priority = 0;
+
+ // If an application is specified, we increase the priority quite a lot. This makes
+ // sure that per-application overrides are used in most cases.
+ if (settings.get_string('profile-app') != '') priority += 10;
+
+ // Each other setting which is not set to its default value increases the priority by
+ // one.
+ if (settings.get_int('profile-animation-type') > 0) ++priority;
+ if (settings.get_int('profile-window-type') > 0) ++priority;
+ if (settings.get_int('profile-color-scheme') > 0) ++priority;
+ if (settings.get_int('profile-power-mode') > 0) ++priority;
+ if (settings.get_int('profile-power-profile') > 0) ++priority;
+
+ // Increase the priority significantly for high-priority profiles.
+ if (settings.get_boolean('profile-high-priority')) priority += 100;
+
+ return priority;
+ }
+
+ // ----------------------------------------------------------------------- private stuff
+
+ // Creates the directory ~/.config/burn-my-windows/profiles if it does not yet exist.
+ _makeProfilesDir() {
+ const path = `${GLib.get_user_config_dir()}/burn-my-windows/profiles`;
+ const dir = Gio.File.new_for_path(path);
+
+ if (!dir.query_exists(null)) {
+ dir.make_directory_with_parents(null);
+ }
+ }
+
+ // Creates a Gio.Settings object for the given effect profile path. Based on
+ // https://gitlab.gnome.org/GNOME/gnome-shell/-/blob/main/js/misc/extensionUtils.js#L213
+ _getProfileSettings(profilePath) {
+
+ // Expect USER extensions to have a schemas/ subfolder, otherwise assume a
+ // SYSTEM extension that has been installed in the same prefix as the shell
+ const schemaDir = this._metadata.dir.get_child('schemas');
+ let source;
+ if (schemaDir.query_exists(null)) {
+ source = Gio.SettingsSchemaSource.new_from_directory(
+ schemaDir.get_path(), Gio.SettingsSchemaSource.get_default(), false);
+ } else {
+ source = Gio.SettingsSchemaSource.get_default();
+ }
+
+ const schema =
+ source.lookup('org.gnome.shell.extensions.burn-my-windows-profile', true);
+
+ const backend =
+ Gio.keyfile_settings_backend_new(profilePath, '/org/gnome/shell/extensions/', null);
+
+ return new Gio.Settings({settings_schema: schema, backend: backend});
+ }
+} \ No newline at end of file