window: Use gdk_toplevel_export_handle
authorMatthias Clasen <mclasen@redhat.com>
Wed, 9 Nov 2022 07:41:55 +0000 (08:41 +0100)
committerMatthias Clasen <mclasen@redhat.com>
Wed, 9 Nov 2022 15:28:29 +0000 (16:28 +0100)
gtk/gtkwindow.c

index a7cbde18bc812f6c7f7d0ecd65f264597d7c3da6..aba22c522b52749e3b98291d546fc45fe20881fb 100644 (file)
@@ -72,6 +72,7 @@
 #include "gdk/gdkprofilerprivate.h"
 #include "gdk/gdksurfaceprivate.h"
 #include "gdk/gdktextureprivate.h"
+#include "gdk/gdktoplevelprivate.h"
 
 #include <cairo-gobject.h>
 #include <errno.h>
@@ -6244,26 +6245,49 @@ gtk_window_enable_debugging (GtkWindow *window,
   return TRUE;
 }
 
-#ifdef GDK_WINDOWING_WAYLAND
 typedef struct {
   GtkWindow *window;
   GtkWindowHandleExported callback;
   gpointer user_data;
-} WaylandSurfaceHandleExportedData;
+} ExportHandleData;
+
+static char *
+prefix_handle (GdkDisplay *display,
+               char       *handle)
+{
+#ifdef GDK_WINDOWING_WAYLAND
+  if (GDK_IS_WAYLAND_DISPLAY (display))
+    return g_strconcat ("wayland:", handle, NULL);
+  else
+#endif
+#ifdef GDK_WINDOWING_X11
+  if (GDK_IS_X11_DISPLAY (display))
+    return g_strconcat ("x11:", handle, NULL);
+  else
+#endif
+    return NULL;
+}
 
 static void
-wayland_surface_handle_exported (GdkToplevel *toplevel,
-                                const char  *wayland_handle_str,
-                                gpointer     user_data)
+export_handle_done (GObject      *source,
+                    GAsyncResult *result,
+                    void         *user_data)
 {
-  WaylandSurfaceHandleExportedData *data = user_data;
-  char *handle_str;
+  ExportHandleData *data = (ExportHandleData *)user_data;
+  GtkWindowPrivate *priv = gtk_window_get_instance_private (data->window);
+  char *handle;
+  char *prefixed;
+
+  handle = gdk_toplevel_export_handle_finish (GDK_TOPLEVEL (priv->surface), result, NULL);
+  prefixed = prefix_handle (priv->display, handle);
+
+  data->callback (data->window, prefixed, data->user_data);
+
+  g_free (handle);
+  g_free (prefixed);
 
-  handle_str = g_strdup_printf ("wayland:%s", wayland_handle_str);
-  data->callback (data->window, handle_str, data->user_data);
-  g_free (handle_str);
+  g_free (data);
 }
-#endif
 
 gboolean
 gtk_window_export_handle (GtkWindow               *window,
@@ -6271,70 +6295,16 @@ gtk_window_export_handle (GtkWindow               *window,
                           gpointer                 user_data)
 {
   GtkWindowPrivate *priv = gtk_window_get_instance_private (window);
+  ExportHandleData *data;
 
-#ifdef GDK_WINDOWING_X11
-  if (GDK_IS_X11_DISPLAY (gtk_widget_get_display (GTK_WIDGET (window))))
-    {
-      char *handle_str;
-      guint32 xid = (guint32) gdk_x11_surface_get_xid (priv->surface);
-
-      handle_str = g_strdup_printf ("x11:%x", xid);
-      callback (window, handle_str, user_data);
-      g_free (handle_str);
-
-      return TRUE;
-    }
-#endif
-#ifdef GDK_WINDOWING_WAYLAND
-  if (GDK_IS_WAYLAND_DISPLAY (gtk_widget_get_display (GTK_WIDGET (window))))
-    {
-      WaylandSurfaceHandleExportedData *data;
-
-      data = g_new0 (WaylandSurfaceHandleExportedData, 1);
-      data->window = window;
-      data->callback = callback;
-      data->user_data = user_data;
-
-      if (!gdk_wayland_toplevel_export_handle (GDK_TOPLEVEL (priv->surface),
-                                              wayland_surface_handle_exported,
-                                              data,
-                                              g_free))
-        {
-          g_free (data);
-          return FALSE;
-        }
-      else
-        {
-          return TRUE;
-        }
-    }
-#endif
-#ifdef GDK_WINDOWING_MACOS
-  if (GDK_IS_MACOS_DISPLAY (gtk_widget_get_display (GTK_WIDGET (window))))
-    {
-      callback (window, NULL, user_data);
-      return TRUE;
-    }
-#endif
-#ifdef GDK_WINDOWING_WIN32
-  if (GDK_IS_WIN32_DISPLAY (gtk_widget_get_display (GTK_WIDGET (window))))
-    {
-      callback (window, NULL, user_data);
-      return TRUE;
-    }
-#endif
-#ifdef GDK_WINDOWING_BROADWAY
-  if (GDK_IS_BROADWAY_DISPLAY (gtk_widget_get_display (GTK_WIDGET (window))))
-    {
-      callback (window, NULL, user_data);
-      return TRUE;
-    }
-#endif
+  data = g_new (ExportHandleData, 1);
+  data->window = window;
+  data->callback = callback;
+  data->user_data = user_data;
 
-  g_warning ("Couldn't export handle for %s surface, unsupported windowing system",
-             G_OBJECT_TYPE_NAME (priv->surface));
+  gdk_toplevel_export_handle (GDK_TOPLEVEL (priv->surface), NULL, export_handle_done, data);
 
-  return FALSE;
+  return TRUE;
 }
 
 void
@@ -6342,32 +6312,7 @@ gtk_window_unexport_handle (GtkWindow *window)
 {
   GtkWindowPrivate *priv = gtk_window_get_instance_private (window);
 
-#ifdef GDK_WINDOWING_WAYLAND
-  if (GDK_IS_WAYLAND_DISPLAY (gtk_widget_get_display (GTK_WIDGET (window))))
-    {
-      gdk_wayland_toplevel_unexport_handle (GDK_TOPLEVEL (priv->surface));
-      return;
-    }
-#endif
-#ifdef GDK_WINDOWING_X11
-  if (GDK_IS_X11_DISPLAY (gtk_widget_get_display (GTK_WIDGET (window))))
-    return;
-#endif
-#ifdef GDK_WINDOWING_MACOS
-  if (GDK_IS_MACOS_DISPLAY (gtk_widget_get_display (GTK_WIDGET (window))))
-    return;
-#endif
-#ifdef GDK_WINDOWING_WIN32
-  if (GDK_IS_WIN32_DISPLAY (gtk_widget_get_display (GTK_WIDGET (window))))
-    return;
-#endif
-#ifdef GDK_WINDOWING_BROADWAY
-  if (GDK_IS_BROADWAY_DISPLAY (gtk_widget_get_display (GTK_WIDGET (window))))
-    return;
-#endif
-
-  g_warning ("Couldn't unexport handle for %s surface, unsupported windowing system",
-             G_OBJECT_TYPE_NAME (priv->surface));
+  gdk_toplevel_unexport_handle (GDK_TOPLEVEL (priv->surface));
 }
 
 static GtkPointerFocus *