[gnome-shell] overview: Load RemoteSearchProviders
- From: Florian MÃllner <fmuellner src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-shell] overview: Load RemoteSearchProviders
- Date: Tue, 21 Feb 2012 22:02:09 +0000 (UTC)
commit 34c6ff96454dbe3d8d2b959834a68fb050b8fe2f
Author: Florian MÃllner <fmuellner gnome org>
Date: Thu Dec 15 14:46:12 2011 +0100
overview: Load RemoteSearchProviders
Allow applications to register search providers by dropping a keyfile
into a well-known directory. For now, initialize all found providers;
long term, we probably want to give users the ability to restrict the
set of active search providers.
https://bugzilla.gnome.org/show_bug.cgi?id=663125
js/ui/overview.js | 4 +++
js/ui/remoteSearch.js | 54 +++++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 58 insertions(+), 0 deletions(-)
---
diff --git a/js/ui/overview.js b/js/ui/overview.js
index 566d3f1..9db4c3d 100644
--- a/js/ui/overview.js
+++ b/js/ui/overview.js
@@ -21,6 +21,7 @@ const MessageTray = imports.ui.messageTray;
const Panel = imports.ui.panel;
const Params = imports.misc.params;
const PlaceDisplay = imports.ui.placeDisplay;
+const RemoteSearch = imports.ui.remoteSearch;
const Tweener = imports.ui.tweener;
const ViewSelector = imports.ui.viewSelector;
const Wanda = imports.ui.wanda;
@@ -210,6 +211,9 @@ const Overview = new Lang.Class({
this.addSearchProvider(new DocDisplay.DocSearchProvider());
this.addSearchProvider(new ContactDisplay.ContactSearchProvider());
+ // Load remote search providers provided by applications
+ RemoteSearch.loadRemoteSearchProviders(Lang.bind(this, this.addSearchProvider));
+
// TODO - recalculate everything when desktop size changes
this._dash = new Dash.Dash();
this._group.add_actor(this._dash.actor);
diff --git a/js/ui/remoteSearch.js b/js/ui/remoteSearch.js
index 18e5749..c0aa985 100644
--- a/js/ui/remoteSearch.js
+++ b/js/ui/remoteSearch.js
@@ -1,11 +1,15 @@
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
const Gio = imports.gi.Gio;
+const GLib = imports.gi.GLib;
const Lang = imports.lang;
const St = imports.gi.St;
+const FileUtils = imports.misc.fileUtils;
const Search = imports.ui.search;
+const KEY_FILE_GROUP = 'Shell Search Provider';
+
const SearchProviderIface = <interface name="org.gnome.Shell.SearchProvider">
<method name="GetInitialResultSet">
<arg type="as" direction="in" />
@@ -28,6 +32,56 @@ const SearchProviderIface = <interface name="org.gnome.Shell.SearchProvider">
var SearchProviderProxy = Gio.DBusProxy.makeProxyWrapper(SearchProviderIface);
+function loadRemoteSearchProviders(addProviderCallback) {
+ let dataDirs = GLib.get_system_data_dirs();
+ for (let i = 0; i < dataDirs.length; i++) {
+ let path = GLib.build_filenamev([dataDirs[i], 'gnome-shell', 'search-providers']);
+ let dir = Gio.file_new_for_path(path);
+ if (!dir.query_exists(null))
+ continue;
+ loadRemoteSearchProvidersFromDir(dir, addProviderCallback);
+ }
+};
+
+function loadRemoteSearchProvidersFromDir(dir, addProviderCallback) {
+ let dirPath = dir.get_path();
+ FileUtils.listDirAsync(dir, Lang.bind(this, function(files) {
+ for (let i = 0; i < files.length; i++) {
+ let keyfile = new GLib.KeyFile();
+ let path = GLib.build_filenamev([dirPath, files[i].get_name()]);
+
+ try {
+ keyfile.load_from_file(path, 0);
+ } catch(e) {
+ continue;
+ }
+
+ if (!keyfile.has_group(KEY_FILE_GROUP))
+ continue;
+
+ let remoteProvider;
+ try {
+ let group = KEY_FILE_GROUP;
+ let title = keyfile.get_locale_string(group, 'Title', null);
+ let icon = keyfile.get_string(group, 'Icon');
+ let busName = keyfile.get_string(group, 'BusName');
+ let objectPath = keyfile.get_string(group, 'ObjectPath');
+
+ remoteProvider = new RemoteSearchProvider(title,
+ icon,
+ busName,
+ objectPath);
+ } catch(e) {
+ log('Failed to add search provider "%s": %s'.format(title, e.toString()));
+ continue;
+ }
+
+ addProviderCallback(remoteProvider);
+ }
+ }));
+
+};
+
const RemoteSearchProvider = new Lang.Class({
Name: 'RemoteSearchProvider',
Extends: Search.SearchProvider,
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]