[gtk+/rendering-cleanup-next: 3/153] widget: Add draw signal
- From: Benjamin Otte <otte src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk+/rendering-cleanup-next: 3/153] widget: Add draw signal
- Date: Sat, 11 Sep 2010 04:51:41 +0000 (UTC)
commit 77191c61bfe0c45f07dfb5160561dd46e8df31b0
Author: Benjamin Otte <otte redhat com>
Date: Wed Sep 1 20:13:44 2010 +0200
widget: Add draw signal
For now, the draw signal is emitted by default from the expose event, so
widgets can chose to either implement the expose event or the draw
function.
This is for the transitional period from expose event to draw signal.
Note that subclasses can only implement the draw function when none of
their parents implemented the expose event.
gtk/gtkmarshalers.list | 1 +
gtk/gtkwidget.c | 61 +++++++++++++++++++++++++++++++++++++++++++++++-
gtk/gtkwidget.h | 7 +++++
3 files changed, 68 insertions(+), 1 deletions(-)
---
diff --git a/gtk/gtkmarshalers.list b/gtk/gtkmarshalers.list
index 22af46d..f2f02fa 100644
--- a/gtk/gtkmarshalers.list
+++ b/gtk/gtkmarshalers.list
@@ -23,6 +23,7 @@
BOOLEAN:BOXED
BOOLEAN:BOXED,BOXED
+BOOLEAN:BOXED,INT,INT
BOOLEAN:ENUM
BOOLEAN:ENUM,BOOLEAN
BOOLEAN:ENUM,DOUBLE
diff --git a/gtk/gtkwidget.c b/gtk/gtkwidget.c
index f0abfb3..6aef0a4 100644
--- a/gtk/gtkwidget.c
+++ b/gtk/gtkwidget.c
@@ -49,6 +49,7 @@
#include "gdk/gdkprivate.h" /* Used in gtk_reset_shapes_recurse to avoid copy */
#include <gobject/gvaluecollector.h>
#include <gobject/gobjectnotifyqueue.c>
+#include <cairo-gobject.h>
#include "gdk/gdkkeysyms.h"
#include "gtkaccessible.h"
#include "gtktooltip.h"
@@ -198,6 +199,7 @@ enum {
DIRECTION_CHANGED,
GRAB_NOTIFY,
CHILD_NOTIFY,
+ DRAW,
MNEMONIC_ACTIVATE,
GRAB_FOCUS,
FOCUS,
@@ -333,6 +335,8 @@ static gboolean gtk_widget_real_show_help (GtkWidget *widget,
static void gtk_widget_dispatch_child_properties_changed (GtkWidget *object,
guint n_pspecs,
GParamSpec **pspecs);
+static gboolean gtk_widget_real_expose_event (GtkWidget *widget,
+ GdkEventExpose *event);
static gboolean gtk_widget_real_key_press_event (GtkWidget *widget,
GdkEventKey *event);
static gboolean gtk_widget_real_key_release_event (GtkWidget *widget,
@@ -572,6 +576,7 @@ gtk_widget_class_init (GtkWidgetClass *klass)
klass->direction_changed = gtk_widget_real_direction_changed;
klass->grab_notify = NULL;
klass->child_notify = NULL;
+ klass->draw = NULL;
klass->mnemonic_activate = gtk_widget_real_mnemonic_activate;
klass->grab_focus = gtk_widget_real_grab_focus;
klass->focus = gtk_widget_real_focus;
@@ -581,7 +586,7 @@ gtk_widget_class_init (GtkWidgetClass *klass)
klass->motion_notify_event = NULL;
klass->delete_event = NULL;
klass->destroy_event = NULL;
- klass->expose_event = NULL;
+ klass->expose_event = gtk_widget_real_expose_event;
klass->key_press_event = gtk_widget_real_key_press_event;
klass->key_release_event = gtk_widget_real_key_release_event;
klass->enter_notify_event = NULL;
@@ -1096,6 +1101,28 @@ gtk_widget_class_init (GtkWidgetClass *klass)
G_TYPE_PARAM);
/**
+ * GtkWidget::draw:
+ * @widget: the object which received the signal
+ * @cr: the cairo context to draw to
+ * @width: width of the widget
+ * @height: height of the widget
+ *
+ * This signal is emitted when a widget is supposed to render itself.
+ * The @widget's top left corner is supposed to be painted at the
+ * origin of the passed in context and be sized in the given @width
+ * and @height.
+ */
+ widget_signals[DRAW] =
+ g_signal_new (I_("draw"),
+ G_TYPE_FROM_CLASS (gobject_class),
+ G_SIGNAL_RUN_LAST,
+ G_STRUCT_OFFSET (GtkWidgetClass, draw),
+ _gtk_boolean_handled_accumulator, NULL,
+ _gtk_marshal_BOOLEAN__BOXED_INT_INT,
+ G_TYPE_BOOLEAN, 3,
+ CAIRO_GOBJECT_TYPE_CONTEXT, G_TYPE_UINT, G_TYPE_UINT);
+
+ /**
* GtkWidget::mnemonic-activate:
* @widget: the object which received the signal.
* @arg1:
@@ -4654,6 +4681,38 @@ gtk_widget_real_mnemonic_activate (GtkWidget *widget,
}
static gboolean
+gtk_widget_real_expose_event (GtkWidget *widget,
+ GdkEventExpose *expose)
+{
+ gboolean result = FALSE;
+ cairo_t *cr;
+
+ if (!gtk_widget_is_drawable (widget))
+ return FALSE;
+
+ cr = gdk_cairo_create (expose->window);
+ gdk_cairo_region (cr, expose->region);
+ cairo_clip (cr);
+
+ if (!gtk_widget_get_has_window (widget))
+ {
+ cairo_translate (cr,
+ widget->priv->allocation.x,
+ widget->priv->allocation.y);
+ }
+
+ g_signal_emit (widget, widget_signals[DRAW],
+ 0, cr,
+ widget->priv->allocation.width,
+ widget->priv->allocation.height,
+ &result);
+
+ cairo_destroy (cr);
+
+ return result;
+}
+
+static gboolean
gtk_widget_real_key_press_event (GtkWidget *widget,
GdkEventKey *event)
{
diff --git a/gtk/gtkwidget.h b/gtk/gtkwidget.h
index 418fe6c..67a1301 100644
--- a/gtk/gtkwidget.h
+++ b/gtk/gtkwidget.h
@@ -331,6 +331,10 @@ struct _GtkWidgetClass
gboolean was_grabbed);
void (* child_notify) (GtkWidget *widget,
GParamSpec *pspec);
+ gboolean (* draw) (GtkWidget *widget,
+ cairo_t *cr,
+ int width,
+ int height);
/* Mnemonics */
gboolean (* mnemonic_activate) (GtkWidget *widget,
@@ -873,6 +877,9 @@ void gtk_widget_set_has_tooltip (GtkWidget *widget,
gboolean has_tooltip);
gboolean gtk_widget_get_has_tooltip (GtkWidget *widget);
+gboolean gtk_cairo_should_draw_window (cairo_t *cr,
+ GdkWindow *window);
+
GType gtk_requisition_get_type (void) G_GNUC_CONST;
GtkRequisition *gtk_requisition_new (void) G_GNUC_MALLOC;
GtkRequisition *gtk_requisition_copy (const GtkRequisition *requisition);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]