[gtk+] API: gdk: Add gdk_window_new_popup()



commit 24d0baec38545feaf3e73d536fe143547e8d7f90
Author: Benjamin Otte <otte redhat com>
Date:   Sun Nov 6 23:47:56 2016 +0100

    API: gdk: Add gdk_window_new_popup()
    
    ... and use it.

 docs/reference/gdk/gdk4-sections.txt |    1 +
 gdk/gdkwindow.c                      |   35 +++++++++++++++++++++++++++++
 gdk/gdkwindow.h                      |    4 +++
 gdk/wayland/gdkdevice-wayland.c      |   15 +------------
 gdk/wayland/gdkdnd-wayland.c         |   15 ++----------
 gdk/win32/gdkdevicemanager-win32.c   |   14 +-----------
 gdk/x11/gdkdnd-x11.c                 |   15 ++----------
 gtk/gtktreeview.c                    |   31 +++++---------------------
 gtk/gtkwindow.c                      |   40 +++++++++++++++------------------
 testsuite/gtk/defaultvalue.c         |   10 ++------
 testsuite/gtk/notify.c               |   10 ++------
 11 files changed, 78 insertions(+), 112 deletions(-)
---
diff --git a/docs/reference/gdk/gdk4-sections.txt b/docs/reference/gdk/gdk4-sections.txt
index 65d7e13..0d88611 100644
--- a/docs/reference/gdk/gdk4-sections.txt
+++ b/docs/reference/gdk/gdk4-sections.txt
@@ -279,6 +279,7 @@ GdkWindowAttr
 GdkWindowAttributesType
 gdk_window_new
 gdk_window_new_toplevel
+gdk_window_new_popup
 gdk_window_new_child
 gdk_window_new_input
 gdk_window_destroy
diff --git a/gdk/gdkwindow.c b/gdk/gdkwindow.c
index 846174c..0d7a6d6 100644
--- a/gdk/gdkwindow.c
+++ b/gdk/gdkwindow.c
@@ -1331,6 +1331,41 @@ gdk_window_new_toplevel (GdkDisplay *display,
 }
 
 /**
+ * gdk_window_new_popup: (constructor)
+ * @display: the display to create the window on
+ * @event_mask: event mask (see gdk_window_set_events())
+ * @position: position of the window on screen
+ *
+ * Creates a new toplevel popup window. The window will bypass window
+ * management.
+ *
+ * Returns: (transfer full): the new #GdkWindow
+ *
+ * Since: 3.90
+ **/
+GdkWindow *
+gdk_window_new_popup (GdkDisplay         *display,
+                      gint                event_mask,
+                      const GdkRectangle *position)
+{
+  GdkWindowAttr attr;
+
+  g_return_val_if_fail (GDK_IS_DISPLAY (display), NULL);
+  g_return_val_if_fail (position != NULL, NULL);
+
+  attr.event_mask = event_mask;
+  attr.wclass = GDK_INPUT_OUTPUT;
+  attr.x = position->x;
+  attr.y = position->y;
+  attr.width = position->width;
+  attr.height = position->height;
+  attr.window_type = GDK_WINDOW_TEMP;
+
+  return gdk_window_new (gdk_screen_get_root_window (gdk_display_get_default_screen (display)),
+                         &attr,
+                         GDK_WA_X | GDK_WA_Y);
+}
+/**
  * gdk_window_new_child: (constructor)
  * @parent: the parent window
  * @event_mask: event mask (see gdk_window_set_events())
diff --git a/gdk/gdkwindow.h b/gdk/gdkwindow.h
index 960c16d..33c3d52 100644
--- a/gdk/gdkwindow.h
+++ b/gdk/gdkwindow.h
@@ -471,6 +471,10 @@ GdkWindow *   gdk_window_new_toplevel          (GdkDisplay    *display,
                                                 int            width,
                                                 int            height);
 GDK_AVAILABLE_IN_3_90
+GdkWindow *   gdk_window_new_popup             (GdkDisplay    *display,
+                                                gint           event_mask,
+                                                const GdkRectangle *position);
+GDK_AVAILABLE_IN_3_90
 GdkWindow *   gdk_window_new_child             (GdkWindow     *parent,
                                                 gint           event_mask,
                                                 const GdkRectangle *position);
diff --git a/gdk/wayland/gdkdevice-wayland.c b/gdk/wayland/gdkdevice-wayland.c
index ce4915b..45483af 100644
--- a/gdk/wayland/gdkdevice-wayland.c
+++ b/gdk/wayland/gdkdevice-wayland.c
@@ -4511,20 +4511,7 @@ static const struct wl_surface_listener pointer_surface_listener = {
 static GdkWindow *
 create_foreign_dnd_window (GdkDisplay *display)
 {
-  GdkWindowAttr attrs;
-  GdkScreen *screen;
-  guint mask;
-
-  screen = gdk_display_get_default_screen (display);
-
-  attrs.x = attrs.y = 0;
-  attrs.width = attrs.height = 1;
-  attrs.wclass = GDK_INPUT_OUTPUT;
-  attrs.window_type = GDK_WINDOW_TEMP;
-
-  mask = GDK_WA_X | GDK_WA_Y;
-
-  return gdk_window_new (gdk_screen_get_root_window (screen), &attrs, mask);
+  return gdk_window_new_popup (display, 0, &(GdkRectangle) { 0, 0, 1, 1 });
 }
 
 static void
diff --git a/gdk/wayland/gdkdnd-wayland.c b/gdk/wayland/gdkdnd-wayland.c
index ca5ec77..184c6a0 100644
--- a/gdk/wayland/gdkdnd-wayland.c
+++ b/gdk/wayland/gdkdnd-wayland.c
@@ -498,20 +498,11 @@ _gdk_wayland_window_register_dnd (GdkWindow *window)
 }
 
 static GdkWindow *
-create_dnd_window (GdkScreen *screen)
+create_dnd_window (GdkDisplay *display)
 {
-  GdkWindowAttr attrs;
   GdkWindow *window;
-  guint mask;
 
-  attrs.x = attrs.y = 0;
-  attrs.width = attrs.height = 100;
-  attrs.wclass = GDK_INPUT_OUTPUT;
-  attrs.window_type = GDK_WINDOW_TEMP;
-
-  mask = GDK_WA_X | GDK_WA_Y;
-
-  window = gdk_window_new (gdk_screen_get_root_window (screen), &attrs, mask);
+  window = gdk_window_new_popup (display, 0, &(GdkRectangle) { 0, 0, 100, 100 });
 
   gdk_window_set_type_hint (window, GDK_WINDOW_TYPE_HINT_DND);
   
@@ -538,7 +529,7 @@ _gdk_wayland_window_drag_begin (GdkWindow *window,
 
   gdk_drag_context_set_device (context, device);
 
-  context_wayland->dnd_window = create_dnd_window (gdk_window_get_screen (window));
+  context_wayland->dnd_window = create_dnd_window (gdk_window_get_display (window));
   context_wayland->dnd_surface = gdk_wayland_window_get_wl_surface (context_wayland->dnd_window);
   context_wayland->data_source =
     gdk_wayland_selection_get_data_source (window,
diff --git a/gdk/win32/gdkdevicemanager-win32.c b/gdk/win32/gdkdevicemanager-win32.c
index 62c164d..7c8794f 100644
--- a/gdk/win32/gdkdevicemanager-win32.c
+++ b/gdk/win32/gdkdevicemanager-win32.c
@@ -354,7 +354,6 @@ wintab_init_check (GdkDeviceManagerWin32 *device_manager)
   GdkWindow *root = gdk_screen_get_root_window (gdk_display_get_default_screen (display));
   static gboolean wintab_initialized = FALSE;
   GdkDeviceWintab *device;
-  GdkWindowAttr wa;
   WORD specversion;
   HCTX *hctx;
   UINT ndevices, ncursors, ncsrtypes, firstcsr, hardware;
@@ -434,18 +433,7 @@ wintab_init_check (GdkDeviceManagerWin32 *device_manager)
                            ndevices, ncursors));
 #endif
   /* Create a dummy window to receive wintab events */
-  wa.wclass = GDK_INPUT_OUTPUT;
-  wa.event_mask = GDK_ALL_EVENTS_MASK;
-  wa.width = 2;
-  wa.height = 2;
-  wa.x = -100;
-  wa.y = -100;
-  wa.window_type = GDK_WINDOW_TOPLEVEL;
-  if ((wintab_window = gdk_window_new (root, &wa, GDK_WA_X | GDK_WA_Y)) == NULL)
-    {
-      g_warning ("gdk_input_wintab_init: gdk_window_new failed");
-      return;
-    }
+  wintab_window = gdk_window_new_popup (display, GDK_ALL_EVENTS_MASK, &(GdkRectangle) { -100, -100, 2, 2 });
   g_object_ref (wintab_window);
 
   for (devix = 0; devix < ndevices; devix++)
diff --git a/gdk/x11/gdkdnd-x11.c b/gdk/x11/gdkdnd-x11.c
index f4cdcc3..ac5e51e 100644
--- a/gdk/x11/gdkdnd-x11.c
+++ b/gdk/x11/gdkdnd-x11.c
@@ -1991,20 +1991,11 @@ gdk_drag_do_leave (GdkX11DragContext *context_x11,
 }
 
 static GdkWindow *
-create_drag_window (GdkScreen *screen)
+create_drag_window (GdkDisplay *display)
 {
-  GdkWindowAttr attrs = { 0 };
   GdkWindow *window;
-  guint mask;
 
-  attrs.x = attrs.y = 0;
-  attrs.width = attrs.height = 100;
-  attrs.wclass = GDK_INPUT_OUTPUT;
-  attrs.window_type = GDK_WINDOW_TEMP;
-
-  mask = GDK_WA_X | GDK_WA_Y;
-
-  window = gdk_window_new (gdk_screen_get_root_window (screen), &attrs, mask);
+  window = gdk_window_new_popup (display, 0, &(GdkRectangle) { 0, 0, 100, 100 });
 
   gdk_window_set_type_hint (window, GDK_WINDOW_TYPE_HINT_DND);
   
@@ -2037,7 +2028,7 @@ _gdk_x11_window_drag_begin (GdkWindow *window,
   GDK_X11_DRAG_CONTEXT (context)->start_x = x_root;
   GDK_X11_DRAG_CONTEXT (context)->start_y = y_root;
 
-  GDK_X11_DRAG_CONTEXT (context)->drag_window = create_drag_window (gdk_window_get_screen (window));
+  GDK_X11_DRAG_CONTEXT (context)->drag_window = create_drag_window (gdk_window_get_display(window));
 
   return context;
 }
diff --git a/gtk/gtktreeview.c b/gtk/gtktreeview.c
index 9747b63..595d572 100644
--- a/gtk/gtktreeview.c
+++ b/gtk/gtktreeview.c
@@ -3938,25 +3938,15 @@ gtk_tree_view_motion_draw_column_motion_arrow (GtkTreeView *tree_view)
       /* Create the new window */
       if (tree_view->priv->drag_column_window_state != DRAG_COLUMN_WINDOW_STATE_ARROW)
        {
-          GdkWindowAttr attributes;
-          gint attributes_mask;
-
          if (tree_view->priv->drag_highlight_window)
            {
              gtk_widget_unregister_window (GTK_WIDGET (tree_view), tree_view->priv->drag_highlight_window);
              gdk_window_destroy (tree_view->priv->drag_highlight_window);
            }
 
-         attributes.window_type = GDK_WINDOW_TEMP;
-         attributes.wclass = GDK_INPUT_OUTPUT;
-         attributes.event_mask = GDK_VISIBILITY_NOTIFY_MASK | GDK_POINTER_MOTION_MASK;
-         attributes_mask = GDK_WA_X | GDK_WA_Y;
-          attributes.x = x;
-          attributes.y = y;
-         attributes.width = width;
-         attributes.height = height;
-         tree_view->priv->drag_highlight_window = gdk_window_new (gdk_screen_get_root_window 
(gtk_widget_get_screen (widget)),
-                                                                  &attributes, attributes_mask);
+         tree_view->priv->drag_highlight_window = gdk_window_new_popup (gtk_widget_get_display (widget),
+                                                                         GDK_VISIBILITY_NOTIFY_MASK | 
GDK_POINTER_MOTION_MASK,
+                                                                         &(GdkRectangle) { x, y, width, 
height });
          gtk_widget_register_window (GTK_WIDGET (tree_view), tree_view->priv->drag_highlight_window);
 
          mask_image = cairo_image_surface_create (CAIRO_FORMAT_A1, width, height);
@@ -4017,24 +4007,15 @@ gtk_tree_view_motion_draw_column_motion_arrow (GtkTreeView *tree_view)
       if (tree_view->priv->drag_column_window_state != DRAG_COLUMN_WINDOW_STATE_ARROW_LEFT &&
          tree_view->priv->drag_column_window_state != DRAG_COLUMN_WINDOW_STATE_ARROW_RIGHT)
        {
-          GdkWindowAttr attributes;
-          gint attributes_mask;
-
          if (tree_view->priv->drag_highlight_window)
            {
              gtk_widget_unregister_window (GTK_WIDGET (tree_view), tree_view->priv->drag_highlight_window);
              gdk_window_destroy (tree_view->priv->drag_highlight_window);
            }
 
-         attributes.window_type = GDK_WINDOW_TEMP;
-         attributes.wclass = GDK_INPUT_OUTPUT;
-         attributes.event_mask = GDK_VISIBILITY_NOTIFY_MASK | GDK_POINTER_MOTION_MASK;
-         attributes_mask = GDK_WA_X | GDK_WA_Y;
-          attributes.x = x;
-          attributes.y = y;
-         attributes.width = width;
-         attributes.height = height;
-         tree_view->priv->drag_highlight_window = gdk_window_new (gdk_screen_get_root_window 
(gtk_widget_get_screen (widget)), &attributes, attributes_mask);
+         tree_view->priv->drag_highlight_window = gdk_window_new_popup (gtk_widget_get_display (widget),
+                                                                         GDK_VISIBILITY_NOTIFY_MASK | 
GDK_POINTER_MOTION_MASK,
+                                                                         &(GdkRectangle) { x, y, width, 
height });
          gtk_widget_register_window (GTK_WIDGET (tree_view), tree_view->priv->drag_highlight_window);
 
          mask_image = cairo_image_surface_create (CAIRO_FORMAT_A1, width, height);
diff --git a/gtk/gtkwindow.c b/gtk/gtkwindow.c
index 764cbf5..28b68af 100644
--- a/gtk/gtkwindow.c
+++ b/gtk/gtkwindow.c
@@ -6858,9 +6858,9 @@ gtk_window_realize (GtkWidget *widget)
   GtkAllocation child_allocation;
   GtkWindow *window;
   GdkWindow *gdk_window;
-  GdkWindowAttr attributes;
   GtkBorder window_border;
   GtkWindowPrivate *priv;
+  gint event_mask;
   gint i;
   GList *link;
 
@@ -6931,30 +6931,26 @@ gtk_window_realize (GtkWidget *widget)
     }
   else
     {
-      attributes.wclass = GDK_INPUT_OUTPUT;
-
       _gtk_widget_get_allocation (widget, &allocation);
-      attributes.width = allocation.width;
-      attributes.height = allocation.height;
-      attributes.event_mask = gtk_widget_get_events (widget);
-      attributes.event_mask |= (GDK_EXPOSURE_MASK |
-                                GDK_BUTTON_PRESS_MASK |
-                                GDK_BUTTON_RELEASE_MASK |
-                                GDK_BUTTON_MOTION_MASK |
-                                GDK_KEY_PRESS_MASK |
-                                GDK_KEY_RELEASE_MASK |
-                                GDK_ENTER_NOTIFY_MASK |
-                                GDK_LEAVE_NOTIFY_MASK |
-                                GDK_FOCUS_CHANGE_MASK |
-                                GDK_STRUCTURE_MASK);
+      event_mask = gtk_widget_get_events (widget);
+      event_mask |= (GDK_EXPOSURE_MASK |
+                     GDK_BUTTON_PRESS_MASK |
+                     GDK_BUTTON_RELEASE_MASK |
+                     GDK_BUTTON_MOTION_MASK |
+                     GDK_KEY_PRESS_MASK |
+                     GDK_KEY_RELEASE_MASK |
+                     GDK_ENTER_NOTIFY_MASK |
+                     GDK_LEAVE_NOTIFY_MASK |
+                     GDK_FOCUS_CHANGE_MASK |
+                     GDK_STRUCTURE_MASK);
       if (priv->decorated && priv->client_decorated)
-        attributes.event_mask |= GDK_POINTER_MOTION_MASK;
+        event_mask |= GDK_POINTER_MOTION_MASK;
 
       switch (priv->type)
         {
         case GTK_WINDOW_TOPLEVEL:
           gdk_window = gdk_window_new_toplevel (gtk_widget_get_display (widget),
-                                                attributes.event_mask,
+                                                event_mask,
                                                 allocation.width,
                                                 allocation.height);
           break;
@@ -6964,15 +6960,15 @@ gtk_window_realize (GtkWidget *widget)
               GDK_IS_WAYLAND_DISPLAY (gtk_widget_get_display (widget)))
             {
               gdk_window = gdk_wayland_window_new_subsurface (gtk_widget_get_display (widget),
-                                                              attributes.event_mask,
+                                                              event_mask,
                                                               &allocation);
             }
           else
 #endif
             {
-              attributes.window_type = GDK_WINDOW_TEMP;
-              gdk_window = gdk_window_new (gdk_screen_get_root_window (_gtk_window_get_screen (window)),
-                                           &attributes, 0);
+              gdk_window = gdk_window_new_popup (gtk_widget_get_display (widget),
+                                                 event_mask,
+                                                 &allocation);
             }
           break;
         default:
diff --git a/testsuite/gtk/defaultvalue.c b/testsuite/gtk/defaultvalue.c
index 1c5cecb..8af8f4f 100644
--- a/testsuite/gtk/defaultvalue.c
+++ b/testsuite/gtk/defaultvalue.c
@@ -107,13 +107,9 @@ test_type (gconstpointer data)
     instance = g_object_ref (gtk_settings_get_default ());
   else if (g_type_is_a (type, GDK_TYPE_WINDOW))
     {
-      GdkWindowAttr attributes;
-      attributes.wclass = GDK_INPUT_OUTPUT;
-      attributes.window_type = GDK_WINDOW_TEMP;
-      attributes.event_mask = 0;
-      attributes.width = 100;
-      attributes.height = 100;
-      instance = g_object_ref (gdk_window_new (NULL, &attributes, 0));
+      instance = g_object_ref (gdk_window_new_popup (gdk_display_get_default (),
+                                                     0,
+                                                     &(GdkRectangle) { 0, 0, 100, 100 }));
     }
   else if (g_str_equal (g_type_name (type), "GdkX11Cursor"))
     instance = g_object_new (type, "display", display, NULL);
diff --git a/testsuite/gtk/notify.c b/testsuite/gtk/notify.c
index 65aba31..3f36913 100644
--- a/testsuite/gtk/notify.c
+++ b/testsuite/gtk/notify.c
@@ -403,13 +403,9 @@ test_type (gconstpointer data)
     instance = g_object_ref (gtk_settings_get_default ());
   else if (g_type_is_a (type, GDK_TYPE_WINDOW))
     {
-      GdkWindowAttr attributes;
-      attributes.wclass = GDK_INPUT_OUTPUT;
-      attributes.window_type = GDK_WINDOW_TEMP;
-      attributes.event_mask = 0;
-      attributes.width = 100;
-      attributes.height = 100;
-      instance = g_object_ref (gdk_window_new (NULL, &attributes, 0));
+      instance = g_object_ref (gdk_window_new_popup (gdk_display_get_default (),
+                                                     0,
+                                                     &(GdkRectangle) { 0, 0, 100, 100 }));
     }
   else if (g_str_equal (g_type_name (type), "GdkX11Cursor"))
     instance = g_object_new (type, "display", display, NULL);


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