summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexander Larsson <alexl@redhat.com>2013-04-25 14:00:18 +0200
committerAlexander Larsson <alexl@redhat.com>2013-05-02 19:02:08 +0200
commit5fc83197dd6755e5f5ce07a48fc3b092142e1606 (patch)
tree521d3ffb22dda797525c5a9a8519c51a51fb9489
parentc2c976cb6af39b615ed6e17c9268fb47b903c9ed (diff)
downloadgtk+-5fc83197dd6755e5f5ce07a48fc3b092142e1606.tar.gz
GtkWindow: Move cairo_save/restore from marshaller
We do the save/restore when emitting ::draw rather than in a custom marshaller, as this saves an extra stack frame, which is helpfull now that we do painting fully recursive. This is also likely to save a few cycles.
-rw-r--r--gtk/gtkwidget.c70
1 files changed, 8 insertions, 62 deletions
diff --git a/gtk/gtkwidget.c b/gtk/gtkwidget.c
index a8498ed06a..5a84fa540a 100644
--- a/gtk/gtkwidget.c
+++ b/gtk/gtkwidget.c
@@ -956,64 +956,6 @@ child_property_notify_dispatcher (GObject *object,
GTK_WIDGET_GET_CLASS (object)->dispatch_child_properties_changed (GTK_WIDGET (object), n_pspecs, pspecs);
}
-/* We guard against the draw signal callbacks modifying the state of the
- * cairo context by surounding it with save/restore.
- * Maybe we should also cairo_new_path() just to be sure?
- */
-static void
-gtk_widget_draw_marshaller (GClosure *closure,
- GValue *return_value,
- guint n_param_values,
- const GValue *param_values,
- gpointer invocation_hint,
- gpointer marshal_data)
-{
- cairo_t *cr = g_value_get_boxed (&param_values[1]);
-
- cairo_save (cr);
-
- _gtk_marshal_BOOLEAN__BOXED (closure,
- return_value,
- n_param_values,
- param_values,
- invocation_hint,
- marshal_data);
-
-
- cairo_restore (cr);
-}
-
-static void
-gtk_widget_draw_marshallerv (GClosure *closure,
- GValue *return_value,
- gpointer instance,
- va_list args,
- gpointer marshal_data,
- int n_params,
- GType *param_types)
-{
- cairo_t *cr;
- va_list args_copy;
-
- G_VA_COPY (args_copy, args);
- cr = va_arg (args_copy, gpointer);
-
- cairo_save (cr);
-
- _gtk_marshal_BOOLEAN__BOXEDv (closure,
- return_value,
- instance,
- args,
- marshal_data,
- n_params,
- param_types);
-
-
- cairo_restore (cr);
-
- va_end (args_copy);
-}
-
static void
gtk_widget_class_init (GtkWidgetClass *klass)
{
@@ -1949,12 +1891,12 @@ gtk_widget_class_init (GtkWidgetClass *klass)
G_TYPE_FROM_CLASS (gobject_class),
G_SIGNAL_RUN_LAST,
G_STRUCT_OFFSET (GtkWidgetClass, draw),
- _gtk_boolean_handled_accumulator, NULL,
- gtk_widget_draw_marshaller,
+ _gtk_boolean_handled_accumulator, NULL,
+ _gtk_marshal_BOOLEAN__BOXED,
G_TYPE_BOOLEAN, 1,
- CAIRO_GOBJECT_TYPE_CONTEXT);
+ CAIRO_GOBJECT_TYPE_CONTEXT | G_SIGNAL_TYPE_STATIC_SCOPE);
g_signal_set_va_marshaller (widget_signals[DRAW], G_TYPE_FROM_CLASS (klass),
- gtk_widget_draw_marshallerv);
+ _gtk_marshal_BOOLEAN__BOXEDv);
/**
* GtkWidget::mnemonic-activate:
@@ -6380,10 +6322,14 @@ _gtk_widget_draw_internal (GtkWidget *widget,
{
gboolean result;
+ cairo_save (cr);
+
g_signal_emit (widget, widget_signals[DRAW],
0, cr,
&result);
+ cairo_restore (cr);
+
#ifdef G_ENABLE_DEBUG
if (G_UNLIKELY (gtk_get_debug_flags () & GTK_DEBUG_BASELINES))
{