X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=src%2Fknot.cpp;h=3ec2799bd63a11ce26a8ea00567faca3b735af80;hb=8e75b1268dabafcba82b82a5e5d51c78b300a010;hp=6edf3d0e806a14a585a73ee4609d4829d6f87868;hpb=582afd9bccb164930731f8e2454c2da25349ab51;p=inkscape.git diff --git a/src/knot.cpp b/src/knot.cpp index 6edf3d0e8..3ec2799bd 100644 --- a/src/knot.cpp +++ b/src/knot.cpp @@ -62,7 +62,6 @@ static void sp_knot_init(SPKnot *knot); static void sp_knot_dispose(GObject *object); static int sp_knot_handler(SPCanvasItem *item, GdkEvent *event, SPKnot *knot); -static void sp_knot_set_flag(SPKnot *knot, guint flag, bool set); static void sp_knot_set_ctrl_state(SPKnot *knot); static GObjectClass *parent_class; @@ -97,7 +96,7 @@ GType sp_knot_get_type() */ static void sp_knot_class_init(SPKnotClass *klass) { - GObjectClass *object_class = (GObjectClass *) klass; + GObjectClass *object_class = (GObjectClass*)klass; parent_class = (GObjectClass*) g_type_class_peek_parent(klass); @@ -195,6 +194,8 @@ static void sp_knot_init(SPKnot *knot) 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; @@ -228,6 +229,12 @@ static void sp_knot_dispose(GObject *object) gdk_pointer_ungrab (GDK_CURRENT_TIME); } + if (knot->_event_handler_id > 0) + { + g_signal_handler_disconnect(G_OBJECT (knot->item), knot->_event_handler_id); + knot->_event_handler_id = 0; + } + if (knot->item) { gtk_object_destroy (GTK_OBJECT (knot->item)); knot->item = NULL; @@ -245,8 +252,8 @@ static void sp_knot_dispose(GObject *object) knot->tip = NULL; } - if (((GObjectClass *) (parent_class))->dispose) { - (* ((GObjectClass *) (parent_class))->dispose) (object); + if (parent_class->dispose) { + (*parent_class->dispose) (object); } } @@ -280,13 +287,14 @@ static int sp_knot_handler(SPCanvasItem *item, GdkEvent *event, SPKnot *knot) g_assert(knot != NULL); g_assert(SP_IS_KNOT(knot)); + g_object_ref(knot); tolerance = prefs_get_int_attribute_limited("options.dragtolerance", "value", 0, 0, 100); gboolean consumed = FALSE; /* Run client universal event handler, if present */ - g_signal_emit(G_OBJECT(knot), knot_signals[EVENT], 0, event, &consumed); + g_signal_emit(knot, knot_signals[EVENT], 0, event, &consumed); if (consumed) { return TRUE; @@ -295,7 +303,7 @@ static int sp_knot_handler(SPCanvasItem *item, GdkEvent *event, SPKnot *knot) switch (event->type) { case GDK_2BUTTON_PRESS: if (event->button.button == 1) { - g_signal_emit(G_OBJECT(knot), knot_signals[DOUBLECLICKED], 0, event->button.state); + g_signal_emit(knot, knot_signals[DOUBLECLICKED], 0, event->button.state); grabbed = FALSE; moved = FALSE; @@ -311,6 +319,7 @@ static int sp_knot_handler(SPCanvasItem *item, GdkEvent *event, SPKnot *knot) break; case GDK_BUTTON_RELEASE: if (event->button.button == 1) { + knot->pressure = 0; if (transform_escaped) { transform_escaped = false; consumed = TRUE; @@ -323,11 +332,11 @@ static int sp_knot_handler(SPCanvasItem *item, GdkEvent *event, SPKnot *knot) sp_knot_set_flag(knot, SP_KNOT_DRAGGING, FALSE); - g_signal_emit(G_OBJECT (knot), + g_signal_emit(knot, knot_signals[UNGRABBED], 0, event->button.state); } else { - g_signal_emit(G_OBJECT (knot), + g_signal_emit(knot, knot_signals[CLICKED], 0, event->button.state); } @@ -352,8 +361,13 @@ 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)) + knot->pressure = CLAMP (knot->pressure, 0, 1); + else + knot->pressure = 0.5; + if (!moved) { - g_signal_emit(G_OBJECT (knot), + g_signal_emit(knot, knot_signals[GRABBED], 0, event->motion.state); sp_knot_set_flag(knot, @@ -404,10 +418,10 @@ static int sp_knot_handler(SPCanvasItem *item, GdkEvent *event, SPKnot *knot) sp_knot_set_flag(knot, SP_KNOT_DRAGGING, FALSE); - g_signal_emit(G_OBJECT(knot), + g_signal_emit(knot, knot_signals[UNGRABBED], 0, event->button.state); - sp_document_undo(SP_DT_DOCUMENT(knot->desktop)); + sp_document_undo(sp_desktop_document(knot->desktop)); knot->desktop->messageStack()->flash(Inkscape::NORMAL_MESSAGE, _("Node or handle drag canceled.")); transform_escaped = true; consumed = TRUE; @@ -424,6 +438,7 @@ static int sp_knot_handler(SPCanvasItem *item, GdkEvent *event, SPKnot *knot) break; } + g_object_unref(knot); return consumed; } @@ -443,7 +458,7 @@ SPKnot *sp_knot_new(SPDesktop *desktop, const gchar *tip) knot->tip = g_strdup (tip); } - knot->item = sp_canvas_item_new(SP_DT_CONTROLS (desktop), + knot->item = sp_canvas_item_new(sp_desktop_controls (desktop), SP_TYPE_CTRL, "anchor", GTK_ANCHOR_CENTER, "size", 8.0, @@ -454,8 +469,8 @@ SPKnot *sp_knot_new(SPDesktop *desktop, const gchar *tip) "mode", SP_KNOT_MODE_XOR, NULL); - gtk_signal_connect(GTK_OBJECT(knot->item), "event", - GTK_SIGNAL_FUNC(sp_knot_handler), knot); + knot->_event_handler_id = gtk_signal_connect(GTK_OBJECT(knot->item), "event", + GTK_SIGNAL_FUNC(sp_knot_handler), knot); return knot; } @@ -492,7 +507,7 @@ void sp_knot_request_position(SPKnot *knot, NR::Point *p, guint state) gboolean done = FALSE; - g_signal_emit(G_OBJECT (knot), + g_signal_emit(knot, knot_signals[REQUEST], 0, p, state, @@ -515,7 +530,7 @@ gdouble sp_knot_distance(SPKnot * knot, NR::Point *p, guint state) gdouble distance = NR::L2(*p - knot->pos); - g_signal_emit(G_OBJECT(knot), + g_signal_emit(knot, knot_signals[DISTANCE], 0, p, state, @@ -538,15 +553,14 @@ void sp_knot_set_position(SPKnot *knot, NR::Point *p, guint state) SP_CTRL(knot->item)->moveto (*p); } - g_signal_emit(G_OBJECT (knot), + g_signal_emit(knot, knot_signals[MOVED], 0, p, state); } /** - * Move knot to new position, without emitting a MOVED signal. We can't be sure this artificial - * move has moved the knot from under cursor, but it seems likely, so we clear SP_KNOT_MOUSEOVER. + * Move knot to new position, without emitting a MOVED signal. */ void sp_knot_moveto(SPKnot *knot, NR::Point *p) { @@ -558,8 +572,6 @@ void sp_knot_moveto(SPKnot *knot, NR::Point *p) if (knot->item) { SP_CTRL(knot->item)->moveto (*p); } - - sp_knot_set_flag(knot, SP_KNOT_MOUSEOVER, FALSE); } /** @@ -576,7 +588,7 @@ NR::Point sp_knot_position(SPKnot const *knot) /** * Set flag in knot, with side effects. */ -static void sp_knot_set_flag(SPKnot *knot, guint flag, bool set) +void sp_knot_set_flag(SPKnot *knot, guint flag, bool set) { g_assert(knot != NULL); g_assert(SP_IS_KNOT(knot));