paned: Fix drawing

Clip children to their window's size. That way no overdraw happens for
these widgets. But don't clip the handle.

We might in the future consider not clipping un-shrinkable children.

https://bugzilla.gnome.org/show_bug.cgi?id=762021
This commit is contained in:
Benjamin Otte
2016-02-14 16:10:07 +01:00
parent 88f0885638
commit 6edb420e51

View File

@@ -1796,23 +1796,42 @@ gtk_paned_render (GtkCssGadget *gadget,
GtkWidget *widget = gtk_css_gadget_get_owner (gadget);
GtkPaned *paned = GTK_PANED (widget);
GtkPanedPrivate *priv = paned->priv;
GtkAllocation widget_allocation;
int window_x, window_y;
cairo_save (cr);
cairo_rectangle (cr, x, y, width, height);
cairo_clip (cr);
gtk_widget_get_allocation (widget, &widget_allocation);
if (gtk_cairo_should_draw_window (cr, gtk_widget_get_window (widget)) &&
priv->child1 && gtk_widget_get_visible (priv->child1) &&
priv->child2 && gtk_widget_get_visible (priv->child2))
gtk_css_gadget_draw (priv->handle_gadget, cr);
if (gtk_cairo_should_draw_window (cr, priv->child1_window))
gtk_container_propagate_draw (GTK_CONTAINER (widget), priv->child1, cr);
if (priv->child1 && gtk_widget_get_visible (priv->child1))
{
gdk_window_get_position (priv->child1_window, &window_x, &window_y);
cairo_save (cr);
cairo_rectangle (cr,
window_x - widget_allocation.x,
window_y - widget_allocation.y,
gdk_window_get_width (priv->child1_window),
gdk_window_get_height (priv->child1_window));
cairo_clip (cr);
gtk_container_propagate_draw (GTK_CONTAINER (widget), priv->child1, cr);
cairo_restore (cr);
}
if (gtk_cairo_should_draw_window (cr, priv->child2_window))
gtk_container_propagate_draw (GTK_CONTAINER (widget), priv->child2, cr);
cairo_restore (cr);
if (priv->child2 && gtk_widget_get_visible (priv->child2))
{
gdk_window_get_position (priv->child2_window, &window_x, &window_y);
cairo_save (cr);
cairo_rectangle (cr,
window_x - widget_allocation.x,
window_y - widget_allocation.y,
gdk_window_get_width (priv->child2_window),
gdk_window_get_height (priv->child2_window));
cairo_clip (cr);
gtk_container_propagate_draw (GTK_CONTAINER (widget), priv->child2, cr);
cairo_restore (cr);
}
return FALSE;
}