[gtk+] flowbox: Turn into no-window widget
- From: Benjamin Otte <otte src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk+] flowbox: Turn into no-window widget
- Date: Mon, 7 Nov 2016 01:05:01 +0000 (UTC)
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]