[gnome-shell-extensions] Introduce a convenience module for initialization



commit c5d79240fddcf01236018e3d0f7c68a1905f7296
Author: Giovanni Campagna <gcampagna src gnome org>
Date:   Sat Nov 19 16:30:15 2011 +0100

    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(-)
---
diff --git a/Makefile.am b/Makefile.am
index 65176d8..28c40c3 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 b16f64f..fc90c23 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 68b27e9..1334912 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 8aa86e3..d811b54 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 6746a03..68523c2 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 fe5d7f9..4058b5c 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 c8aa632..ed8c003 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 838d7b2..387d784 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 96237b4..dce4a88 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 c455111..c37968e 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 ee591c9..398f4ea 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 67bc34f..0772ee4 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 d6c7424..237ffb5 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 17bfe73..7e551a1 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 38f77da..70eb17b 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 8fbe341..e71533e 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 979e549..344f7bf 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 0000000..49de620
--- /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 0000000..2a3ef0d
--- /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



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]