From: Emmanuele Bassi Date: Thu, 16 Mar 2023 12:09:55 +0000 (+0000) Subject: linkbutton: Use GtkFileLauncher for file URI X-Git-Tag: archive/raspbian/4.12.3+ds-1+rpi1~1^2^2^2~22^2~4^2~10^2~80 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=6a797f6b1a52a68eebd29521f9e020101774c86e;p=gtk4.git 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 --- diff --git a/gtk/gtklinkbutton.c b/gtk/gtklinkbutton.c index 25ed3d2333..d92991b799 100644 --- a/gtk/gtklinkbutton.c +++ b/gtk/gtklinkbutton.c @@ -57,9 +57,9 @@ #include "gtklinkbutton.h" #include "gtkdragsource.h" +#include "gtkfilelauncher.h" #include "gtkgestureclick.h" #include "gtkgesturesingle.h" -#include #include "gtklabel.h" #include "gtkmain.h" #include "gtkmarshalers.h" @@ -71,6 +71,7 @@ #include "gtkwidgetprivate.h" #include +#include 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,