diff options
| -rw-r--r-- | src/gradient-drag.cpp | 60 | ||||
| -rw-r--r-- | src/gradient-drag.h | 8 | ||||
| -rw-r--r-- | src/knot-holder-entity.cpp | 9 | ||||
| -rw-r--r-- | src/knot.cpp | 637 | ||||
| -rw-r--r-- | src/knot.h | 235 | ||||
| -rw-r--r-- | src/knotholder.cpp | 4 | ||||
| -rw-r--r-- | src/knotholder.h | 2 | ||||
| -rw-r--r-- | src/seltrans.cpp | 64 | ||||
| -rw-r--r-- | src/ui/tools/connector-tool.cpp | 53 | ||||
| -rw-r--r-- | src/vanishing-point.cpp | 29 | ||||
| -rw-r--r-- | src/vanishing-point.h | 4 |
11 files changed, 465 insertions, 640 deletions
diff --git a/src/gradient-drag.cpp b/src/gradient-drag.cpp index 8a0d7ee26..7b9daf57e 100644 --- a/src/gradient-drag.cpp +++ b/src/gradient-drag.cpp @@ -803,7 +803,7 @@ static void gr_knot_moved_handler(SPKnot *knot, Geom::Point const &ppointer, gui m.unSetup(); if (s.getSnapped()) { p = s.getPoint(); - sp_knot_moveto (knot, p); + knot->moveto(p); } } else if (state & GDK_CONTROL_MASK) { IntermSnapResults isr; @@ -888,7 +888,7 @@ static void gr_knot_moved_handler(SPKnot *knot, Geom::Point const &ppointer, gui } //p = isr.points.front().getPoint(); p = bsp.getPoint(); - sp_knot_moveto (knot, p); + knot->moveto(p); } drag->keep_selection = (bool) g_list_find(drag->selected, dragger); @@ -989,8 +989,6 @@ static void gr_midpoint_limits(GrDragger *dragger, SPObject *server, Geom::Point *high_lim = dragger->point - (highest_dragger->point - *end); } - - /** * Called when a midpoint knot is dragged. */ @@ -1046,7 +1044,7 @@ static void gr_knot_moved_midpoint_handler(SPKnot */*knot*/, Geom::Point const & } } drg->point += this_move; - sp_knot_moveto (drgknot, drg->point); + drgknot->moveto(drg->point); drg->fireDraggables (false); drg->updateDependencies(false); } @@ -1388,7 +1386,7 @@ GrDragger::updateHandles ( Geom::Point pc_old, MeshNodeOperation op ) GrDragger *handle = drag->getDraggerFor( item, POINT_MG_HANDLE, i, fill_or_stroke ); SPKnot *knot = handle->knot; Geom::Point pk = getGradientCoords( item, POINT_MG_HANDLE, i, fill_or_stroke ); - sp_knot_moveto( knot, pk ); + knot->moveto(pk); } @@ -1397,7 +1395,7 @@ GrDragger::updateHandles ( Geom::Point pc_old, MeshNodeOperation op ) GrDragger *handle = drag->getDraggerFor( item, POINT_MG_TENSOR, i, fill_or_stroke ); SPKnot *knot = handle->knot; Geom::Point pk = getGradientCoords( item, POINT_MG_TENSOR, i, fill_or_stroke ); - sp_knot_moveto( knot, pk ); + knot->moveto(pk); } @@ -1483,7 +1481,7 @@ void GrDragger::moveThisToDraggable(SPItem *item, GrPointType point_type, gint p this->point = getGradientCoords(dr_first->item, dr_first->point_type, dr_first->point_i, dr_first->fill_or_stroke); this->point_original = this->point; - sp_knot_moveto(this->knot, this->point); + this->knot->moveto(this->point); for (GSList const* i = draggables; i != NULL; i = i->next) { GrDraggable *da = (GrDraggable *) i->data; @@ -1593,15 +1591,15 @@ GrDragger::GrDragger(GrDrag *parent, Geom::Point p, GrDraggable *draggable) this->parent = parent; // create the knot - this->knot = sp_knot_new (parent->desktop, NULL); + this->knot = new SPKnot(parent->desktop, NULL); this->knot->setMode(SP_KNOT_MODE_XOR); this->knot->setFill(GR_KNOT_COLOR_NORMAL, GR_KNOT_COLOR_MOUSEOVER, GR_KNOT_COLOR_MOUSEOVER); this->knot->setStroke(0x0000007f, 0x0000007f, 0x0000007f); - sp_knot_update_ctrl(this->knot); + this->knot->update_ctrl(); // move knot to the given point - sp_knot_set_position (this->knot, p, SP_KNOT_STATE_NORMAL); - sp_knot_show (this->knot); + this->knot->set_position(p, SP_KNOT_STATE_NORMAL); + this->knot->show(); // connect knot's signals if ( (draggable) // it can be NULL if a node in unsnapped (eg. focus point unsnapped from center) @@ -1610,18 +1608,21 @@ GrDragger::GrDragger(GrDrag *parent, Geom::Point p, GrDraggable *draggable) || (draggable->point_type == POINT_RG_MID1) || (draggable->point_type == POINT_RG_MID2) ) ) { - this->handler_id = g_signal_connect (G_OBJECT (this->knot), "moved", G_CALLBACK (gr_knot_moved_midpoint_handler), this); + this->_moved_connection = this->knot->_moved_signal.connect(sigc::bind(sigc::ptr_fun(gr_knot_moved_midpoint_handler), this)); } else { - this->handler_id = g_signal_connect (G_OBJECT (this->knot), "moved", G_CALLBACK (gr_knot_moved_handler), this); + this->_moved_connection = this->knot->_moved_signal.connect(sigc::bind(sigc::ptr_fun(gr_knot_moved_handler), this)); } - g_signal_connect (G_OBJECT (this->knot), "clicked", G_CALLBACK (gr_knot_clicked_handler), this); - g_signal_connect (G_OBJECT (this->knot), "doubleclicked", G_CALLBACK (gr_knot_doubleclicked_handler), this); - g_signal_connect (G_OBJECT (this->knot), "grabbed", G_CALLBACK (gr_knot_grabbed_handler), this); - g_signal_connect (G_OBJECT (this->knot), "ungrabbed", G_CALLBACK (gr_knot_ungrabbed_handler), this); + + this->_clicked_connection = this->knot->_click_signal.connect(sigc::bind(sigc::ptr_fun(gr_knot_clicked_handler), this)); + this->_doubleclicked_connection = this->knot->_doubleclicked_signal.connect(sigc::bind(sigc::ptr_fun(gr_knot_doubleclicked_handler), this)); + this->_grabbed_connection = this->knot->_grabbed_signal.connect(sigc::bind(sigc::ptr_fun(gr_knot_grabbed_handler), this)); + this->_ungrabbed_connection = this->knot->_ungrabbed_signal.connect(sigc::bind(sigc::ptr_fun(gr_knot_ungrabbed_handler), this)); // add the initial draggable - if (draggable) + if (draggable) { this->addDraggable (draggable); + } + updateKnotShape(); } @@ -1634,19 +1635,20 @@ GrDragger::~GrDragger() //this->parent->setDeselected(this); // disconnect signals - g_signal_handlers_disconnect_by_func(G_OBJECT(this->knot), (gpointer) G_CALLBACK (gr_knot_moved_handler), this); - g_signal_handlers_disconnect_by_func(G_OBJECT(this->knot), (gpointer) G_CALLBACK (gr_knot_clicked_handler), this); - g_signal_handlers_disconnect_by_func(G_OBJECT(this->knot), (gpointer) G_CALLBACK (gr_knot_doubleclicked_handler), this); - g_signal_handlers_disconnect_by_func(G_OBJECT(this->knot), (gpointer) G_CALLBACK (gr_knot_grabbed_handler), this); - g_signal_handlers_disconnect_by_func(G_OBJECT(this->knot), (gpointer) G_CALLBACK (gr_knot_ungrabbed_handler), this); + this->_moved_connection.disconnect(); + this->_clicked_connection.disconnect(); + this->_doubleclicked_connection.disconnect(); + this->_grabbed_connection.disconnect(); + this->_ungrabbed_connection.disconnect(); /* unref should call destroy */ - g_object_unref (G_OBJECT (this->knot)); + knot_unref(this->knot); // delete all draggables for (GSList const* i = this->draggables; i != NULL; i = i->next) { delete ((GrDraggable *) i->data); } + g_slist_free (this->draggables); this->draggables = NULL; } @@ -2043,7 +2045,7 @@ void GrDrag::addDraggersMesh(SPMeshGradient *mg, SPItem *item, Inkscape::PaintTa void GrDrag::grabKnot(GrDragger *dragger, gint x, gint y, guint32 etime) { if (dragger) { - sp_knot_start_dragging (dragger->knot, dragger->point, x, y, etime); + dragger->knot->start_dragging(dragger->point, x, y, etime); } } @@ -2055,7 +2057,7 @@ void GrDrag::grabKnot(SPItem *item, GrPointType point_type, gint point_i, Inksca { GrDragger *dragger = getDraggerFor(item, point_type, point_i, fill_or_stroke); if (dragger) { - sp_knot_start_dragging (dragger->knot, dragger->point, x, y, etime); + dragger->knot->start_dragging(dragger->point, x, y, etime); } } @@ -2358,7 +2360,7 @@ void GrDrag::selected_move(double x, double y, bool write_repr, bool scale_radia Geom::Point p_old = d->point; d->point += Geom::Point (x, y); d->point_original = d->point; - sp_knot_moveto (d->knot, d->point); + d->knot->moveto(d->point); d->fireDraggables (write_repr, scale_radial); d->updateHandles( p_old, MG_NODE_NO_SCALE ); @@ -2394,7 +2396,7 @@ void GrDrag::selected_move(double x, double y, bool write_repr, bool scale_radia GrDragger *drg = (GrDragger*) i->data; SPKnot *drgknot = drg->knot; drg->point += displacement; - sp_knot_moveto (drgknot, drg->point); + drgknot->moveto(drg->point); drg->fireDraggables (true); drg->updateDependencies(true); did = true; diff --git a/src/gradient-drag.h b/src/gradient-drag.h index 4ed13b9f7..e22b48e19 100644 --- a/src/gradient-drag.h +++ b/src/gradient-drag.h @@ -87,7 +87,13 @@ struct GrDragger { Geom::Point point_original; /** Connection to \a knot's "moved" signal, for blocking it (unused?). */ - guint handler_id; + //guint handler_id; + + sigc::connection _moved_connection; + sigc::connection _clicked_connection; + sigc::connection _doubleclicked_connection; + sigc::connection _grabbed_connection; + sigc::connection _ungrabbed_connection; GSList *draggables; diff --git a/src/knot-holder-entity.cpp b/src/knot-holder-entity.cpp index 043685460..48096489e 100644 --- a/src/knot-holder-entity.cpp +++ b/src/knot-holder-entity.cpp @@ -34,7 +34,7 @@ void KnotHolderEntity::create(SPDesktop *desktop, SPItem *item, KnotHolder *pare const gchar *tip, SPKnotShapeType shape, SPKnotModeType mode, guint32 color) { - knot = sp_knot_new(desktop, tip); + knot = new SPKnot(desktop, tip); this->parent_holder = parent; this->item = item; // TODO: remove the item either from here or from knotholder.cpp @@ -52,7 +52,7 @@ void KnotHolderEntity::create(SPDesktop *desktop, SPItem *item, KnotHolder *pare g_object_set (G_OBJECT(knot->item), "fill_color", color, NULL); update_knot(); - sp_knot_show(knot); + knot->show(); _moved_connection = knot->_moved_signal.connect(sigc::mem_fun(*parent_holder, &KnotHolder::knot_moved_handler)); _click_connection = knot->_click_signal.connect(sigc::mem_fun(*parent_holder, &KnotHolder::knot_clicked_handler)); @@ -68,7 +68,8 @@ KnotHolderEntity::~KnotHolderEntity() /* unref should call destroy */ if (knot) { - g_object_unref(knot); + //g_object_unref(knot); + knot_unref(knot); } else { // FIXME: This shouldn't occur. Perhaps it is caused by LPE PointParams being knotholder entities, too // If so, it will likely be fixed with upcoming refactoring efforts. @@ -84,7 +85,7 @@ KnotHolderEntity::update_knot() Geom::Point dp(knot_get() * i2dt); _moved_connection.block(); - sp_knot_set_position(knot, dp, SP_KNOT_STATE_NORMAL); + knot->set_position(dp, SP_KNOT_STATE_NORMAL); _moved_connection.unblock(); } diff --git a/src/knot.cpp b/src/knot.cpp index 2179bc3d5..59d048d8b 100644 --- a/src/knot.cpp +++ b/src/knot.cpp @@ -17,7 +17,6 @@ #endif #include <gdk/gdkkeysyms.h> #include <glibmm/i18n.h> -#include "helper/sp-marshal.h" #include "display/sodipodi-ctrl.h" #include "desktop.h" #include "desktop-handles.h" @@ -36,10 +35,11 @@ using Inkscape::DocumentUndo; GDK_POINTER_MOTION_HINT_MASK | \ GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK) -static bool nograb = false; +const gchar *nograbenv = getenv("INKSCAPE_NO_GRAB"); +static bool nograb = (nograbenv && *nograbenv && (*nograbenv != '0')); -static bool grabbed = FALSE; -static bool moved = FALSE; +static bool grabbed = false; +static bool moved = false; static gint xp = 0, yp = 0; // where drag started static gint tolerance = 0; @@ -47,247 +47,136 @@ static bool within_tolerance = false; static bool transform_escaped = false; // true iff resize or rotate was cancelled by esc. -enum { - EVENT, - CLICKED, - DOUBLECLICKED, - GRABBED, - UNGRABBED, - MOVED, - REQUEST, - DISTANCE, - LAST_SIGNAL -}; - -static void sp_knot_class_init(SPKnotClass *klass); -static void sp_knot_init(SPKnot *knot); -static void sp_knot_dispose(GObject *object); +void knot_ref(SPKnot* knot) { + knot->ref_count++; +} + +void knot_unref(SPKnot* knot) { + if (--knot->ref_count < 1) { + delete knot; + } +} + static int sp_knot_handler(SPCanvasItem *item, GdkEvent *event, SPKnot *knot); -static void sp_knot_set_ctrl_state(SPKnot *knot); -static GObjectClass *parent_class; -static guint knot_signals[LAST_SIGNAL] = { 0 }; +SPKnot::SPKnot(SPDesktop *desktop, const gchar *tip) : ref_count(1) { + this->desktop = NULL; + this->item = NULL; + this->owner = NULL; + this->flags = 0; -GType sp_knot_get_type() -{ - static GType type = 0; - if (!type) { - GTypeInfo info = { - sizeof(SPKnotClass), - NULL, /* base_init */ - NULL, /* base_finalize */ - (GClassInitFunc) sp_knot_class_init, - NULL, /* class_finalize */ - NULL, /* class_data */ - sizeof (SPKnot), - 16, /* n_preallocs */ - (GInstanceInitFunc) sp_knot_init, - NULL - }; - type = g_type_register_static (G_TYPE_OBJECT, "SPKnot", &info, (GTypeFlags) 0); + this->size = 8; + this->pos = Geom::Point(0, 0); + this->grabbed_rel_pos = Geom::Point(0, 0); + this->anchor = SP_ANCHOR_CENTER; + this->shape = SP_KNOT_SHAPE_SQUARE; + this->mode = SP_KNOT_MODE_XOR; + this->tip = NULL; + this->_event_handler_id = 0; + this->pressure = 0; + + this->fill[SP_KNOT_STATE_NORMAL] = 0xffffff00; + this->fill[SP_KNOT_STATE_MOUSEOVER] = 0xff0000ff; + this->fill[SP_KNOT_STATE_DRAGGING] = 0x0000ffff; + + this->stroke[SP_KNOT_STATE_NORMAL] = 0x01000000; + this->stroke[SP_KNOT_STATE_MOUSEOVER] = 0x01000000; + this->stroke[SP_KNOT_STATE_DRAGGING] = 0x01000000; + + this->image[SP_KNOT_STATE_NORMAL] = NULL; + this->image[SP_KNOT_STATE_MOUSEOVER] = NULL; + this->image[SP_KNOT_STATE_DRAGGING] = NULL; + + this->cursor[SP_KNOT_STATE_NORMAL] = NULL; + this->cursor[SP_KNOT_STATE_MOUSEOVER] = NULL; + this->cursor[SP_KNOT_STATE_DRAGGING] = NULL; + + this->saved_cursor = NULL; + this->pixbuf = NULL; + + + this->desktop = desktop; + this->flags = SP_KNOT_VISIBLE; + + if (tip) { + this->tip = g_strdup (tip); } - return type; -} -/** - * SPKnot vtable initialization. - */ -static void sp_knot_class_init(SPKnotClass *klass) -{ - GObjectClass *object_class = (GObjectClass*)klass; - - parent_class = (GObjectClass*) g_type_class_peek_parent(klass); - - object_class->dispose = sp_knot_dispose; - - knot_signals[EVENT] = g_signal_new("event", - G_TYPE_FROM_CLASS(klass), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET(SPKnotClass, event), - NULL, NULL, - sp_marshal_BOOLEAN__POINTER, - G_TYPE_BOOLEAN, 1, - GDK_TYPE_EVENT); - - knot_signals[CLICKED] = g_signal_new("clicked", - G_TYPE_FROM_CLASS(klass), - G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET(SPKnotClass, clicked), - NULL, NULL, - g_cclosure_marshal_VOID__UINT, - G_TYPE_NONE, 1, - G_TYPE_UINT); - - knot_signals[DOUBLECLICKED] = g_signal_new("doubleclicked", - G_TYPE_FROM_CLASS(klass), - G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET(SPKnotClass, doubleclicked), - NULL, NULL, - g_cclosure_marshal_VOID__UINT, - G_TYPE_NONE, 1, - G_TYPE_UINT); - - knot_signals[GRABBED] = g_signal_new("grabbed", - G_TYPE_FROM_CLASS(klass), - G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET(SPKnotClass, grabbed), - NULL, NULL, - g_cclosure_marshal_VOID__UINT, - G_TYPE_NONE, 1, - G_TYPE_UINT); - - knot_signals[UNGRABBED] = g_signal_new("ungrabbed", - G_TYPE_FROM_CLASS(klass), - G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET(SPKnotClass, ungrabbed), - NULL, NULL, - g_cclosure_marshal_VOID__UINT, - G_TYPE_NONE, 1, - G_TYPE_UINT); - - knot_signals[MOVED] = g_signal_new("moved", - G_TYPE_FROM_CLASS(klass), - G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET(SPKnotClass, moved), - NULL, NULL, - sp_marshal_NONE__POINTER_UINT, - G_TYPE_NONE, 2, - G_TYPE_POINTER, G_TYPE_UINT); - - knot_signals[REQUEST] = g_signal_new("request", - G_TYPE_FROM_CLASS(klass), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET(SPKnotClass, request), - NULL, NULL, - sp_marshal_BOOLEAN__POINTER_UINT, - G_TYPE_BOOLEAN, 2, - G_TYPE_POINTER, G_TYPE_UINT); - - knot_signals[DISTANCE] = g_signal_new("distance", - G_TYPE_FROM_CLASS(klass), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET(SPKnotClass, distance), - NULL, NULL, - sp_marshal_DOUBLE__POINTER_UINT, - G_TYPE_DOUBLE, 2, - G_TYPE_POINTER, G_TYPE_UINT); - - const gchar *nograbenv = getenv("INKSCAPE_NO_GRAB"); - nograb = (nograbenv && *nograbenv && (*nograbenv != '0')); -} + this->item = sp_canvas_item_new(sp_desktop_controls (desktop), + SP_TYPE_CTRL, + "anchor", SP_ANCHOR_CENTER, + "size", 8.0, + "filled", TRUE, + "fill_color", 0xffffff00, + "stroked", TRUE, + "stroke_color", 0x01000000, + "mode", SP_KNOT_MODE_XOR, + NULL); -/** - * Callback for SPKnot initialization. - */ -static void sp_knot_init(SPKnot *knot) -{ - knot->desktop = NULL; - knot->item = NULL; - knot->owner = NULL; - knot->flags = 0; - - knot->size = 8; - knot->pos = Geom::Point(0, 0); - knot->grabbed_rel_pos = Geom::Point(0, 0); - knot->anchor = SP_ANCHOR_CENTER; - knot->shape = SP_KNOT_SHAPE_SQUARE; - knot->mode = SP_KNOT_MODE_XOR; - knot->tip = NULL; - knot->_event_handler_id = 0; - knot->pressure = 0; - - knot->fill[SP_KNOT_STATE_NORMAL] = 0xffffff00; - knot->fill[SP_KNOT_STATE_MOUSEOVER] = 0xff0000ff; - knot->fill[SP_KNOT_STATE_DRAGGING] = 0x0000ffff; - - knot->stroke[SP_KNOT_STATE_NORMAL] = 0x01000000; - knot->stroke[SP_KNOT_STATE_MOUSEOVER] = 0x01000000; - knot->stroke[SP_KNOT_STATE_DRAGGING] = 0x01000000; - - knot->image[SP_KNOT_STATE_NORMAL] = NULL; - knot->image[SP_KNOT_STATE_MOUSEOVER] = NULL; - knot->image[SP_KNOT_STATE_DRAGGING] = NULL; - - knot->cursor[SP_KNOT_STATE_NORMAL] = NULL; - knot->cursor[SP_KNOT_STATE_MOUSEOVER] = NULL; - knot->cursor[SP_KNOT_STATE_DRAGGING] = NULL; - - knot->saved_cursor = NULL; - knot->pixbuf = NULL; + this->_event_handler_id = g_signal_connect(G_OBJECT(this->item), "event", + G_CALLBACK(sp_knot_handler), this); } -/** - * Called before SPKnot destruction. - */ -static void sp_knot_dispose(GObject *object) -{ - SPKnot *knot = static_cast<SPKnot *>(object); - +SPKnot::~SPKnot() { #if GTK_CHECK_VERSION(3,0,0) GdkDisplay *display = gdk_display_get_default(); GdkDeviceManager *dm = gdk_display_get_device_manager(display); GdkDevice *device = gdk_device_manager_get_client_pointer(dm); - if ((knot->flags & SP_KNOT_GRABBED) && gdk_display_device_is_grabbed(display, device)) { + if ((this->flags & SP_KNOT_GRABBED) && gdk_display_device_is_grabbed(display, device)) { // This happens e.g. when deleting a node in node tool while dragging it gdk_device_ungrab(device, GDK_CURRENT_TIME); } #else - if ((knot->flags & SP_KNOT_GRABBED) && gdk_pointer_is_grabbed ()) { + if ((this->flags & SP_KNOT_GRABBED) && gdk_pointer_is_grabbed ()) { // This happens e.g. when deleting a node in node tool while dragging it gdk_pointer_ungrab (GDK_CURRENT_TIME); } #endif - if (knot->_event_handler_id > 0) - { - g_signal_handler_disconnect(G_OBJECT (knot->item), knot->_event_handler_id); - knot->_event_handler_id = 0; - } + if (this->_event_handler_id > 0) { + g_signal_handler_disconnect(G_OBJECT (this->item), this->_event_handler_id); + this->_event_handler_id = 0; + } - if (knot->item) { - sp_canvas_item_destroy(knot->item); - knot->item = NULL; + if (this->item) { + sp_canvas_item_destroy(this->item); + this->item = NULL; } for (gint i = 0; i < SP_KNOT_VISIBLE_STATES; i++) { - if (knot->cursor[i]) { + if (this->cursor[i]) { #if GTK_CHECK_VERSION(3,0,0) - g_object_unref(knot->cursor[i]); + g_object_unref(this->cursor[i]); #else - gdk_cursor_unref(knot->cursor[i]); + gdk_cursor_unref(this->cursor[i]); #endif - knot->cursor[i] = NULL; + this->cursor[i] = NULL; } } - if (knot->tip) { - g_free(knot->tip); - knot->tip = NULL; - } - - if (parent_class->dispose) { - (*parent_class->dispose) (object); + if (this->tip) { + g_free(this->tip); + this->tip = NULL; } } -void sp_knot_start_dragging(SPKnot *knot, Geom::Point const &p, gint x, gint y, guint32 etime) -{ +void SPKnot::start_dragging(Geom::Point const &p, gint x, gint y, guint32 etime) { // save drag origin xp = x; yp = y; within_tolerance = true; - knot->grabbed_rel_pos = p - knot->pos; - knot->drag_origin = knot->pos; + this->grabbed_rel_pos = p - this->pos; + this->drag_origin = this->pos; + if (!nograb) { - sp_canvas_item_grab(knot->item, - KNOT_EVENT_MASK, - knot->cursor[SP_KNOT_STATE_DRAGGING], - etime); + sp_canvas_item_grab(this->item, KNOT_EVENT_MASK, this->cursor[SP_KNOT_STATE_DRAGGING], etime); } - sp_knot_set_flag(knot, SP_KNOT_GRABBED, TRUE); + + this->set_flag(SP_KNOT_GRABBED, TRUE); + grabbed = TRUE; } @@ -300,23 +189,21 @@ static int sp_knot_handler(SPCanvasItem */*item*/, GdkEvent *event, SPKnot *knot g_assert(SP_IS_KNOT(knot)); /* Run client universal event handler, if present */ - - gboolean consumed = FALSE; - - g_signal_emit(knot, knot_signals[EVENT], 0, event, &consumed); + bool consumed = knot->_event_signal.emit(knot, event); if (consumed) { - return TRUE; + return true; } - g_object_ref(knot); + knot_ref(knot); + Inkscape::Preferences *prefs = Inkscape::Preferences::get(); tolerance = prefs->getIntLimited("/options/dragtolerance/value", 0, 0, 100); switch (event->type) { case GDK_2BUTTON_PRESS: if (event->button.button == 1) { - g_signal_emit(knot, knot_signals[DOUBLECLICKED], 0, event->button.state); + knot->_doubleclicked_signal.emit(knot, event->button.state); grabbed = FALSE; moved = FALSE; @@ -326,7 +213,8 @@ static int sp_knot_handler(SPCanvasItem */*item*/, GdkEvent *event, SPKnot *knot case GDK_BUTTON_PRESS: if ((event->button.button == 1) && knot->desktop && knot->desktop->event_context && !knot->desktop->event_context->space_panning) { Geom::Point const p = knot->desktop->w2d(Geom::Point(event->button.x, event->button.y)); - sp_knot_start_dragging(knot, p, (gint) event->button.x, (gint) event->button.y, event->button.time); + knot->start_dragging(p, (gint) event->button.x, (gint) event->button.y, event->button.time); + consumed = TRUE; } break; @@ -340,28 +228,25 @@ static int sp_knot_handler(SPCanvasItem */*item*/, GdkEvent *event, SPKnot *knot sp_event_context_discard_delayed_snap_event(knot->desktop->event_context); knot->pressure = 0; + if (transform_escaped) { transform_escaped = false; consumed = TRUE; } else { - sp_knot_set_flag(knot, SP_KNOT_GRABBED, FALSE); + knot->set_flag(SP_KNOT_GRABBED, FALSE); + if (!nograb) { sp_canvas_item_ungrab(knot->item, event->button.time); } + if (moved) { - sp_knot_set_flag(knot, - SP_KNOT_DRAGGING, - FALSE); - g_signal_emit(knot, - knot_signals[UNGRABBED], 0, - event->button.state); - knot->_ungrabbed_signal.emit(knot); + knot->set_flag(SP_KNOT_DRAGGING, FALSE); + + knot->_ungrabbed_signal.emit(knot, event->button.state); } else { - g_signal_emit(knot, - knot_signals[CLICKED], 0, - event->button.state); knot->_click_signal.emit(knot, event->button.state); } + grabbed = FALSE; moved = FALSE; consumed = TRUE; @@ -383,27 +268,26 @@ static int sp_knot_handler(SPCanvasItem */*item*/, GdkEvent *event, SPKnot *knot // motion notify coordinates as given (no snapping back to origin) within_tolerance = false; - if (gdk_event_get_axis (event, GDK_AXIS_PRESSURE, &knot->pressure)) + if (gdk_event_get_axis (event, GDK_AXIS_PRESSURE, &knot->pressure)) { knot->pressure = CLAMP (knot->pressure, 0, 1); - else + } else { knot->pressure = 0.5; + } if (!moved) { - g_signal_emit(knot, - knot_signals[GRABBED], 0, - event->motion.state); - sp_knot_set_flag(knot, - SP_KNOT_DRAGGING, - TRUE); + knot->_grabbed_signal.emit(knot, event->motion.state); + + knot->set_flag(SP_KNOT_DRAGGING, TRUE); } + sp_event_context_snap_delay_handler(knot->desktop->event_context, NULL, (gpointer) knot, (GdkEventMotion *)event, Inkscape::UI::Tools::DelayedSnapEvent::KNOT_HANDLER); sp_knot_handler_request_position(event, knot); moved = TRUE; } break; case GDK_ENTER_NOTIFY: - sp_knot_set_flag(knot, SP_KNOT_MOUSEOVER, TRUE); - sp_knot_set_flag(knot, SP_KNOT_GRABBED, FALSE); + knot->set_flag(SP_KNOT_MOUSEOVER, TRUE); + knot->set_flag(SP_KNOT_GRABBED, FALSE); if (knot->tip && knot->desktop && knot->desktop->event_context) { knot->desktop->event_context->defaultMessageContext()->set(Inkscape::NORMAL_MESSAGE, knot->tip); @@ -414,8 +298,8 @@ static int sp_knot_handler(SPCanvasItem */*item*/, GdkEvent *event, SPKnot *knot consumed = TRUE; break; case GDK_LEAVE_NOTIFY: - sp_knot_set_flag(knot, SP_KNOT_MOUSEOVER, FALSE); - sp_knot_set_flag(knot, SP_KNOT_GRABBED, FALSE); + knot->set_flag(SP_KNOT_MOUSEOVER, FALSE); + knot->set_flag(SP_KNOT_GRABBED, FALSE); if (knot->tip && knot->desktop && knot->desktop->event_context) { knot->desktop->event_context->defaultMessageContext()->clear(); @@ -428,24 +312,26 @@ static int sp_knot_handler(SPCanvasItem */*item*/, GdkEvent *event, SPKnot *knot case GDK_KEY_PRESS: // keybindings for knot switch (Inkscape::UI::Tools::get_group0_keyval(&event->key)) { case GDK_KEY_Escape: - sp_knot_set_flag(knot, SP_KNOT_GRABBED, FALSE); + knot->set_flag(SP_KNOT_GRABBED, FALSE); + if (!nograb) { sp_canvas_item_ungrab(knot->item, event->button.time); } + if (moved) { - sp_knot_set_flag(knot, - SP_KNOT_DRAGGING, - FALSE); - g_signal_emit(knot, - knot_signals[UNGRABBED], 0, - event->button.state); + knot->set_flag(SP_KNOT_DRAGGING, FALSE); + + knot->_ungrabbed_signal.emit(knot, event->button.state); + DocumentUndo::undo(sp_desktop_document(knot->desktop)); knot->desktop->messageStack()->flash(Inkscape::NORMAL_MESSAGE, _("Node or handle drag canceled.")); transform_escaped = true; consumed = TRUE; } + grabbed = FALSE; moved = FALSE; + sp_event_context_discard_delayed_snap_event(knot->desktop->event_context); break; default: @@ -457,164 +343,82 @@ static int sp_knot_handler(SPCanvasItem */*item*/, GdkEvent *event, SPKnot *knot break; } - g_object_unref(knot); + knot_unref(knot); return consumed || grabbed; } -void sp_knot_handler_request_position(GdkEvent *event, SPKnot *knot) -{ +void sp_knot_handler_request_position(GdkEvent *event, SPKnot *knot) { Geom::Point const motion_w(event->motion.x, event->motion.y); Geom::Point const motion_dt = knot->desktop->w2d(motion_w); Geom::Point p = motion_dt - knot->grabbed_rel_pos; - sp_knot_request_position (knot, p, event->motion.state); + + knot->request_position(p, event->motion.state); knot->desktop->scroll_to_point (motion_dt); knot->desktop->set_coordinate_status(knot->pos); // display the coordinate of knot, not cursor - they may be different! - if (event->motion.state & GDK_BUTTON1_MASK) - Inkscape::UI::Tools::gobble_motion_events(GDK_BUTTON1_MASK); -} - -SPKnot *sp_knot_new(SPDesktop *desktop, const gchar *tip) -{ - g_return_val_if_fail(desktop != NULL, NULL); - - SPKnot * knot = static_cast<SPKnot*>(g_object_new(SP_TYPE_KNOT, 0)); - knot->desktop = desktop; - knot->flags = SP_KNOT_VISIBLE; - if (tip) { - knot->tip = g_strdup (tip); + if (event->motion.state & GDK_BUTTON1_MASK) { + Inkscape::UI::Tools::gobble_motion_events(GDK_BUTTON1_MASK); } - - knot->item = sp_canvas_item_new(sp_desktop_controls (desktop), - SP_TYPE_CTRL, - "anchor", SP_ANCHOR_CENTER, - "size", 8.0, - "filled", TRUE, - "fill_color", 0xffffff00, - "stroked", TRUE, - "stroke_color", 0x01000000, - "mode", SP_KNOT_MODE_XOR, - NULL); - - knot->_event_handler_id = g_signal_connect(G_OBJECT(knot->item), "event", - G_CALLBACK(sp_knot_handler), knot); - - return knot; } -void sp_knot_show(SPKnot *knot) -{ - g_return_if_fail(knot != NULL); - g_return_if_fail(SP_IS_KNOT (knot)); - - sp_knot_set_flag(knot, SP_KNOT_VISIBLE, TRUE); +void SPKnot::show() { + this->set_flag(SP_KNOT_VISIBLE, TRUE); } -void sp_knot_hide(SPKnot *knot) -{ - g_return_if_fail(knot != NULL); - g_return_if_fail(SP_IS_KNOT(knot)); - - sp_knot_set_flag(knot, SP_KNOT_VISIBLE, FALSE); +void SPKnot::hide() { + this->set_flag(SP_KNOT_VISIBLE, FALSE); } -void sp_knot_request_position(SPKnot *knot, Geom::Point const &p, guint state) -{ - g_return_if_fail(knot != NULL); - g_return_if_fail(SP_IS_KNOT(knot)); - - gboolean done = FALSE; - - g_signal_emit(knot, - knot_signals[REQUEST], 0, - &p, - state, - &done); +void SPKnot::request_position(Geom::Point const &p, guint state) { + bool done = this->_request_signal.emit(this, &const_cast<Geom::Point&>(p), state); /* If user did not complete, we simply move knot to new position */ - if (!done) { - sp_knot_set_position (knot, p, state); + this->set_position(p, state); } } -gdouble sp_knot_distance(SPKnot * knot, Geom::Point const &p, guint state) -{ - g_return_val_if_fail(knot != NULL, 1e18); - g_return_val_if_fail(SP_IS_KNOT(knot), 1e18); - - gdouble distance = Geom::L2(p - knot->pos); +void SPKnot::set_position(Geom::Point const &p, guint state) { + this->pos = p; - g_signal_emit(knot, - knot_signals[DISTANCE], 0, - &p, - state, - &distance); - - return distance; -} - -void sp_knot_set_position(SPKnot *knot, Geom::Point const &p, guint state) -{ - g_return_if_fail(knot != NULL); - g_return_if_fail(SP_IS_KNOT (knot)); - - knot->pos = p; - - if (knot->item) { - SP_CTRL(knot->item)->moveto (p); + if (this->item) { + SP_CTRL(this->item)->moveto(p); } - g_signal_emit(knot, - knot_signals[MOVED], 0, - &p, - state); - knot->_moved_signal.emit(knot, p, state); + this->_moved_signal.emit(this, p, state); } -void sp_knot_moveto(SPKnot *knot, Geom::Point const &p) -{ - g_return_if_fail(knot != NULL); - g_return_if_fail(SP_IS_KNOT(knot)); - - knot->pos = p; +void SPKnot::moveto(Geom::Point const &p) { + this->pos = p; - if (knot->item) { - SP_CTRL(knot->item)->moveto (p); + if (this->item) { + SP_CTRL(this->item)->moveto(p); } } -Geom::Point sp_knot_position(SPKnot const *knot) -{ - g_assert(knot != NULL); - g_assert(SP_IS_KNOT (knot)); - - return knot->pos; +Geom::Point SPKnot::position() const { + return this->pos; } -void sp_knot_set_flag(SPKnot *knot, guint flag, bool set) -{ - g_assert(knot != NULL); - g_assert(SP_IS_KNOT(knot)); - +void SPKnot::set_flag(guint flag, bool set) { if (set) { - knot->flags |= flag; + this->flags |= flag; } else { - knot->flags &= ~flag; + this->flags &= ~flag; } switch (flag) { case SP_KNOT_VISIBLE: if (set) { - sp_canvas_item_show(knot->item); + sp_canvas_item_show(this->item); } else { - sp_canvas_item_hide(knot->item); + sp_canvas_item_hide(this->item); } break; case SP_KNOT_MOUSEOVER: case SP_KNOT_DRAGGING: - sp_knot_set_ctrl_state(knot); + this->set_ctrl_state(); break; case SP_KNOT_GRABBED: break; @@ -624,39 +428,130 @@ void sp_knot_set_flag(SPKnot *knot, guint flag, bool set) } } -void sp_knot_update_ctrl(SPKnot *knot) -{ - if (!knot->item) { +void SPKnot::update_ctrl() { + if (!this->item) { return; } - g_object_set(knot->item, "shape", knot->shape, NULL); - g_object_set(knot->item, "mode", knot->mode, NULL); - g_object_set(knot->item, "size", (gdouble) knot->size, NULL); - g_object_set(knot->item, "anchor", knot->anchor, NULL); - if (knot->pixbuf) { - g_object_set(knot->item, "pixbuf", knot->pixbuf, NULL); + g_object_set(this->item, "shape", this->shape, NULL); + g_object_set(this->item, "mode", this->mode, NULL); + g_object_set(this->item, "size", (gdouble) this->size, NULL); + g_object_set(this->item, "anchor", this->anchor, NULL); + + if (this->pixbuf) { + g_object_set(this->item, "pixbuf", this->pixbuf, NULL); } - sp_knot_set_ctrl_state(knot); + this->set_ctrl_state(); } -/** - * Set knot control state (dragging/mouseover/normal). - */ -static void sp_knot_set_ctrl_state(SPKnot *knot) -{ +void SPKnot::set_ctrl_state() { int state = SP_KNOT_STATE_NORMAL; - if (knot->flags & SP_KNOT_DRAGGING) { + + if (this->flags & SP_KNOT_DRAGGING) { state = SP_KNOT_STATE_DRAGGING; - } else if (knot->flags & SP_KNOT_MOUSEOVER) { + } else if (this->flags & SP_KNOT_MOUSEOVER) { state = SP_KNOT_STATE_MOUSEOVER; } - g_object_set(knot->item, "fill_color", knot->fill[state], NULL); - g_object_set(knot->item, "stroke_color", knot->stroke[state], NULL); + + g_object_set(this->item, "fill_color", this->fill[state], NULL); + g_object_set(this->item, "stroke_color", this->stroke[state], NULL); +} + + +void SPKnot::setSize(guint i) { + size = i; +} + +void SPKnot::setShape(guint i) { + shape = (SPKnotShapeType) i; +} + +void SPKnot::setAnchor(guint i) { + anchor = (SPAnchorType) i; +} + +void SPKnot::setMode(guint i) { + mode = (SPKnotModeType) i; +} + +void SPKnot::setPixbuf(gpointer p) { + pixbuf = p; } +void SPKnot::setFill(guint32 normal, guint32 mouseover, guint32 dragging) { + fill[SP_KNOT_STATE_NORMAL] = normal; + fill[SP_KNOT_STATE_MOUSEOVER] = mouseover; + fill[SP_KNOT_STATE_DRAGGING] = dragging; +} + +void SPKnot::setStroke(guint32 normal, guint32 mouseover, guint32 dragging) { + stroke[SP_KNOT_STATE_NORMAL] = normal; + stroke[SP_KNOT_STATE_MOUSEOVER] = mouseover; + stroke[SP_KNOT_STATE_DRAGGING] = dragging; +} +void SPKnot::setImage(guchar* normal, guchar* mouseover, guchar* dragging) { + image[SP_KNOT_STATE_NORMAL] = normal; + image[SP_KNOT_STATE_MOUSEOVER] = mouseover; + image[SP_KNOT_STATE_DRAGGING] = dragging; +} + +void SPKnot::setCursor(GdkCursor* normal, GdkCursor* mouseover, GdkCursor* dragging) { + if (cursor[SP_KNOT_STATE_NORMAL]) { +#if GTK_CHECK_VERSION(3,0,0) + g_object_unref(cursor[SP_KNOT_STATE_NORMAL]); +#else + gdk_cursor_unref(cursor[SP_KNOT_STATE_NORMAL]); +#endif + } + + cursor[SP_KNOT_STATE_NORMAL] = normal; + + if (normal) { +#if GTK_CHECK_VERSION(3,0,0) + g_object_ref(normal); +#else + gdk_cursor_ref(normal); +#endif + } + + if (cursor[SP_KNOT_STATE_MOUSEOVER]) { +#if GTK_CHECK_VERSION(3,0,0) + g_object_unref(cursor[SP_KNOT_STATE_MOUSEOVER]); +#else + gdk_cursor_unref(cursor[SP_KNOT_STATE_MOUSEOVER]); +#endif + } + + cursor[SP_KNOT_STATE_MOUSEOVER] = mouseover; + + if (mouseover) { +#if GTK_CHECK_VERSION(3,0,0) + g_object_ref(mouseover); +#else + gdk_cursor_ref(mouseover); +#endif + } + + if (cursor[SP_KNOT_STATE_DRAGGING]) { +#if GTK_CHECK_VERSION(3,0,0) + g_object_unref(cursor[SP_KNOT_STATE_DRAGGING]); +#else + gdk_cursor_unref(cursor[SP_KNOT_STATE_DRAGGING]); +#endif + } + + cursor[SP_KNOT_STATE_DRAGGING] = dragging; + + if (dragging) { +#if GTK_CHECK_VERSION(3,0,0) + g_object_ref(dragging); +#else + gdk_cursor_ref(dragging); +#endif + } +} /* Local Variables: diff --git a/src/knot.h b/src/knot.h index 4d87d703f..c8812a466 100644 --- a/src/knot.h +++ b/src/knot.h @@ -26,11 +26,8 @@ class SPDesktop; struct SPCanvasItem; -#define SP_TYPE_KNOT (sp_knot_get_type()) -#define SP_KNOT(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), SP_TYPE_KNOT, SPKnot)) -#define SP_KNOT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), SP_TYPE_KNOT, SPKnotClass)) -#define SP_IS_KNOT(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), SP_TYPE_KNOT)) -#define SP_IS_KNOT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), SP_TYPE_KNOT)) +#define SP_KNOT(obj) (dynamic_cast<SPKnot*>(static_cast<SPKnot*>(obj))) +#define SP_IS_KNOT(obj) (dynamic_cast<const SPKnot*>(static_cast<const SPKnot*>(obj)) != NULL) /** @@ -39,7 +36,15 @@ struct SPCanvasItem; * A knot is a draggable object, with callbacks to change something by * dragging it, visuably represented by a canvas item (mostly square). */ -struct SPKnot : GObject { +class SPKnot { +public: + SPKnot(SPDesktop *desktop, const gchar *tip); + virtual ~SPKnot(); + + + int ref_count; + + SPDesktop *desktop; /**< Desktop we are on. */ SPCanvasItem *item; /**< Our CanvasItem. */ SPItem *owner; /**< Optional Owner Item */ @@ -69,180 +74,94 @@ struct SPKnot : GObject { double pressure; /**< The tablet pen pressure when the knot is being dragged. */ - // C++ signals - /** - sigc::signal<void, Geom::Point const &, Geom::Point const &, guint> _moved_signal; - sigc::signal<void, guint> _click_signal; - sigc::signal<Geom::Point> _ungrabbed_signal; - **/ - sigc::signal<void, SPKnot *, Geom::Point const &, guint> _moved_signal; sigc::signal<void, SPKnot *, guint> _click_signal; - sigc::signal<void, SPKnot *> _ungrabbed_signal; + sigc::signal<void, SPKnot*, guint> _doubleclicked_signal; + sigc::signal<void, SPKnot*, guint> _grabbed_signal; + sigc::signal<void, SPKnot *, guint> _ungrabbed_signal; + sigc::signal<void, SPKnot *, Geom::Point const &, guint> _moved_signal; + sigc::signal<bool, SPKnot*, GdkEvent*> _event_signal; - //TODO: all the members above should eventualle become private, accessible via setters/getters - inline void setSize (guint i) {size = i;} - inline void setShape (guint i) {shape = (SPKnotShapeType) i;} - inline void setAnchor (guint i) {anchor = (SPAnchorType) i;} - inline void setMode (guint i) {mode = (SPKnotModeType) i;} - inline void setPixbuf (gpointer p) {pixbuf = p;} - inline void setFill (guint32 normal, guint32 mouseover, guint32 dragging) { - fill[SP_KNOT_STATE_NORMAL] = normal; - fill[SP_KNOT_STATE_MOUSEOVER] = mouseover; - fill[SP_KNOT_STATE_DRAGGING] = dragging; - } - inline void setStroke (guint32 normal, guint32 mouseover, guint32 dragging) { - stroke[SP_KNOT_STATE_NORMAL] = normal; - stroke[SP_KNOT_STATE_MOUSEOVER] = mouseover; - stroke[SP_KNOT_STATE_DRAGGING] = dragging; - } - inline void setImage (guchar* normal, guchar* mouseover, guchar* dragging) { - image[SP_KNOT_STATE_NORMAL] = normal; - image[SP_KNOT_STATE_MOUSEOVER] = mouseover; - image[SP_KNOT_STATE_DRAGGING] = dragging; - } - inline void setCursor (GdkCursor* normal, GdkCursor* mouseover, GdkCursor* dragging) { - if (cursor[SP_KNOT_STATE_NORMAL]) { -#if GTK_CHECK_VERSION(3,0,0) - g_object_unref(cursor[SP_KNOT_STATE_NORMAL]); -#else - gdk_cursor_unref(cursor[SP_KNOT_STATE_NORMAL]); -#endif - } - cursor[SP_KNOT_STATE_NORMAL] = normal; - if (normal) { -#if GTK_CHECK_VERSION(3,0,0) - g_object_ref(normal); -#else - gdk_cursor_ref(normal); -#endif - } - - if (cursor[SP_KNOT_STATE_MOUSEOVER]) { -#if GTK_CHECK_VERSION(3,0,0) - g_object_unref(cursor[SP_KNOT_STATE_MOUSEOVER]); -#else - gdk_cursor_unref(cursor[SP_KNOT_STATE_MOUSEOVER]); -#endif - } - cursor[SP_KNOT_STATE_MOUSEOVER] = mouseover; - if (mouseover) { -#if GTK_CHECK_VERSION(3,0,0) - g_object_ref(mouseover); -#else - gdk_cursor_ref(mouseover); -#endif - } - - if (cursor[SP_KNOT_STATE_DRAGGING]) { -#if GTK_CHECK_VERSION(3,0,0) - g_object_unref(cursor[SP_KNOT_STATE_DRAGGING]); -#else - gdk_cursor_unref(cursor[SP_KNOT_STATE_DRAGGING]); -#endif - } - cursor[SP_KNOT_STATE_DRAGGING] = dragging; - if (dragging) { -#if GTK_CHECK_VERSION(3,0,0) - g_object_ref(dragging); -#else - gdk_cursor_ref(dragging); -#endif - } - } + sigc::signal<bool, SPKnot*, Geom::Point*, guint> _request_signal; -}; -/// The SPKnot vtable. -struct SPKnotClass { - GObjectClass parent_class; - gint (* event) (SPKnot *knot, GdkEvent *event); - - /* - * These are unconditional. - */ + //TODO: all the members above should eventualle become private, accessible via setters/getters + void setSize(guint i); + void setShape(guint i); + void setAnchor(guint i); + void setMode(guint i); + void setPixbuf(gpointer p); - void (* clicked) (SPKnot *knot, guint state); - void (* doubleclicked) (SPKnot *knot, guint state); - void (* grabbed) (SPKnot *knot, guint state); - void (* ungrabbed) (SPKnot *knot, guint state); - void (* moved) (SPKnot *knot, Geom::Point const &position, guint state); - void (* stamped) (SPKnot *know, guint state); + void setFill(guint32 normal, guint32 mouseover, guint32 dragging); + void setStroke(guint32 normal, guint32 mouseover, guint32 dragging); + void setImage(guchar* normal, guchar* mouseover, guchar* dragging); - /** Request knot to move to absolute position. */ - bool (* request) (SPKnot *knot, Geom::Point const &pos, guint state); + void setCursor(GdkCursor* normal, GdkCursor* mouseover, GdkCursor* dragging); - /** Find complex distance from knot to point. */ - gdouble (* distance) (SPKnot *knot, Geom::Point const &pos, guint state); -}; + /** + * Show knot on its canvas. + */ + void show(); -/** - * Registers SPKnot class and returns its type number. - */ -GType sp_knot_get_type(); + /** + * Hide knot on its canvas. + */ + void hide(); -/** - * Return new knot object. - */ -SPKnot *sp_knot_new(SPDesktop *desktop, gchar const *tip = NULL); + /** + * Set flag in knot, with side effects. + */ + void set_flag(guint flag, bool set); -#define SP_KNOT_IS_VISIBLE(k) ((k->flags & SP_KNOT_VISIBLE) != 0) -#define SP_KNOT_IS_MOUSEOVER(k) ((k->flags & SP_KNOT_MOUSEOVER) != 0) -#define SP_KNOT_IS_DRAGGING(k) ((k->flags & SP_KNOT_DRAGGING) != 0) -#define SP_KNOT_IS_GRABBED(k) ((k->flags & SP_KNOT_GRABBED) != 0) + /** + * Update knot's pixbuf and set its control state. + */ + void update_ctrl(); -/** - * Show knot on its canvas. - */ -void sp_knot_show(SPKnot *knot); + /** + * Request or set new position for knot. + */ + void request_position(Geom::Point const &pos, guint state); -/** - * Hide knot on its canvas. - */ -void sp_knot_hide(SPKnot *knot); + /** + * Update knot for dragging and tell canvas an item was grabbed. + */ + void start_dragging(Geom::Point const &p, gint x, gint y, guint32 etime); -/** - * Set flag in knot, with side effects. - */ -void sp_knot_set_flag(SPKnot *knot, guint flag, bool set); + /** + * Move knot to new position and emits "moved" signal. + */ + void set_position(Geom::Point const &p, guint state); -/** - * Update knot's pixbuf and set its control state. - */ -void sp_knot_update_ctrl(SPKnot *knot); + /** + * Move knot to new position, without emitting a MOVED signal. + */ + void moveto(Geom::Point const &p); -/** - * Request or set new position for knot. - */ -void sp_knot_request_position(SPKnot *knot, Geom::Point const &pos, guint state); + /** + * Returns position of knot. + */ + Geom::Point position() const; -/** - * Return distance of point to knot's position; unused. - */ -gdouble sp_knot_distance(SPKnot *knot, Geom::Point const &p, guint state); +private: + SPKnot(const SPKnot&); + SPKnot& operator=(const SPKnot&); -/** - * Update knot for dragging and tell canvas an item was grabbed. - */ -void sp_knot_start_dragging(SPKnot *knot, Geom::Point const &p, gint x, gint y, guint32 etime); + /** + * Set knot control state (dragging/mouseover/normal). + */ + void set_ctrl_state(); +}; -/** - * Move knot to new position and emits "moved" signal. - */ -void sp_knot_set_position(SPKnot *knot, Geom::Point const &p, guint state); +void knot_ref(SPKnot* knot); +void knot_unref(SPKnot* knot); -/** - * Move knot to new position, without emitting a MOVED signal. - */ -void sp_knot_moveto(SPKnot *knot, Geom::Point const &p); +#define SP_KNOT_IS_VISIBLE(k) ((k->flags & SP_KNOT_VISIBLE) != 0) +#define SP_KNOT_IS_MOUSEOVER(k) ((k->flags & SP_KNOT_MOUSEOVER) != 0) +#define SP_KNOT_IS_DRAGGING(k) ((k->flags & SP_KNOT_DRAGGING) != 0) +#define SP_KNOT_IS_GRABBED(k) ((k->flags & SP_KNOT_GRABBED) != 0) void sp_knot_handler_request_position(GdkEvent *event, SPKnot *knot); -/** - * Returns position of knot. - */ -Geom::Point sp_knot_position(SPKnot const *knot); - - #endif // SEEN_SP_KNOT_H /* diff --git a/src/knotholder.cpp b/src/knotholder.cpp index bef89f3af..cf87423d4 100644 --- a/src/knotholder.cpp +++ b/src/knotholder.cpp @@ -63,14 +63,12 @@ KnotHolder::KnotHolder(SPDesktop *desktop, SPItem *item, SPKnotHolderReleasedFun g_print ("Error! Throw an exception, please!\n"); } - //g_object_ref(G_OBJECT(item)); // TODO: is this still needed after C++-ification? sp_object_ref(item); sizeUpdatedConn = ControlManager::getManager().connectCtrlSizeChanged(sigc::mem_fun(*this, &KnotHolder::updateControlSizes)); } KnotHolder::~KnotHolder() { - //g_object_unref(G_OBJECT(item)); sp_object_unref(item); for (std::list<KnotHolderEntity *>::iterator i = entity.begin(); i != entity.end(); ++i) @@ -187,7 +185,7 @@ KnotHolder::knot_moved_handler(SPKnot *knot, Geom::Point const &p, guint state) } void -KnotHolder::knot_ungrabbed_handler(SPKnot */*knot*/) +KnotHolder::knot_ungrabbed_handler(SPKnot */*knot*/, guint) { this->dragging = false; diff --git a/src/knotholder.h b/src/knotholder.h index fc91a56fc..d531ae288 100644 --- a/src/knotholder.h +++ b/src/knotholder.h @@ -48,7 +48,7 @@ public: void knot_moved_handler(SPKnot *knot, Geom::Point const &p, guint state); void knot_clicked_handler(SPKnot *knot, guint state); - void knot_ungrabbed_handler(SPKnot *knot); + void knot_ungrabbed_handler(SPKnot *knot, guint); void add(KnotHolderEntity *e); diff --git a/src/seltrans.cpp b/src/seltrans.cpp index a55bc3c0d..858985625 100644 --- a/src/seltrans.cpp +++ b/src/seltrans.cpp @@ -54,15 +54,15 @@ using Inkscape::ControlManager; using Inkscape::DocumentUndo; -static void sp_sel_trans_handle_grab(SPKnot *knot, guint state, gpointer data); -static void sp_sel_trans_handle_ungrab(SPKnot *knot, guint state, gpointer data); -static void sp_sel_trans_handle_click(SPKnot *knot, guint state, gpointer data); -static void sp_sel_trans_handle_new_event(SPKnot *knot, Geom::Point *position, guint32 state, gpointer data); -static gboolean sp_sel_trans_handle_request(SPKnot *knot, Geom::Point *p, guint state, gboolean *data); +static void sp_sel_trans_handle_grab(SPKnot *knot, guint state, SPSelTransHandle const* data); +static void sp_sel_trans_handle_ungrab(SPKnot *knot, guint state, SPSelTransHandle const* data); +static void sp_sel_trans_handle_click(SPKnot *knot, guint state, SPSelTransHandle const* data); +static void sp_sel_trans_handle_new_event(SPKnot *knot, Geom::Point const &position, guint32 state, SPSelTransHandle const* data); +static gboolean sp_sel_trans_handle_request(SPKnot *knot, Geom::Point *p, guint state, SPSelTransHandle const *data); extern GdkPixbuf *handles[]; -static gboolean sp_sel_trans_handle_event(SPKnot *knot, GdkEvent *event, gpointer) +static gboolean sp_sel_trans_handle_event(SPKnot *knot, GdkEvent *event, SPSelTransHandle const*) { switch (event->type) { case GDK_MOTION_NOTIFY: @@ -186,7 +186,7 @@ Inkscape::SelTrans::~SelTrans() _sel_modified_connection.disconnect(); for (int i = 0; i < NUMHANDS; i++) { - g_object_unref(G_OBJECT(knots[i])); + knot_unref(knots[i]); knots[i] = NULL; } @@ -574,7 +574,7 @@ void Inkscape::SelTrans::stamp() void Inkscape::SelTrans::_updateHandles() { for (int i = 0; i < NUMHANDS; i++) - sp_knot_hide(knots[i]); + knots[i]->hide(); if ( !_show_handles || _empty ) return; @@ -627,13 +627,13 @@ void Inkscape::SelTrans::_showHandles(SPSelTransType type) // Position knots to scale the selection bbox Geom::Point const bpos(hands[i].x, hands[i].y); Geom::Point p(_bbox->min() + (_bbox->dimensions() * Geom::Scale(bpos))); - sp_knot_moveto(knots[i], p); - sp_knot_show(knots[i]); + knots[i]->moveto(p); + knots[i]->show(); // This controls the center handle's position, because the default can // be moved and needs to be remembered. if( type == HANDLE_CENTER && _center ) - sp_knot_moveto(knots[i], *_center); + knots[i]->moveto(*_center); } } @@ -641,7 +641,7 @@ void Inkscape::SelTrans::_makeHandles() { for (int i = 0; i < NUMHANDS; i++) { SPSelTransTypeInfo info = handtypes[hands[i].type]; - knots[i] = sp_knot_new(_desktop, info.tip); + knots[i] = new SPKnot(_desktop, info.tip); knots[i]->setShape(SP_CTRL_SHAPE_BITMAP); knots[i]->setSize(13); @@ -650,50 +650,46 @@ void Inkscape::SelTrans::_makeHandles() knots[i]->setFill(info.color[0], info.color[1], info.color[2]); knots[i]->setStroke(info.color[3], info.color[4], info.color[5]); knots[i]->setPixbuf(handles[hands[i].control]); - sp_knot_update_ctrl(knots[i]); - - g_signal_connect(G_OBJECT(knots[i]), "request", - G_CALLBACK(sp_sel_trans_handle_request), (gpointer) &hands[i]); - g_signal_connect(G_OBJECT(knots[i]), "moved", - G_CALLBACK(sp_sel_trans_handle_new_event), (gpointer) &hands[i]); - g_signal_connect(G_OBJECT(knots[i]), "grabbed", - G_CALLBACK(sp_sel_trans_handle_grab), (gpointer) &hands[i]); - g_signal_connect(G_OBJECT(knots[i]), "ungrabbed", - G_CALLBACK(sp_sel_trans_handle_ungrab), (gpointer) &hands[i]); - g_signal_connect(G_OBJECT(knots[i]), "clicked", - G_CALLBACK(sp_sel_trans_handle_click), (gpointer) &hands[i]); - g_signal_connect(G_OBJECT(knots[i]), "event", - G_CALLBACK(sp_sel_trans_handle_event), (gpointer) &hands[i]); + knots[i]->update_ctrl(); + + knots[i]->_request_signal.connect(sigc::bind(sigc::ptr_fun(sp_sel_trans_handle_request), &hands[i])); + knots[i]->_moved_signal.connect(sigc::bind(sigc::ptr_fun(sp_sel_trans_handle_new_event), &hands[i])); + knots[i]->_grabbed_signal.connect(sigc::bind(sigc::ptr_fun(sp_sel_trans_handle_grab), &hands[i])); + knots[i]->_ungrabbed_signal.connect(sigc::bind(sigc::ptr_fun(sp_sel_trans_handle_ungrab), &hands[i])); + knots[i]->_click_signal.connect(sigc::bind(sigc::ptr_fun(sp_sel_trans_handle_click), &hands[i])); + knots[i]->_event_signal.connect(sigc::bind(sigc::ptr_fun(sp_sel_trans_handle_event), &hands[i])); } } -static void sp_sel_trans_handle_grab(SPKnot *knot, guint state, gpointer data) +static void sp_sel_trans_handle_grab(SPKnot *knot, guint state, SPSelTransHandle const* data) { SP_SELECT_CONTEXT(knot->desktop->event_context)->_seltrans->handleGrab( knot, state, *(SPSelTransHandle const *) data ); } -static void sp_sel_trans_handle_ungrab(SPKnot *knot, guint /*state*/, gpointer /*data*/) +static void sp_sel_trans_handle_ungrab(SPKnot *knot, guint /*state*/, SPSelTransHandle const* /*data*/) { SP_SELECT_CONTEXT(knot->desktop->event_context)->_seltrans->ungrab(); } -static void sp_sel_trans_handle_new_event(SPKnot *knot, Geom::Point *position, guint state, gpointer data) +static void sp_sel_trans_handle_new_event(SPKnot *knot, Geom::Point const& position, guint state, SPSelTransHandle const *data) { + Geom::Point pos = position; + SP_SELECT_CONTEXT(knot->desktop->event_context)->_seltrans->handleNewEvent( - knot, position, state, *(SPSelTransHandle const *) data + knot, &pos, state, *(SPSelTransHandle const *) data ); } -static gboolean sp_sel_trans_handle_request(SPKnot *knot, Geom::Point *position, guint state, gboolean *data) +static gboolean sp_sel_trans_handle_request(SPKnot *knot, Geom::Point *position, guint state, SPSelTransHandle const *data) { return SP_SELECT_CONTEXT(knot->desktop->event_context)->_seltrans->handleRequest( knot, position, state, *(SPSelTransHandle const *) data ); } -static void sp_sel_trans_handle_click(SPKnot *knot, guint state, gpointer data) +static void sp_sel_trans_handle_click(SPKnot *knot, guint state, SPSelTransHandle const* data) { SP_SELECT_CONTEXT(knot->desktop->event_context)->_seltrans->handleClick( knot, state, *(SPSelTransHandle const *) data @@ -742,7 +738,7 @@ void Inkscape::SelTrans::handleGrab(SPKnot *knot, guint /*state*/, SPSelTransHan break; } - grab(sp_knot_position(knot), handle.x, handle.y, FALSE, FALSE); + grab(knot->position(), handle.x, handle.y, FALSE, FALSE); } @@ -800,7 +796,7 @@ gboolean Inkscape::SelTrans::handleRequest(SPKnot *knot, Geom::Point *position, return TRUE; } if (request(handle, *position, state)) { - sp_knot_set_position(knot, *position, state); + knot->set_position(*position, state); SP_CTRL(_grip)->moveto(*position); if (handle.type == HANDLE_CENTER) { SP_CTRL(_norm)->moveto(*position); diff --git a/src/ui/tools/connector-tool.cpp b/src/ui/tools/connector-tool.cpp index e19f35832..4f918b483 100644 --- a/src/ui/tools/connector-tool.cpp +++ b/src/ui/tools/connector-tool.cpp @@ -201,7 +201,8 @@ ConnectorTool::~ConnectorTool() { for (int i = 0; i < 2; ++i) { if (this->endpt_handle[1]) { - g_object_unref(this->endpt_handle[i]); + //g_object_unref(this->endpt_handle[i]); + knot_unref(this->endpt_handle[i]); this->endpt_handle[i] = NULL; } } @@ -319,7 +320,7 @@ cc_clear_active_knots(SPKnotList k) // Hide the connection points if they exist. if (k.size()) { for (SPKnotList::iterator it = k.begin(); it != k.end(); ++it) { - sp_knot_hide(it->first); + it->first->hide(); } } } @@ -341,7 +342,7 @@ void ConnectorTool::cc_clear_active_conn() { // Hide the endpoint handles. for (int i = 0; i < 2; ++i) { if (this->endpt_handle[i]) { - sp_knot_hide(this->endpt_handle[i]); + this->endpt_handle[i]->hide(); } } } @@ -365,7 +366,7 @@ cc_select_handle(SPKnot* knot) knot->setSize(10); knot->setAnchor(SP_ANCHOR_CENTER); knot->setFill(0x0000ffff, 0x0000ffff, 0x0000ffff); - sp_knot_update_ctrl(knot); + knot->update_ctrl(); } static void @@ -375,7 +376,7 @@ cc_deselect_handle(SPKnot* knot) knot->setSize(8); knot->setAnchor(SP_ANCHOR_CENTER); knot->setFill(0xffffff00, 0xff0000ff, 0xff0000ff); - sp_knot_update_ctrl(knot); + knot->update_ctrl(); } bool ConnectorTool::item_handler(SPItem* item, GdkEvent* event) { @@ -969,7 +970,8 @@ cc_generic_knot_handler(SPCanvasItem *, GdkEvent *event, SPKnot *knot) { g_assert (knot != NULL); - g_object_ref(knot); + //g_object_ref(knot); + knot_ref(knot); ConnectorTool *cc = SP_CONNECTOR_CONTEXT( knot->desktop->event_context); @@ -979,7 +981,7 @@ cc_generic_knot_handler(SPCanvasItem *, GdkEvent *event, SPKnot *knot) gchar const *knot_tip = "Click to join at this point"; switch (event->type) { case GDK_ENTER_NOTIFY: - sp_knot_set_flag(knot, SP_KNOT_MOUSEOVER, TRUE); + knot->set_flag(SP_KNOT_MOUSEOVER, TRUE); cc->active_handle = knot; if (knot_tip) @@ -991,7 +993,7 @@ cc_generic_knot_handler(SPCanvasItem *, GdkEvent *event, SPKnot *knot) consumed = TRUE; break; case GDK_LEAVE_NOTIFY: - sp_knot_set_flag(knot, SP_KNOT_MOUSEOVER, FALSE); + knot->set_flag(SP_KNOT_MOUSEOVER, FALSE); /* FIXME: the following test is a workaround for LP Bug #1273510. * It seems that a signal is not correctly disconnected, maybe @@ -1010,7 +1012,8 @@ cc_generic_knot_handler(SPCanvasItem *, GdkEvent *event, SPKnot *knot) break; } - g_object_unref(knot); + //g_object_unref(knot); + knot_unref(knot); return consumed; } @@ -1066,14 +1069,14 @@ endpt_handler(SPKnot */*knot*/, GdkEvent *event, ConnectorTool *cc) } void ConnectorTool::_activeShapeAddKnot(SPItem* item) { - SPKnot *knot = sp_knot_new(desktop, 0); + SPKnot *knot = new SPKnot(desktop, 0); knot->owner = item; knot->setShape(SP_KNOT_SHAPE_SQUARE); knot->setSize(8); knot->setAnchor(SP_ANCHOR_CENTER); knot->setFill(0xffffff00, 0xff0000ff, 0xff0000ff); - sp_knot_update_ctrl(knot); + knot->update_ctrl(); // We don't want to use the standard knot handler. g_signal_handler_disconnect(G_OBJECT(knot->item), @@ -1084,8 +1087,8 @@ void ConnectorTool::_activeShapeAddKnot(SPItem* item) { g_signal_connect(G_OBJECT(knot->item), "event", G_CALLBACK(cc_generic_knot_handler), knot); - sp_knot_set_position(knot, item->avoidRef->getConnectionPointPos() * desktop->doc2dt(), 0); - sp_knot_show(knot); + knot->set_position(item->avoidRef->getConnectionPointPos() * desktop->doc2dt(), 0); + knot->show(); this->knots[knot] = 1; } @@ -1149,17 +1152,17 @@ void ConnectorTool::cc_set_active_conn(SPItem *item) { { // Connector is invisible because it is clipped to the boundary of // two overlpapping shapes. - sp_knot_hide(this->endpt_handle[0]); - sp_knot_hide(this->endpt_handle[1]); + this->endpt_handle[0]->hide(); + this->endpt_handle[1]->hide(); } else { // Just adjust handle positions. Geom::Point startpt = *(curve->first_point()) * i2dt; - sp_knot_set_position(this->endpt_handle[0], startpt, 0); + this->endpt_handle[0]->set_position(startpt, 0); Geom::Point endpt = *(curve->last_point()) * i2dt; - sp_knot_set_position(this->endpt_handle[1], endpt, 0); + this->endpt_handle[1]->set_position(endpt, 0); } return; @@ -1184,7 +1187,7 @@ void ConnectorTool::cc_set_active_conn(SPItem *item) { for (int i = 0; i < 2; ++i) { // Create the handle if it doesn't exist if ( this->endpt_handle[i] == NULL ) { - SPKnot *knot = sp_knot_new(this->desktop, + SPKnot *knot = new SPKnot(this->desktop, _("<b>Connector endpoint</b>: drag to reroute or connect to new shapes")); knot->setShape(SP_KNOT_SHAPE_SQUARE); @@ -1192,7 +1195,7 @@ void ConnectorTool::cc_set_active_conn(SPItem *item) { knot->setAnchor(SP_ANCHOR_CENTER); knot->setFill(0xffffff00, 0xff0000ff, 0xff0000ff); knot->setStroke(0x000000ff, 0x000000ff, 0x000000ff); - sp_knot_update_ctrl(knot); + knot->update_ctrl(); // We don't want to use the standard knot handler, // since we don't want this knot to be draggable. @@ -1232,13 +1235,13 @@ void ConnectorTool::cc_set_active_conn(SPItem *item) { } Geom::Point startpt = *(curve->first_point()) * i2dt; - sp_knot_set_position(this->endpt_handle[0], startpt, 0); + this->endpt_handle[0]->set_position(startpt, 0); Geom::Point endpt = *(curve->last_point()) * i2dt; - sp_knot_set_position(this->endpt_handle[1], endpt, 0); + this->endpt_handle[1]->set_position(endpt, 0); - sp_knot_show(this->endpt_handle[0]); - sp_knot_show(this->endpt_handle[1]); + this->endpt_handle[0]->show(); + this->endpt_handle[1]->show(); } void cc_create_connection_point(ConnectorTool* cc) @@ -1250,7 +1253,7 @@ void cc_create_connection_point(ConnectorTool* cc) cc_deselect_handle( cc->selected_handle ); } - SPKnot *knot = sp_knot_new(cc->desktop, 0); + SPKnot *knot = new SPKnot(cc->desktop, 0); // We do not process events on this knot. g_signal_handler_disconnect(G_OBJECT(knot->item), @@ -1260,7 +1263,7 @@ void cc_create_connection_point(ConnectorTool* cc) cc_select_handle( knot ); cc->selected_handle = knot; - sp_knot_show(cc->selected_handle); + cc->selected_handle->show(); cc->state = SP_CONNECTOR_CONTEXT_NEWCONNPOINT; } } diff --git a/src/vanishing-point.cpp b/src/vanishing-point.cpp index 361a7a0de..a0f3692a5 100644 --- a/src/vanishing-point.cpp +++ b/src/vanishing-point.cpp @@ -85,12 +85,12 @@ have_VPs_of_same_perspective (VPDragger *dr1, VPDragger *dr2) } static void -vp_knot_moved_handler (SPKnot *knot, Geom::Point const *ppointer, guint state, gpointer data) +vp_knot_moved_handler (SPKnot *knot, Geom::Point const &ppointer, guint state, gpointer data) { VPDragger *dragger = (VPDragger *) data; VPDrag *drag = dragger->parent; - Geom::Point p = *ppointer; + Geom::Point p = ppointer; // FIXME: take from prefs double snap_dist = SNAP_DIST / inkscape_active_desktop()->current_zoom(); @@ -188,7 +188,7 @@ vp_knot_moved_handler (SPKnot *knot, Geom::Point const *ppointer, guint state, g m.unSetup(); if (s.getSnapped()) { p = s.getPoint(); - sp_knot_moveto(knot, p); + knot->moveto(p); } } @@ -277,22 +277,22 @@ VPDragger::VPDragger(VPDrag *parent, Geom::Point p, VanishingPoint &vp) if (vp.is_finite()) { // create the knot - this->knot = sp_knot_new(inkscape_active_desktop(), NULL); + this->knot = new SPKnot(inkscape_active_desktop(), NULL); this->knot->setMode(SP_KNOT_MODE_XOR); this->knot->setFill(VP_KNOT_COLOR_NORMAL, VP_KNOT_COLOR_NORMAL, VP_KNOT_COLOR_NORMAL); this->knot->setStroke(0x000000ff, 0x000000ff, 0x000000ff); - sp_knot_update_ctrl(this->knot); + this->knot->update_ctrl(); knot->item->ctrlType = CTRL_TYPE_ANCHOR; ControlManager::getManager().track(knot->item); // move knot to the given point - sp_knot_set_position (this->knot, this->point, SP_KNOT_STATE_NORMAL); - sp_knot_show (this->knot); + this->knot->set_position(this->point, SP_KNOT_STATE_NORMAL); + this->knot->show(); // connect knot's signals - g_signal_connect (G_OBJECT (this->knot), "moved", G_CALLBACK (vp_knot_moved_handler), this); - g_signal_connect (G_OBJECT (this->knot), "grabbed", G_CALLBACK (vp_knot_grabbed_handler), this); - g_signal_connect (G_OBJECT (this->knot), "ungrabbed", G_CALLBACK (vp_knot_ungrabbed_handler), this); + this->_moved_connection = this->knot->_moved_signal.connect(sigc::bind(sigc::ptr_fun(vp_knot_moved_handler), this)); + this->_grabbed_connection = this->knot->_grabbed_signal.connect(sigc::bind(sigc::ptr_fun(vp_knot_grabbed_handler), this)); + this->_ungrabbed_connection = this->knot->_ungrabbed_signal.connect(sigc::bind(sigc::ptr_fun(vp_knot_ungrabbed_handler), this)); // add the initial VP (which may be NULL!) this->addVP (vp); @@ -302,11 +302,12 @@ VPDragger::VPDragger(VPDrag *parent, Geom::Point p, VanishingPoint &vp) VPDragger::~VPDragger() { // disconnect signals - g_signal_handlers_disconnect_by_func(G_OBJECT(this->knot), (gpointer) G_CALLBACK (vp_knot_moved_handler), this); - g_signal_handlers_disconnect_by_func(G_OBJECT(this->knot), (gpointer) G_CALLBACK (vp_knot_grabbed_handler), this); - g_signal_handlers_disconnect_by_func(G_OBJECT(this->knot), (gpointer) G_CALLBACK (vp_knot_ungrabbed_handler), this); + this->_moved_connection.disconnect(); + this->_grabbed_connection.disconnect(); + this->_ungrabbed_connection.disconnect(); + /* unref should call destroy */ - g_object_unref (G_OBJECT (this->knot)); + knot_unref(this->knot); } /** diff --git a/src/vanishing-point.h b/src/vanishing-point.h index 53366fe66..ed66aab0a 100644 --- a/src/vanishing-point.h +++ b/src/vanishing-point.h @@ -133,6 +133,10 @@ public: bool dragging_started; + sigc::connection _moved_connection; + sigc::connection _grabbed_connection; + sigc::connection _ungrabbed_connection; + std::list<VanishingPoint> vps; void addVP(VanishingPoint &vp, bool update_pos = false); |
