diff options
| author | Alex Valavanis <valavanisalex@gmail.com> | 2012-06-09 13:40:09 +0000 |
|---|---|---|
| committer | Alex Valavanis <valavanisalex@gmail.com> | 2012-06-09 13:40:09 +0000 |
| commit | 62dd6c138e3547689acdcccbb289d822b458cdb0 (patch) | |
| tree | df7a4a357c7483216c7d805406bd79ff3c21c7c1 /src/display | |
| parent | Move measure angle string to keep it visible when angle is small. (diff) | |
| download | inkscape-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.cpp | 22 | ||||
| -rw-r--r-- | src/display/canvas-bpath.cpp | 21 | ||||
| -rw-r--r-- | src/display/canvas-grid.cpp | 24 | ||||
| -rw-r--r-- | src/display/canvas-temporary-item.cpp | 3 | ||||
| -rw-r--r-- | src/display/canvas-text.cpp | 16 | ||||
| -rw-r--r-- | src/display/gnome-canvas-acetate.cpp | 17 | ||||
| -rw-r--r-- | src/display/guideline.cpp | 14 | ||||
| -rw-r--r-- | src/display/sodipodi-ctrl.cpp | 24 | ||||
| -rw-r--r-- | src/display/sodipodi-ctrlrect.cpp | 12 | ||||
| -rw-r--r-- | src/display/sp-canvas-item.h | 22 | ||||
| -rw-r--r-- | src/display/sp-canvas.cpp | 202 | ||||
| -rw-r--r-- | src/display/sp-ctrlcurve.cpp | 8 | ||||
| -rw-r--r-- | src/display/sp-ctrlline.cpp | 8 | ||||
| -rw-r--r-- | src/display/sp-ctrlpoint.cpp | 16 | ||||
| -rw-r--r-- | src/display/sp-ctrlquadr.cpp | 13 |
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 |
