[PATCH 1/2] Added the OS dependent function subsurface_launch_for_uri()

Lubomir I. Ivanov neolit123 at gmail.com
Mon Jan 14 15:20:29 PST 2013


From: "Lubomir I. Ivanov" <neolit123 at gmail.com>

Opening URI addresses from Subsurface does not work on Windows using
the latest GTK bundle from the Gnome website. The reason lies in GIO
and GLib and how it obtains assigned applications for protocols and MIME
types.

While gtk_show_uri() should be viable for both linux.c and macos.c,
in windows.c ShellExecute() is used, which provides proper support
for the URI calls.

subsurface_launch_for_uri() returns TRUE on success.

Signed-off-by: Lubomir I. Ivanov <neolit123 at gmail.com>
---
 dive.h    |  1 +
 linux.c   | 12 ++++++++++++
 macos.c   | 12 ++++++++++++
 windows.c |  8 ++++++++
 4 files changed, 33 insertions(+)

diff --git a/dive.h b/dive.h
index c53e194..a459209 100644
--- a/dive.h
+++ b/dive.h
@@ -581,6 +581,7 @@ typedef enum {
 extern const char *existing_filename;
 extern const char *subsurface_gettext_domainpath(char *);
 extern gboolean subsurface_os_feature_available(os_feature_t);
+extern gboolean subsurface_launch_for_uri(const char *);
 extern void subsurface_command_line_init(gint *, gchar ***);
 extern void subsurface_command_line_exit(gint *, gchar ***);
 #define AIR_PERMILLE 209
diff --git a/linux.c b/linux.c
index 9281b43..f8d3e88 100644
--- a/linux.c
+++ b/linux.c
@@ -176,3 +176,15 @@ gboolean subsurface_os_feature_available(os_feature_t f)
 {
 	return TRUE;
 }
+
+gboolean subsurface_launch_for_uri(const char* uri)
+{
+	GError *err = NULL;
+	gtk_show_uri(NULL, uri, gtk_get_current_event_time(), &err);
+	if (err) {
+		g_message("%s: %s", err->message, uri);
+		g_error_free(err);
+		return FALSE;
+	}
+	return TRUE;
+}
diff --git a/macos.c b/macos.c
index b8451cf..b67c9d6 100644
--- a/macos.c
+++ b/macos.c
@@ -220,3 +220,15 @@ gboolean subsurface_os_feature_available(os_feature_t f)
 {
 	return TRUE;
 }
+
+gboolean subsurface_launch_for_uri(const char* uri)
+{
+	GError *err = NULL;
+	gtk_show_uri(NULL, uri, gtk_get_current_event_time(), &err);
+	if (err) {
+		g_message("%s: %s", err->message, uri);
+		g_error_free(err);
+		return FALSE;
+	}
+	return TRUE;
+}
diff --git a/windows.c b/windows.c
index f9b04ce..2730d48 100644
--- a/windows.c
+++ b/windows.c
@@ -298,6 +298,14 @@ void subsurface_command_line_exit(gint *argc, gchar ***argv)
 	g_free(*argv);
 }
 
+gboolean subsurface_launch_for_uri(const char* uri)
+{
+	if ((INT_PTR)ShellExecute(NULL, "open", uri, NULL, NULL, SW_SHOWNORMAL) > 32)
+		return TRUE;
+	g_message("ShellExecute failed for: %s", uri);
+	return FALSE;
+}
+
 /* check if we are running a newer OS version */
 gboolean subsurface_os_feature_available(os_feature_t f)
 {
-- 
1.7.11.msysgit.0



More information about the subsurface mailing list