linkbutton: Use GtkFileLauncher for file URI
The GtkUriLauncher calls into the openuri portal, which distinguishes between files, directories, and URI. The GtkFileLauncher contains logic to deal with this, because it can already handle the file and folder differences. If we have a file:// URI it's easier to create a GFile out of it, and use the GtkFileLauncher API, while leaving the GtkUriLauncher API for every other URI scheme. Fixes: #5671
This commit is contained in:
committed by
Matthias Clasen
parent
6b5baefd75
commit
6a797f6b1a
@@ -57,9 +57,9 @@
|
||||
#include "gtklinkbutton.h"
|
||||
|
||||
#include "gtkdragsource.h"
|
||||
#include "gtkfilelauncher.h"
|
||||
#include "gtkgestureclick.h"
|
||||
#include "gtkgesturesingle.h"
|
||||
#include <glib/gi18n-lib.h>
|
||||
#include "gtklabel.h"
|
||||
#include "gtkmain.h"
|
||||
#include "gtkmarshalers.h"
|
||||
@@ -71,6 +71,7 @@
|
||||
#include "gtkwidgetprivate.h"
|
||||
|
||||
#include <string.h>
|
||||
#include <glib/gi18n-lib.h>
|
||||
|
||||
typedef struct _GtkLinkButtonClass GtkLinkButtonClass;
|
||||
|
||||
@@ -230,7 +231,7 @@ gtk_link_button_class_init (GtkLinkButtonClass *klass)
|
||||
/**
|
||||
* GtkLinkButton|menu.popup:
|
||||
*
|
||||
* Opens the context menu.
|
||||
* Opens the context menu.
|
||||
*/
|
||||
gtk_widget_class_install_action (widget_class, "menu.popup", NULL, gtk_link_button_popup_menu);
|
||||
|
||||
@@ -303,7 +304,7 @@ gtk_link_content_get_value (GdkContentProvider *provider,
|
||||
content->link != NULL)
|
||||
{
|
||||
char *uri;
|
||||
|
||||
|
||||
uri = g_strdup_printf ("%s\r\n", content->link->uri);
|
||||
g_value_set_string (value, uri);
|
||||
g_free (uri);
|
||||
@@ -381,7 +382,7 @@ gtk_link_button_get_property (GObject *object,
|
||||
GParamSpec *pspec)
|
||||
{
|
||||
GtkLinkButton *link_button = GTK_LINK_BUTTON (object);
|
||||
|
||||
|
||||
switch (prop_id)
|
||||
{
|
||||
case PROP_URI:
|
||||
@@ -403,7 +404,7 @@ gtk_link_button_set_property (GObject *object,
|
||||
GParamSpec *pspec)
|
||||
{
|
||||
GtkLinkButton *link_button = GTK_LINK_BUTTON (object);
|
||||
|
||||
|
||||
switch (prop_id)
|
||||
{
|
||||
case PROP_URI:
|
||||
@@ -479,13 +480,31 @@ static gboolean
|
||||
gtk_link_button_activate_link (GtkLinkButton *link_button)
|
||||
{
|
||||
GtkWidget *toplevel;
|
||||
GtkUriLauncher *launcher;
|
||||
const char *uri_scheme;
|
||||
|
||||
toplevel = GTK_WIDGET (gtk_widget_get_root (GTK_WIDGET (link_button)));
|
||||
|
||||
launcher = gtk_uri_launcher_new (link_button->uri);
|
||||
gtk_uri_launcher_launch (launcher, GTK_WINDOW (toplevel), NULL, NULL, NULL);
|
||||
g_object_unref (launcher);
|
||||
uri_scheme = g_uri_peek_scheme (link_button->uri);
|
||||
if (g_strcmp0 (uri_scheme, "file") == 0)
|
||||
{
|
||||
GFile *file = g_file_new_for_uri (link_button->uri);
|
||||
GtkFileLauncher *launcher;
|
||||
|
||||
launcher = gtk_file_launcher_new (file);
|
||||
|
||||
gtk_file_launcher_launch (launcher, GTK_WINDOW (toplevel), NULL, NULL, NULL);
|
||||
|
||||
g_object_unref (launcher);
|
||||
g_object_unref (file);
|
||||
}
|
||||
else
|
||||
{
|
||||
GtkUriLauncher *launcher = gtk_uri_launcher_new (link_button->uri);
|
||||
|
||||
gtk_uri_launcher_launch (launcher, GTK_WINDOW (toplevel), NULL, NULL, NULL);
|
||||
|
||||
g_object_unref (launcher);
|
||||
}
|
||||
|
||||
gtk_link_button_set_visited (link_button, TRUE);
|
||||
|
||||
@@ -521,9 +540,9 @@ gtk_link_button_new (const char *uri)
|
||||
{
|
||||
char *utf8_uri = NULL;
|
||||
GtkWidget *retval;
|
||||
|
||||
|
||||
g_return_val_if_fail (uri != NULL, NULL);
|
||||
|
||||
|
||||
if (g_utf8_validate (uri, -1, NULL))
|
||||
{
|
||||
utf8_uri = g_strdup (uri);
|
||||
@@ -531,7 +550,7 @@ gtk_link_button_new (const char *uri)
|
||||
else
|
||||
{
|
||||
GError *conv_err = NULL;
|
||||
|
||||
|
||||
utf8_uri = g_locale_to_utf8 (uri, -1, NULL, NULL, &conv_err);
|
||||
if (conv_err)
|
||||
{
|
||||
@@ -540,18 +559,18 @@ gtk_link_button_new (const char *uri)
|
||||
uri,
|
||||
conv_err->message);
|
||||
g_error_free (conv_err);
|
||||
|
||||
|
||||
utf8_uri = g_strdup (_("Invalid URI"));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
retval = g_object_new (GTK_TYPE_LINK_BUTTON,
|
||||
"label", utf8_uri,
|
||||
"uri", uri,
|
||||
NULL);
|
||||
|
||||
|
||||
g_free (utf8_uri);
|
||||
|
||||
|
||||
return retval;
|
||||
}
|
||||
|
||||
@@ -569,9 +588,9 @@ gtk_link_button_new_with_label (const char *uri,
|
||||
const char *label)
|
||||
{
|
||||
GtkWidget *retval;
|
||||
|
||||
|
||||
g_return_val_if_fail (uri != NULL, NULL);
|
||||
|
||||
|
||||
if (!label)
|
||||
return gtk_link_button_new (uri);
|
||||
|
||||
@@ -583,7 +602,7 @@ gtk_link_button_new_with_label (const char *uri,
|
||||
return retval;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
static gboolean
|
||||
gtk_link_button_query_tooltip_cb (GtkWidget *widget,
|
||||
int x,
|
||||
int y,
|
||||
|
||||
Reference in New Issue
Block a user