summaryrefslogtreecommitdiffstats
path: root/src/display
diff options
context:
space:
mode:
authorAlex Valavanis <valavanisalex@gmail.com>2012-06-09 13:40:09 +0000
committerAlex Valavanis <valavanisalex@gmail.com>2012-06-09 13:40:09 +0000
commit62dd6c138e3547689acdcccbb289d822b458cdb0 (patch)
treedf7a4a357c7483216c7d805406bd79ff3c21c7c1 /src/display
parentMove measure angle string to keep it visible when angle is small. (diff)
downloadinkscape-62dd6c138e3547689acdcccbb289d822b458cdb0.tar.gz
inkscape-62dd6c138e3547689acdcccbb289d822b458cdb0.zip
Stop deriving SPCanvasItem from GtkObject
(bzr r11469.1.1)
Diffstat (limited to 'src/display')
-rw-r--r--src/display/canvas-arena.cpp22
-rw-r--r--src/display/canvas-bpath.cpp21
-rw-r--r--src/display/canvas-grid.cpp24
-rw-r--r--src/display/canvas-temporary-item.cpp3
-rw-r--r--src/display/canvas-text.cpp16
-rw-r--r--src/display/gnome-canvas-acetate.cpp17
-rw-r--r--src/display/guideline.cpp14
-rw-r--r--src/display/sodipodi-ctrl.cpp24
-rw-r--r--src/display/sodipodi-ctrlrect.cpp12
-rw-r--r--src/display/sp-canvas-item.h22
-rw-r--r--src/display/sp-canvas.cpp202
-rw-r--r--src/display/sp-ctrlcurve.cpp8
-rw-r--r--src/display/sp-ctrlline.cpp8
-rw-r--r--src/display/sp-ctrlpoint.cpp16
-rw-r--r--src/display/sp-ctrlquadr.cpp13
15 files changed, 233 insertions, 189 deletions
diff --git a/src/display/canvas-arena.cpp b/src/display/canvas-arena.cpp
index 9aa119be9..f0fd63ef4 100644
--- a/src/display/canvas-arena.cpp
+++ b/src/display/canvas-arena.cpp
@@ -32,7 +32,7 @@ enum {
static void sp_canvas_arena_class_init(SPCanvasArenaClass *klass);
static void sp_canvas_arena_init(SPCanvasArena *group);
-static void sp_canvas_arena_destroy(GtkObject *object);
+static void sp_canvas_arena_destroy(SPCanvasItem *object);
static void sp_canvas_arena_item_deleted(SPCanvasArena *arena, Inkscape::DrawingItem *item);
static void sp_canvas_arena_update (SPCanvasItem *item, Geom::Affine const &affine, unsigned int flags);
@@ -93,24 +93,19 @@ sp_canvas_arena_get_type (void)
static void
sp_canvas_arena_class_init (SPCanvasArenaClass *klass)
{
- GtkObjectClass *object_class;
- SPCanvasItemClass *item_class;
-
- object_class = (GtkObjectClass *) klass;
- item_class = (SPCanvasItemClass *) klass;
+ SPCanvasItemClass *item_class = (SPCanvasItemClass *) klass;
parent_class = (SPCanvasItemClass*)g_type_class_peek_parent (klass);
signals[ARENA_EVENT] = g_signal_new ("arena_event",
- G_TYPE_FROM_CLASS(object_class),
+ G_TYPE_FROM_CLASS(item_class),
G_SIGNAL_RUN_LAST,
((glong)((guint8*)&(klass->arena_event) - (guint8*)klass)),
NULL, NULL,
sp_marshal_INT__POINTER_POINTER,
G_TYPE_INT, 2, G_TYPE_POINTER, G_TYPE_POINTER);
- object_class->destroy = sp_canvas_arena_destroy;
-
+ item_class->destroy = sp_canvas_arena_destroy;
item_class->update = sp_canvas_arena_update;
item_class->render = sp_canvas_arena_render;
item_class->point = sp_canvas_arena_point;
@@ -147,16 +142,15 @@ sp_canvas_arena_init (SPCanvasArena *arena)
arena->active = NULL;
}
-static void
-sp_canvas_arena_destroy (GtkObject *object)
+static void sp_canvas_arena_destroy(SPCanvasItem *object)
{
- SPCanvasArena *arena = SP_CANVAS_ARENA (object);
+ SPCanvasArena *arena = SP_CANVAS_ARENA(object);
delete arena->observer;
arena->drawing.~Drawing();
- if (GTK_OBJECT_CLASS (parent_class)->destroy)
- (* GTK_OBJECT_CLASS (parent_class)->destroy) (object);
+ if (SP_CANVAS_ITEM_CLASS(parent_class)->destroy)
+ (* SP_CANVAS_ITEM_CLASS(parent_class)->destroy) (object);
}
static void
diff --git a/src/display/canvas-bpath.cpp b/src/display/canvas-bpath.cpp
index 11bccf2a6..ee9e14f10 100644
--- a/src/display/canvas-bpath.cpp
+++ b/src/display/canvas-bpath.cpp
@@ -29,7 +29,7 @@
static void sp_canvas_bpath_class_init (SPCanvasBPathClass *klass);
static void sp_canvas_bpath_init (SPCanvasBPath *path);
-static void sp_canvas_bpath_destroy (GtkObject *object);
+static void sp_canvas_bpath_destroy(SPCanvasItem *object);
static void sp_canvas_bpath_update (SPCanvasItem *item, Geom::Affine const &affine, unsigned int flags);
static void sp_canvas_bpath_render (SPCanvasItem *item, SPCanvasBuf *buf);
@@ -57,19 +57,13 @@ sp_canvas_bpath_get_type (void)
return type;
}
-static void
-sp_canvas_bpath_class_init (SPCanvasBPathClass *klass)
+static void sp_canvas_bpath_class_init(SPCanvasBPathClass *klass)
{
- GtkObjectClass *object_class;
- SPCanvasItemClass *item_class;
-
- object_class = GTK_OBJECT_CLASS (klass);
- item_class = (SPCanvasItemClass *) klass;
+ SPCanvasItemClass *item_class = (SPCanvasItemClass *) klass;
parent_class = (SPCanvasItemClass*)g_type_class_peek_parent (klass);
- object_class->destroy = sp_canvas_bpath_destroy;
-
+ item_class->destroy = sp_canvas_bpath_destroy;
item_class->update = sp_canvas_bpath_update;
item_class->render = sp_canvas_bpath_render;
item_class->point = sp_canvas_bpath_point;
@@ -88,8 +82,7 @@ sp_canvas_bpath_init (SPCanvasBPath * bpath)
bpath->stroke_miterlimit = 11.0;
}
-static void
-sp_canvas_bpath_destroy (GtkObject *object)
+static void sp_canvas_bpath_destroy(SPCanvasItem *object)
{
SPCanvasBPath *cbp = SP_CANVAS_BPATH (object);
@@ -97,8 +90,8 @@ sp_canvas_bpath_destroy (GtkObject *object)
cbp->curve = cbp->curve->unref();
}
- if (GTK_OBJECT_CLASS (parent_class)->destroy)
- (* GTK_OBJECT_CLASS (parent_class)->destroy) (object);
+ if (SP_CANVAS_ITEM_CLASS(parent_class)->destroy)
+ (* SP_CANVAS_ITEM_CLASS(parent_class)->destroy) (object);
}
static void sp_canvas_bpath_update(SPCanvasItem *item, Geom::Affine const &affine, unsigned int flags)
diff --git a/src/display/canvas-grid.cpp b/src/display/canvas-grid.cpp
index 92a1b0fb8..2ba748022 100644
--- a/src/display/canvas-grid.cpp
+++ b/src/display/canvas-grid.cpp
@@ -57,8 +57,7 @@ static gchar const *const grid_svgname[] = {
// Grid CanvasItem
static void grid_canvasitem_class_init (GridCanvasItemClass *klass);
static void grid_canvasitem_init (GridCanvasItem *grid);
-static void grid_canvasitem_destroy (GtkObject *object);
-
+static void grid_canvasitem_destroy(SPCanvasItem *object);
static void grid_canvasitem_update (SPCanvasItem *item, Geom::Affine const &affine, unsigned int flags);
static void grid_canvasitem_render (SPCanvasItem *item, SPCanvasBuf *buf);
@@ -86,19 +85,13 @@ grid_canvasitem_get_type (void)
return grid_canvasitem_type;
}
-static void
-grid_canvasitem_class_init (GridCanvasItemClass *klass)
+static void grid_canvasitem_class_init(GridCanvasItemClass *klass)
{
- GtkObjectClass *object_class;
- SPCanvasItemClass *item_class;
-
- object_class = (GtkObjectClass *) klass;
- item_class = (SPCanvasItemClass *) klass;
+ SPCanvasItemClass *item_class = (SPCanvasItemClass *) klass;
parent_class = (SPCanvasItemClass*)g_type_class_peek_parent (klass);
- object_class->destroy = grid_canvasitem_destroy;
-
+ item_class->destroy = grid_canvasitem_destroy;
item_class->update = grid_canvasitem_update;
item_class->render = grid_canvasitem_render;
}
@@ -109,14 +102,13 @@ grid_canvasitem_init (GridCanvasItem *griditem)
griditem->grid = NULL;
}
-static void
-grid_canvasitem_destroy (GtkObject *object)
+static void grid_canvasitem_destroy(SPCanvasItem *object)
{
g_return_if_fail (object != NULL);
g_return_if_fail (INKSCAPE_IS_GRID_CANVASITEM (object));
- if (GTK_OBJECT_CLASS (parent_class)->destroy)
- (* GTK_OBJECT_CLASS (parent_class)->destroy) (object);
+ if (SP_CANVAS_ITEM_CLASS(parent_class)->destroy)
+ (* SP_CANVAS_ITEM_CLASS(parent_class)->destroy) (object);
}
/**
@@ -184,7 +176,7 @@ CanvasGrid::~CanvasGrid()
}
while (canvasitems) {
- gtk_object_destroy(GTK_OBJECT(canvasitems->data));
+ sp_canvas_item_destroy(SP_CANVAS_ITEM(canvasitems->data));
canvasitems = g_slist_remove(canvasitems, canvasitems->data);
}
}
diff --git a/src/display/canvas-temporary-item.cpp b/src/display/canvas-temporary-item.cpp
index abe5f2f1b..551ea1536 100644
--- a/src/display/canvas-temporary-item.cpp
+++ b/src/display/canvas-temporary-item.cpp
@@ -17,6 +17,7 @@
#include "display/canvas-temporary-item.h"
#include <gtk/gtk.h>
+#include "display/sp-canvas-item.h"
namespace Inkscape {
namespace Display {
@@ -48,7 +49,7 @@ TemporaryItem::~TemporaryItem()
if (canvasitem) {
// destroying the item automatically hides it
- gtk_object_destroy (GTK_OBJECT (canvasitem));
+ sp_canvas_item_destroy(canvasitem);
canvasitem = NULL;
}
}
diff --git a/src/display/canvas-text.cpp b/src/display/canvas-text.cpp
index c7ca4ab16..ddc946d5d 100644
--- a/src/display/canvas-text.cpp
+++ b/src/display/canvas-text.cpp
@@ -28,7 +28,7 @@
static void sp_canvastext_class_init (SPCanvasTextClass *klass);
static void sp_canvastext_init (SPCanvasText *canvastext);
-static void sp_canvastext_destroy (GtkObject *object);
+static void sp_canvastext_destroy(SPCanvasItem *object);
static void sp_canvastext_update (SPCanvasItem *item, Geom::Affine const &affine, unsigned int flags);
static void sp_canvastext_render (SPCanvasItem *item, SPCanvasBuf *buf);
@@ -56,16 +56,13 @@ sp_canvastext_get_type (void)
return type;
}
-static void
-sp_canvastext_class_init (SPCanvasTextClass *klass)
+static void sp_canvastext_class_init(SPCanvasTextClass *klass)
{
- GtkObjectClass *object_class = (GtkObjectClass *) klass;
SPCanvasItemClass *item_class = (SPCanvasItemClass *) klass;
parent_class_ct = (SPCanvasItemClass*)g_type_class_peek_parent (klass);
- object_class->destroy = sp_canvastext_destroy;
-
+ item_class->destroy = sp_canvastext_destroy;
item_class->update = sp_canvastext_update;
item_class->render = sp_canvastext_render;
}
@@ -93,8 +90,7 @@ sp_canvastext_init (SPCanvasText *canvastext)
canvastext->border = 3; // must be a constant, and not proportional to any width, height, or fontsize to allow alignment with other text boxes
}
-static void
-sp_canvastext_destroy (GtkObject *object)
+static void sp_canvastext_destroy(SPCanvasItem *object)
{
g_return_if_fail (object != NULL);
g_return_if_fail (SP_IS_CANVASTEXT (object));
@@ -105,8 +101,8 @@ sp_canvastext_destroy (GtkObject *object)
canvastext->text = NULL;
canvastext->item = NULL;
- if (GTK_OBJECT_CLASS (parent_class_ct)->destroy)
- (* GTK_OBJECT_CLASS (parent_class_ct)->destroy) (object);
+ if (SP_CANVAS_ITEM_CLASS(parent_class_ct)->destroy)
+ (* SP_CANVAS_ITEM_CLASS(parent_class_ct)->destroy) (object);
}
static void
diff --git a/src/display/gnome-canvas-acetate.cpp b/src/display/gnome-canvas-acetate.cpp
index 0891836b5..2cd0f296d 100644
--- a/src/display/gnome-canvas-acetate.cpp
+++ b/src/display/gnome-canvas-acetate.cpp
@@ -17,7 +17,7 @@
static void sp_canvas_acetate_class_init (SPCanvasAcetateClass *klass);
static void sp_canvas_acetate_init (SPCanvasAcetate *acetate);
-static void sp_canvas_acetate_destroy (GtkObject *object);
+static void sp_canvas_acetate_destroy(SPCanvasItem *object);
static void sp_canvas_acetate_update (SPCanvasItem *item, Geom::Affine const &affine, unsigned int flags);
static double sp_canvas_acetate_point (SPCanvasItem *item, Geom::Point p, SPCanvasItem **actual_item);
@@ -45,16 +45,11 @@ GType sp_canvas_acetate_get_type (void)
static void sp_canvas_acetate_class_init (SPCanvasAcetateClass *klass)
{
- GtkObjectClass *object_class;
- SPCanvasItemClass *item_class;
-
- object_class = (GtkObjectClass *) klass;
- item_class = (SPCanvasItemClass *) klass;
+ SPCanvasItemClass *item_class = (SPCanvasItemClass *) klass;
parent_class = (SPCanvasItemClass*)g_type_class_peek_parent (klass);
- object_class->destroy = sp_canvas_acetate_destroy;
-
+ item_class->destroy = sp_canvas_acetate_destroy;
item_class->update = sp_canvas_acetate_update;
item_class->point = sp_canvas_acetate_point;
}
@@ -64,13 +59,13 @@ static void sp_canvas_acetate_init (SPCanvasAcetate */*acetate*/)
/* Nothing here */
}
-static void sp_canvas_acetate_destroy (GtkObject *object)
+static void sp_canvas_acetate_destroy(SPCanvasItem *object)
{
g_return_if_fail (object != NULL);
g_return_if_fail (GNOME_IS_CANVAS_ACETATE (object));
- if (GTK_OBJECT_CLASS (parent_class)->destroy)
- (* GTK_OBJECT_CLASS (parent_class)->destroy) (object);
+ if (SP_CANVAS_ITEM_CLASS(parent_class)->destroy)
+ (* SP_CANVAS_ITEM_CLASS(parent_class)->destroy) (object);
}
static void sp_canvas_acetate_update( SPCanvasItem *item, Geom::Affine const &/*affine*/, unsigned int /*flags*/ )
diff --git a/src/display/guideline.cpp b/src/display/guideline.cpp
index 652f4e2d7..d3385978a 100644
--- a/src/display/guideline.cpp
+++ b/src/display/guideline.cpp
@@ -31,7 +31,7 @@ using Inkscape::ControlManager;
static void sp_guideline_class_init(SPGuideLineClass *c);
static void sp_guideline_init(SPGuideLine *guideline);
-static void sp_guideline_destroy(GtkObject *object);
+static void sp_guideline_destroy(SPCanvasItem *object);
static void sp_guideline_update(SPCanvasItem *item, Geom::Affine const &affine, unsigned int flags);
static void sp_guideline_render(SPCanvasItem *item, SPCanvasBuf *buf);
@@ -68,10 +68,8 @@ static void sp_guideline_class_init(SPGuideLineClass *c)
{
parent_class = (SPCanvasItemClass*) g_type_class_peek_parent(c);
- GtkObjectClass *object_class = (GtkObjectClass *) c;
- object_class->destroy = sp_guideline_destroy;
-
SPCanvasItemClass *item_class = (SPCanvasItemClass *) c;
+ item_class->destroy = sp_guideline_destroy;
item_class->update = sp_guideline_update;
item_class->render = sp_guideline_render;
item_class->point = sp_guideline_point;
@@ -90,7 +88,7 @@ static void sp_guideline_init(SPGuideLine *gl)
gl->label = NULL;
}
-static void sp_guideline_destroy(GtkObject *object)
+static void sp_guideline_destroy(SPCanvasItem *object)
{
g_return_if_fail (object != NULL);
g_return_if_fail (SP_IS_GUIDELINE (object));
@@ -98,13 +96,13 @@ static void sp_guideline_destroy(GtkObject *object)
//g_return_if_fail (SP_IS_CTRLPOINT(SP_GUIDELINE(object)->origin));
if (SP_GUIDELINE(object)->origin != NULL && SP_IS_CTRLPOINT(SP_GUIDELINE(object)->origin)) {
- gtk_object_destroy(GTK_OBJECT(SP_GUIDELINE(object)->origin));
+ sp_canvas_item_destroy(SP_GUIDELINE(object)->origin);
} else {
// FIXME: This branch shouldn't be reached (although it seems to be harmless).
//g_error("Why can it be that gl->origin is not a valid SPCtrlPoint?\n");
}
- GTK_OBJECT_CLASS(parent_class)->destroy(object);
+ SP_CANVAS_ITEM_CLASS(parent_class)->destroy(object);
}
static void sp_guideline_render(SPCanvasItem *item, SPCanvasBuf *buf)
@@ -290,7 +288,7 @@ void sp_guideline_set_sensitive(SPGuideLine *gl, int sensitive)
void sp_guideline_delete(SPGuideLine *gl)
{
//gtk_object_destroy(GTK_OBJECT(gl->origin));
- gtk_object_destroy(GTK_OBJECT(gl));
+ sp_canvas_item_destroy(SP_CANVAS_ITEM(gl));
}
static void
diff --git a/src/display/sodipodi-ctrl.cpp b/src/display/sodipodi-ctrl.cpp
index 725ead0d6..e21bdff15 100644
--- a/src/display/sodipodi-ctrl.cpp
+++ b/src/display/sodipodi-ctrl.cpp
@@ -28,7 +28,7 @@ enum {
static void sp_ctrl_class_init (SPCtrlClass *klass);
static void sp_ctrl_init (SPCtrl *ctrl);
-static void sp_ctrl_destroy (GtkObject *object);
+static void sp_ctrl_destroy(SPCanvasItem *object);
static void sp_ctrl_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec);
static void sp_ctrl_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec);
static void sp_ctrl_update (SPCanvasItem *item, Geom::Affine const &affine, unsigned int flags);
@@ -63,19 +63,13 @@ sp_ctrl_get_type (void)
static void
sp_ctrl_class_init (SPCtrlClass *klass)
{
- GtkObjectClass *object_class;
- SPCanvasItemClass *item_class;
- GObjectClass *g_object_class;
-
- object_class = (GtkObjectClass *) klass;
- item_class = (SPCanvasItemClass *) klass;
- g_object_class = (GObjectClass *) klass;
+ SPCanvasItemClass *item_class = (SPCanvasItemClass *) klass;
+ GObjectClass *g_object_class = (GObjectClass *) klass;
parent_class = (SPCanvasItemClass *)g_type_class_peek_parent (klass);
g_object_class->set_property = sp_ctrl_set_property;
g_object_class->get_property = sp_ctrl_get_property;
- object_class->destroy = sp_ctrl_destroy;
g_object_class_install_property (g_object_class,
ARG_SHAPE, g_param_spec_int ("shape", "shape", "Shape", 0, G_MAXINT, SP_CTRL_SHAPE_SQUARE, (GParamFlags) G_PARAM_READWRITE));
@@ -96,6 +90,7 @@ sp_ctrl_class_init (SPCtrlClass *klass)
g_object_class_install_property (g_object_class,
ARG_STROKE_COLOR, g_param_spec_int ("stroke_color", "stroke_color", "Stroke Color", G_MININT, G_MAXINT, 0x000000ff, (GParamFlags) G_PARAM_READWRITE));
+ item_class->destroy = sp_ctrl_destroy;
item_class->update = sp_ctrl_update;
item_class->render = sp_ctrl_render;
item_class->point = sp_ctrl_point;
@@ -268,23 +263,20 @@ sp_ctrl_init (SPCtrl *ctrl)
ctrl->_point = Geom::Point(0,0);
}
-static void
-sp_ctrl_destroy (GtkObject *object)
+static void sp_ctrl_destroy(SPCanvasItem *object)
{
- SPCtrl *ctrl;
-
g_return_if_fail (object != NULL);
g_return_if_fail (SP_IS_CTRL (object));
- ctrl = SP_CTRL (object);
+ SPCtrl *ctrl = SP_CTRL (object);
if (ctrl->cache) {
delete[] ctrl->cache;
ctrl->cache = NULL;
}
- if (GTK_OBJECT_CLASS (parent_class)->destroy)
- (* GTK_OBJECT_CLASS (parent_class)->destroy) (object);
+ if (SP_CANVAS_ITEM_CLASS(parent_class)->destroy)
+ (* SP_CANVAS_ITEM_CLASS(parent_class)->destroy) (object);
}
static void
diff --git a/src/display/sodipodi-ctrlrect.cpp b/src/display/sodipodi-ctrlrect.cpp
index 3b50d0b5d..b0c997a92 100644
--- a/src/display/sodipodi-ctrlrect.cpp
+++ b/src/display/sodipodi-ctrlrect.cpp
@@ -28,7 +28,7 @@
static void sp_ctrlrect_class_init(SPCtrlRectClass *c);
static void sp_ctrlrect_init(CtrlRect *ctrlrect);
-static void sp_ctrlrect_destroy(GtkObject *object);
+static void sp_ctrlrect_destroy(SPCanvasItem *object);
static void sp_ctrlrect_update(SPCanvasItem *item, Geom::Affine const &affine, unsigned int flags);
static void sp_ctrlrect_render(SPCanvasItem *item, SPCanvasBuf *buf);
@@ -61,13 +61,11 @@ GType sp_ctrlrect_get_type()
static void sp_ctrlrect_class_init(SPCtrlRectClass *c)
{
- GtkObjectClass *object_class = (GtkObjectClass *) c;
SPCanvasItemClass *item_class = (SPCanvasItemClass *) c;
parent_class = (SPCanvasItemClass*) g_type_class_peek_parent(c);
- object_class->destroy = sp_ctrlrect_destroy;
-
+ item_class->destroy = sp_ctrlrect_destroy;
item_class->update = sp_ctrlrect_update;
item_class->render = sp_ctrlrect_render;
}
@@ -77,10 +75,10 @@ static void sp_ctrlrect_init(CtrlRect *cr)
cr->init();
}
-static void sp_ctrlrect_destroy(GtkObject *object)
+static void sp_ctrlrect_destroy(SPCanvasItem *object)
{
- if (GTK_OBJECT_CLASS(parent_class)->destroy) {
- (* GTK_OBJECT_CLASS(parent_class)->destroy)(object);
+ if (SP_CANVAS_ITEM_CLASS(parent_class)->destroy) {
+ (* SP_CANVAS_ITEM_CLASS(parent_class)->destroy)(object);
}
}
diff --git a/src/display/sp-canvas-item.h b/src/display/sp-canvas-item.h
index ecbbd2758..f34ec453c 100644
--- a/src/display/sp-canvas-item.h
+++ b/src/display/sp-canvas-item.h
@@ -39,14 +39,17 @@ typedef struct _SPCanvasItemClass SPCanvasItemClass;
#define SP_TYPE_CANVAS_ITEM (SPCanvasItem::getType())
#define SP_CANVAS_ITEM(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), SP_TYPE_CANVAS_ITEM, SPCanvasItem))
+#define SP_CANVAS_ITEM_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), SP_TYPE_CANVAS_ITEM, SPCanvasItemClass))
#define SP_IS_CANVAS_ITEM(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), SP_TYPE_CANVAS_ITEM))
#define SP_CANVAS_ITEM_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS((o), SP_TYPE_CANVAS_ITEM, SPCanvasItemClass))
+
/**
* An SPCanvasItem refers to a SPCanvas and to its parent item; it has
* four coordinates, a bounding rectangle, and a transformation matrix.
*/
-struct SPCanvasItem : public GtkObject {
+struct SPCanvasItem {
+ GInitiallyUnowned parent_instance;
static GType getType();
SPCanvas *canvas;
@@ -66,12 +69,16 @@ struct SPCanvasItem : public GtkObject {
gboolean visible;
gboolean need_update;
gboolean need_affine;
+
+ bool in_destruction;
};
/**
* The vtable of an SPCanvasItem.
*/
-struct _SPCanvasItemClass : public GtkObjectClass {
+struct _SPCanvasItemClass {
+ GInitiallyUnownedClass parent_class;
+
void (* update) (SPCanvasItem *item, Geom::Affine const &affine, unsigned int flags);
void (* render) (SPCanvasItem *item, SPCanvasBuf *buf);
@@ -79,6 +86,16 @@ struct _SPCanvasItemClass : public GtkObjectClass {
int (* event) (SPCanvasItem *item, GdkEvent *event);
void (* viewbox_changed) (SPCanvasItem *item, Geom::IntRect const &new_area);
+
+ /* Default signal handler for the ::destroy signal, which is
+ * invoked to request that references to the widget be dropped.
+ * If an object class overrides destroy() in order to perform class
+ * specific destruction then it must still invoke its superclass'
+ * implementation of the method after it is finished with its
+ * own cleanup. (See gtk_widget_real_destroy() for an example of
+ * how to do this).
+ */
+ void (*destroy) (SPCanvasItem *object);
};
/**
@@ -96,6 +113,7 @@ void sp_canvas_item_lower(SPCanvasItem *item, int positions);
bool sp_canvas_item_is_visible(SPCanvasItem *item);
void sp_canvas_item_show(SPCanvasItem *item);
void sp_canvas_item_hide(SPCanvasItem *item);
+void sp_canvas_item_destroy(SPCanvasItem *item);
int sp_canvas_item_grab(SPCanvasItem *item, unsigned int event_mask, GdkCursor *cursor, guint32 etime);
void sp_canvas_item_ungrab(SPCanvasItem *item, guint32 etime);
diff --git a/src/display/sp-canvas.cpp b/src/display/sp-canvas.cpp
index eff3b7ac2..2d8bb55ad 100644
--- a/src/display/sp-canvas.cpp
+++ b/src/display/sp-canvas.cpp
@@ -90,7 +90,7 @@ struct SPCanvasGroup {
* Callback that destroys all items in group and calls group's virtual
* destroy() function.
*/
- static void destroy(GtkObject *object);
+ static void destroy(SPCanvasItem *object);
/**
* Update handler for canvas groups.
@@ -159,6 +159,14 @@ enum {
void trackLatency(GdkEvent const *event);
+enum {
+ DESTROY,
+ LAST_SIGNAL
+};
+
+void sp_canvas_item_base_class_init(SPCanvasItemClass *klass);
+void sp_canvas_item_base_class_finalize(SPCanvasItemClass *klass);
+
/**
* Initializes the SPCanvasItem vtable and the "event" signal.
*/
@@ -167,12 +175,17 @@ void sp_canvas_item_class_init(SPCanvasItemClass *klass);
/**
* Callback for initialization of SPCanvasItem.
*/
-void sp_canvas_item_init(SPCanvasItem *item);
+void sp_canvas_item_init(SPCanvasItem *item, SPCanvasItemClass *klass);
/**
* Callback that removes item from all referers and destroys it.
*/
-void sp_canvas_item_dispose(GObject *object);
+void sp_canvas_item_dispose(GObject *object);
+void sp_canvas_item_finalize(GObject *object);
+void sp_canvas_item_real_destroy(SPCanvasItem *object);
+
+static gpointer parent_class = NULL;
+static guint object_signals[LAST_SIGNAL] = { 0 };
/**
* Sets up the newly created SPCanvasItem.
@@ -228,7 +241,7 @@ public:
/**
* Destroy handler for SPCanvas.
*/
- static void destroy(GtkObject *object);
+ static void dispose(GObject *object);
/**
* The canvas widget's realize callback.
@@ -370,29 +383,43 @@ GtkWidgetClass *SPCanvasImpl::parentClass = 0;
GType SPCanvasItem::getType()
{
- static GType type = 0;
- if (!type) {
- static GTypeInfo const info = {
+ static GType object_type = 0;
+
+ if (!object_type) {
+ static GTypeInfo const object_info = {
sizeof(SPCanvasItemClass),
- NULL, NULL,
+ reinterpret_cast<GBaseInitFunc>(sp_canvas_item_base_class_init),
+ reinterpret_cast<GBaseFinalizeFunc>(sp_canvas_item_base_class_finalize),
reinterpret_cast<GClassInitFunc>(sp_canvas_item_class_init),
- NULL, NULL,
+ NULL, // class_finalize
+ NULL, // class_data
sizeof(SPCanvasItem),
- 0,
+ 16, // n_preallocs
reinterpret_cast<GInstanceInitFunc>(sp_canvas_item_init),
- NULL
+ NULL // value_table
};
- type = g_type_register_static(GTK_TYPE_OBJECT, "SPCanvasItem", &info, GTypeFlags(0));
+
+ object_type = g_type_register_static(G_TYPE_INITIALLY_UNOWNED,
+ "SPCanvasItem", &object_info, GTypeFlags(0));
}
- return type;
+ return object_type;
}
namespace {
+void sp_canvas_item_base_class_init(SPCanvasItemClass *klass)
+{
+}
+
+void sp_canvas_item_base_class_finalize(SPCanvasItemClass *klass)
+{
+}
+
void sp_canvas_item_class_init(SPCanvasItemClass *klass)
{
- GObjectClass *object_class = (GObjectClass *) klass;
+ GObjectClass *gobject_class = (GObjectClass *) klass;
+ parent_class = g_type_class_ref (G_TYPE_OBJECT);
item_signals[ITEM_EVENT] = g_signal_new ("event",
G_TYPE_FROM_CLASS (klass),
@@ -403,10 +430,21 @@ void sp_canvas_item_class_init(SPCanvasItemClass *klass)
G_TYPE_BOOLEAN, 1,
GDK_TYPE_EVENT);
- object_class->dispose = sp_canvas_item_dispose;
+ gobject_class->dispose = sp_canvas_item_dispose;
+ gobject_class->finalize = sp_canvas_item_finalize;
+ klass->destroy = sp_canvas_item_real_destroy;
+
+ object_signals[DESTROY] =
+ g_signal_new ("destroy",
+ G_TYPE_FROM_CLASS (gobject_class),
+ (GSignalFlags)(G_SIGNAL_RUN_CLEANUP | G_SIGNAL_NO_RECURSE | G_SIGNAL_NO_HOOKS),
+ G_STRUCT_OFFSET (SPCanvasItemClass, destroy),
+ NULL, NULL,
+ g_cclosure_marshal_VOID__VOID,
+ G_TYPE_NONE, 0);
}
-void sp_canvas_item_init(SPCanvasItem *item)
+void sp_canvas_item_init(SPCanvasItem *item, SPCanvasItemClass *klass)
{
item->xform = Geom::Affine(Geom::identity());
item->ctrlType = Inkscape::CTRL_TYPE_UNKNOWN;
@@ -416,6 +454,7 @@ void sp_canvas_item_init(SPCanvasItem *item)
// that should be initially invisible; examples of such items: node handles, the CtrlRect
// used for rubberbanding, path outline, etc.
item->visible = TRUE;
+ item->in_destruction = false;
}
} // namespace
@@ -473,49 +512,86 @@ static void redraw_if_visible(SPCanvasItem *item)
}
}
-namespace {
+void sp_canvas_item_destroy(SPCanvasItem *item)
+{
+ g_return_if_fail(SP_IS_CANVAS_ITEM(item));
+
+ if (!item->in_destruction)
+ g_object_run_dispose(G_OBJECT(item));
+}
+namespace {
void sp_canvas_item_dispose(GObject *object)
{
SPCanvasItem *item = SP_CANVAS_ITEM (object);
- // Hack: if this is a ctrlrect, move it to 0,0;
- // this redraws only the stroke of the rect to be deleted,
- // avoiding redraw of the entire area
- if (SP_IS_CTRLRECT(item)) {
- SP_CTRLRECT(object)->setRectangle(Geom::Rect(Geom::Point(0,0),Geom::Point(0,0)));
- SP_CTRLRECT(object)->update(item->xform, 0);
- } else {
- redraw_if_visible (item);
- }
- item->visible = FALSE;
-
- if (item == item->canvas->current_item) {
- item->canvas->current_item = NULL;
- item->canvas->need_repick = TRUE;
- }
-
- if (item == item->canvas->new_current_item) {
- item->canvas->new_current_item = NULL;
- item->canvas->need_repick = TRUE;
- }
-
- if (item == item->canvas->grabbed_item) {
- item->canvas->grabbed_item = NULL;
- gdk_pointer_ungrab (GDK_CURRENT_TIME);
- }
-
- if (item == item->canvas->focused_item) {
- item->canvas->focused_item = NULL;
- }
-
- if (item->parent) {
- SP_CANVAS_GROUP(item->parent)->remove(item);
+ /* guard against reinvocations during
+ * destruction with the in_destruction flag.
+ */
+ if (!item->in_destruction)
+ {
+ item->in_destruction=true;
+
+ // Hack: if this is a ctrlrect, move it to 0,0;
+ // this redraws only the stroke of the rect to be deleted,
+ // avoiding redraw of the entire area
+ if (SP_IS_CTRLRECT(item)) {
+ SP_CTRLRECT(object)->setRectangle(Geom::Rect(Geom::Point(0,0),Geom::Point(0,0)));
+ SP_CTRLRECT(object)->update(item->xform, 0);
+ } else {
+ redraw_if_visible (item);
+ }
+ item->visible = FALSE;
+
+ if (item == item->canvas->current_item) {
+ item->canvas->current_item = NULL;
+ item->canvas->need_repick = TRUE;
+ }
+
+ if (item == item->canvas->new_current_item) {
+ item->canvas->new_current_item = NULL;
+ item->canvas->need_repick = TRUE;
+ }
+
+ if (item == item->canvas->grabbed_item) {
+ item->canvas->grabbed_item = NULL;
+ gdk_pointer_ungrab (GDK_CURRENT_TIME);
+ }
+
+ if (item == item->canvas->focused_item) {
+ item->canvas->focused_item = NULL;
+ }
+
+ if (item->parent) {
+ SP_CANVAS_GROUP(item->parent)->remove(item);
+ }
+
+ g_signal_emit (object, object_signals[DESTROY], 0);
+ item->in_destruction = false;
+ }
+
+ G_OBJECT_CLASS(parent_class)->dispose(object);
+}
+
+void sp_canvas_item_real_destroy(SPCanvasItem *object)
+{
+ g_signal_handlers_destroy(object);
+}
+
+void sp_canvas_item_finalize(GObject *gobject)
+{
+ SPCanvasItem *object = SP_CANVAS_ITEM(gobject);
+
+ if (g_object_is_floating (object))
+ {
+ g_warning ("A floating object was finalized. This means that someone\n"
+ "called g_object_unref() on an object that had only a floating\n"
+ "reference; the initial floating reference is not owned by anyone\n"
+ "and must be removed with g_object_ref_sink().");
}
-
- G_OBJECT_CLASS(g_type_class_peek(g_type_parent(SPCanvasItem::getType())))->dispose(object);
+
+ G_OBJECT_CLASS (parent_class)->finalize (gobject);
}
-
} // namespace
/**
@@ -931,13 +1007,11 @@ GType SPCanvasGroup::getType(void)
void SPCanvasGroup::classInit(SPCanvasGroupClass *klass)
{
- GtkObjectClass *object_class = reinterpret_cast<GtkObjectClass *>(klass);
SPCanvasItemClass *item_class = reinterpret_cast<SPCanvasItemClass *>(klass);
parentClass = reinterpret_cast<SPCanvasItemClass*>(g_type_class_peek_parent(klass));
- object_class->destroy = SPCanvasGroup::destroy;
-
+ item_class->destroy = SPCanvasGroup::destroy;
item_class->update = SPCanvasGroup::update;
item_class->render = SPCanvasGroup::render;
item_class->point = SPCanvasGroup::point;
@@ -949,7 +1023,7 @@ void SPCanvasGroup::init(SPCanvasGroup * /*group*/)
// Nothing here
}
-void SPCanvasGroup::destroy(GtkObject *object)
+void SPCanvasGroup::destroy(SPCanvasItem *object)
{
g_return_if_fail(object != NULL);
g_return_if_fail(SP_IS_CANVAS_GROUP(object));
@@ -961,11 +1035,11 @@ void SPCanvasGroup::destroy(GtkObject *object)
SPCanvasItem *child = reinterpret_cast<SPCanvasItem *>(list->data);
list = list->next;
- gtk_object_destroy(GTK_OBJECT(child));
+ sp_canvas_item_destroy(child);
}
- if (GTK_OBJECT_CLASS(parentClass)->destroy) {
- (* GTK_OBJECT_CLASS(parentClass)->destroy)(object);
+ if (SP_CANVAS_ITEM_CLASS(parentClass)->destroy) {
+ (* SP_CANVAS_ITEM_CLASS(parentClass)->destroy)(object);
}
}
@@ -1141,12 +1215,12 @@ GType SPCanvas::getType(void)
void SPCanvasImpl::classInit(SPCanvasClass *klass)
{
- GtkObjectClass *object_class = (GtkObjectClass *) klass;
+ GObjectClass *object_class = (GObjectClass *) klass;
GtkWidgetClass *widget_class = (GtkWidgetClass *) klass;
parentClass = reinterpret_cast<GtkWidgetClass *>(g_type_class_peek_parent(klass));
- object_class->destroy = SPCanvasImpl::destroy;
+ object_class->dispose = SPCanvasImpl::dispose;
widget_class->realize = SPCanvasImpl::realize;
widget_class->unrealize = SPCanvasImpl::unrealize;
@@ -1235,7 +1309,7 @@ void SPCanvasImpl::shutdown_transients(SPCanvas *canvas)
remove_idle(canvas);
}
-void SPCanvasImpl::destroy(GtkObject *object)
+void SPCanvasImpl::dispose(GObject *object)
{
SPCanvas *canvas = SP_CANVAS(object);
@@ -1248,8 +1322,8 @@ void SPCanvasImpl::destroy(GtkObject *object)
#if defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2)
canvas->cms_key.~ustring();
#endif
- if (GTK_OBJECT_CLASS(parentClass)->destroy) {
- (* GTK_OBJECT_CLASS(parentClass)->destroy)(object);
+ if (G_OBJECT_CLASS(parentClass)->dispose) {
+ (* G_OBJECT_CLASS(parentClass)->dispose)(object);
}
}
diff --git a/src/display/sp-ctrlcurve.cpp b/src/display/sp-ctrlcurve.cpp
index 5ef4c4d3f..d9b687f2e 100644
--- a/src/display/sp-ctrlcurve.cpp
+++ b/src/display/sp-ctrlcurve.cpp
@@ -25,7 +25,7 @@ namespace {
static void sp_ctrlcurve_class_init(SPCtrlCurveClass *klass, gpointer data);
static void sp_ctrlcurve_init(SPCtrlCurve *ctrlcurve, gpointer g_class);
-static void sp_ctrlcurve_destroy(GtkObject *object);
+static void sp_ctrlcurve_destroy(SPCanvasItem *object);
static void sp_ctrlcurve_update(SPCanvasItem *item, Geom::Affine const &affine, unsigned int flags);
static void sp_ctrlcurve_render(SPCanvasItem *item, SPCanvasBuf *buf);
@@ -74,7 +74,7 @@ sp_ctrlcurve_init(SPCtrlCurve *ctrlcurve, gpointer /*g_class*/)
}
static void
-sp_ctrlcurve_destroy(GtkObject *object)
+sp_ctrlcurve_destroy(SPCanvasItem *object)
{
g_return_if_fail (object != NULL);
g_return_if_fail (SP_IS_CTRLCURVE (object));
@@ -83,8 +83,8 @@ sp_ctrlcurve_destroy(GtkObject *object)
ctrlcurve->item=NULL;
- if (GTK_OBJECT_CLASS (parent_class)->destroy)
- (* GTK_OBJECT_CLASS (parent_class)->destroy) (object);
+ if (SP_CANVAS_ITEM_CLASS (parent_class)->destroy)
+ (* SP_CANVAS_ITEM_CLASS (parent_class)->destroy) (object);
}
static void
diff --git a/src/display/sp-ctrlline.cpp b/src/display/sp-ctrlline.cpp
index b7ad262b8..aef284c1a 100644
--- a/src/display/sp-ctrlline.cpp
+++ b/src/display/sp-ctrlline.cpp
@@ -32,7 +32,7 @@ namespace {
void sp_ctrlline_class_init(SPCtrlLineClass *klass, gpointer data);
void sp_ctrlline_init(SPCtrlLine *ctrlline, gpointer g_class);
-void sp_ctrlline_destroy(GtkObject *object);
+void sp_ctrlline_destroy(SPCanvasItem *object);
void sp_ctrlline_update(SPCanvasItem *item, Geom::Affine const &affine, unsigned int flags);
void sp_ctrlline_render(SPCanvasItem *item, SPCanvasBuf *buf);
@@ -79,7 +79,7 @@ void sp_ctrlline_init(SPCtrlLine *ctrlline, gpointer /*g_class*/)
ctrlline->item=NULL;
}
-void sp_ctrlline_destroy(GtkObject *object)
+void sp_ctrlline_destroy(SPCanvasItem *object)
{
g_return_if_fail(object != NULL);
g_return_if_fail(SP_IS_CTRLLINE(object));
@@ -88,8 +88,8 @@ void sp_ctrlline_destroy(GtkObject *object)
ctrlline->item = NULL;
- if (GTK_OBJECT_CLASS (parent_class)->destroy) {
- (* GTK_OBJECT_CLASS (parent_class)->destroy)(object);
+ if(SP_CANVAS_ITEM_CLASS (parent_class)->destroy) {
+ (* SP_CANVAS_ITEM_CLASS (parent_class)->destroy)(object);
}
}
diff --git a/src/display/sp-ctrlpoint.cpp b/src/display/sp-ctrlpoint.cpp
index 3c8e2bc5d..d07e9385b 100644
--- a/src/display/sp-ctrlpoint.cpp
+++ b/src/display/sp-ctrlpoint.cpp
@@ -23,7 +23,7 @@
static void sp_ctrlpoint_class_init (SPCtrlPointClass *klass);
static void sp_ctrlpoint_init (SPCtrlPoint *ctrlpoint);
-static void sp_ctrlpoint_destroy (GtkObject *object);
+static void sp_ctrlpoint_destroy(SPCanvasItem *object);
static void sp_ctrlpoint_update (SPCanvasItem *item, Geom::Affine const &affine, unsigned int flags);
static void sp_ctrlpoint_render (SPCanvasItem *item, SPCanvasBuf *buf);
@@ -50,16 +50,13 @@ sp_ctrlpoint_get_type (void)
return type;
}
-static void
-sp_ctrlpoint_class_init (SPCtrlPointClass *klass)
+static void sp_ctrlpoint_class_init(SPCtrlPointClass *klass)
{
- GtkObjectClass *object_class = (GtkObjectClass *) klass;
SPCanvasItemClass *item_class = (SPCanvasItemClass *) klass;
parent_class = (SPCanvasItemClass*)g_type_class_peek_parent (klass);
- object_class->destroy = sp_ctrlpoint_destroy;
-
+ item_class->destroy = sp_ctrlpoint_destroy;
item_class->update = sp_ctrlpoint_update;
item_class->render = sp_ctrlpoint_render;
}
@@ -73,8 +70,7 @@ sp_ctrlpoint_init (SPCtrlPoint *ctrlpoint)
ctrlpoint->radius = 2;
}
-static void
-sp_ctrlpoint_destroy (GtkObject *object)
+static void sp_ctrlpoint_destroy(SPCanvasItem *object)
{
g_return_if_fail (object != NULL);
g_return_if_fail (SP_IS_CTRLPOINT (object));
@@ -83,8 +79,8 @@ sp_ctrlpoint_destroy (GtkObject *object)
ctrlpoint->item=NULL;
- if (GTK_OBJECT_CLASS (parent_class)->destroy)
- (* GTK_OBJECT_CLASS (parent_class)->destroy) (object);
+ if (SP_CANVAS_ITEM_CLASS(parent_class)->destroy)
+ (* SP_CANVAS_ITEM_CLASS(parent_class)->destroy) (object);
}
static void
diff --git a/src/display/sp-ctrlquadr.cpp b/src/display/sp-ctrlquadr.cpp
index 723075f74..ae15d620a 100644
--- a/src/display/sp-ctrlquadr.cpp
+++ b/src/display/sp-ctrlquadr.cpp
@@ -31,7 +31,7 @@ struct SPCtrlQuadrClass : public SPCanvasItemClass{};
static void sp_ctrlquadr_class_init (SPCtrlQuadrClass *klass);
static void sp_ctrlquadr_init (SPCtrlQuadr *ctrlquadr);
-static void sp_ctrlquadr_destroy (GtkObject *object);
+static void sp_ctrlquadr_destroy(SPCanvasItem *object);
static void sp_ctrlquadr_update (SPCanvasItem *item, Geom::Affine const &affine, unsigned int flags);
static void sp_ctrlquadr_render (SPCanvasItem *item, SPCanvasBuf *buf);
@@ -61,13 +61,11 @@ sp_ctrlquadr_get_type (void)
static void
sp_ctrlquadr_class_init (SPCtrlQuadrClass *klass)
{
- GtkObjectClass *object_class = (GtkObjectClass *) klass;
SPCanvasItemClass *item_class = (SPCanvasItemClass *) klass;
parent_class = (SPCanvasItemClass*)g_type_class_peek_parent (klass);
- object_class->destroy = sp_ctrlquadr_destroy;
-
+ item_class->destroy = sp_ctrlquadr_destroy;
item_class->update = sp_ctrlquadr_update;
item_class->render = sp_ctrlquadr_render;
}
@@ -82,14 +80,13 @@ sp_ctrlquadr_init (SPCtrlQuadr *ctrlquadr)
ctrlquadr->p4 = Geom::Point(0, 0);
}
-static void
-sp_ctrlquadr_destroy (GtkObject *object)
+static void sp_ctrlquadr_destroy(SPCanvasItem *object)
{
g_return_if_fail (object != NULL);
g_return_if_fail (SP_IS_CTRLQUADR (object));
- if (GTK_OBJECT_CLASS (parent_class)->destroy)
- (* GTK_OBJECT_CLASS (parent_class)->destroy) (object);
+ if (SP_CANVAS_ITEM_CLASS(parent_class)->destroy)
+ (* SP_CANVAS_ITEM_CLASS(parent_class)->destroy) (object);
}
static void