mirror of
https://github.com/edu4rdshl/gnome-shell.git
synced 2026-07-17 23:24:51 +00:00
The ENABLED state means that an extension's `enable()` method was called successfully. This usually matches whether an extension *should* be enabled according to the enabled-extensions/disabled-extensions settings, but not necessarily: If an extension had an error or does not support the currently active mode, its actual state is different. We currently only expose the actual state to external tooling, but whether an extension should be enabled is relevant as well, for example to disable a lock-screen only extension from the regular session. For that purpose we will expose a separate `enabled` property. To avoid confusion with the existing states, change the exposed names to (IN)ACTIVE. This does not affect the D-Bus API, as the numeric values of the states remain unchanged. https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/7004 Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/3073>
96 lines
2.1 KiB
JavaScript
96 lines
2.1 KiB
JavaScript
// Common utils for the extension system, the extensions D-Bus service
|
|
// and the Extensions app
|
|
|
|
import Gio from 'gi://Gio';
|
|
import GLib from 'gi://GLib';
|
|
|
|
export const ExtensionType = {
|
|
SYSTEM: 1,
|
|
PER_USER: 2,
|
|
};
|
|
|
|
/**
|
|
* @enum {number}
|
|
*/
|
|
export const ExtensionState = {
|
|
ACTIVE: 1,
|
|
INACTIVE: 2,
|
|
ERROR: 3,
|
|
OUT_OF_DATE: 4,
|
|
DOWNLOADING: 5,
|
|
INITIALIZED: 6,
|
|
DEACTIVATING: 7,
|
|
ACTIVATING: 8,
|
|
|
|
// Used as an error state for operations on unknown extensions,
|
|
// should never be in a real extensionMeta object.
|
|
UNINSTALLED: 99,
|
|
};
|
|
|
|
const SERIALIZED_PROPERTIES = [
|
|
'type',
|
|
'state',
|
|
'path',
|
|
'error',
|
|
'hasPrefs',
|
|
'hasUpdate',
|
|
'canChange',
|
|
];
|
|
|
|
/**
|
|
* Serialize extension into an object that can be used
|
|
* in a vardict {GLib.Variant}
|
|
*
|
|
* @param {object} extension - an extension object
|
|
* @returns {object}
|
|
*/
|
|
export function serializeExtension(extension) {
|
|
let obj = {...extension.metadata};
|
|
|
|
SERIALIZED_PROPERTIES.forEach(prop => {
|
|
obj[prop] = extension[prop];
|
|
});
|
|
|
|
let res = {};
|
|
for (let key in obj) {
|
|
let val = obj[key];
|
|
let type;
|
|
switch (typeof val) {
|
|
case 'string':
|
|
type = 's';
|
|
break;
|
|
case 'number':
|
|
type = 'd';
|
|
break;
|
|
case 'boolean':
|
|
type = 'b';
|
|
break;
|
|
default:
|
|
continue;
|
|
}
|
|
res[key] = GLib.Variant.new(type, val);
|
|
}
|
|
|
|
return res;
|
|
}
|
|
|
|
/**
|
|
* Deserialize an unpacked variant into an extension object
|
|
*
|
|
* @param {object} variant - an unpacked {GLib.Variant}
|
|
* @returns {object}
|
|
*/
|
|
export function deserializeExtension(variant) {
|
|
let res = {metadata: {}};
|
|
for (let prop in variant) {
|
|
let val = variant[prop].unpack();
|
|
if (SERIALIZED_PROPERTIES.includes(prop))
|
|
res[prop] = val;
|
|
else
|
|
res.metadata[prop] = val;
|
|
}
|
|
// add the 2 additional properties to create a valid extension object, as createExtensionObject()
|
|
res.uuid = res.metadata.uuid;
|
|
res.dir = Gio.File.new_for_path(res.path);
|
|
return res;
|
|
}
|