Files
Burn-My-Windows/src/migrate.js
T
Simon Schneegans 9ae7f9c042 ♻️ Use glob import for utils
2023-09-02 10:21:40 +02:00

227 lines
9.0 KiB
JavaScript

//////////////////////////////////////////////////////////////////////////////////////////
// ) ( //
// ( /( ( ( ) ( ( ( ( )\ ) ( ( //
// )\()) ))\ )( ( ( )\ ) )\))( )\ ( (()/( ( )\))( ( //
// ((_)\ /((_|()\ )\ ) )\ '(()/( ((_)()((_) )\ ) ((_)))\((_)()\ )\ //
// | |(_|_))( ((_)_(_/( _((_)) )(_)) _(()((_|_)_(_/( _| |((_)(()((_|(_) //
// | '_ \ || | '_| ' \)) | ' \()| || | \ V V / | ' \)) _` / _ \ V V (_-< //
// |_.__/\_,_|_| |_||_| |_|_|_| \_, | \_/\_/|_|_||_|\__,_\___/\_/\_//__/ //
// |__/ //
//////////////////////////////////////////////////////////////////////////////////////////
// SPDX-FileCopyrightText: Simon Schneegans <code@simonschneegans.de>
// SPDX-License-Identifier: GPL-3.0-or-later
'use strict';
import {ProfileManager} from './ProfileManager.js';
import * as utils from './utils.js';
// Migrating from pre-27 versions is pretty involved. Before, all settings were stored in
// the standard Gio.Settings backend. Now, there are effect profiles. Depending on the
// settings one or two profiles may be required.
export async function fromVersion26() {
return utils
.executeCommand(['dconf', 'dump', '/org/gnome/shell/extensions/burn-my-windows/'])
.catch(r => utils.debug('Failed to get old settings for effect migration: ' + r))
.then(r => {
// If there were no settings before, we do not have to migrate anything. Just use
// the new defaults.
if (r == '') {
return;
}
utils.debug('Starting Burn-My-Windows profile migration (old version <= 26)!');
// We use this to write the new profiles.
const profileManager = new ProfileManager();
// The default value of this was false, so not-present is equal to false.
const destroyDialogs = r.includes('destroy-dialogs=true');
if (!destroyDialogs) {
utils.debug('Only normal windows will be burned by the new profile(s).');
}
// The default value of this was false, so not-present is equal to false.
const disableOnBattery = r.includes('disable-on-battery=true');
if (disableOnBattery) {
utils.debug('The new profile(s) will not be active on battery.');
}
// The default value of this was false, so not-present is equal to false.
const disableOnPowerSave = r.includes('disable-on-power-save=true');
if (disableOnPowerSave) {
utils.debug('The new profile(s) will not be active in power-save mode.');
}
// Remove some unnecessary lines.
r = r.replace(/^active-profile=.*\n?/gm, '');
r = r.replace(/^test-mode=.*\n?/gm, '');
r = r.replace(/^last-extension-version=.*\n?/gm, '');
r = r.replace(/^last-prefs-version=.*\n?/gm, '');
r = r.replace(/^destroy-dialogs=.*\n?/gm, '');
r = r.replace(/^disable-on-battery=.*\n?/gm, '');
r = r.replace(/^disable-on-power-save=.*\n?/gm, '');
r = r.replace(/^.*-preview-.*\n?/gm, '');
r = r.replace('[/]\n', '');
r = r.trim();
// There were some inconsistencies in the key names. The update fixes them.
r.replace('flame-', 'fire-');
r.replace('claw-', 'trex-');
// Find all effects which were used for openeing and closing. This first extracts
// all lines which end in "-open-effect=true" and then remove this suffix from the
// lines. This leaves only the effect nicks.
let lines = r.split('\n');
let openEffects = lines.filter(l => l.includes('-open-effect=true'))
.map(l => l.replace('-open-effect=true', ''));
let closeEffects = lines.filter(l => l.includes('-close-effect=true'))
.map(l => l.replace('-close-effect=true', ''));
// The fire-close effect is enabled per default, so we have to add it if it's not
// explicitly disabled.
if (!r.includes('fire-close-effect=false') && !closeEffects.includes('fire')) {
closeEffects.push('fire');
}
// Print all effects we've found.
utils.debug('Enabled open effects: ' + openEffects);
utils.debug('Enabled close effects: ' + closeEffects);
// If the same effects were used for opening and closing windows or there is either
// no opening or no closing animation configured, only one profile is required. Else
// we have to create two new profiles.
const numProfiles = openEffects.join() == closeEffects.join() ? 1 : 2;
if (numProfiles == 1) {
utils.debug('Only one profile is required.');
} else if (closeEffects.length == 0) {
utils.debug('Only a window-open profile is required.');
} else if (openEffects.length == 0) {
utils.debug('Only a window-close profile is required.');
} else {
utils.debug('Two profiles are required.');
}
// Remove all open / close lines.
const profileLines =
lines.filter(l => !l.includes('-close-effect=') && !l.includes('-open-effect='));
// Add the header.
profileLines.unshift('[burn-my-windows-profile]');
// Push the line which makes the profile only apply to normal windows.
if (!destroyDialogs) {
profileLines.push('profile-window-type=1');
}
// Push the line which makes the profile only active when plugged in.
if (disableOnBattery) {
profileLines.push('profile-power-mode=2');
}
// Push the line which makes the profile only active when on balanced or performance
// mode.
if (disableOnPowerSave) {
profileLines.push('profile-power-profile=5');
}
// Now comes a bit of code repetition, but it is more readable this way.
if (numProfiles == 1) {
// Add all relevant effects.
openEffects.forEach(e => profileLines.push(e + '-enable-effect=true'));
// The fire effect is enabled per default, so we have to explicitly disable it if
// not required.
if (!openEffects.includes('fire')) {
profileLines.push('fire-enable-effect=false');
}
// Print and save the new profile.
const profile = profileLines.join('\n');
utils.debug('The new profile:');
utils.debug(profile);
profileManager.createProfile(profile);
} else if (closeEffects.length == 0) {
// This profile is only for window openeing.
profileLines.push('profile-animation-type=1')
// Add all relevant effects.
openEffects.forEach(e => profileLines.push(e + '-enable-effect=true'));
// The fire effect is enabled per default, so we have to explicitly disable it if
// not required.
if (!openEffects.includes('fire')) {
profileLines.push('fire-enable-effect=false');
}
// Print and save the new profile.
const profile = profileLines.join('\n');
utils.debug('The new window-open profile:');
utils.debug(profile);
profileManager.createProfile(profile);
} else if (openEffects.length == 0) {
// This profile is only for window closing.
profileLines.push('profile-animation-type=2')
// Add all relevant effects.
closeEffects.forEach(e => profileLines.push(e + '-enable-effect=true'));
// The fire effect is enabled per default, so we have to explicitly disable it if
// not required.
if (!closeEffects.includes('fire')) {
profileLines.push('fire-enable-effect=false');
}
// Print and save the new profile.
const profile = profileLines.join('\n');
utils.debug('The new window-close profile:');
utils.debug(profile);
profileManager.createProfile(profile);
} else {
const openProfileLines = [...profileLines, 'profile-animation-type=1'];
const closeProfileLines = [...profileLines, 'profile-animation-type=2'];
// Add all relevant effects.
openEffects.forEach(e => openProfileLines.push(e + '-enable-effect=true'));
closeEffects.forEach(e => closeProfileLines.push(e + '-enable-effect=true'));
// The fire effect is enabled per default, so we have to explicitly disable it if
// not required.
if (!closeEffects.includes('fire')) {
closeProfileLines.push('fire-enable-effect=false');
}
if (!openEffects.includes('fire')) {
openProfileLines.push('fire-enable-effect=false');
}
// Print and save the new profiles.
const openProfile = openProfileLines.join('\n');
const closeProfile = closeProfileLines.join('\n');
utils.debug('The new open-window profile:');
utils.debug(openProfile);
utils.debug('The new close-window profile:');
utils.debug(closeProfile);
profileManager.createProfile(openProfile);
profileManager.createProfile(closeProfile);
}
})
.catch(r => utils.debug('Failed to migrate settings: ' + r));
}