diff options
| author | Alex Valavanis <valavanisalex@gmail.com> | 2013-01-17 00:59:37 +0000 |
|---|---|---|
| committer | Alex Valavanis <valavanisalex@gmail.com> | 2013-01-17 00:59:37 +0000 |
| commit | cd0794c0d76a46a0ae47b6c450167015ee41bc35 (patch) | |
| tree | 2f0c97f37dadbda4122e622e6aa249294a978336 /src | |
| parent | extensions. dxf output. set flag if LWPOLYLINE is closed (Bug 1098283) (diff) | |
| download | inkscape-cd0794c0d76a46a0ae47b6c450167015ee41bc35.tar.gz inkscape-cd0794c0d76a46a0ae47b6c450167015ee41bc35.zip | |
Cleanup more GObject type definitions
(bzr r12034)
Diffstat (limited to 'src')
| -rw-r--r-- | src/draw-context.cpp | 36 | ||||
| -rw-r--r-- | src/draw-context.h | 4 | ||||
| -rw-r--r-- | src/eraser-context.cpp | 45 | ||||
| -rw-r--r-- | src/eraser-context.h | 4 | ||||
| -rw-r--r-- | src/filters/flood.cpp | 47 | ||||
| -rw-r--r-- | src/filters/flood.h | 14 | ||||
| -rw-r--r-- | src/sp-animation.cpp | 128 | ||||
| -rw-r--r-- | src/sp-animation.h | 4 | ||||
| -rw-r--r-- | src/sp-clippath.cpp | 5 | ||||
| -rw-r--r-- | src/sp-guide.cpp | 39 | ||||
| -rw-r--r-- | src/sp-guide.h | 3 | ||||
| -rw-r--r-- | src/sp-mask.cpp | 2 | ||||
| -rw-r--r-- | src/sp-object-group.cpp | 98 | ||||
| -rw-r--r-- | src/sp-object-group.h | 25 | ||||
| -rw-r--r-- | src/sp-object.cpp | 184 | ||||
| -rw-r--r-- | src/sp-object.h | 82 | ||||
| -rw-r--r-- | src/sp-rect.cpp | 46 | ||||
| -rw-r--r-- | src/sp-rect.h | 6 | ||||
| -rw-r--r-- | src/sp-switch.cpp | 30 | ||||
| -rw-r--r-- | src/sp-switch.h | 10 | ||||
| -rw-r--r-- | src/sp-text.cpp | 64 |
21 files changed, 313 insertions, 563 deletions
diff --git a/src/draw-context.cpp b/src/draw-context.cpp index 5996d600b..e62435004 100644 --- a/src/draw-context.cpp +++ b/src/draw-context.cpp @@ -50,8 +50,6 @@ using Inkscape::DocumentUndo; -static void sp_draw_context_class_init(SPDrawContextClass *klass); -static void sp_draw_context_init(SPDrawContext *dc); static void sp_draw_context_dispose(GObject *object); static void sp_draw_context_setup(SPEventContext *ec); @@ -76,27 +74,7 @@ static void spdc_flush_white(SPDrawContext *dc, SPCurve *gc); static void spdc_reset_white(SPDrawContext *dc); static void spdc_free_colors(SPDrawContext *dc); - -static SPEventContextClass *draw_parent_class; - -GType sp_draw_context_get_type(void) -{ - static GType type = 0; - if (!type) { - GTypeInfo info = { - sizeof(SPDrawContextClass), - NULL, NULL, - (GClassInitFunc) sp_draw_context_class_init, - NULL, NULL, - sizeof(SPDrawContext), - 4, - (GInstanceInitFunc) sp_draw_context_init, - NULL, // value_table - }; - type = g_type_register_static(SP_TYPE_EVENT_CONTEXT, "SPDrawContext", &info, (GTypeFlags)0); - } - return type; -} +G_DEFINE_TYPE(SPDrawContext, sp_draw_context, SP_TYPE_EVENT_CONTEXT); static void sp_draw_context_class_init(SPDrawContextClass *klass) { @@ -106,8 +84,6 @@ static void sp_draw_context_class_init(SPDrawContextClass *klass) object_class = (GObjectClass *)klass; ec_class = SP_EVENT_CONTEXT_CLASS(klass); - draw_parent_class = SP_EVENT_CONTEXT_CLASS(g_type_class_peek_parent(klass)); - object_class->dispose = sp_draw_context_dispose; ec_class->setup = sp_draw_context_setup; @@ -167,7 +143,7 @@ static void sp_draw_context_dispose(GObject *object) spdc_free_colors(dc); - G_OBJECT_CLASS(draw_parent_class)->dispose(object); + G_OBJECT_CLASS(sp_draw_context_parent_class)->dispose(object); } static void sp_draw_context_setup(SPEventContext *ec) @@ -175,8 +151,8 @@ static void sp_draw_context_setup(SPEventContext *ec) SPDrawContext *dc = SP_DRAW_CONTEXT(ec); SPDesktop *dt = ec->desktop; - if ((SP_EVENT_CONTEXT_CLASS(draw_parent_class))->setup) { - (SP_EVENT_CONTEXT_CLASS(draw_parent_class))->setup(ec); + if ((SP_EVENT_CONTEXT_CLASS(sp_draw_context_parent_class))->setup) { + (SP_EVENT_CONTEXT_CLASS(sp_draw_context_parent_class))->setup(ec); } dc->selection = sp_desktop_selection(dt); @@ -261,8 +237,8 @@ gint sp_draw_context_root_handler(SPEventContext *ec, GdkEvent *event) } if (!ret) { - if ((SP_EVENT_CONTEXT_CLASS(draw_parent_class))->root_handler) { - ret = (SP_EVENT_CONTEXT_CLASS(draw_parent_class))->root_handler(ec, event); + if ((SP_EVENT_CONTEXT_CLASS(sp_draw_context_parent_class))->root_handler) { + ret = (SP_EVENT_CONTEXT_CLASS(sp_draw_context_parent_class))->root_handler(ec, event); } } diff --git a/src/draw-context.h b/src/draw-context.h index 202dd85b2..98309c0cb 100644 --- a/src/draw-context.h +++ b/src/draw-context.h @@ -20,6 +20,7 @@ #include "event-context.h" #include "live_effects/effect.h" +G_BEGIN_DECLS /* Freehand context */ #define SP_TYPE_DRAW_CONTEXT (sp_draw_context_get_type()) @@ -82,7 +83,7 @@ struct SPDrawContext : public SPEventContext{ struct SPDrawContextClass : public SPEventContextClass{}; -GType sp_draw_context_get_type(void); +GType sp_draw_context_get_type(void) G_GNUC_CONST; /** * Returns FIRST active anchor (the activated one). @@ -119,6 +120,7 @@ void spdc_check_for_and_apply_waiting_LPE(SPDrawContext *dc, SPItem *item); */ void spdc_create_single_dot(SPEventContext *ec, Geom::Point const &pt, char const *tool, guint event_state); +G_END_DECLS #endif // SEEN_SP_DRAW_CONTEXT_H /* diff --git a/src/eraser-context.cpp b/src/eraser-context.cpp index c4560d462..cd0b1dc3b 100644 --- a/src/eraser-context.cpp +++ b/src/eraser-context.cpp @@ -83,9 +83,6 @@ using Inkscape::DocumentUndo; #define DRAG_DEFAULT 1.0 #define DRAG_MAX 1.0 - -static void sp_eraser_context_class_init(SPEraserContextClass *klass); -static void sp_eraser_context_init(SPEraserContext *erc); static void sp_eraser_context_dispose(GObject *object); static void sp_eraser_context_setup(SPEventContext *ec); @@ -104,29 +101,7 @@ static Geom::Point sp_eraser_get_npoint(SPEraserContext const *erc, Geom::Point static Geom::Point sp_eraser_get_vpoint(SPEraserContext const *erc, Geom::Point n); static void draw_temporary_box(SPEraserContext *dc); - -static SPEventContextClass *eraser_parent_class = 0; - -GType sp_eraser_context_get_type(void) -{ - static GType type = 0; - if (!type) { - GTypeInfo info = { - sizeof(SPEraserContextClass), - 0, // base_init - 0, // base_finalize - (GClassInitFunc)sp_eraser_context_class_init, - 0, // class_finalize - 0, // class_data - sizeof(SPEraserContext), - 0, // n_preallocs - (GInstanceInitFunc)sp_eraser_context_init, - 0 // value_table - }; - type = g_type_register_static(SP_TYPE_COMMON_CONTEXT, "SPEraserContext", &info, static_cast<GTypeFlags>(0)); - } - return type; -} +G_DEFINE_TYPE(SPEraserContext, sp_eraser_context, SP_TYPE_COMMON_CONTEXT); static void sp_eraser_context_class_init(SPEraserContextClass *klass) @@ -134,8 +109,6 @@ sp_eraser_context_class_init(SPEraserContextClass *klass) GObjectClass *object_class = G_OBJECT_CLASS(klass); SPEventContextClass *event_context_class = SP_EVENT_CONTEXT_CLASS(klass); - eraser_parent_class = SP_EVENT_CONTEXT_CLASS(g_type_class_peek_parent(klass)); - object_class->dispose = sp_eraser_context_dispose; event_context_class->setup = sp_eraser_context_setup; @@ -154,9 +127,7 @@ sp_eraser_context_init(SPEraserContext *erc) static void sp_eraser_context_dispose(GObject *object) { - //SPEraserContext *erc = SP_ERASER_CONTEXT(object); - - G_OBJECT_CLASS(eraser_parent_class)->dispose(object); + G_OBJECT_CLASS(sp_eraser_context_parent_class)->dispose(object); } static void @@ -165,8 +136,8 @@ sp_eraser_context_setup(SPEventContext *ec) SPEraserContext *erc = SP_ERASER_CONTEXT(ec); SPDesktop *desktop = ec->desktop; - if ((SP_EVENT_CONTEXT_CLASS(eraser_parent_class))->setup) - (SP_EVENT_CONTEXT_CLASS(eraser_parent_class))->setup(ec); + if ((SP_EVENT_CONTEXT_CLASS(sp_eraser_context_parent_class))->setup) + (SP_EVENT_CONTEXT_CLASS(sp_eraser_context_parent_class))->setup(ec); erc->accumulated = new SPCurve(); erc->currentcurve = new SPCurve(); @@ -222,8 +193,8 @@ static void sp_eraser_context_set(SPEventContext *ec, Inkscape::Preferences::Entry *val) { //pass on up to parent class to handle common attributes. - if ( eraser_parent_class->set ) { - eraser_parent_class->set(ec, val); + if (SP_EVENT_CONTEXT_CLASS(sp_eraser_context_parent_class)->set ) { + SP_EVENT_CONTEXT_CLASS(sp_eraser_context_parent_class)->set(ec, val); } } @@ -689,8 +660,8 @@ sp_eraser_context_root_handler(SPEventContext *event_context, } if (!ret) { - if ((SP_EVENT_CONTEXT_CLASS(eraser_parent_class))->root_handler) { - ret = (SP_EVENT_CONTEXT_CLASS(eraser_parent_class))->root_handler(event_context, event); + if ((SP_EVENT_CONTEXT_CLASS(sp_eraser_context_parent_class))->root_handler) { + ret = (SP_EVENT_CONTEXT_CLASS(sp_eraser_context_parent_class))->root_handler(event_context, event); } } diff --git a/src/eraser-context.h b/src/eraser-context.h index 68ed04ad5..7c147c32f 100644 --- a/src/eraser-context.h +++ b/src/eraser-context.h @@ -21,6 +21,8 @@ #include "common-context.h" +G_BEGIN_DECLS + #define SP_TYPE_ERASER_CONTEXT (sp_eraser_context_get_type()) #define SP_ERASER_CONTEXT(o) (G_TYPE_CHECK_INSTANCE_CAST((o), SP_TYPE_ERASER_CONTEXT, SPEraserContext)) #define SP_ERASER_CONTEXT_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), SP_TYPE_ERASER_CONTEXT, SPEraserContextClass)) @@ -45,6 +47,8 @@ struct SPEraserContextClass : public SPEventContextClass{}; GType sp_eraser_context_get_type(void); +G_END_DECLS + #endif // SP_ERASER_CONTEXT_H_SEEN /* diff --git a/src/filters/flood.cpp b/src/filters/flood.cpp index 170bed767..51b139b34 100644 --- a/src/filters/flood.cpp +++ b/src/filters/flood.cpp @@ -29,9 +29,6 @@ /* FeFlood base class */ -static void sp_feFlood_class_init(SPFeFloodClass *klass); -static void sp_feFlood_init(SPFeFlood *feFlood); - static void sp_feFlood_build(SPObject *object, SPDocument *document, Inkscape::XML::Node *repr); static void sp_feFlood_release(SPObject *object); static void sp_feFlood_set(SPObject *object, unsigned int key, gchar const *value); @@ -39,35 +36,13 @@ static void sp_feFlood_update(SPObject *object, SPCtx *ctx, guint flags); static Inkscape::XML::Node *sp_feFlood_write(SPObject *object, Inkscape::XML::Document *doc, Inkscape::XML::Node *repr, guint flags); static void sp_feFlood_build_renderer(SPFilterPrimitive *primitive, Inkscape::Filters::Filter *filter); -static SPFilterPrimitiveClass *feFlood_parent_class; - -GType sp_feFlood_get_type() -{ - static GType feFlood_type = 0; - - if (!feFlood_type) { - GTypeInfo feFlood_info = { - sizeof(SPFeFloodClass), - NULL, NULL, - (GClassInitFunc) sp_feFlood_class_init, - NULL, NULL, - sizeof(SPFeFlood), - 16, - (GInstanceInitFunc) sp_feFlood_init, - NULL, /* value_table */ - }; - feFlood_type = g_type_register_static(SP_TYPE_FILTER_PRIMITIVE, "SPFeFlood", &feFlood_info, (GTypeFlags)0); - } - return feFlood_type; -} +G_DEFINE_TYPE(SPFeFlood, sp_feFlood, SP_TYPE_FILTER_PRIMITIVE); static void sp_feFlood_class_init(SPFeFloodClass *klass) { SPObjectClass *sp_object_class = (SPObjectClass *)klass; SPFilterPrimitiveClass *sp_primitive_class = (SPFilterPrimitiveClass *)klass; - feFlood_parent_class = (SPFilterPrimitiveClass*)g_type_class_peek_parent(klass); - sp_object_class->build = sp_feFlood_build; sp_object_class->release = sp_feFlood_release; sp_object_class->write = sp_feFlood_write; @@ -90,8 +65,8 @@ static void sp_feFlood_init(SPFeFlood *feFlood) static void sp_feFlood_build(SPObject *object, SPDocument *document, Inkscape::XML::Node *repr) { - if (((SPObjectClass *) feFlood_parent_class)->build) { - ((SPObjectClass *) feFlood_parent_class)->build(object, document, repr); + if ((SP_OBJECT_CLASS(sp_feFlood_parent_class))->build) { + (SP_OBJECT_CLASS(sp_feFlood_parent_class))->build(object, document, repr); } /*LOAD ATTRIBUTES FROM REPR HERE*/ @@ -104,8 +79,8 @@ sp_feFlood_build(SPObject *object, SPDocument *document, Inkscape::XML::Node *re */ static void sp_feFlood_release(SPObject *object) { - if (((SPObjectClass *) feFlood_parent_class)->release) - ((SPObjectClass *) feFlood_parent_class)->release(object); + if ((SP_OBJECT_CLASS(sp_feFlood_parent_class))->release) + (SP_OBJECT_CLASS(sp_feFlood_parent_class))->release(object); } /** @@ -170,8 +145,8 @@ sp_feFlood_set(SPObject *object, unsigned int key, gchar const *value) } break; default: - if (((SPObjectClass *) feFlood_parent_class)->set) - ((SPObjectClass *) feFlood_parent_class)->set(object, key, value); + if ((SP_OBJECT_CLASS(sp_feFlood_parent_class))->set) + (SP_OBJECT_CLASS(sp_feFlood_parent_class))->set(object, key, value); break; } @@ -190,8 +165,8 @@ sp_feFlood_update(SPObject *object, SPCtx *ctx, guint flags) } - if (((SPObjectClass *) feFlood_parent_class)->update) { - ((SPObjectClass *) feFlood_parent_class)->update(object, ctx, flags); + if ((SP_OBJECT_CLASS(sp_feFlood_parent_class))->update) { + (SP_OBJECT_CLASS(sp_feFlood_parent_class))->update(object, ctx, flags); } } @@ -207,8 +182,8 @@ sp_feFlood_write(SPObject *object, Inkscape::XML::Document *doc, Inkscape::XML:: repr = object->getRepr()->duplicate(doc); } - if (((SPObjectClass *) feFlood_parent_class)->write) { - ((SPObjectClass *) feFlood_parent_class)->write(object, doc, repr, flags); + if ((SP_OBJECT_CLASS(sp_feFlood_parent_class))->write) { + (SP_OBJECT_CLASS(sp_feFlood_parent_class))->write(object, doc, repr, flags); } return repr; diff --git a/src/filters/flood.h b/src/filters/flood.h index 0083def70..d60321689 100644 --- a/src/filters/flood.h +++ b/src/filters/flood.h @@ -15,10 +15,12 @@ #include "sp-filter-primitive.h" #include "svg/svg-icc-color.h" -#define SP_TYPE_FEFLOOD (sp_feFlood_get_type()) -#define SP_FEFLOOD(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), SP_TYPE_FEFLOOD, SPFeFlood)) -#define SP_FEFLOOD_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), SP_TYPE_FEFLOOD, SPFeFloodClass)) -#define SP_IS_FEFLOOD(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), SP_TYPE_FEFLOOD)) +G_BEGIN_DECLS + +#define SP_TYPE_FEFLOOD (sp_feFlood_get_type()) +#define SP_FEFLOOD(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), SP_TYPE_FEFLOOD, SPFeFlood)) +#define SP_FEFLOOD_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), SP_TYPE_FEFLOOD, SPFeFloodClass)) +#define SP_IS_FEFLOOD(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), SP_TYPE_FEFLOOD)) #define SP_IS_FEFLOOD_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), SP_TYPE_FEFLOOD)) class SPFeFloodClass; @@ -33,9 +35,9 @@ struct SPFeFloodClass { SPFilterPrimitiveClass parent_class; }; -GType sp_feFlood_get_type(); - +GType sp_feFlood_get_type() G_GNUC_CONST; +G_END_DECLS #endif /* !SP_FEFLOOD_H_SEEN */ /* diff --git a/src/sp-animation.cpp b/src/sp-animation.cpp index 2951a76fd..e1dba552e 100644 --- a/src/sp-animation.cpp +++ b/src/sp-animation.cpp @@ -15,20 +15,7 @@ #include "sp-animation.h" -#if 0 -/* Feel free to remove this function and its calls. */ -static void log_set_attr(char const *const classname, unsigned int const key, char const *const value) -{ - unsigned char const *const attr_name = sp_attribute_name(key); - if (value) { - g_print("%s: Set %s=%s\n", classname, attr_name, value); - } else { - g_print("%s: unset %s.\n", classname, attr_name); - } -} -#else # define log_set_attr(_classname, _key, _value) static_cast<void>(0) -#endif /* Animation base class */ @@ -39,49 +26,26 @@ static void sp_animation_build(SPObject *object, SPDocument *document, Inkscape: static void sp_animation_release(SPObject *object); static void sp_animation_set(SPObject *object, unsigned int key, gchar const *value); -static SPObjectClass *animation_parent_class; - -GType sp_animation_get_type(void) -{ - static GType animation_type = 0; - - if (!animation_type) { - GTypeInfo animation_info = { - sizeof(SPAnimationClass), - NULL, NULL, - (GClassInitFunc) sp_animation_class_init, - NULL, NULL, - sizeof(SPAnimation), - 16, - (GInstanceInitFunc) sp_animation_init, - NULL, /* value_table */ - }; - animation_type = g_type_register_static(SP_TYPE_OBJECT, "SPAnimation", &animation_info, (GTypeFlags)0); - } - return animation_type; -} +G_DEFINE_TYPE(SPAnimation, sp_animation, SP_TYPE_OBJECT); static void sp_animation_class_init(SPAnimationClass *klass) { - //GObjectClass *gobject_class = (GObjectClass *) klass; SPObjectClass *sp_object_class = (SPObjectClass *) klass; - animation_parent_class = (SPObjectClass*)g_type_class_peek_parent(klass); - sp_object_class->build = sp_animation_build; sp_object_class->release = sp_animation_release; sp_object_class->set = sp_animation_set; } -static void sp_animation_init(SPAnimation */*animation*/) +static void sp_animation_init(SPAnimation * /*animation*/) { } static void sp_animation_build(SPObject *object, SPDocument *document, Inkscape::XML::Node *repr) { - if (((SPObjectClass *) animation_parent_class)->build) - ((SPObjectClass *) animation_parent_class)->build(object, document, repr); + if ((SP_OBJECT_CLASS(sp_animation_parent_class))->build) + (SP_OBJECT_CLASS(sp_animation_parent_class))->build(object, document, repr); object->readAttr( "xlink:href" ); object->readAttr( "attributeName" ); @@ -103,12 +67,10 @@ static void sp_animation_release(SPObject */*object*/) static void sp_animation_set(SPObject *object, unsigned int key, gchar const *value) { - //SPAnimation *animation = SP_ANIMATION(object); - log_set_attr("SPAnimation", key, value); - if (((SPObjectClass *) animation_parent_class)->set) - ((SPObjectClass *) animation_parent_class)->set(object, key, value); + if ((SP_OBJECT_CLASS(sp_animation_parent_class))->set) + (SP_OBJECT_CLASS(sp_animation_parent_class))->set(object, key, value); } /* Interpolated animation base class */ @@ -120,49 +82,26 @@ static void sp_ianimation_build(SPObject *object, SPDocument *document, Inkscape static void sp_ianimation_release(SPObject *object); static void sp_ianimation_set(SPObject *object, unsigned int key, gchar const *value); -static SPObjectClass *ianimation_parent_class; - -GType sp_ianimation_get_type(void) -{ - static GType type = 0; - - if (!type) { - GTypeInfo info = { - sizeof(SPIAnimationClass), - NULL, NULL, - (GClassInitFunc) sp_ianimation_class_init, - NULL, NULL, - sizeof(SPIAnimation), - 16, - (GInstanceInitFunc) sp_ianimation_init, - NULL, /* value_table */ - }; - type = g_type_register_static(SP_TYPE_OBJECT, "SPIAnimation", &info, (GTypeFlags)0); - } - return type; -} +G_DEFINE_TYPE(SPIanimationClass, sp_ianimation, SP_TYPE_OBJECT); static void sp_ianimation_class_init(SPIAnimationClass *klass) { - //GObjectClass *gobject_class = (GObjectClass *) klass; SPObjectClass *sp_object_class = (SPObjectClass *) klass; - ianimation_parent_class = (SPObjectClass*)g_type_class_peek_parent(klass); - sp_object_class->build = sp_ianimation_build; sp_object_class->release = sp_ianimation_release; sp_object_class->set = sp_ianimation_set; } -static void sp_ianimation_init(SPIAnimation */*animation*/) +static void sp_ianimation_init(SPIAnimation * /*animation*/) { } static void sp_ianimation_build(SPObject *object, SPDocument *document, Inkscape::XML::Node *repr) { - if (((SPObjectClass *) ianimation_parent_class)->build) - ((SPObjectClass *) ianimation_parent_class)->build(object, document, repr); + if ((SP_OBJECT_CLASS(sp_ianimation_parent_class))->build) + (SP_OBJECT_CLASS(sp_ianimation_parent_class))->build(object, document, repr); object->readAttr( "calcMode" ); object->readAttr( "values" ); @@ -175,18 +114,16 @@ static void sp_ianimation_build(SPObject *object, SPDocument *document, Inkscape object->readAttr( "accumulate" ); } -static void sp_ianimation_release(SPObject */*object*/) +static void sp_ianimation_release(SPObject * /*object*/) { } static void sp_ianimation_set(SPObject *object, unsigned int key, gchar const *value) { - //SPIAnimation *ianimation = SP_IANIMATION(object); - log_set_attr("SPIAnimation", key, value); - if (((SPObjectClass *) ianimation_parent_class)->set) - ((SPObjectClass *) ianimation_parent_class)->set(object, key, value); + if ((SP_OBJECT_CLASS(sp_ianimation_parent_class))->set) + (SP_OBJECT_CLASS(sp_ianimation_parent_class))->set(object, key, value); } /* SVG <animate> */ @@ -198,63 +135,38 @@ static void sp_animate_build(SPObject *object, SPDocument *document, Inkscape::X static void sp_animate_release(SPObject *object); static void sp_animate_set(SPObject *object, unsigned int key, gchar const *value); -static SPIAnimationClass *animate_parent_class; - -GType sp_animate_get_type(void) -{ - static GType type = 0; - - if (!type) { - GTypeInfo info = { - sizeof(SPAnimateClass), - NULL, NULL, - (GClassInitFunc) sp_animate_class_init, - NULL, NULL, - sizeof(SPAnimate), - 16, - (GInstanceInitFunc) sp_animate_init, - NULL, /* value_table */ - }; - type = g_type_register_static(SP_TYPE_IANIMATION, "SPAnimate", &info, (GTypeFlags)0); - } - return type; -} +G_DEFINE_TYPE(SPAnimate, sp_animate, SP_TYPE_IANIMATION); static void sp_animate_class_init(SPAnimateClass *klass) { - //GObjectClass *gobject_class = (GObjectClass *) klass; SPObjectClass *sp_object_class = (SPObjectClass *) klass; - animate_parent_class = (SPIAnimationClass*)g_type_class_peek_parent(klass); - sp_object_class->build = sp_animate_build; sp_object_class->release = sp_animate_release; sp_object_class->set = sp_animate_set; } -static void sp_animate_init(SPAnimate */*animate*/) +static void sp_animate_init(SPAnimate * /*animate*/) { } static void sp_animate_build(SPObject *object, SPDocument *document, Inkscape::XML::Node *repr) { - if (((SPObjectClass *) animate_parent_class)->build) - ((SPObjectClass *) animate_parent_class)->build(object, document, repr); + if ((SP_OBJECT_CLASS(sp_animate_parent_class))->build) + (SP_OBJECT_CLASS(sp_animate_parent_class))->build(object, document, repr); } -static void sp_animate_release(SPObject */*object*/) +static void sp_animate_release(SPObject * /*object*/) { } static void sp_animate_set(SPObject *object, unsigned int key, gchar const *value) { - //SPAnimate *animate = SP_ANIMATE(object); - log_set_attr("SPAnimate", key, value); - if (((SPObjectClass *) animate_parent_class)->set) - ((SPObjectClass *) animate_parent_class)->set(object, key, value); + if ((SP_OBJECT_CLASS(sp_animate_parent_class))->set) + (SP_OBJECT_CLASS(sp_animate_parent_class))->set(object, key, value); } diff --git a/src/sp-animation.h b/src/sp-animation.h index 407419f5b..cd502b6bc 100644 --- a/src/sp-animation.h +++ b/src/sp-animation.h @@ -14,7 +14,7 @@ #include "sp-object.h" - +G_BEGIN_DECLS /* Animation base class */ @@ -70,6 +70,6 @@ struct SPAnimateClass { GType sp_animate_get_type (void); - +G_END_DECLS #endif diff --git a/src/sp-clippath.cpp b/src/sp-clippath.cpp index 2213443a5..47d9be2c1 100644 --- a/src/sp-clippath.cpp +++ b/src/sp-clippath.cpp @@ -64,9 +64,8 @@ SPClipPath::sp_clippath_get_type(void) void SPClipPathClass::sp_clippath_class_init(SPClipPathClass *klass) { - SPObjectClass *sp_object_class = (SPObjectClass *) klass; - - static_parent_class = (SPObjectGroupClass*)g_type_class_ref(SP_TYPE_OBJECTGROUP); + SPObjectClass *sp_object_class = SP_OBJECT_CLASS(klass); + static_parent_class = SP_OBJECTGROUP_CLASS(g_type_class_ref(SP_TYPE_OBJECTGROUP)); sp_object_class->build = SPClipPath::build; sp_object_class->release = SPClipPath::release; diff --git a/src/sp-guide.cpp b/src/sp-guide.cpp index 6a71cf4f0..7445b0b75 100644 --- a/src/sp-guide.cpp +++ b/src/sp-guide.cpp @@ -53,8 +53,6 @@ enum { PROP_HICOLOR }; -static void sp_guide_class_init(SPGuideClass *gc); -static void sp_guide_init(SPGuide *guide); static void sp_guide_set_property(GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec); static void sp_guide_get_property(GObject *object, guint prop_id, GValue *value, GParamSpec *pspec); @@ -62,36 +60,13 @@ static void sp_guide_build(SPObject *object, SPDocument *document, Inkscape::XML static void sp_guide_release(SPObject *object); static void sp_guide_set(SPObject *object, unsigned int key, const gchar *value); -static SPObjectClass *parent_class; - -GType sp_guide_get_type(void) -{ - static GType guide_type = 0; - - if (!guide_type) { - GTypeInfo guide_info = { - sizeof(SPGuideClass), - NULL, NULL, - (GClassInitFunc) sp_guide_class_init, - NULL, NULL, - sizeof(SPGuide), - 16, - (GInstanceInitFunc) sp_guide_init, - NULL, /* value_table */ - }; - guide_type = g_type_register_static(SP_TYPE_OBJECT, "SPGuide", &guide_info, (GTypeFlags) 0); - } - - return guide_type; -} +G_DEFINE_TYPE(SPGuide, sp_guide, SP_TYPE_OBJECT); static void sp_guide_class_init(SPGuideClass *gc) { GObjectClass *gobject_class = (GObjectClass *) gc; SPObjectClass *sp_object_class = (SPObjectClass *) gc; - parent_class = (SPObjectClass*) g_type_class_ref(SP_TYPE_OBJECT); - gobject_class->set_property = sp_guide_set_property; gobject_class->get_property = sp_guide_get_property; @@ -158,8 +133,8 @@ static void sp_guide_get_property(GObject *object, guint prop_id, GValue *value, static void sp_guide_build(SPObject *object, SPDocument *document, Inkscape::XML::Node *repr) { - if (((SPObjectClass *) (parent_class))->build) { - (* ((SPObjectClass *) (parent_class))->build)(object, document, repr); + if ((SP_OBJECT_CLASS(sp_guide_parent_class))->build) { + (* (SP_OBJECT_CLASS(sp_guide_parent_class))->build)(object, document, repr); } object->readAttr( "inkscape:label" ); @@ -184,8 +159,8 @@ static void sp_guide_release(SPObject *object) object->document->removeResource("guide", object); } - if (((SPObjectClass *) parent_class)->release) { - ((SPObjectClass *) parent_class)->release(object); + if ((SP_OBJECT_CLASS(sp_guide_parent_class))->release) { + (SP_OBJECT_CLASS(sp_guide_parent_class))->release(object); } } @@ -260,8 +235,8 @@ static void sp_guide_set(SPObject *object, unsigned int key, const gchar *value) } break; default: - if (((SPObjectClass *) (parent_class))->set) { - ((SPObjectClass *) (parent_class))->set(object, key, value); + if ((SP_OBJECT_CLASS(sp_guide_parent_class))->set) { + (SP_OBJECT_CLASS(sp_guide_parent_class))->set(object, key, value); } break; } diff --git a/src/sp-guide.h b/src/sp-guide.h index 319e12305..c39252066 100644 --- a/src/sp-guide.h +++ b/src/sp-guide.h @@ -22,6 +22,8 @@ struct SPCanvas; struct SPCanvasGroup; +G_BEGIN_DECLS + #define SP_TYPE_GUIDE (sp_guide_get_type()) #define SP_GUIDE(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), SP_TYPE_GUIDE, SPGuide)) #define SP_GUIDE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), SP_TYPE_GUIDE, SPGuideClass)) @@ -70,6 +72,7 @@ void sp_guide_remove(SPGuide *guide); char *sp_guide_description(SPGuide const *guide, const bool verbose = true); +G_END_DECLS #endif // SEEN_SP_GUIDE_H diff --git a/src/sp-mask.cpp b/src/sp-mask.cpp index f955e5428..785a626f8 100644 --- a/src/sp-mask.cpp +++ b/src/sp-mask.cpp @@ -73,7 +73,7 @@ sp_mask_get_type (void) static void sp_mask_class_init (SPMaskClass *klass) { - parent_class = (SPObjectGroupClass*) g_type_class_ref (SP_TYPE_OBJECTGROUP); + parent_class = SP_OBJECTGROUP_CLASS(g_type_class_ref(SP_TYPE_OBJECTGROUP)); SPObjectClass *sp_object_class = (SPObjectClass *) klass; sp_object_class->build = sp_mask_build; diff --git a/src/sp-object-group.cpp b/src/sp-object-group.cpp index 65fbc0295..5158ec70a 100644 --- a/src/sp-object-group.cpp +++ b/src/sp-object-group.cpp @@ -16,74 +16,82 @@ #include "xml/repr.h" #include "document.h" -SPObjectClass * SPObjectGroupClass::static_parent_class = 0; +static void sp_objectgroup_child_added(SPObject *object, + Inkscape::XML::Node *child, + Inkscape::XML::Node *ref); -GType SPObjectGroup::sp_objectgroup_get_type(void) -{ - static GType objectgroup_type = 0; - if (!objectgroup_type) { - GTypeInfo objectgroup_info = { - sizeof(SPObjectGroupClass), - NULL, /* base_init */ - NULL, /* base_finalize */ - (GClassInitFunc) SPObjectGroupClass::sp_objectgroup_class_init, - NULL, /* class_finalize */ - NULL, /* class_data */ - sizeof(SPObjectGroup), - 16, /* n_preallocs */ - (GInstanceInitFunc) init, - NULL, /* value_table */ - }; - objectgroup_type = g_type_register_static(SP_TYPE_OBJECT, "SPObjectGroup", &objectgroup_info, (GTypeFlags)0); - } - return objectgroup_type; -} +static void sp_objectgroup_remove_child(SPObject *object, + Inkscape::XML::Node *child); -void SPObjectGroupClass::sp_objectgroup_class_init(SPObjectGroupClass *klass) -{ - //GObjectClass * object_class = (GObjectClass *) klass; - SPObjectClass * sp_object_class = (SPObjectClass *) klass; +static void sp_objectgroup_order_changed(SPObject *object, + Inkscape::XML::Node *child, + Inkscape::XML::Node *old_ref, + Inkscape::XML::Node *new_ref); - static_parent_class = (SPObjectClass *)g_type_class_ref(SP_TYPE_OBJECT); +static Inkscape::XML::Node* sp_objectgroup_write(SPObject *object, + Inkscape::XML::Document *doc, + Inkscape::XML::Node *repr, + guint flags); + +G_DEFINE_TYPE(SPObjectGroup, sp_objectgroup, SP_TYPE_OBJECT); + +static void +sp_objectgroup_class_init(SPObjectGroupClass *klass) +{ + SPObjectClass * sp_object_class = SP_OBJECT_CLASS(klass); - sp_object_class->child_added = SPObjectGroup::childAdded; - sp_object_class->remove_child = SPObjectGroup::removeChild; - sp_object_class->order_changed = SPObjectGroup::orderChanged; - sp_object_class->write = SPObjectGroup::write; + sp_object_class->child_added = sp_objectgroup_child_added; + sp_object_class->remove_child = sp_objectgroup_remove_child; + sp_object_class->order_changed = sp_objectgroup_order_changed; + sp_object_class->write = sp_objectgroup_write; } -void SPObjectGroup::init(SPObjectGroup * /*objectgroup*/) +static void +sp_objectgroup_init(SPObjectGroup * /*objectgroup*/) { } -void SPObjectGroup::childAdded(SPObject *object, Inkscape::XML::Node *child, Inkscape::XML::Node *ref) +static void +sp_objectgroup_child_added(SPObject *object, + Inkscape::XML::Node *child, + Inkscape::XML::Node *ref) { - if (((SPObjectClass *) (SPObjectGroupClass::static_parent_class))->child_added) { - (* ((SPObjectClass *) (SPObjectGroupClass::static_parent_class))->child_added)(object, child, ref); + if ((SP_OBJECT_CLASS(sp_objectgroup_parent_class))->child_added) { + (* (SP_OBJECT_CLASS(sp_objectgroup_parent_class))->child_added)(object, child, ref); } object->requestModified(SP_OBJECT_MODIFIED_FLAG); } -void SPObjectGroup::removeChild(SPObject *object, Inkscape::XML::Node *child) +static void +sp_objectgroup_remove_child(SPObject *object, + Inkscape::XML::Node *child) { - if (((SPObjectClass *) (SPObjectGroupClass::static_parent_class))->remove_child) { - (* ((SPObjectClass *) (SPObjectGroupClass::static_parent_class))->remove_child)(object, child); + if ((SP_OBJECT_CLASS(sp_objectgroup_parent_class))->remove_child) { + (* (SP_OBJECT_CLASS(sp_objectgroup_parent_class))->remove_child)(object, child); } object->requestModified(SP_OBJECT_MODIFIED_FLAG); } -void SPObjectGroup::orderChanged(SPObject *object, Inkscape::XML::Node *child, Inkscape::XML::Node *old_ref, Inkscape::XML::Node *new_ref) +static void +sp_objectgroup_order_changed(SPObject *object, + Inkscape::XML::Node *child, + Inkscape::XML::Node *old_ref, + Inkscape::XML::Node *new_ref) { - if (((SPObjectClass *) (SPObjectGroupClass::static_parent_class))->order_changed) { - (* ((SPObjectClass *) (SPObjectGroupClass::static_parent_class))->order_changed)(object, child, old_ref, new_ref); + if ((SP_OBJECT_CLASS(sp_objectgroup_parent_class))->order_changed) { + (* (SP_OBJECT_CLASS(sp_objectgroup_parent_class))->order_changed)(object, child, old_ref, new_ref); } object->requestModified(SP_OBJECT_MODIFIED_FLAG); } -Inkscape::XML::Node *SPObjectGroup::write(SPObject *object, Inkscape::XML::Document *xml_doc, Inkscape::XML::Node *repr, guint flags) +static Inkscape::XML::Node* +sp_objectgroup_write(SPObject *object, + Inkscape::XML::Document *xml_doc, + Inkscape::XML::Node *repr, + guint flags) { SP_OBJECTGROUP(object); // Ensure we have the right type of SPObject @@ -99,8 +107,8 @@ Inkscape::XML::Node *SPObjectGroup::write(SPObject *object, Inkscape::XML::Docum } } while (l) { - repr->addChild((Inkscape::XML::Node *) l->data, NULL); - Inkscape::GC::release((Inkscape::XML::Node *) l->data); + repr->addChild(static_cast<Inkscape::XML::Node *>(l->data), NULL); + Inkscape::GC::release(static_cast<Inkscape::XML::Node *>(l->data)); l = g_slist_remove(l, l->data); } } else { @@ -109,8 +117,8 @@ Inkscape::XML::Node *SPObjectGroup::write(SPObject *object, Inkscape::XML::Docum } } - if (((SPObjectClass *) (SPObjectGroupClass::static_parent_class))->write) { - ((SPObjectClass *) (SPObjectGroupClass::static_parent_class))->write(object, xml_doc, repr, flags); + if ((SP_OBJECT_CLASS(sp_objectgroup_parent_class))->write) { + (SP_OBJECT_CLASS(sp_objectgroup_parent_class))->write(object, xml_doc, repr, flags); } return repr; diff --git a/src/sp-object-group.h b/src/sp-object-group.h index a666a316a..88e0e0f4e 100644 --- a/src/sp-object-group.h +++ b/src/sp-object-group.h @@ -16,25 +16,17 @@ #include "sp-object.h" -#define SP_TYPE_OBJECTGROUP (SPObjectGroup::sp_objectgroup_get_type ()) -#define SP_OBJECTGROUP(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), SP_TYPE_OBJECTGROUP, SPObjectGroup)) -#define SP_OBJECTGROUP_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), SP_TYPE_OBJECTGROUP, SPObjectGroupClass)) -#define SP_IS_OBJECTGROUP(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), SP_TYPE_OBJECTGROUP)) +#define SP_TYPE_OBJECTGROUP (sp_objectgroup_get_type ()) +#define SP_OBJECTGROUP(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), SP_TYPE_OBJECTGROUP, SPObjectGroup)) +#define SP_OBJECTGROUP_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), SP_TYPE_OBJECTGROUP, SPObjectGroupClass)) +#define SP_IS_OBJECTGROUP(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), SP_TYPE_OBJECTGROUP)) #define SP_IS_OBJECTGROUP_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), SP_TYPE_OBJECTGROUP)) -class SPObjectGroup : public SPObject { -public: - static GType sp_objectgroup_get_type(void); +GType sp_objectgroup_get_type() G_GNUC_CONST; +class SPObjectGroup : public SPObject { private: - static void init(SPObjectGroup *objectgroup); - - static void childAdded(SPObject * object, Inkscape::XML::Node * child, Inkscape::XML::Node * ref); - static void removeChild(SPObject * object, Inkscape::XML::Node * child); - static void orderChanged(SPObject * object, Inkscape::XML::Node * child, Inkscape::XML::Node * old_ref, Inkscape::XML::Node * new_ref); - static Inkscape::XML::Node *write(SPObject *object, Inkscape::XML::Document *doc, Inkscape::XML::Node *repr, guint flags); - - friend class SPObjectGroupClass; + friend class SPObjectGroupClass; }; class SPObjectGroupClass { @@ -42,9 +34,6 @@ public: SPObjectClass parent_class; private: - static void sp_objectgroup_class_init(SPObjectGroupClass *klass); - static SPObjectClass *static_parent_class; - friend class SPObjectGroup; }; diff --git a/src/sp-object.cpp b/src/sp-object.cpp index 2cf28137a..4d2a5a709 100644 --- a/src/sp-object.cpp +++ b/src/sp-object.cpp @@ -101,48 +101,63 @@ public: } }; +static void sp_object_child_added(SPObject *object, + Inkscape::XML::Node *child, + Inkscape::XML::Node *ref); -GObjectClass * SPObjectClass::static_parent_class = 0; +static void sp_object_finalize(GObject *object); -GType SPObject::get_type() -{ - static GType type = 0; - if (!type) { - GTypeInfo info = { - sizeof(SPObjectClass), - NULL, NULL, - (GClassInitFunc) SPObjectClass::init, - NULL, NULL, - sizeof(SPObject), - 16, - (GInstanceInitFunc)init, - NULL - }; - type = g_type_register_static(G_TYPE_OBJECT, "SPObject", &info, (GTypeFlags)0); - } - return type; -} - -void SPObjectClass::init(SPObjectClass *klass) -{ - GObjectClass *object_class; +static void sp_object_remove_child(SPObject *object, + Inkscape::XML::Node *child); + +static void sp_object_order_changed(SPObject *object, + Inkscape::XML::Node *child, + Inkscape::XML::Node *old_ref, + Inkscape::XML::Node *new_ref); - object_class = (GObjectClass *) klass; +static void sp_object_release(SPObject *object); +static void sp_object_build(SPObject *object, + SPDocument *document, + Inkscape::XML::Node *repr); - static_parent_class = (GObjectClass *) g_type_class_ref(G_TYPE_OBJECT); +static void sp_object_private_set(SPObject *object, + unsigned int key, + gchar const *value); - object_class->finalize = SPObject::finalize; +static Inkscape::XML::Node *sp_object_private_write(SPObject *object, + Inkscape::XML::Document *doc, + Inkscape::XML::Node *repr, + guint flags); + +static gchar *sp_object_get_unique_id(SPObject *object, + gchar const *defid); + +G_DEFINE_TYPE(SPObject, sp_object, G_TYPE_OBJECT); + +/** + * Initializes the SPObject vtable. + */ +static void +sp_object_class_init(SPObjectClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS(klass); + + object_class->finalize = sp_object_finalize; - klass->child_added = SPObject::child_added; - klass->remove_child = SPObject::remove_child; - klass->order_changed = SPObject::order_changed; - klass->release = SPObject::release; - klass->build = SPObject::build; - klass->set = SPObject::private_set; - klass->write = SPObject::private_write; + klass->child_added = sp_object_child_added; + klass->remove_child = sp_object_remove_child; + klass->order_changed = sp_object_order_changed; + klass->release = sp_object_release; + klass->build = sp_object_build; + klass->set = sp_object_private_set; + klass->write = sp_object_private_write; } -void SPObject::init(SPObject *object) +/** + * Callback to initialize the SPObject object. + */ +static void +sp_object_init(SPObject *object) { debug("id=%x, typename=%s",object, g_type_name_from_instance((GTypeInstance*)object)); @@ -175,7 +190,11 @@ void SPObject::init(SPObject *object) object->_default_label = NULL; } -void SPObject::finalize(GObject *object) +/** + * Callback to destroy all members and connections of object and itself. + */ +static void +sp_object_finalize(GObject *object) { SPObject *spobject = (SPObject *)object; @@ -194,8 +213,8 @@ void SPObject::finalize(GObject *object) spobject->_delete_signal.~signal(); spobject->_position_changed_signal.~signal(); - if (((GObjectClass *) (SPObjectClass::static_parent_class))->finalize) { - (* ((GObjectClass *) (SPObjectClass::static_parent_class))->finalize)(object); + if (((GObjectClass *) (sp_object_parent_class))->finalize) { + (* ((GObjectClass *) (sp_object_parent_class))->finalize)(object); } } @@ -613,7 +632,14 @@ SPObject *SPObject::get_child_by_repr(Inkscape::XML::Node *repr) return result; } -void SPObject::child_added(SPObject *object, Inkscape::XML::Node *child, Inkscape::XML::Node *ref) +/** + * Callback for child_added event. + * Invoked whenever the given mutation event happens in the XML tree. + */ +static void +sp_object_child_added(SPObject *object, + Inkscape::XML::Node *child, + Inkscape::XML::Node *ref) { GType type = sp_repr_type_lookup(child); if (!type) { @@ -627,7 +653,19 @@ void SPObject::child_added(SPObject *object, Inkscape::XML::Node *child, Inkscap ochild->invoke_build(object->document, child, object->cloned); } -void SPObject::release(SPObject *object) +/** + * Removes, releases and unrefs all children of object. + * + * This is the opposite of build. It has to be invoked as soon as the + * object is removed from the tree, even if it is still alive according + * to reference count. The frontend unregisters the object from the + * document and releases the SPRepr bindings; implementations should free + * state data and release all child objects. Invoking release on + * SPRoot destroys the whole document tree. + * @see sp_object_build() + */ +static void +sp_object_release(SPObject *object) { debug("id=%x, typename=%s", object, g_type_name_from_instance((GTypeInstance*)object)); while (object->children) { @@ -635,7 +673,17 @@ void SPObject::release(SPObject *object) } } -void SPObject::remove_child(SPObject *object, Inkscape::XML::Node *child) +/** + * Remove object's child whose node equals repr, release and + * unref it. + * + * Invoked whenever the given mutation event happens in the XML + * tree, BEFORE removal from the XML tree happens, so grouping + * objects can safely release the child data. + */ +static void +sp_object_remove_child(SPObject *object, + Inkscape::XML::Node *child) { debug("id=%x, typename=%s", object, g_type_name_from_instance((GTypeInstance*)object)); SPObject *ochild = object->get_child_by_repr(child); @@ -645,8 +693,17 @@ void SPObject::remove_child(SPObject *object, Inkscape::XML::Node *child) } } -void SPObject::order_changed(SPObject *object, Inkscape::XML::Node *child, Inkscape::XML::Node * /*old_ref*/, - Inkscape::XML::Node *new_ref) +/** + * Move object corresponding to child after sibling object corresponding + * to new_ref. + * Invoked whenever the given mutation event happens in the XML tree. + * @param old_ref Ignored + */ +static void +sp_object_order_changed(SPObject *object, + Inkscape::XML::Node *child, + Inkscape::XML::Node * /*old_ref*/, + Inkscape::XML::Node *new_ref) { SPObject *ochild = object->get_child_by_repr(child); g_return_if_fail(ochild != NULL); @@ -655,7 +712,21 @@ void SPObject::order_changed(SPObject *object, Inkscape::XML::Node *child, Inksc ochild->_position_changed_signal.emit(ochild); } -void SPObject::build(SPObject *object, SPDocument *document, Inkscape::XML::Node *repr) +/** + * Virtual build callback. + * + * This has to be invoked immediately after creation of an SPObject. The + * frontend method ensures that the new object is properly attached to + * the document and repr; implementation then will parse all of the attributes, + * generate the children objects and so on. Invoking build on the SPRoot + * object results in creation of the whole document tree (this is, what + * SPDocument does after the creation of the XML tree). + * @see release() + */ +static void +sp_object_build(SPObject *object, + SPDocument *document, + Inkscape::XML::Node *repr) { /* Nothing specific here */ debug("id=%x, typename=%s", object, g_type_name_from_instance((GTypeInstance*)object)); @@ -706,7 +777,7 @@ void SPObject::invoke_build(SPDocument *document, Inkscape::XML::Node *repr, uns gchar const *id = this->repr->attribute("id"); if (!document->isSeeking()) { { - gchar *realid = get_unique_id(this, id); + gchar *realid = sp_object_get_unique_id(this, id); g_assert(realid != NULL); this->document->bindObjectToId(realid, this); @@ -844,7 +915,12 @@ void SPObject::repr_order_changed(Inkscape::XML::Node * /*repr*/, Inkscape::XML: } } -void SPObject::private_set(SPObject *object, unsigned int key, gchar const *value) +/** + * Callback for set event. + */ +static void sp_object_private_set(SPObject *object, + unsigned int key, + gchar const *value) { g_assert(key != SP_ATTR_INVALID); @@ -866,7 +942,7 @@ void SPObject::private_set(SPObject *object, unsigned int key, gchar const *valu if (!document->isSeeking()) { sp_object_ref(conflict, NULL); // give the conflicting object a new ID - gchar *new_conflict_id = get_unique_id(conflict, NULL); + gchar *new_conflict_id = sp_object_get_unique_id(conflict, NULL); conflict->getRepr()->setAttribute("id", new_conflict_id); g_free(new_conflict_id); sp_object_unref(conflict, NULL); @@ -994,7 +1070,14 @@ static gchar const *sp_xml_get_space_string(unsigned int space) } } -Inkscape::XML::Node * SPObject::private_write(SPObject *object, Inkscape::XML::Document *doc, Inkscape::XML::Node *repr, guint flags) +/** + * Callback for write event. + */ +static Inkscape::XML::Node* +sp_object_private_write(SPObject *object, + Inkscape::XML::Document *doc, + Inkscape::XML::Node *repr, + guint flags) { if (!repr && (flags & SP_OBJECT_WRITE_BUILD)) { repr = object->getRepr()->duplicate(doc); @@ -1297,9 +1380,10 @@ bool SPObject::storeAsDouble( gchar const *key, double *val ) const return sp_repr_get_double(((Inkscape::XML::Node *)(this->getRepr())),key,val); } -/* Helper */ - -gchar * SPObject::get_unique_id(SPObject *object, gchar const *id) +/** Helper */ +static gchar* +sp_object_get_unique_id(SPObject *object, + gchar const *id) { static unsigned long count = 0; diff --git a/src/sp-object.h b/src/sp-object.h index 0c4429a74..296b9d9e9 100644 --- a/src/sp-object.h +++ b/src/sp-object.h @@ -18,7 +18,7 @@ class SPObject; class SPObjectClass; -#define SP_TYPE_OBJECT (SPObject::get_type ()) +#define SP_TYPE_OBJECT (sp_object_get_type()) #define SP_OBJECT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), SP_TYPE_OBJECT, SPObject)) #define SP_OBJECT_CLASS(clazz) (G_TYPE_CHECK_CLASS_CAST((clazz), SP_TYPE_OBJECT, SPObjectClass)) #define SP_IS_OBJECT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), SP_TYPE_OBJECT)) @@ -122,6 +122,7 @@ struct SPIXmlSpace { guint value : 1; }; +GType sp_object_get_type() G_GNUC_CONST; /* * Refcounting @@ -796,78 +797,6 @@ private: */ GString * textualContent() const; - /** - * Callback to initialize the SPObject object. - */ - static void init(SPObject *object); - - /** - * Callback to destroy all members and connections of object and itself. - */ - static void finalize(GObject *object); - - /** - * Callback for child_added event. - * Invoked whenever the given mutation event happens in the XML tree. - */ - static void child_added(SPObject *object, Inkscape::XML::Node *child, Inkscape::XML::Node *ref); - - /** - * Remove object's child whose node equals repr, release and - * unref it. - * - * Invoked whenever the given mutation event happens in the XML - * tree, BEFORE removal from the XML tree happens, so grouping - * objects can safely release the child data. - */ - static void remove_child(SPObject *object, Inkscape::XML::Node *child); - - /** - * Move object corresponding to child after sibling object corresponding - * to new_ref. - * Invoked whenever the given mutation event happens in the XML tree. - * @param old_ref Ignored - */ - static void order_changed(SPObject *object, Inkscape::XML::Node *child, Inkscape::XML::Node *old_ref, Inkscape::XML::Node *new_ref); - - /** - * Removes, releases and unrefs all children of object. - * - * This is the opposite of build. It has to be invoked as soon as the - * object is removed from the tree, even if it is still alive according - * to reference count. The frontend unregisters the object from the - * document and releases the SPRepr bindings; implementations should free - * state data and release all child objects. Invoking release on - * SPRoot destroys the whole document tree. - * @see build() - */ - static void release(SPObject *object); - - /** - * Virtual build callback. - * - * This has to be invoked immediately after creation of an SPObject. The - * frontend method ensures that the new object is properly attached to - * the document and repr; implementation then will parse all of the attributes, - * generate the children objects and so on. Invoking build on the SPRoot - * object results in creation of the whole document tree (this is, what - * SPDocument does after the creation of the XML tree). - * @see release() - */ - static void build(SPObject *object, SPDocument *document, Inkscape::XML::Node *repr); - - /** - * Callback for set event. - */ - static void private_set(SPObject *object, unsigned int key, gchar const *value); - - /** - * Callback for write event. - */ - static Inkscape::XML::Node *private_write(SPObject *object, Inkscape::XML::Document *doc, Inkscape::XML::Node *repr, guint flags); - - static gchar *get_unique_id(SPObject *object, gchar const *defid); - /* Real handlers of repr signals */ public: @@ -935,13 +864,6 @@ public: Inkscape::XML::Node * (* write) (SPObject *object, Inkscape::XML::Document *doc, Inkscape::XML::Node *repr, unsigned int flags); private: - static GObjectClass *static_parent_class; - - /** - * Initializes the SPObject vtable. - */ - static void init(SPObjectClass *klass); - friend class SPObject; }; diff --git a/src/sp-rect.cpp b/src/sp-rect.cpp index f33d234ee..e7e1432c2 100644 --- a/src/sp-rect.cpp +++ b/src/sp-rect.cpp @@ -31,9 +31,6 @@ #define noRECT_VERBOSE -static void sp_rect_class_init(SPRectClass *klass); -static void sp_rect_init(SPRect *rect); - static void sp_rect_build(SPObject *object, SPDocument *document, Inkscape::XML::Node *repr); static void sp_rect_set(SPObject *object, unsigned key, gchar const *value); static void sp_rect_update(SPObject *object, SPCtx *ctx, guint flags); @@ -46,30 +43,7 @@ static void sp_rect_convert_to_guides(SPItem *item); static void sp_rect_set_shape(SPShape *shape); static void sp_rect_snappoints(SPItem const *item, std::vector<Inkscape::SnapCandidatePoint> &p, Inkscape::SnapPreferences const *snapprefs); -static SPShapeClass *parent_class; - -GType -sp_rect_get_type(void) -{ - static GType type = 0; - - if (!type) { - GTypeInfo info = { - sizeof(SPRectClass), - NULL, /* base_init */ - NULL, /* base_finalize */ - (GClassInitFunc) sp_rect_class_init, - NULL, /* class_finalize */ - NULL, /* class_data */ - sizeof(SPRect), - 16, /* n_preallocs */ - (GInstanceInitFunc) sp_rect_init, - NULL, /* value_table */ - }; - type = g_type_register_static(SP_TYPE_SHAPE, "SPRect", &info, (GTypeFlags)0); - } - return type; -} +G_DEFINE_TYPE(SPRect, sp_rect, SP_TYPE_SHAPE); static void sp_rect_class_init(SPRectClass *klass) @@ -78,8 +52,6 @@ sp_rect_class_init(SPRectClass *klass) SPItemClass *item_class = (SPItemClass *) klass; SPShapeClass *shape_class = (SPShapeClass *) klass; - parent_class = (SPShapeClass *)g_type_class_ref(SP_TYPE_SHAPE); - sp_object_class->build = sp_rect_build; sp_object_class->write = sp_rect_write; sp_object_class->set = sp_rect_set; @@ -108,8 +80,8 @@ sp_rect_init(SPRect */*rect*/) static void sp_rect_build(SPObject *object, SPDocument *document, Inkscape::XML::Node *repr) { - if (((SPObjectClass *) parent_class)->build) - ((SPObjectClass *) parent_class)->build(object, document, repr); + if ((SP_OBJECT_CLASS(sp_rect_parent_class))->build) + (SP_OBJECT_CLASS(sp_rect_parent_class))->build(object, document, repr); object->readAttr( "x" ); object->readAttr( "y" ); @@ -160,8 +132,8 @@ sp_rect_set(SPObject *object, unsigned key, gchar const *value) object->requestDisplayUpdate(SP_OBJECT_MODIFIED_FLAG); break; default: - if (((SPObjectClass *) parent_class)->set) - ((SPObjectClass *) parent_class)->set(object, key, value); + if ((SP_OBJECT_CLASS(sp_rect_parent_class))->set) + (SP_OBJECT_CLASS(sp_rect_parent_class))->set(object, key, value); break; } } @@ -187,8 +159,8 @@ sp_rect_update(SPObject *object, SPCtx *ctx, guint flags) flags &= ~SP_OBJECT_USER_MODIFIED_FLAG_B; // since we change the description, it's not a "just translation" anymore } - if (((SPObjectClass *) parent_class)->update) - ((SPObjectClass *) parent_class)->update(object, ctx, flags); + if ((SP_OBJECT_CLASS(sp_rect_parent_class))->update) + (SP_OBJECT_CLASS(sp_rect_parent_class))->update(object, ctx, flags); } static Inkscape::XML::Node * @@ -209,8 +181,8 @@ sp_rect_write(SPObject *object, Inkscape::XML::Document *xml_doc, Inkscape::XML: sp_rect_set_shape ((SPShape *) rect); // evaluate SPCurve - if (((SPObjectClass *) parent_class)->write) - ((SPObjectClass *) parent_class)->write(object, xml_doc, repr, flags); + if ((SP_OBJECT_CLASS(sp_rect_parent_class))->write) + (SP_OBJECT_CLASS(sp_rect_parent_class))->write(object, xml_doc, repr, flags); return repr; } diff --git a/src/sp-rect.h b/src/sp-rect.h index 7bc85dd8a..5e518dcd7 100644 --- a/src/sp-rect.h +++ b/src/sp-rect.h @@ -18,7 +18,7 @@ #include "sp-shape.h" #include <2geom/forward.h> - +G_BEGIN_DECLS #define SP_TYPE_RECT (sp_rect_get_type ()) #define SP_RECT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), SP_TYPE_RECT, SPRect)) @@ -44,7 +44,7 @@ struct SPRectClass { /* Standard GType function */ -GType sp_rect_get_type (void); +GType sp_rect_get_type (void) G_GNUC_CONST; void sp_rect_position_set (SPRect * rect, gdouble x, gdouble y, gdouble width, gdouble height); @@ -65,6 +65,8 @@ gdouble sp_rect_get_visible_height (SPRect *rect); void sp_rect_compensate_rxry (SPRect *rect, Geom::Affine xform); +G_END_DECLS + #endif // SEEN_SP_RECT_H /* diff --git a/src/sp-switch.cpp b/src/sp-switch.cpp index 500e43c9c..be9866e16 100644 --- a/src/sp-switch.cpp +++ b/src/sp-switch.cpp @@ -25,35 +25,11 @@ #include <sigc++/functors/ptr_fun.h> #include <sigc++/adaptors/bind.h> -static void sp_switch_class_init (SPSwitchClass *klass); -static void sp_switch_init (SPSwitch *group); - -static SPGroupClass * parent_class; - -GType CSwitch::getType (void) -{ - static GType switch_type = 0; - if (!switch_type) { - GTypeInfo switch_info = { - sizeof (SPSwitchClass), - NULL, /* base_init */ - NULL, /* base_finalize */ - (GClassInitFunc) sp_switch_class_init, - NULL, /* class_finalize */ - NULL, /* class_data */ - sizeof (SPSwitch), - 16, /* n_preallocs */ - (GInstanceInitFunc) sp_switch_init, - NULL, /* value_table */ - }; - switch_type = g_type_register_static (SP_TYPE_GROUP, "SPSwitch", &switch_info, (GTypeFlags)0); - } - return switch_type; -} +G_DEFINE_TYPE(SPSwitch, sp_switch, SP_TYPE_GROUP); static void -sp_switch_class_init (SPSwitchClass *) { - parent_class = (SPGroupClass *)g_type_class_ref (SP_TYPE_GROUP); +sp_switch_class_init (SPSwitchClass *) +{ } static void sp_switch_init (SPSwitch *group) diff --git a/src/sp-switch.h b/src/sp-switch.h index c2c98e3b3..f0442f27b 100644 --- a/src/sp-switch.h +++ b/src/sp-switch.h @@ -17,12 +17,16 @@ #include <stddef.h> #include <sigc++/connection.h> -#define SP_TYPE_SWITCH (CSwitch::getType()) +G_BEGIN_DECLS + +#define SP_TYPE_SWITCH (sp_switch_get_type()) #define SP_SWITCH(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), SP_TYPE_SWITCH, SPSwitch)) #define SP_SWITCH_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), SP_TYPE_SWITCH, SPSwitchClass)) #define SP_IS_SWITCH(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), SP_TYPE_SWITCH)) #define SP_IS_SWITCH_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), SP_TYPE_SWITCH)) +GType sp_switch_get_type() G_GNUC_CONST; + /* * Virtual methods of SPSwitch */ @@ -32,8 +36,6 @@ public: virtual ~CSwitch(); friend class SPSwitch; - - static GType getType(); virtual void onChildAdded(Inkscape::XML::Node *child); virtual void onChildRemoved(Inkscape::XML::Node *child); @@ -61,4 +63,6 @@ struct SPSwitch : public SPGroup { struct SPSwitchClass : public SPGroupClass { }; +G_END_DECLS + #endif diff --git a/src/sp-text.cpp b/src/sp-text.cpp index 0b60c1960..1b4246483 100644 --- a/src/sp-text.cpp +++ b/src/sp-text.cpp @@ -62,8 +62,6 @@ # SPTEXT #####################################################*/ -static void sp_text_class_init (SPTextClass *classname); -static void sp_text_init (SPText *text); static void sp_text_release (SPObject *object); static void sp_text_build (SPObject *object, SPDocument *document, Inkscape::XML::Node *repr); @@ -82,29 +80,7 @@ static void sp_text_snappoints(SPItem const *item, std::vector<Inkscape::SnapCan static Geom::Affine sp_text_set_transform(SPItem *item, Geom::Affine const &xform); static void sp_text_print (SPItem *item, SPPrintContext *gpc); -static SPItemClass *text_parent_class; - -GType -sp_text_get_type () -{ - static GType type = 0; - if (!type) { - GTypeInfo info = { - sizeof (SPTextClass), - NULL, /* base_init */ - NULL, /* base_finalize */ - (GClassInitFunc) sp_text_class_init, - NULL, /* class_finalize */ - NULL, /* class_data */ - sizeof (SPText), - 16, /* n_preallocs */ - (GInstanceInitFunc) sp_text_init, - NULL, /* value_table */ - }; - type = g_type_register_static (SP_TYPE_ITEM, "SPText", &info, (GTypeFlags)0); - } - return type; -} +G_DEFINE_TYPE(SPText, sp_text, SP_TYPE_ITEM); static void sp_text_class_init (SPTextClass *classname) @@ -112,8 +88,6 @@ sp_text_class_init (SPTextClass *classname) SPObjectClass *sp_object_class = (SPObjectClass *) classname; SPItemClass *item_class = (SPItemClass *) classname; - text_parent_class = (SPItemClass*)g_type_class_ref (SP_TYPE_ITEM); - sp_object_class->release = sp_text_release; sp_object_class->build = sp_text_build; sp_object_class->set = sp_text_set; @@ -146,8 +120,8 @@ sp_text_release (SPObject *object) text->attributes.~TextTagAttributes(); text->layout.~Layout(); - if (((SPObjectClass *) text_parent_class)->release) - ((SPObjectClass *) text_parent_class)->release(object); + if ((SP_OBJECT_CLASS(sp_text_parent_class))->release) + (SP_OBJECT_CLASS(sp_text_parent_class))->release(object); } static void @@ -159,8 +133,8 @@ sp_text_build (SPObject *object, SPDocument *doc, Inkscape::XML::Node *repr) object->readAttr( "dy" ); object->readAttr( "rotate" ); - if (((SPObjectClass *) text_parent_class)->build) - ((SPObjectClass *) text_parent_class)->build(object, doc, repr); + if ((SP_OBJECT_CLASS(sp_text_parent_class))->build) + (SP_OBJECT_CLASS(sp_text_parent_class))->build(object, doc, repr); object->readAttr( "sodipodi:linespacing" ); // has to happen after the styles are read } @@ -186,8 +160,8 @@ sp_text_set(SPObject *object, unsigned key, gchar const *value) object->requestDisplayUpdate(SP_OBJECT_MODIFIED_FLAG | SP_TEXT_LAYOUT_MODIFIED_FLAG); break; default: - if (((SPObjectClass *) text_parent_class)->set) - ((SPObjectClass *) text_parent_class)->set (object, key, value); + if ((SP_OBJECT_CLASS(sp_text_parent_class))->set) + (SP_OBJECT_CLASS(sp_text_parent_class))->set (object, key, value); break; } } @@ -198,8 +172,8 @@ sp_text_child_added (SPObject *object, Inkscape::XML::Node *rch, Inkscape::XML:: { SPText *text = SP_TEXT (object); - if (((SPObjectClass *) text_parent_class)->child_added) - ((SPObjectClass *) text_parent_class)->child_added (object, rch, ref); + if ((SP_OBJECT_CLASS(sp_text_parent_class))->child_added) + (SP_OBJECT_CLASS(sp_text_parent_class))->child_added (object, rch, ref); text->requestDisplayUpdate(SP_OBJECT_MODIFIED_FLAG | SP_TEXT_CONTENT_MODIFIED_FLAG | SP_TEXT_LAYOUT_MODIFIED_FLAG); } @@ -209,8 +183,8 @@ sp_text_remove_child (SPObject *object, Inkscape::XML::Node *rch) { SPText *text = SP_TEXT (object); - if (((SPObjectClass *) text_parent_class)->remove_child) - ((SPObjectClass *) text_parent_class)->remove_child (object, rch); + if ((SP_OBJECT_CLASS(sp_text_parent_class))->remove_child) + (SP_OBJECT_CLASS(sp_text_parent_class))->remove_child (object, rch); text->requestDisplayUpdate(SP_OBJECT_MODIFIED_FLAG | SP_TEXT_CONTENT_MODIFIED_FLAG | SP_TEXT_LAYOUT_MODIFIED_FLAG); } @@ -219,8 +193,8 @@ static void sp_text_update(SPObject *object, SPCtx *ctx, guint flags) { SPText *text = SP_TEXT (object); - if (((SPObjectClass *) text_parent_class)->update) - ((SPObjectClass *) text_parent_class)->update (object, ctx, flags); + if ((SP_OBJECT_CLASS(sp_text_parent_class))->update) + (SP_OBJECT_CLASS(sp_text_parent_class))->update (object, ctx, flags); guint cflags = (flags & SP_OBJECT_MODIFIED_CASCADE); if (flags & SP_OBJECT_MODIFIED_FLAG) cflags |= SP_OBJECT_PARENT_MODIFIED_FLAG; @@ -264,8 +238,8 @@ static void sp_text_update(SPObject *object, SPCtx *ctx, guint flags) static void sp_text_modified(SPObject *object, guint flags) { - if (((SPObjectClass *) text_parent_class)->modified) { - ((SPObjectClass *) text_parent_class)->modified (object, flags); + if ((SP_OBJECT_CLASS(sp_text_parent_class))->modified) { + (SP_OBJECT_CLASS(sp_text_parent_class))->modified (object, flags); } guint cflags = (flags & SP_OBJECT_MODIFIED_CASCADE); @@ -357,8 +331,8 @@ static Inkscape::XML::Node *sp_text_write(SPObject *object, Inkscape::XML::Docum text->getRepr()->setAttribute("sodipodi:linespacing", NULL); } - if (((SPObjectClass *) (text_parent_class))->write) { - ((SPObjectClass *) (text_parent_class))->write (object, xml_doc, repr, flags); + if ((SP_OBJECT_CLASS(sp_text_parent_class))->write) { + (SP_OBJECT_CLASS(sp_text_parent_class))->write (object, xml_doc, repr, flags); } return repr; @@ -396,8 +370,8 @@ sp_text_show(SPItem *item, Inkscape::Drawing &drawing, unsigned /* key*/, unsign static void sp_text_hide(SPItem *item, unsigned key) { - if (((SPItemClass *) text_parent_class)->hide) - ((SPItemClass *) text_parent_class)->hide (item, key); + if ((SP_ITEM_CLASS(sp_text_parent_class))->hide) + (SP_ITEM_CLASS(sp_text_parent_class))->hide (item, key); } static char * sp_text_description(SPItem *item) |
