Support x-scheme-handler with GLib < 2.28
So for example x-scheme-handler/magnet=transmission-gtk.desktop in the file ~/.local/share/applications/mimeapps.list allows opening of magnet links with Transmission.
This commit is contained in:
parent
fc8d0a1179
commit
d903505ee6
1 changed files with 53 additions and 7 deletions
|
@ -271,6 +271,34 @@ sokoke_open_with_response_cb (GtkWidget* dialog,
|
||||||
gtk_widget_destroy (dialog);
|
gtk_widget_destroy (dialog);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static GAppInfo*
|
||||||
|
sokoke_default_for_uri (const gchar* uri,
|
||||||
|
gchar** scheme_ptr)
|
||||||
|
{
|
||||||
|
gchar* scheme;
|
||||||
|
GAppInfo* info;
|
||||||
|
|
||||||
|
scheme = g_uri_parse_scheme (uri);
|
||||||
|
if (scheme_ptr != NULL)
|
||||||
|
*scheme_ptr = scheme;
|
||||||
|
if (!scheme)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
info = g_app_info_get_default_for_uri_scheme (scheme);
|
||||||
|
#if !GLIB_CHECK_VERSION (2, 28, 0)
|
||||||
|
if (!info)
|
||||||
|
{
|
||||||
|
gchar* type = g_strdup_printf ("x-scheme-handler/%s", scheme);
|
||||||
|
info = g_app_info_get_default_for_type (type, FALSE);
|
||||||
|
g_free (type);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
if (info != NULL && scheme_ptr != NULL)
|
||||||
|
g_free (scheme);
|
||||||
|
return info;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* sokoke_show_uri:
|
* sokoke_show_uri:
|
||||||
* @screen: a #GdkScreen, or %NULL
|
* @screen: a #GdkScreen, or %NULL
|
||||||
|
@ -281,6 +309,7 @@ sokoke_open_with_response_cb (GtkWidget* dialog,
|
||||||
* Shows the specified URI with an appropriate application. This
|
* Shows the specified URI with an appropriate application. This
|
||||||
* supports xdg-open, exo-open and gnome-open as fallbacks if
|
* supports xdg-open, exo-open and gnome-open as fallbacks if
|
||||||
* GIO doesn't do the trick.
|
* GIO doesn't do the trick.
|
||||||
|
* x-scheme-handler is supported for GLib < 2.28 as of 0.3.3.
|
||||||
*
|
*
|
||||||
* On Maemo, hildon_uri_open() is used.
|
* On Maemo, hildon_uri_open() is used.
|
||||||
*
|
*
|
||||||
|
@ -364,6 +393,10 @@ sokoke_show_uri (GdkScreen* screen,
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
|
||||||
|
#if !GLIB_CHECK_VERSION (2, 28, 0)
|
||||||
|
GAppInfo* info;
|
||||||
|
gchar* scheme;
|
||||||
|
#endif
|
||||||
const gchar* fallbacks [] = { "xdg-open", "exo-open", "gnome-open" };
|
const gchar* fallbacks [] = { "xdg-open", "exo-open", "gnome-open" };
|
||||||
gsize i;
|
gsize i;
|
||||||
GtkWidget* dialog;
|
GtkWidget* dialog;
|
||||||
|
@ -386,6 +419,25 @@ sokoke_show_uri (GdkScreen* screen,
|
||||||
return TRUE;
|
return TRUE;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if !GLIB_CHECK_VERSION (2, 28, 0)
|
||||||
|
info = sokoke_default_for_uri (uri, &scheme);
|
||||||
|
if (info)
|
||||||
|
{
|
||||||
|
gchar* argument = g_strdup (&uri[scheme - uri]);
|
||||||
|
GList* uris = g_list_prepend (NULL, argument);
|
||||||
|
if (g_app_info_launch_uris (info, uris, NULL, NULL))
|
||||||
|
{
|
||||||
|
g_list_free (uris);
|
||||||
|
g_free (scheme);
|
||||||
|
g_object_unref (info);
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
g_list_free (uris);
|
||||||
|
g_free (scheme);
|
||||||
|
g_object_unref (info);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
for (i = 0; i < G_N_ELEMENTS (fallbacks); i++)
|
for (i = 0; i < G_N_ELEMENTS (fallbacks); i++)
|
||||||
{
|
{
|
||||||
gchar* command = g_strconcat (fallbacks[i], " ", uri, NULL);
|
gchar* command = g_strconcat (fallbacks[i], " ", uri, NULL);
|
||||||
|
@ -756,7 +808,6 @@ sokoke_resolve_hostname (const gchar* hostname)
|
||||||
gboolean
|
gboolean
|
||||||
sokoke_external_uri (const gchar* uri)
|
sokoke_external_uri (const gchar* uri)
|
||||||
{
|
{
|
||||||
gchar* scheme;
|
|
||||||
GAppInfo* info;
|
GAppInfo* info;
|
||||||
|
|
||||||
if (!uri || !strncmp (uri, "http", 4)
|
if (!uri || !strncmp (uri, "http", 4)
|
||||||
|
@ -764,12 +815,7 @@ sokoke_external_uri (const gchar* uri)
|
||||||
|| !strncmp (uri, "about:", 6))
|
|| !strncmp (uri, "about:", 6))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
scheme = g_uri_parse_scheme (uri);
|
info = sokoke_default_for_uri (uri, NULL);
|
||||||
if (!scheme)
|
|
||||||
return FALSE;
|
|
||||||
|
|
||||||
info = g_app_info_get_default_for_uri_scheme (scheme);
|
|
||||||
g_free (scheme);
|
|
||||||
if (info)
|
if (info)
|
||||||
g_object_unref (info);
|
g_object_unref (info);
|
||||||
return info != NULL;
|
return info != NULL;
|
||||||
|
|
Loading…
Reference in a new issue