[gtk+] flowbox: Turn into no-window widget



commit 2f8df5237f57f788664d39965178677574d3876a
Author: Benjamin Otte <otte redhat com>
Date:   Sun Nov 6 14:41:07 2016 +0100

    flowbox: Turn into no-window widget

 gtk/gtkflowbox.c |   60 +++++++++++++++++++++++++++++++++++++++++++++---------
 1 files changed, 50 insertions(+), 10 deletions(-)
---
diff --git a/gtk/gtkflowbox.c b/gtk/gtkflowbox.c
index f1bee97..26e39c0 100644
--- a/gtk/gtkflowbox.c
+++ b/gtk/gtkflowbox.c
@@ -772,6 +772,7 @@ struct _GtkFlowBoxPrivate {
 
   GSequence        *children;
 
+  GdkWindow        *view_window;
   GtkCssGadget     *gadget;
   GtkFlowBoxFilterFunc filter_func;
   gpointer             filter_data;
@@ -1562,15 +1563,15 @@ static void
 gtk_flow_box_size_allocate (GtkWidget     *widget,
                             GtkAllocation *allocation)
 {
+  GtkFlowBox *box = GTK_FLOW_BOX (widget);
+  GtkFlowBoxPrivate  *priv = BOX_PRIV (box);
   GtkAllocation clip;
-  GdkWindow *window;
   GtkAllocation child_allocation;
 
   gtk_widget_set_allocation (widget, allocation);
 
-  window = gtk_widget_get_window (widget);
-  if (window != NULL)
-    gdk_window_move_resize (window,
+  if (priv->view_window)
+    gdk_window_move_resize (priv->view_window,
                             allocation->x, allocation->y,
                             allocation->width, allocation->height);
 
@@ -3112,13 +3113,13 @@ static void
 gtk_flow_box_realize (GtkWidget *widget)
 {
   GtkFlowBox *box = GTK_FLOW_BOX (widget);
+  GtkFlowBoxPrivate *priv = BOX_PRIV (box);
   GtkAllocation allocation;
-  GdkWindow *window;
+  GSequenceIter *iter;
 
   gtk_widget_get_allocation (GTK_WIDGET (box), &allocation);
-  gtk_widget_set_realized (GTK_WIDGET (box), TRUE);
 
-  window = gdk_window_new_child (gtk_widget_get_parent_window (GTK_WIDGET (box)),
+  priv->view_window = gdk_window_new_child (gtk_widget_get_parent_window (GTK_WIDGET (box)),
                                  gtk_widget_get_events (GTK_WIDGET (box))
                                  | GDK_ENTER_NOTIFY_MASK
                                  | GDK_LEAVE_NOTIFY_MASK
@@ -3127,18 +3128,53 @@ gtk_flow_box_realize (GtkWidget *widget)
                                  | GDK_BUTTON_PRESS_MASK
                                  | GDK_BUTTON_RELEASE_MASK,
                                  &allocation);
-  gtk_widget_register_window (GTK_WIDGET (box), window);
-  gtk_widget_set_window (GTK_WIDGET (box), window);
+  gtk_widget_register_window (GTK_WIDGET (box), priv->view_window);
+
+  for (iter = g_sequence_get_begin_iter (priv->children);
+       !g_sequence_iter_is_end (iter);
+       iter = g_sequence_iter_next (iter))
+    {
+      gtk_widget_set_parent_window (g_sequence_get (iter), priv->view_window);
+    }
+
+  GTK_WIDGET_CLASS (gtk_flow_box_parent_class)->realize (widget);
+}
+
+static void
+gtk_flow_box_unrealize (GtkWidget *widget)
+{
+  GtkFlowBox *box = GTK_FLOW_BOX (widget);
+  GtkFlowBoxPrivate *priv = BOX_PRIV (box);
+
+  gtk_widget_unregister_window (widget, priv->view_window);
+  gdk_window_destroy (priv->view_window);
+  priv->view_window = NULL;
+
+  GTK_WIDGET_CLASS (gtk_flow_box_parent_class)->unrealize (widget);
+}
+
+static void
+gtk_flow_box_map (GtkWidget *widget)
+{
+  GtkFlowBox *box = GTK_FLOW_BOX (widget);
+  GtkFlowBoxPrivate *priv = BOX_PRIV (box);
+
+  gdk_window_show (priv->view_window);
+
+  GTK_WIDGET_CLASS (gtk_flow_box_parent_class)->map (widget);
 }
 
 static void
 gtk_flow_box_unmap (GtkWidget *widget)
 {
   GtkFlowBox *box = GTK_FLOW_BOX (widget);
+  GtkFlowBoxPrivate *priv = BOX_PRIV (box);
 
   remove_autoscroll (box);
 
   GTK_WIDGET_CLASS (gtk_flow_box_parent_class)->unmap (widget);
+
+  gdk_window_hide (priv->view_window);
 }
 
 /* GtkContainer implementation {{{2 */
@@ -3697,6 +3733,8 @@ gtk_flow_box_class_init (GtkFlowBoxClass *class)
   widget_class->motion_notify_event = gtk_flow_box_motion_notify_event;
   widget_class->size_allocate = gtk_flow_box_size_allocate;
   widget_class->realize = gtk_flow_box_realize;
+  widget_class->unrealize = gtk_flow_box_unrealize;
+  widget_class->map = gtk_flow_box_map;
   widget_class->unmap = gtk_flow_box_unmap;
   widget_class->focus = gtk_flow_box_focus;
   widget_class->get_render_node = gtk_flow_box_get_render_node;
@@ -4013,7 +4051,7 @@ gtk_flow_box_init (GtkFlowBox *box)
   GtkFlowBoxPrivate *priv = BOX_PRIV (box);
   GtkCssNode *widget_node;
 
-  gtk_widget_set_has_window (GTK_WIDGET (box), TRUE);
+  gtk_widget_set_has_window (GTK_WIDGET (box), FALSE);
   gtk_widget_set_redraw_on_allocate (GTK_WIDGET (box), TRUE);
 
   priv->orientation = GTK_ORIENTATION_HORIZONTAL;
@@ -4202,6 +4240,8 @@ gtk_flow_box_insert (GtkFlowBox *box,
   gtk_flow_box_insert_css_node (box, GTK_WIDGET (child), iter);
 
   CHILD_PRIV (child)->iter = iter;
+  if (priv->view_window)
+    gtk_widget_set_parent_window (GTK_WIDGET (child), priv->view_window);
   gtk_widget_set_parent (GTK_WIDGET (child), GTK_WIDGET (box));
   gtk_flow_box_apply_filter (box, child);
 }


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