From cda8e6d6771ff71d7157bb07d04194f5f2efdef7 Mon Sep 17 00:00:00 2001 From: Gergely Polonkai Date: Tue, 29 Sep 2015 15:01:08 +0200 Subject: [PATCH] Introducing settings --- .gitignore | 1 + convenience.js | 93 +++++++++++++++++++ extension.js | 5 +- metadata.json | 3 +- ...gnome.shell.extensions.planets.gschema.xml | 10 ++ 5 files changed, 110 insertions(+), 2 deletions(-) create mode 100644 .gitignore create mode 100644 convenience.js create mode 100644 schemas/org.gnome.shell.extensions.planets.gschema.xml diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..2b1b3a3 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +schemas/gschemas.compiled diff --git a/convenience.js b/convenience.js new file mode 100644 index 0000000..82843b6 --- /dev/null +++ b/convenience.js @@ -0,0 +1,93 @@ +/* -*- mode: js; js-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* + Copyright (c) 2011-2012, Giovanni Campagna + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the GNOME nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +const Gettext = imports.gettext; +const Gio = imports.gi.Gio; + +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 }); +} + diff --git a/extension.js b/extension.js index 43bb972..a5ab431 100644 --- a/extension.js +++ b/extension.js @@ -17,6 +17,8 @@ PlanetsExtension.prototype = { this.extensionMeta = extensionMeta; + this._settings = Convenience.getSettings(); + this.panelContainer = new St.BoxLayout({style_class: "panel-box"}); this.actor.add_actor(this.panelContainer); this.actor.add_style_class_name('panel-status-button'); @@ -29,7 +31,8 @@ PlanetsExtension.prototype = { this.last_update = 0; - MainLoop.timeout_add(1, Lang.bind(this, function() { + MainLoop.timeout_add(this._settings.get_int("refresh-interval"), + Lang.bind(this, function() { this.last_update++; this.panelLabel.set_text("Update count: " + this.last_update); diff --git a/metadata.json b/metadata.json index ff9402a..3347d17 100644 --- a/metadata.json +++ b/metadata.json @@ -4,5 +4,6 @@ ], "uuid": "planets@gergely.polonkai.eu", "name": "Planets", - "description": "Display planets position" + "description": "Display planets position", + "settings-schema": "planets" } diff --git a/schemas/org.gnome.shell.extensions.planets.gschema.xml b/schemas/org.gnome.shell.extensions.planets.gschema.xml new file mode 100644 index 0000000..6220b78 --- /dev/null +++ b/schemas/org.gnome.shell.extensions.planets.gschema.xml @@ -0,0 +1,10 @@ + + + + + 30 + Refresh interval of planet data + Interval in seconds. Sets how often the planet positions are recalculated. Setting this too low (e.g. below 30) may raise performance issues. + + +