dot/.local/share/gnome-shell/extensions/workspaces-to-dock@passingt.../convenience.js

128 lines
4.3 KiB
JavaScript

/* ========================================================================================================
* convenience.js - convenience functions
* --------------------------------------------------------------------------------------------------------
* CREDITS: This code was copied from the dash-to-dock extension https://github.com/micheleg/dash-to-dock
* and modified to create a workspaces dock. Many thanks to michele_g for a great extension.
* ========================================================================================================
*/
/*
* Part of this file comes from gnome-shell-extensions:
* http://git.gnome.org/browse/gnome-shell-extensions/
*
*/
const Gettext = imports.gettext;
const Gio = imports.gi.Gio;
const Lang = imports.lang;
const Config = imports.misc.config;
const ExtensionUtils = imports.misc.extensionUtils;
/**
* initTranslations:
* @domain: (optional): the gettext domain to use
*
* Initialize Gettext to load translations from extensionsdir/locale.
* If @domain is not provided, it will be taken from metadata['gettext-domain']
*/
function initTranslations(domain) {
let extension = ExtensionUtils.getCurrentExtension();
domain = domain || extension.metadata['gettext-domain'];
// check if this extension was built with "make zip-file", and thus
// has the locale files in a subfolder
// otherwise assume that extension has been installed in the
// same prefix as gnome-shell
let localeDir = extension.dir.get_child('locale');
if (localeDir.query_exists(null)) {
Gettext.bindtextdomain(domain, localeDir.get_path());
} else {
Gettext.bindtextdomain(domain, Config.LOCALEDIR);
}
}
/**
* getSettings:
* @schema: (optional): the GSettings schema id
*
* Builds and return a GSettings schema for @schema, using schema files
* in extensionsdir/schemas. If @schema is not provided, it is taken from
* metadata['settings-schema'].
*/
function getSettings(schema) {
let extension = ExtensionUtils.getCurrentExtension();
schema = schema || extension.metadata['settings-schema'];
const GioSSS = Gio.SettingsSchemaSource;
// check if this extension was built with "make zip-file", and thus
// has the schema files in a subfolder
// otherwise assume that extension has been installed in the
// same prefix as gnome-shell (and therefore schemas are available
// in the standard folders)
let schemaDir = extension.dir.get_child('schemas');
let schemaSource;
if (schemaDir.query_exists(null)) {
schemaSource = GioSSS.new_from_directory(schemaDir.get_path(), GioSSS.get_default(), false);
} else {
schemaSource = GioSSS.get_default();
}
let schemaObj = schemaSource.lookup(schema, true);
if (!schemaObj)
throw new Error('Schema ' + schema + ' could not be found for extension ' + extension.metadata.uuid + '. Please check your installation.');
return new Gio.Settings({
settings_schema: schemaObj
});
}
// try to simplify global signals handling
var globalSignalHandler = class WorkspacesToDock_globalSignalHandler {
constructor() {
this._signals = new Object();
}
push(/*unlimited 3-long array arguments*/){
this._addSignals('generic', arguments);
}
disconnect() {
for (let label in this._signals) {
this.disconnectWithLabel(label);
}
}
pushWithLabel(label /* plus unlimited 3-long array arguments*/) {
// skip first element of the arguments array;
let elements = new Array;
for (let i = 1 ; i< arguments.length; i++) {
elements.push(arguments[i]);
}
this._addSignals(label, elements);
}
_addSignals(label, elements) {
if (this._signals[label] == undefined) {
this._signals[label] = new Array();
}
for (let i = 0; i < elements.length; i++) {
let object = elements[i][0];
let event = elements[i][1];
let id = object.connect(event, elements[i][2]);
this._signals[label].push([object, id]);
}
}
disconnectWithLabel(label) {
if (this._signals[label]) {
for (let i = 0; i < this._signals[label].length; i++) {
this._signals[label][i][0].disconnect(this._signals[label][i][1]);
}
delete this._signals[label];
}
}
};