search: Junk the OpenSearch system
The original design for the overview had buttons for searching for Wikipedia and Google, but in practice this is a bad idea. The buttons are the default activations, meaning that using the overview as a fluent motion of launching something - "firefxo<Enter>", will launch Google/Wikipedia. https://bugzilla.gnome.org/show_bug.cgi?id=670168
This commit is contained in:
parent
7e2bab48c9
commit
ef4231b9c0
@ -10,11 +10,6 @@ desktop_DATA = gnome-shell.desktop gnome-shell-extension-prefs.desktop
|
|||||||
|
|
||||||
@INTLTOOL_DESKTOP_RULE@
|
@INTLTOOL_DESKTOP_RULE@
|
||||||
|
|
||||||
searchprovidersdir = $(pkgdatadir)/open-search-providers
|
|
||||||
dist_searchproviders_DATA = \
|
|
||||||
open-search-providers/google.xml \
|
|
||||||
open-search-providers/wikipedia.xml
|
|
||||||
|
|
||||||
introspectiondir = $(datadir)/dbus-1/interfaces
|
introspectiondir = $(datadir)/dbus-1/interfaces
|
||||||
introspection_DATA = org.gnome.ShellSearchProvider.xml
|
introspection_DATA = org.gnome.ShellSearchProvider.xml
|
||||||
|
|
||||||
|
@ -1,7 +0,0 @@
|
|||||||
<OpenSearchDescription xmlns="http://a9.com/-/spec/opensearch/1.1/">
|
|
||||||
<ShortName>Google</ShortName>
|
|
||||||
<Description>Google Search</Description>
|
|
||||||
<InputEncoding>UTF-8</InputEncoding>
|
|
||||||
<Image width="16" height="16">data:image/x-icon;base64,AAABAAEAEBAAAAEAGABoAwAAFgAAACgAAAAQAAAAIAAAAAEAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADs9Pt8xetPtu9FsfFNtu%2BTzvb2%2B%2Fne4dFJeBw0egA%2FfAJAfAA8ewBBegAAAAD%2B%2FPtft98Mp%2BwWsfAVsvEbs%2FQeqvF8xO7%2F%2F%2F63yqkxdgM7gwE%2FggM%2BfQA%2BegBDeQDe7PIbotgQufcMufEPtfIPsvAbs%2FQvq%2Bfz%2Bf%2F%2B%2B%2FZKhR05hgBBhQI8hgBAgAI9ewD0%2B%2Fg3pswAtO8Cxf4Kw%2FsJvvYAqupKsNv%2B%2Fv7%2F%2FP5VkSU0iQA7jQA9hgBDgQU%2BfQH%2F%2Ff%2FQ6fM4sM4KsN8AteMCruIqqdbZ7PH8%2Fv%2Fg6Nc%2Fhg05kAA8jAM9iQI%2BhQA%2BgQDQu6b97uv%2F%2F%2F7V8Pqw3eiWz97q8%2Ff%2F%2F%2F%2F7%2FPptpkkqjQE4kwA7kAA5iwI8iAA8hQCOSSKdXjiyflbAkG7u2s%2F%2B%2F%2F39%2F%2F7r8utrqEYtjQE8lgA7kwA7kwA9jwA9igA9hACiWSekVRyeSgiYSBHx6N%2F%2B%2Fv7k7OFRmiYtlAA5lwI7lwI4lAA7kgI9jwE9iwI4iQCoVhWcTxCmb0K%2BooT8%2Fv%2F7%2F%2F%2FJ2r8fdwI1mwA3mQA3mgA8lAE8lAE4jwA9iwE%2BhwGfXifWvqz%2B%2Ff%2F58u%2Fev6Dt4tr%2B%2F%2F2ZuIUsggA7mgM6mAM3lgA5lgA6kQE%2FkwBChwHt4dv%2F%2F%2F728ei1bCi7VAC5XQ7kz7n%2F%2F%2F6bsZkgcB03lQA9lgM7kwA2iQktZToPK4r9%2F%2F%2F9%2F%2F%2FSqYK5UwDKZAS9WALIkFn%2B%2F%2F3%2F%2BP8oKccGGcIRJrERILYFEMwAAuEAAdX%2F%2Ff7%2F%2FP%2B%2BfDvGXQLIZgLEWgLOjlf7%2F%2F%2F%2F%2F%2F9QU90EAPQAAf8DAP0AAfMAAOUDAtr%2F%2F%2F%2F7%2B%2Fu2bCTIYwDPZgDBWQDSr4P%2F%2Fv%2F%2F%2FP5GRuABAPkAA%2FwBAfkDAPAAAesAAN%2F%2F%2B%2Fz%2F%2F%2F64g1C5VwDMYwK8Yg7y5tz8%2Fv%2FV1PYKDOcAAP0DAf4AAf0AAfYEAOwAAuAAAAD%2F%2FPvi28ymXyChTATRrIb8%2F%2F3v8fk6P8MAAdUCAvoAAP0CAP0AAfYAAO4AAACAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAQAA</Image>
|
|
||||||
<Url type="text/html" method="GET" template="http://www.google.com/search?q={searchTerms}"/>
|
|
||||||
</OpenSearchDescription>
|
|
@ -1,44 +0,0 @@
|
|||||||
<OpenSearchDescription xmlns="http://a9.com/-/spec/opensearch/1.1/">
|
|
||||||
<ShortName>Wikipedia</ShortName>
|
|
||||||
<Description>Wikipedia, the free encyclopedia</Description>
|
|
||||||
<InputEncoding>UTF-8</InputEncoding>
|
|
||||||
<Image width="16" height="16">data:image/x-icon;base64,AAABAAEAEBAQAAEABAAoAQAAFgAAACgAAAAQAAAAIAAAAAEABAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAEAgQAhIOEAMjHyABIR0gA6ejpAGlqaQCpqKkAKCgoAPz9%2FAAZGBkAmJiYANjZ2ABXWFcAent6ALm6uQA8OjwAiIiIiIiIiIiIiI4oiL6IiIiIgzuIV4iIiIhndo53KIiIiB%2FWvXoYiIiIfEZfWBSIiIEGi%2FfoqoiIgzuL84i9iIjpGIoMiEHoiMkos3FojmiLlUipYliEWIF%2BiDe0GoRa7D6GPbjcu1yIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA</Image>
|
|
||||||
<Url type="text/html" method="GET" template="http://{language}.wikipedia.org/wiki/Special:Search?search={searchTerms}"/>
|
|
||||||
<!-- The criterion for being below is being listed with more than 100,000
|
|
||||||
articles on http://meta.wikimedia.org/wiki/List_of_Wikipedias -->
|
|
||||||
<Language>ar</Language>
|
|
||||||
<Language>bg</Language>
|
|
||||||
<Language>ca</Language>
|
|
||||||
<Language>cs</Language>
|
|
||||||
<Language>da</Language>
|
|
||||||
<Language>de</Language>
|
|
||||||
<Language>en</Language>
|
|
||||||
<Language>eo</Language>
|
|
||||||
<Language>es</Language>
|
|
||||||
<Language>fa</Language>
|
|
||||||
<Language>fi</Language>
|
|
||||||
<Language>fr</Language>
|
|
||||||
<Language>he</Language>
|
|
||||||
<Language>hu</Language>
|
|
||||||
<Language>id</Language>
|
|
||||||
<Language>it</Language>
|
|
||||||
<Language>ja</Language>
|
|
||||||
<Language>ko</Language>
|
|
||||||
<Language>lt</Language>
|
|
||||||
<Language>nl</Language>
|
|
||||||
<Language>no</Language>
|
|
||||||
<Language>pl</Language>
|
|
||||||
<Language>pt</Language>
|
|
||||||
<Language>ro</Language>
|
|
||||||
<Language>ru</Language>
|
|
||||||
<Language>sk</Language>
|
|
||||||
<Language>sl</Language>
|
|
||||||
<Language>sr</Language>
|
|
||||||
<Language>sv</Language>
|
|
||||||
<Language>tr</Language>
|
|
||||||
<Language>uk</Language>
|
|
||||||
<Language>vi</Language>
|
|
||||||
<Language>vo</Language>
|
|
||||||
<Language>war</Language>
|
|
||||||
<Language>zh</Language>
|
|
||||||
</OpenSearchDescription>
|
|
@ -10,8 +10,6 @@ const Util = imports.misc.util;
|
|||||||
const FileUtils = imports.misc.fileUtils;
|
const FileUtils = imports.misc.fileUtils;
|
||||||
const Main = imports.ui.main;
|
const Main = imports.ui.main;
|
||||||
|
|
||||||
const DISABLED_OPEN_SEARCH_PROVIDERS_KEY = 'disabled-open-search-providers';
|
|
||||||
|
|
||||||
// Not currently referenced by the search API, but
|
// Not currently referenced by the search API, but
|
||||||
// this enumeration can be useful for provider
|
// this enumeration can be useful for provider
|
||||||
// implementations.
|
// implementations.
|
||||||
@ -169,99 +167,6 @@ const SearchProvider = new Lang.Class({
|
|||||||
});
|
});
|
||||||
Signals.addSignalMethods(SearchProvider.prototype);
|
Signals.addSignalMethods(SearchProvider.prototype);
|
||||||
|
|
||||||
const OpenSearchSystem = new Lang.Class({
|
|
||||||
Name: 'OpenSearchSystem',
|
|
||||||
|
|
||||||
_init: function() {
|
|
||||||
this._providers = [];
|
|
||||||
global.settings.connect('changed::' + DISABLED_OPEN_SEARCH_PROVIDERS_KEY, Lang.bind(this, this._refresh));
|
|
||||||
this._refresh();
|
|
||||||
},
|
|
||||||
|
|
||||||
getProviders: function() {
|
|
||||||
let res = [];
|
|
||||||
for (let i = 0; i < this._providers.length; i++)
|
|
||||||
res.push({ id: i, name: this._providers[i].name });
|
|
||||||
|
|
||||||
return res;
|
|
||||||
},
|
|
||||||
|
|
||||||
setSearchTerms: function(terms) {
|
|
||||||
this._terms = terms;
|
|
||||||
},
|
|
||||||
|
|
||||||
_checkSupportedProviderLanguage: function(provider) {
|
|
||||||
if (provider.url.search(/{language}/) == -1)
|
|
||||||
return true;
|
|
||||||
|
|
||||||
let langs = GLib.get_language_names();
|
|
||||||
|
|
||||||
langs.push('en');
|
|
||||||
let lang = null;
|
|
||||||
for (let i = 0; i < langs.length; i++) {
|
|
||||||
for (let k = 0; k < provider.langs.length; k++) {
|
|
||||||
if (langs[i] == provider.langs[k])
|
|
||||||
lang = langs[i];
|
|
||||||
}
|
|
||||||
if (lang)
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
provider.lang = lang;
|
|
||||||
return lang != null;
|
|
||||||
},
|
|
||||||
|
|
||||||
activateResult: function(id, params) {
|
|
||||||
let searchTerms = this._terms.join(' ');
|
|
||||||
|
|
||||||
let url = this._providers[id].url.replace('{searchTerms}', encodeURIComponent(searchTerms));
|
|
||||||
if (url.match('{language}'))
|
|
||||||
url = url.replace('{language}', this._providers[id].lang);
|
|
||||||
|
|
||||||
try {
|
|
||||||
Gio.app_info_launch_default_for_uri(url, global.create_app_launch_context());
|
|
||||||
} catch (e) {
|
|
||||||
// TODO: remove this after glib will be removed from moduleset
|
|
||||||
// In the default jhbuild, gio is in our prefix but gvfs is not
|
|
||||||
Util.spawn(['gvfs-open', url])
|
|
||||||
}
|
|
||||||
|
|
||||||
Main.overview.hide();
|
|
||||||
},
|
|
||||||
|
|
||||||
_addProvider: function(fileName) {
|
|
||||||
let path = global.datadir + '/open-search-providers/' + fileName;
|
|
||||||
let source = Shell.get_file_contents_utf8_sync(path);
|
|
||||||
let [success, name, url, langs, icon_uri] = Shell.parse_search_provider(source);
|
|
||||||
let provider ={ name: name,
|
|
||||||
url: url,
|
|
||||||
id: this._providers.length,
|
|
||||||
icon_uri: icon_uri,
|
|
||||||
langs: langs };
|
|
||||||
if (this._checkSupportedProviderLanguage(provider)) {
|
|
||||||
this._providers.push(provider);
|
|
||||||
this.emit('changed');
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
_refresh: function() {
|
|
||||||
this._providers = [];
|
|
||||||
let names = global.settings.get_strv(DISABLED_OPEN_SEARCH_PROVIDERS_KEY);
|
|
||||||
let file = Gio.file_new_for_path(global.datadir + '/open-search-providers');
|
|
||||||
FileUtils.listDirAsync(file, Lang.bind(this, function(files) {
|
|
||||||
for (let i = 0; i < files.length; i++) {
|
|
||||||
let enabled = true;
|
|
||||||
let name = files[i].get_name();
|
|
||||||
for (let k = 0; k < names.length; k++)
|
|
||||||
if (names[k] == name)
|
|
||||||
enabled = false;
|
|
||||||
if (enabled)
|
|
||||||
this._addProvider(name);
|
|
||||||
}
|
|
||||||
}));
|
|
||||||
}
|
|
||||||
});
|
|
||||||
Signals.addSignalMethods(OpenSearchSystem.prototype);
|
|
||||||
|
|
||||||
const SearchSystem = new Lang.Class({
|
const SearchSystem = new Lang.Class({
|
||||||
Name: 'SearchSystem',
|
Name: 'SearchSystem',
|
||||||
|
|
||||||
|
@ -173,10 +173,9 @@ const GridSearchResults = new Lang.Class({
|
|||||||
const SearchResults = new Lang.Class({
|
const SearchResults = new Lang.Class({
|
||||||
Name: 'SearchResults',
|
Name: 'SearchResults',
|
||||||
|
|
||||||
_init: function(searchSystem, openSearchSystem) {
|
_init: function(searchSystem) {
|
||||||
this._searchSystem = searchSystem;
|
this._searchSystem = searchSystem;
|
||||||
this._searchSystem.connect('search-updated', Lang.bind(this, this._updateResults));
|
this._searchSystem.connect('search-updated', Lang.bind(this, this._updateResults));
|
||||||
this._openSearchSystem = openSearchSystem;
|
|
||||||
|
|
||||||
this.actor = new St.BoxLayout({ name: 'searchResults',
|
this.actor = new St.BoxLayout({ name: 'searchResults',
|
||||||
vertical: true });
|
vertical: true });
|
||||||
@ -215,55 +214,10 @@ const SearchResults = new Lang.Class({
|
|||||||
this._searchProvidersBox = new St.BoxLayout({ style_class: 'search-providers-box' });
|
this._searchProvidersBox = new St.BoxLayout({ style_class: 'search-providers-box' });
|
||||||
this.actor.add(this._searchProvidersBox);
|
this.actor.add(this._searchProvidersBox);
|
||||||
|
|
||||||
this._openSearchProviders = [];
|
|
||||||
this._openSearchSystem.connect('changed', Lang.bind(this, this._updateOpenSearchProviderButtons));
|
|
||||||
this._updateOpenSearchProviderButtons();
|
|
||||||
|
|
||||||
this._highlightDefault = false;
|
this._highlightDefault = false;
|
||||||
this._defaultResult = null;
|
this._defaultResult = null;
|
||||||
},
|
},
|
||||||
|
|
||||||
_updateOpenSearchProviderButtons: function() {
|
|
||||||
for (let i = 0; i < this._openSearchProviders.length; i++)
|
|
||||||
this._openSearchProviders[i].actor.destroy();
|
|
||||||
this._openSearchProviders = this._openSearchSystem.getProviders();
|
|
||||||
for (let i = 0; i < this._openSearchProviders.length; i++)
|
|
||||||
this._createOpenSearchProviderButton(this._openSearchProviders[i]);
|
|
||||||
},
|
|
||||||
|
|
||||||
_createOpenSearchProviderButton: function(provider) {
|
|
||||||
let button = new St.Button({ style_class: 'dash-search-button',
|
|
||||||
reactive: true,
|
|
||||||
can_focus: true,
|
|
||||||
x_fill: true,
|
|
||||||
y_align: St.Align.MIDDLE });
|
|
||||||
let bin = new St.Bin({ x_fill: false,
|
|
||||||
x_align:St.Align.MIDDLE });
|
|
||||||
button.connect('clicked', Lang.bind(this, function() {
|
|
||||||
this._openSearchSystem.activateResult(provider.id);
|
|
||||||
}));
|
|
||||||
let title = new St.Label({ text: provider.name,
|
|
||||||
style_class: 'dash-search-button-label' });
|
|
||||||
|
|
||||||
button.label_actor = title;
|
|
||||||
bin.set_child(title);
|
|
||||||
button.set_child(bin);
|
|
||||||
provider.actor = button;
|
|
||||||
|
|
||||||
button.setSelected = function(selected) {
|
|
||||||
if (selected)
|
|
||||||
button.add_style_pseudo_class('selected');
|
|
||||||
else
|
|
||||||
button.remove_style_pseudo_class('selected');
|
|
||||||
};
|
|
||||||
button.activate = Lang.bind(this, function() {
|
|
||||||
this._openSearchSystem.activateResult(provider.id);
|
|
||||||
});
|
|
||||||
button.actor = button;
|
|
||||||
|
|
||||||
this._searchProvidersBox.add(button);
|
|
||||||
},
|
|
||||||
|
|
||||||
createProviderMeta: function(provider) {
|
createProviderMeta: function(provider) {
|
||||||
let providerBox = new St.BoxLayout({ style_class: 'search-section',
|
let providerBox = new St.BoxLayout({ style_class: 'search-section',
|
||||||
vertical: true });
|
vertical: true });
|
||||||
@ -323,8 +277,6 @@ const SearchResults = new Lang.Class({
|
|||||||
|
|
||||||
doSearch: function (searchString) {
|
doSearch: function (searchString) {
|
||||||
this._searchSystem.updateSearch(searchString);
|
this._searchSystem.updateSearch(searchString);
|
||||||
let terms = this._searchSystem.getTerms();
|
|
||||||
this._openSearchSystem.setSearchTerms(terms);
|
|
||||||
},
|
},
|
||||||
|
|
||||||
_metaForProvider: function(provider) {
|
_metaForProvider: function(provider) {
|
||||||
|
@ -103,7 +103,6 @@ const SearchTab = new Lang.Class({
|
|||||||
this._searchTimeoutId = 0;
|
this._searchTimeoutId = 0;
|
||||||
|
|
||||||
this._searchSystem = new Search.SearchSystem();
|
this._searchSystem = new Search.SearchSystem();
|
||||||
this._openSearchSystem = new Search.OpenSearchSystem();
|
|
||||||
|
|
||||||
this._entry = new St.Entry({ name: 'searchEntry',
|
this._entry = new St.Entry({ name: 'searchEntry',
|
||||||
/* Translators: this is the text displayed
|
/* Translators: this is the text displayed
|
||||||
@ -127,7 +126,7 @@ const SearchTab = new Lang.Class({
|
|||||||
|
|
||||||
this._iconClickedId = 0;
|
this._iconClickedId = 0;
|
||||||
|
|
||||||
this._searchResults = new SearchDisplay.SearchResults(this._searchSystem, this._openSearchSystem);
|
this._searchResults = new SearchDisplay.SearchResults(this._searchSystem);
|
||||||
this.parent(this._entry, this._searchResults.actor, _("Search"), 'edit-find');
|
this.parent(this._entry, this._searchResults.actor, _("Search"), 'edit-find');
|
||||||
|
|
||||||
this._text.connect('text-changed', Lang.bind(this, this._onTextChanged));
|
this._text.connect('text-changed', Lang.bind(this, this._onTextChanged));
|
||||||
|
132
src/shell-util.c
132
src/shell-util.c
@ -14,10 +14,6 @@
|
|||||||
#include <langinfo.h>
|
#include <langinfo.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include <libxml/parser.h>
|
|
||||||
#include <libxml/tree.h>
|
|
||||||
#include <libxml/xmlmemory.h>
|
|
||||||
|
|
||||||
#ifdef WITH_SYSTEMD
|
#ifdef WITH_SYSTEMD
|
||||||
#include <systemd/sd-daemon.h>
|
#include <systemd/sd-daemon.h>
|
||||||
#include <systemd/sd-login.h>
|
#include <systemd/sd-login.h>
|
||||||
@ -646,134 +642,6 @@ shell_get_file_contents_utf8_sync (const char *path,
|
|||||||
return contents;
|
return contents;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* shell_parse_search_provider:
|
|
||||||
* @data: description of provider
|
|
||||||
* @name: (out): location to store a display name
|
|
||||||
* @url: (out): location to store template of url
|
|
||||||
* @langs: (out) (transfer full) (element-type utf8): list of supported languages
|
|
||||||
* @icon_data_uri: (out): location to store uri
|
|
||||||
* @error: location to store GError
|
|
||||||
*
|
|
||||||
* Returns: %TRUE on success
|
|
||||||
*/
|
|
||||||
gboolean
|
|
||||||
shell_parse_search_provider (const char *data,
|
|
||||||
char **name,
|
|
||||||
char **url,
|
|
||||||
GList **langs,
|
|
||||||
char **icon_data_uri,
|
|
||||||
GError **error)
|
|
||||||
{
|
|
||||||
xmlDocPtr doc = xmlParseMemory (data, strlen (data));
|
|
||||||
xmlNode *root;
|
|
||||||
|
|
||||||
*name = NULL;
|
|
||||||
*url = NULL;
|
|
||||||
*icon_data_uri = NULL;
|
|
||||||
*langs = NULL;
|
|
||||||
|
|
||||||
if (!doc)
|
|
||||||
{
|
|
||||||
g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED, "Malformed xml");
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
root = xmlDocGetRootElement (doc);
|
|
||||||
if (root && root->name && xmlStrcmp (root->name, (const xmlChar *)"OpenSearchDescription") == 0)
|
|
||||||
{
|
|
||||||
xmlNode *child;
|
|
||||||
for (child = root->children; child; child = child->next)
|
|
||||||
{
|
|
||||||
if (!child->name)
|
|
||||||
continue;
|
|
||||||
if (xmlStrcmp (child->name, (const xmlChar *)"Language") == 0)
|
|
||||||
{
|
|
||||||
xmlChar *val = xmlNodeListGetString(doc, child->xmlChildrenNode, 1);
|
|
||||||
if (!val)
|
|
||||||
continue;
|
|
||||||
*langs = g_list_append (*langs, g_strdup ((char *)val));
|
|
||||||
xmlFree (val);
|
|
||||||
}
|
|
||||||
if (!*name && xmlStrcmp (child->name, (const xmlChar *)"ShortName") == 0)
|
|
||||||
{
|
|
||||||
xmlChar *val = xmlNodeListGetString(doc, child->xmlChildrenNode, 1);
|
|
||||||
*name = g_strdup ((char *)val);
|
|
||||||
xmlFree (val);
|
|
||||||
}
|
|
||||||
if (!*icon_data_uri && xmlStrcmp (child->name, (const xmlChar *)"Image") == 0)
|
|
||||||
{
|
|
||||||
xmlChar *val = xmlNodeListGetString(doc, child->xmlChildrenNode, 1);
|
|
||||||
if (val)
|
|
||||||
*icon_data_uri = g_strdup ((char *)val);
|
|
||||||
xmlFree (val);
|
|
||||||
}
|
|
||||||
if (!*url && xmlStrcmp (child->name, (const xmlChar *)"Url") == 0)
|
|
||||||
{
|
|
||||||
xmlChar *template;
|
|
||||||
xmlChar *type;
|
|
||||||
|
|
||||||
type = xmlGetProp(child, (const xmlChar *)"type");
|
|
||||||
if (!type)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
if (xmlStrcmp (type, (const xmlChar *)"text/html") != 0)
|
|
||||||
{
|
|
||||||
xmlFree (type);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
xmlFree (type);
|
|
||||||
|
|
||||||
template = xmlGetProp(child, (const xmlChar *)"template");
|
|
||||||
if (!template)
|
|
||||||
continue;
|
|
||||||
*url = g_strdup ((char *)template);
|
|
||||||
xmlFree (template);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED, "Invalid OpenSearch document");
|
|
||||||
xmlFreeDoc (doc);
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
xmlFreeDoc (doc);
|
|
||||||
if (*icon_data_uri && *name && *url)
|
|
||||||
return TRUE;
|
|
||||||
|
|
||||||
if (*icon_data_uri)
|
|
||||||
g_free (*icon_data_uri);
|
|
||||||
else
|
|
||||||
g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
|
|
||||||
"search provider doesn't have icon");
|
|
||||||
|
|
||||||
if (*name)
|
|
||||||
g_free (*name);
|
|
||||||
else if (error && !*error)
|
|
||||||
g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
|
|
||||||
"search provider doesn't have ShortName");
|
|
||||||
|
|
||||||
if (*url)
|
|
||||||
g_free (*url);
|
|
||||||
else if (error && !*error)
|
|
||||||
g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
|
|
||||||
"search provider doesn't have template for url");
|
|
||||||
|
|
||||||
if (*langs)
|
|
||||||
{
|
|
||||||
g_list_foreach (*langs, (GFunc)g_free, NULL);
|
|
||||||
g_list_free (*langs);
|
|
||||||
}
|
|
||||||
|
|
||||||
*url = NULL;
|
|
||||||
*name = NULL;
|
|
||||||
*icon_data_uri = NULL;
|
|
||||||
*langs = NULL;
|
|
||||||
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* shell_session_is_active_for_systemd:
|
* shell_session_is_active_for_systemd:
|
||||||
*
|
*
|
||||||
|
@ -33,13 +33,6 @@ gboolean shell_write_string_to_stream (GOutputStream *stream,
|
|||||||
char *shell_get_file_contents_utf8_sync (const char *path,
|
char *shell_get_file_contents_utf8_sync (const char *path,
|
||||||
GError **error);
|
GError **error);
|
||||||
|
|
||||||
gboolean shell_parse_search_provider (const char *data,
|
|
||||||
char **name,
|
|
||||||
char **url,
|
|
||||||
GList **langs,
|
|
||||||
char **icon_data_uri,
|
|
||||||
GError **error);
|
|
||||||
|
|
||||||
gboolean shell_session_is_active_for_systemd (void);
|
gboolean shell_session_is_active_for_systemd (void);
|
||||||
|
|
||||||
gboolean shell_util_wifexited (int status,
|
gboolean shell_util_wifexited (int status,
|
||||||
|
Loading…
Reference in New Issue
Block a user