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
This commit is contained in:
parent
f6749fb204
commit
34c6ff9645
@ -21,6 +21,7 @@ const MessageTray = imports.ui.messageTray;
|
|||||||
const Panel = imports.ui.panel;
|
const Panel = imports.ui.panel;
|
||||||
const Params = imports.misc.params;
|
const Params = imports.misc.params;
|
||||||
const PlaceDisplay = imports.ui.placeDisplay;
|
const PlaceDisplay = imports.ui.placeDisplay;
|
||||||
|
const RemoteSearch = imports.ui.remoteSearch;
|
||||||
const Tweener = imports.ui.tweener;
|
const Tweener = imports.ui.tweener;
|
||||||
const ViewSelector = imports.ui.viewSelector;
|
const ViewSelector = imports.ui.viewSelector;
|
||||||
const Wanda = imports.ui.wanda;
|
const Wanda = imports.ui.wanda;
|
||||||
@ -210,6 +211,9 @@ const Overview = new Lang.Class({
|
|||||||
this.addSearchProvider(new DocDisplay.DocSearchProvider());
|
this.addSearchProvider(new DocDisplay.DocSearchProvider());
|
||||||
this.addSearchProvider(new ContactDisplay.ContactSearchProvider());
|
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
|
// TODO - recalculate everything when desktop size changes
|
||||||
this._dash = new Dash.Dash();
|
this._dash = new Dash.Dash();
|
||||||
this._group.add_actor(this._dash.actor);
|
this._group.add_actor(this._dash.actor);
|
||||||
|
@ -1,11 +1,15 @@
|
|||||||
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
||||||
|
|
||||||
const Gio = imports.gi.Gio;
|
const Gio = imports.gi.Gio;
|
||||||
|
const GLib = imports.gi.GLib;
|
||||||
const Lang = imports.lang;
|
const Lang = imports.lang;
|
||||||
const St = imports.gi.St;
|
const St = imports.gi.St;
|
||||||
|
|
||||||
|
const FileUtils = imports.misc.fileUtils;
|
||||||
const Search = imports.ui.search;
|
const Search = imports.ui.search;
|
||||||
|
|
||||||
|
const KEY_FILE_GROUP = 'Shell Search Provider';
|
||||||
|
|
||||||
const SearchProviderIface = <interface name="org.gnome.Shell.SearchProvider">
|
const SearchProviderIface = <interface name="org.gnome.Shell.SearchProvider">
|
||||||
<method name="GetInitialResultSet">
|
<method name="GetInitialResultSet">
|
||||||
<arg type="as" direction="in" />
|
<arg type="as" direction="in" />
|
||||||
@ -28,6 +32,56 @@ const SearchProviderIface = <interface name="org.gnome.Shell.SearchProvider">
|
|||||||
var SearchProviderProxy = Gio.DBusProxy.makeProxyWrapper(SearchProviderIface);
|
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({
|
const RemoteSearchProvider = new Lang.Class({
|
||||||
Name: 'RemoteSearchProvider',
|
Name: 'RemoteSearchProvider',
|
||||||
Extends: Search.SearchProvider,
|
Extends: Search.SearchProvider,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user