From c5d79240fddcf01236018e3d0f7c68a1905f7296 Mon Sep 17 00:00:00 2001 From: Giovanni Campagna Date: Sat, 19 Nov 2011 16:30:15 +0100 Subject: [PATCH] Introduce a convenience module for initialization Common code for retrieving translations and GSettings schemas has been factored out into lib/convenience.js, which is part of every extension installation. Since that code relies on renames done at zip file creation time, extensions can no longer be installed with "make install". Instead, one should create the zip file and install it with the tweak-tool. There is also a bash script, local-install.sh, that will install everything in zip-files. Also, since the GSettingsSchemaSource code is not yet in a stable GLib release, extensions using GSettings have seen their stable shell version removed. --- Makefile.am | 2 ++ extension.mk | 2 +- extensions/alternate-tab/extension.js | 14 +++++++------- extensions/alternate-tab/metadata.json.in | 2 +- extensions/alternative-status-menu/extension.js | 3 ++- extensions/auto-move-windows/extension.js | 12 ++++++++---- extensions/auto-move-windows/metadata.json.in | 2 +- extensions/dock/extension.js | 9 ++++++--- extensions/dock/metadata.json.in | 2 +- extensions/drive-menu/extension.js | 3 ++- extensions/example/extension.js | 5 +++-- extensions/native-window-placement/extension.js | 11 +++++++---- .../native-window-placement/metadata.json.in | 2 +- extensions/places-menu/extension.js | 3 ++- extensions/user-theme/extension.js | 9 +++++---- extensions/user-theme/metadata.json.in | 2 +- extensions/xrandr-indicator/extension.js | 5 +++-- lib/convenience.js | 17 +++++++++++++++++ local-install.sh | 15 +++++++++++++++ 19 files changed, 85 insertions(+), 35 deletions(-) create mode 100644 lib/convenience.js create mode 100755 local-install.sh diff --git a/Makefile.am b/Makefile.am index 65176d8f..28c40c30 100644 --- a/Makefile.am +++ b/Makefile.am @@ -2,6 +2,8 @@ ACLOCAL_AMFLAGS = -I m4 ${ACLOCAL_FLAGS} SUBDIRS = extensions po +EXTRA_DIST = lib/convenience.js + DISTCHECK_CONFIGURE_FLAGS = --enable-extensions=all include include.mk diff --git a/extension.mk b/extension.mk index b16f64f0..fc90c235 100644 --- a/extension.mk +++ b/extension.mk @@ -1,7 +1,7 @@ include $(top_srcdir)/include.mk dist_extension_DATA = extension.js stylesheet.css -nodist_extension_DATA = metadata.json $(EXTRA_EXTENSION) +nodist_extension_DATA = metadata.json $(top_srcdir)/lib/convenience.js $(EXTRA_EXTENSION) EXTRA_DIST = metadata.json.in diff --git a/extensions/alternate-tab/extension.js b/extensions/alternate-tab/extension.js index 68b27e94..1334912d 100644 --- a/extensions/alternate-tab/extension.js +++ b/extensions/alternate-tab/extension.js @@ -23,6 +23,8 @@ const Gettext = imports.gettext.domain('gnome-shell-extensions'); const _ = Gettext.gettext; const N_ = function(e) { return e }; +let settings; + const POPUP_DELAY_TIMEOUT = 150; // milliseconds const SETTINGS_SCHEMA = 'org.gnome.shell.extensions.alternate-tab'; @@ -328,9 +330,8 @@ AltTabSettingsDialog.prototype = { }, setBehaviour: function(behaviour) { - this._settings = new Gio.Settings({ schema: SETTINGS_SCHEMA }); - this._settings.set_string(SETTINGS_BEHAVIOUR_KEY, behaviour); - this._settings.set_boolean(SETTINGS_FIRST_TIME_KEY, false); + settings.set_string(SETTINGS_BEHAVIOUR_KEY, behaviour); + settings.set_boolean(SETTINGS_FIRST_TIME_KEY, false); } }; @@ -595,13 +596,12 @@ WindowList.prototype = { }; function init(metadata) { - imports.gettext.bindtextdomain('gnome-shell-extensions', metadata.localedir); + let me = imports.ui.extensionSystem.extensions[metadata.uuid]; + me.convenience.initTranslations(metadata); + settings = me.convenience.getSettings(metadata, 'alternate-tab'); } function doAltTab(shellwm, binding, mask, window, backwards) { - let settings = new Gio.Settings({ schema: SETTINGS_SCHEMA }); - - if(settings.get_boolean(SETTINGS_FIRST_TIME_KEY)) { new AltTabSettingsDialog().open(); } else { diff --git a/extensions/alternate-tab/metadata.json.in b/extensions/alternate-tab/metadata.json.in index 8aa86e35..d811b547 100644 --- a/extensions/alternate-tab/metadata.json.in +++ b/extensions/alternate-tab/metadata.json.in @@ -3,7 +3,7 @@ "name": "AlternateTab", "description": "A replacement for Alt-Tab, allows to cycle between windows and does not group by application", "original-authors": [ "jw@bargsten.org", "thomas.bouffon@gmail.com" ], -"shell-version": [ "@shell_current@", "3.2" ], +"shell-version": [ "@shell_current@" ], "localedir": "@LOCALEDIR@", "url": "@url@" } diff --git a/extensions/alternative-status-menu/extension.js b/extensions/alternative-status-menu/extension.js index 6746a036..68523c23 100644 --- a/extensions/alternative-status-menu/extension.js +++ b/extensions/alternative-status-menu/extension.js @@ -99,7 +99,8 @@ function createSubMenu() { // Put your extension initialization code here function init(metadata) { - imports.gettext.bindtextdomain('gnome-shell-extensions', metadata.localedir); + let me = imports.ui.extensionSystem.extensions[metadata.uuid]; + me.convenience.initTranslations(metadata); } function reset(statusMenu) { diff --git a/extensions/auto-move-windows/extension.js b/extensions/auto-move-windows/extension.js index fe5d7f97..4058b5c2 100644 --- a/extensions/auto-move-windows/extension.js +++ b/extensions/auto-move-windows/extension.js @@ -14,13 +14,15 @@ const Main = imports.ui.main; const SETTINGS_SCHEMA = 'org.gnome.shell.extensions.auto-move-windows'; const SETTINGS_KEY = 'application-list'; +let settings; + function WindowMover() { this._init(); } WindowMover.prototype = { _init: function() { - this._settings = new Gio.Settings({ schema: SETTINGS_SCHEMA }); + this._settings = settings; this._windowTracker = Shell.WindowTracker.get_default(); let display = global.screen.get_display(); @@ -79,8 +81,10 @@ WindowMover.prototype = { let prevCheckWorkspaces; let winMover; -function init(extensionMeta) { - // do nothing here +function init(metadata) { + let me = imports.ui.extensionSystem.extensions[metadata.uuid]; + me.convenience.initTranslations(metadata); + settings = me.convenience.getSettings(metadata, 'auto-move-windows'); } function enable() { @@ -159,4 +163,4 @@ function enable() { function disable() { Main._checkWorkspaces = prevCheckWorkspaces; winMover.destroy(); -} \ No newline at end of file +} diff --git a/extensions/auto-move-windows/metadata.json.in b/extensions/auto-move-windows/metadata.json.in index c8aa6322..ed8c003a 100644 --- a/extensions/auto-move-windows/metadata.json.in +++ b/extensions/auto-move-windows/metadata.json.in @@ -2,7 +2,7 @@ "uuid": "@uuid@", "name": "Auto Move Windows", "description": "Move applications to specific workspaces when they create windows", - "shell-version": [ "@shell_current@", "3.2" ], + "shell-version": [ "@shell_current@" ], "localedir": "@LOCALEDIR@", "original-authors": [ "alessandro.crismani@gmail.com", "thomas.bouffon@gmail.com" ], "url": "@url@" diff --git a/extensions/dock/extension.js b/extensions/dock/extension.js index 838d7b27..387d7845 100644 --- a/extensions/dock/extension.js +++ b/extensions/dock/extension.js @@ -33,6 +33,7 @@ const DOCK_HIDE_KEY = 'autohide'; const DOCK_EFFECTHIDE_KEY = 'hide-effect'; const DOCK_AUTOHIDE_ANIMATION_TIME_KEY = 'hide-effect-duration'; +let _me, _metadata; //hide //const autohide_animation_time = 0.3; @@ -340,7 +341,7 @@ Dock.prototype = { this._favorites = []; // Load Settings - this._settings = new Gio.Settings({ schema: DOCK_SETTINGS_SCHEMA }); + this._settings = _me.convenience.getSettings(_metadata, 'dock'); position = this._settings.get_enum(DOCK_POSITION_KEY); dockicon_size = this._settings.get_int(DOCK_SIZE_KEY); hideDock = hideable = this._settings.get_boolean(DOCK_HIDE_KEY); @@ -934,8 +935,10 @@ DockIconMenu.prototype = { } } -function init(extensionMeta) { - imports.gettext.bindtextdomain('gnome-shell-extensions', extensionMeta.localedir); +function init(metadata) { + _metadata = metadata; + _me = imports.ui.extensionSystem.extensions[metadata.uuid]; + _me.convenience.initTranslations(metadata); } let dock; diff --git a/extensions/dock/metadata.json.in b/extensions/dock/metadata.json.in index 96237b49..dce4a882 100644 --- a/extensions/dock/metadata.json.in +++ b/extensions/dock/metadata.json.in @@ -3,7 +3,7 @@ "name": "Dock", "description": "A dock for the GNOME Shell -- displays favorite and running applications", "original-author": "tclaesson@gmail.com", -"shell-version": [ "@shell_current@", "3.2" ], +"shell-version": [ "@shell_current@" ], "localedir": "@LOCALEDIR@", "url": "@url@" } diff --git a/extensions/drive-menu/extension.js b/extensions/drive-menu/extension.js index c4551115..c37968ea 100644 --- a/extensions/drive-menu/extension.js +++ b/extensions/drive-menu/extension.js @@ -91,7 +91,8 @@ DriveMenu.prototype = { // Put your extension initialization code here function init(metadata) { - imports.gettext.bindtextdomain('gnome-shell-extensions', metadata.localedir); + let me = imports.ui.extensionSystem.extensions[metadata.uuid]; + me.convenience.initTranslations(metadata); } let _indicator; diff --git a/extensions/example/extension.js b/extensions/example/extension.js index ee591c9f..398f4eaf 100644 --- a/extensions/example/extension.js +++ b/extensions/example/extension.js @@ -19,7 +19,8 @@ function _showHello() { function init(metadata) { log ('Example extension initalized'); - imports.gettext.bindtextdomain('gnome-shell-extensions', metadata.localedir); + let me = imports.ui.extensionSystem.extensions[metadata.uuid]; + me.convenience.initTranslations(metadata); } let signalId; @@ -38,4 +39,4 @@ function disable() { Main.panel.actor.disconnect(signalId); signalId = 0; } -} \ No newline at end of file +} diff --git a/extensions/native-window-placement/extension.js b/extensions/native-window-placement/extension.js index 67bc34f1..0772ee4b 100644 --- a/extensions/native-window-placement/extension.js +++ b/extensions/native-window-placement/extension.js @@ -25,6 +25,8 @@ const WindowPlacementStrategy = { GRID: 1, }; +let _me, _metadata; + // testing settings for natural window placement strategy: const WINDOW_PLACEMENT_NATURAL_FILLGAPS = true; // enlarge windows at the end to fill gaps // not implemented yet const WINDOW_PLACEMENT_NATURAL_GRID_FALLBACK = true; // fallback to grid mode if all windows have the same size and positions. // not implemented yet @@ -117,7 +119,7 @@ function resetState() { function enable() { resetState(); - let settings = new Gio.Settings({ schema: 'org.gnome.shell.extensions.native-window-placement' }); + let settings = _me.convenience.getSettings(_metadata, 'native-window-placement'); let placementStrategy = settings.get_enum('strategy'); let signalId = settings.connect('changed::strategy', function() { placementStrategy = settings.get_enum('strategy'); @@ -527,6 +529,7 @@ function disable() { resetState(); } -function init() { - /* do nothing */ -} \ No newline at end of file +function init(metadata) { + _metadata = metadata; + _me = imports.ui.extensionSystem.extensions[metadata.uuid]; +} diff --git a/extensions/native-window-placement/metadata.json.in b/extensions/native-window-placement/metadata.json.in index d6c7424c..237ffb5d 100644 --- a/extensions/native-window-placement/metadata.json.in +++ b/extensions/native-window-placement/metadata.json.in @@ -2,7 +2,7 @@ "uuid": "@uuid@", "name": "Native Window Placement", "description": "Arrange windows in overview in a more native way", - "shell-version": [ "@shell_current@", "3.2" ], + "shell-version": [ "@shell_current@" ], "localedir": "@LOCALEDIR@", "url": "@url@", "original-authors": [ "wepmaschda@gmx.de" ] diff --git a/extensions/places-menu/extension.js b/extensions/places-menu/extension.js index 17bfe736..7e551a15 100644 --- a/extensions/places-menu/extension.js +++ b/extensions/places-menu/extension.js @@ -114,7 +114,8 @@ PlacesMenu.prototype = { function init(metadata) { - imports.gettext.bindtextdomain('gnome-shell-extensions', metadata.localedir); + let me = imports.ui.extensionSystem.extensions[metadata.uuid]; + me.convenience.initTranslations(metadata); } let _indicator; diff --git a/extensions/user-theme/extension.js b/extensions/user-theme/extension.js index 38f77da4..70eb17b6 100644 --- a/extensions/user-theme/extension.js +++ b/extensions/user-theme/extension.js @@ -10,15 +10,16 @@ const SETTINGS_SCHEMA = 'org.gnome.shell.extensions.user-theme'; const SETTINGS_KEY = 'name'; function ThemeManager() { - this._init(); + this._init.apply(this, arguments); } ThemeManager.prototype = { - _init: function() { + _init: function(metadata) { + let me = imports.ui.extensionSystem.extensions[metadata.uuid]; + this._settings = me.convenience.getSettings(metadata, 'user-theme'); }, enable: function() { - this._settings = new Gio.Settings({ schema: SETTINGS_SCHEMA }); this._changedId = this._settings.connect('changed::'+SETTINGS_KEY, Lang.bind(this, this._changeTheme)); this._changeTheme(); }, @@ -68,5 +69,5 @@ ThemeManager.prototype = { function init(metadata) { - return new ThemeManager(); + return new ThemeManager(metadata); } diff --git a/extensions/user-theme/metadata.json.in b/extensions/user-theme/metadata.json.in index 8fbe3413..e71533e2 100644 --- a/extensions/user-theme/metadata.json.in +++ b/extensions/user-theme/metadata.json.in @@ -2,7 +2,7 @@ "uuid": "@uuid@", "name": "User Themes", "description": "Load shell themes from user directory", - "shell-version": [ "@shell_current@", "3.2" ], + "shell-version": [ "@shell_current@" ], "localedir": "@LOCALEDIR@", "original-authors": [ "john.stowers@gmail.com" ], "url": "@url@" diff --git a/extensions/xrandr-indicator/extension.js b/extensions/xrandr-indicator/extension.js index 979e549d..344f7bf8 100644 --- a/extensions/xrandr-indicator/extension.js +++ b/extensions/xrandr-indicator/extension.js @@ -137,7 +137,8 @@ Indicator.prototype = { function init(metadata) { - imports.gettext.bindtextdomain('gnome-shell-extensions', metadata.localedir); + let me = imports.ui.extensionSystem.extensions[metadata.uuid]; + me.convenience.initTranslations(metadata); } let _indicator; @@ -149,4 +150,4 @@ function enable() { function disable() { _indicator.destroy(); -} \ No newline at end of file +} diff --git a/lib/convenience.js b/lib/convenience.js new file mode 100644 index 00000000..49de6206 --- /dev/null +++ b/lib/convenience.js @@ -0,0 +1,17 @@ +const Gettext = imports.gettext; +const Gio = imports.gi.Gio; + +function initTranslations(metadata) { + let localeDir = metadata.dir.get_child('locale').get_path(); + Gettext.bindtextdomain('gnome-shell-extensions', localeDir); +} + +function getSettings(metadata, extension_id) { + let schemaDir = metadata.dir.get_child('schemas').get_path(); + let schemaSource = Gio.SettingsSchemaSource.new_from_directory(schemaDir, + Gio.SettingsSchemaSource.get_default(), + false); + let schema = schemaSource.lookup('org.gnome.shell.extensions.' + extension_id, false); + return new Gio.Settings({ settings_schema: schema }); +} + diff --git a/local-install.sh b/local-install.sh new file mode 100755 index 00000000..2a3ef0df --- /dev/null +++ b/local-install.sh @@ -0,0 +1,15 @@ +#!/bin/bash + +extensionbase=~/.local/share/gnome-shell/extensions + +for i in zip-files/*; do + zip_file=`pwd`/$i; + uuid=`basename $i | sed -e "s/.shell-extension.zip//"`; + if [ -d $extensionbase/$uuid ]; then + rm -fR $extensionbase/$uuid; + fi + mkdir $extensionbase/$uuid; + (cd $extensionbase/$uuid; + unzip -q $zip_file; + ); +done