[gtk+/portal: 1/18] Add gtk_show_uri_on_window



commit 38b1716a74543cbbee731fdbb58266922b630dbc
Author: Matthias Clasen <mclasen redhat com>
Date:   Sat Jun 18 17:59:40 2016 -0400

    Add gtk_show_uri_on_window
    
    The gtk_show_uri API doesn't let us specify a parent window. With
    portals, there may be an intermediate dialog, for which it is nice
    to have parent window information, to place it properly.

 gtk/gtkshow.c |   67 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
 gtk/gtkshow.h |    8 ++++++
 2 files changed, 74 insertions(+), 1 deletions(-)
---
diff --git a/gtk/gtkshow.c b/gtk/gtkshow.c
index 7a03f9e..6fb7e0f 100644
--- a/gtk/gtkshow.c
+++ b/gtk/gtkshow.c
@@ -24,6 +24,10 @@
 
 #include "gtkshow.h"
 
+#ifdef GDK_WINDOWING_X11
+#include "x11/gdkx.h"
+#endif
+
 /**
  * gtk_show_uri:
  * @screen: (allow-none): screen to show the uri on
@@ -70,8 +74,69 @@ gtk_show_uri (GdkScreen    *screen,
   gdk_app_launch_context_set_screen (context, screen);
   gdk_app_launch_context_set_timestamp (context, timestamp);
 
-  ret = g_app_info_launch_default_for_uri (uri, (GAppLaunchContext*)context, error);
+  ret = g_app_info_launch_default_for_uri (uri, G_APP_LAUNCH_CONTEXT (context), error);
+  g_object_unref (context);
+
+  return ret;
+}
+
+/**
+ * gtk_show_uri_on_window:
+ * @parent: parent window
+ * @uri: the uri to show
+ * @timestamp: a timestamp to prevent focus stealing
+ * @error: a #GError that is returned in case of errors
+ *
+ * A convenience function for launching the default application
+ * to show the uri. Like gtk_show_uri(), but takes a window
+ * as transient parent instead of a screen.
+ *
+ * Returns: %TRUE on success, %FALSE on error
+ *
+ * Since: 3.22
+ */
+gboolean
+gtk_show_uri_on_window (GtkWindow   *parent,
+                        const char  *uri,
+                        guint32      timestamp,
+                        GError     **error)
+{
+  GdkAppLaunchContext *context;
+  gboolean ret;
+  GdkDisplay *display;
+
+  g_return_val_if_fail (uri != NULL, FALSE);
+
+  if (parent)
+    display = gtk_widget_get_display (GTK_WIDGET (parent));
+  else
+    display = gdk_display_get_default ();
+
+  context = gdk_display_get_app_launch_context (display);
+
+  if (parent)
+    {
+      GdkWindow *window = gtk_widget_get_window (GTK_WIDGET (parent));
+#ifdef GDK_WINDOWING_X11
+      if (GDK_IS_X11_WINDOW(window))
+        {
+          char *parent_window_str;
+
+          parent_window_str = g_strdup_printf ("x11:%x", (guint32)gdk_x11_window_get_xid (window));
+          g_app_launch_context_setenv (G_APP_LAUNCH_CONTEXT (context),
+                                       "PARENT_WINDOW_ID",
+                                       parent_window_str);
+          g_free (parent_window_str);
+        }
+#endif
+    }
+
+  gdk_app_launch_context_set_timestamp (context, timestamp);
+
+  ret = g_app_info_launch_default_for_uri (uri, G_APP_LAUNCH_CONTEXT (context), error);
+
   g_object_unref (context);
 
   return ret;
+
 }
diff --git a/gtk/gtkshow.h b/gtk/gtkshow.h
index c4acd9c..f4e3feb 100644
--- a/gtk/gtkshow.h
+++ b/gtk/gtkshow.h
@@ -25,6 +25,8 @@
 #error "Only <gtk/gtk.h> can be included directly."
 #endif
 
+#include <gtk/gtkwindow.h>
+
 G_BEGIN_DECLS
 
 GDK_AVAILABLE_IN_ALL
@@ -33,6 +35,12 @@ gboolean gtk_show_uri  (GdkScreen   *screen,
                         guint32      timestamp,
                         GError     **error);
 
+GDK_AVAILABLE_IN_3_22
+gboolean gtk_show_uri_on_window (GtkWindow   *parent,
+                                 const char  *uri,
+                                 guint32      timestamp,
+                                 GError     **error);
+
 G_END_DECLS
 
 #endif /* __GTK_SHOW_H__ */


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]