[gnome-shell] overview: Load RemoteSearchProviders



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]