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