summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBenjamin Otte <otte@redhat.com>2014-05-21 23:13:52 +0200
committerBenjamin Otte <otte@redhat.com>2014-05-23 19:33:14 +0200
commit5b86526a2e3c3616816647602481a07fa6d3a363 (patch)
treebd021cbbf3c78dadb4412b183a355acc156cf5bb
parent15a3f58bf92635143a35f7a946c63c0c0a4fc785 (diff)
downloadgtk+-5b86526a2e3c3616816647602481a07fa6d3a363.tar.gz
widget: Add _gtk_widget_set_css_clip()
... and use it in GtkBox and GtkGrid.
-rw-r--r--gtk/gtkbox.c4
-rw-r--r--gtk/gtkgrid.c3
-rw-r--r--gtk/gtkwidget.c43
-rw-r--r--gtk/gtkwidgetprivate.h3
4 files changed, 52 insertions, 1 deletions
diff --git a/gtk/gtkbox.c b/gtk/gtkbox.c
index 557d9fdac2..b8e87094b2 100644
--- a/gtk/gtkbox.c
+++ b/gtk/gtkbox.c
@@ -791,6 +791,8 @@ gtk_box_size_allocate_no_center (GtkWidget *widget,
i++;
}
}
+
+ _gtk_widget_set_simple_clip (widget);
}
static void
@@ -1158,6 +1160,8 @@ gtk_box_size_allocate_with_center (GtkWidget *widget,
child_allocation.height = center_size;
}
gtk_widget_size_allocate_with_baseline (priv->center->widget, &child_allocation, baseline);
+
+ _gtk_widget_set_simple_clip (widget);
}
static void
diff --git a/gtk/gtkgrid.c b/gtk/gtkgrid.c
index 5c93571ccf..98080fccbc 100644
--- a/gtk/gtkgrid.c
+++ b/gtk/gtkgrid.c
@@ -24,6 +24,7 @@
#include "gtkorientableprivate.h"
#include "gtksizerequest.h"
+#include "gtkwidgetprivate.h"
#include "gtkprivate.h"
#include "gtkintl.h"
@@ -1677,6 +1678,8 @@ gtk_grid_size_allocate (GtkWidget *widget,
gtk_grid_request_position (&request, 1);
gtk_grid_request_allocate_children (&request);
+
+ _gtk_widget_set_simple_clip (widget);
}
static gboolean
diff --git a/gtk/gtkwidget.c b/gtk/gtkwidget.c
index dd8360818d..24b36ce2ae 100644
--- a/gtk/gtkwidget.c
+++ b/gtk/gtkwidget.c
@@ -14987,6 +14987,49 @@ _gtk_widget_supports_clip (GtkWidget *widget)
return widget->priv->supports_clip;
}
+static void
+union_with_clip (GtkWidget *widget,
+ gpointer clip)
+{
+ GtkAllocation widget_clip;
+
+ if (!gtk_widget_is_drawable (widget))
+ return;
+
+ gtk_widget_get_clip (widget, &widget_clip);
+
+ gdk_rectangle_union (&widget_clip, clip, clip);
+}
+
+/**
+ * _gtk_widget_set_simple_clip:
+ * @widget:
+ *
+ * This is a convenience function for gtk_widget_set_clip(), if you
+ * just want to set the clip for @widget based on its allocation,
+ * CSS properties and - if the widget is a #GtkContainer - its
+ * children. gtk_widget_set_allocation() must have been called
+ * and all children must have been allocated with
+ * gtk_widget_size_allocate() before calling this function. It is
+ * therefor a good idea to call this function last in your
+ * implementation of GtkWidget::size_allocate().
+ *
+ * If your widget overdraws its contents, you cannot use this
+ * function and must call gtk_widget_set_clip() yourself.
+ **/
+void
+_gtk_widget_set_simple_clip (GtkWidget *widget)
+{
+ GtkAllocation clip;
+
+ gtk_widget_get_allocation (widget, &clip);
+
+ if (GTK_IS_CONTAINER (widget))
+ gtk_container_forall (GTK_CONTAINER (widget), union_with_clip, &clip);
+
+ gtk_widget_set_clip (widget, &clip);
+}
+
/**
* gtk_widget_get_allocation:
* @widget: a #GtkWidget
diff --git a/gtk/gtkwidgetprivate.h b/gtk/gtkwidgetprivate.h
index b65389d5b2..7634fa3b31 100644
--- a/gtk/gtkwidgetprivate.h
+++ b/gtk/gtkwidgetprivate.h
@@ -132,7 +132,8 @@ void _gtk_widget_buildable_finish_accelerator (GtkWidget *widget,
GtkStyle * _gtk_widget_get_style (GtkWidget *widget);
void _gtk_widget_set_style (GtkWidget *widget,
GtkStyle *style);
-gboolean _gtk_widget_supports_clip (GtkWidget *widget);
+gboolean _gtk_widget_supports_clip (GtkWidget *widget);
+void _gtk_widget_set_simple_clip (GtkWidget *widget);
typedef gboolean (*GtkCapturedEventHandler) (GtkWidget *widget, GdkEvent *event);