4
* SPKnot implementation
7
* Lauris Kaplinski <lauris@kaplinski.com>
8
* bulia byak <buliabyak@users.sf.net>
10
* Copyright (C) 1999-2005 authors
11
* Copyright (C) 2001-2002 Ximian, Inc.
13
* Released under GNU GPL, read the file 'COPYING' for more information
19
#include <gdk/gdkkeysyms.h>
20
#include <glibmm/i18n.h>
21
#include "helper/sp-marshal.h"
22
#include "display/sodipodi-ctrl.h"
24
#include "desktop-handles.h"
27
#include "prefs-utils.h"
28
#include "message-stack.h"
29
#include "message-context.h"
30
#include "event-context.h"
33
#define KNOT_EVENT_MASK (GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | \
34
GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | \
35
GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK)
37
static bool nograb = false;
39
static bool grabbed = FALSE;
40
static bool moved = FALSE;
42
static gint xp = 0, yp = 0; // where drag started
43
static gint tolerance = 0;
44
static bool within_tolerance = false;
46
static bool transform_escaped = false; // true iff resize or rotate was cancelled by esc.
55
PROP_FILL, PROP_FILL_MOUSEOVER, PROP_FILL_DRAGGING,
56
PROP_STROKE, PROP_STROKE_MOUSEOVER, PROP_STROKE_DRAGGING,
57
PROP_IMAGE, PROP_IMAGE_MOUSEOVER, PROP_IMAGE_DRAGGING,
58
PROP_CURSOR, PROP_CURSOR_MOUSEOVER, PROP_CURSOR_DRAGGING,
77
static void sp_knot_class_init(SPKnotClass *klass);
78
static void sp_knot_init(SPKnot *knot);
79
static void sp_knot_dispose(GObject *object);
80
static void sp_knot_set_property(GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec);
81
static void sp_knot_get_property(GObject *object, guint prop_id, GValue *value, GParamSpec *pspec);
83
static int sp_knot_handler(SPCanvasItem *item, GdkEvent *event, SPKnot *knot);
84
static void sp_knot_set_flag(SPKnot *knot, guint flag, bool set);
85
static void sp_knot_update_ctrl(SPKnot *knot);
86
static void sp_knot_set_ctrl_state(SPKnot *knot);
88
static GObjectClass *parent_class;
89
static guint knot_signals[LAST_SIGNAL] = { 0 };
92
* Registers SPKnot class and returns its type number.
94
GType sp_knot_get_type()
96
static GType type = 0;
100
NULL, /* base_init */
101
NULL, /* base_finalize */
102
(GClassInitFunc) sp_knot_class_init,
103
NULL, /* class_finalize */
104
NULL, /* class_data */
106
16, /* n_preallocs */
107
(GInstanceInitFunc) sp_knot_init,
110
type = g_type_register_static (G_TYPE_OBJECT, "SPKnot", &info, (GTypeFlags) 0);
116
* SPKnot vtable initialization.
118
static void sp_knot_class_init(SPKnotClass *klass)
120
GObjectClass *object_class = (GObjectClass *) klass;
122
parent_class = (GObjectClass*) g_type_class_peek_parent(klass);
124
object_class->dispose = sp_knot_dispose;
125
object_class->set_property = sp_knot_set_property;
126
object_class->get_property = sp_knot_get_property;
130
g_object_class_install_property(object_class,
132
g_param_spec_uint("size", "Size", "",
136
(GParamFlags) G_PARAM_READWRITE));
137
g_object_class_install_property(object_class,
139
g_param_spec_enum("anchor", "Anchor", "",
140
GTK_TYPE_ANCHOR_TYPE,
142
(GParamFlags) G_PARAM_READWRITE));
143
g_object_class_install_property(object_class,
145
g_param_spec_int("shape", "Shape", "",
146
SP_KNOT_SHAPE_SQUARE,
148
SP_KNOT_SHAPE_SQUARE,
149
(GParamFlags) G_PARAM_READWRITE));
151
g_object_class_install_property(object_class,
153
g_param_spec_int("mode", "Mode", "",
157
(GParamFlags) G_PARAM_READWRITE));
159
g_object_class_install_property(object_class,
161
g_param_spec_uint("fill", "Fill", "",
165
(GParamFlags) G_PARAM_READWRITE));
167
g_object_class_install_property(object_class,
169
g_param_spec_uint("fill_mouseover", "Fill mouse over", "",
173
(GParamFlags) G_PARAM_READWRITE));
175
g_object_class_install_property(object_class,
177
g_param_spec_uint("fill_dragging", "Fill dragging", "",
181
(GParamFlags) G_PARAM_READWRITE));
183
g_object_class_install_property(object_class,
185
g_param_spec_uint("stroke", "Stroke", "",
189
(GParamFlags) G_PARAM_READWRITE));
191
g_object_class_install_property(object_class,
192
PROP_STROKE_MOUSEOVER,
193
g_param_spec_uint("stroke_mouseover", "Stroke mouseover", "",
197
(GParamFlags) G_PARAM_READWRITE));
199
g_object_class_install_property(object_class,
200
PROP_STROKE_DRAGGING,
201
g_param_spec_uint("stroke_dragging", "Stroke dragging", "",
205
(GParamFlags) G_PARAM_READWRITE));
207
g_object_class_install_property(object_class,
209
g_param_spec_pointer("image", "Image", "",
210
(GParamFlags) G_PARAM_READWRITE));
212
g_object_class_install_property(object_class,
213
PROP_IMAGE_MOUSEOVER,
214
g_param_spec_pointer("image_mouseover", "Image mouseover", "",
215
(GParamFlags) G_PARAM_READWRITE));
217
g_object_class_install_property(object_class,
219
g_param_spec_pointer("image_dragging", "Image dragging", "",
220
(GParamFlags) G_PARAM_READWRITE));
222
g_object_class_install_property(object_class,
224
g_param_spec_boxed("cursor", "Cursor", "",
226
(GParamFlags) G_PARAM_READWRITE));
228
g_object_class_install_property(object_class,
229
PROP_CURSOR_MOUSEOVER,
230
g_param_spec_boxed("cursor_mouseover", "Cursor mouseover", "",
232
(GParamFlags) G_PARAM_READWRITE));
234
g_object_class_install_property(object_class,
235
PROP_CURSOR_DRAGGING,
236
g_param_spec_boxed("cursor_dragging", "Cursor dragging", "",
238
(GParamFlags) G_PARAM_READWRITE));
240
g_object_class_install_property(object_class,
242
g_param_spec_pointer("pixbuf", "Pixbuf", "",
243
(GParamFlags) G_PARAM_READWRITE));
245
g_object_class_install_property(object_class,
247
g_param_spec_pointer("tip", "Tip", "",
248
(GParamFlags) G_PARAM_READWRITE));
250
knot_signals[EVENT] = g_signal_new("event",
251
G_TYPE_FROM_CLASS(klass),
253
G_STRUCT_OFFSET(SPKnotClass, event),
255
sp_marshal_BOOLEAN__POINTER,
259
knot_signals[CLICKED] = g_signal_new("clicked",
260
G_TYPE_FROM_CLASS(klass),
262
G_STRUCT_OFFSET(SPKnotClass, clicked),
264
sp_marshal_NONE__UINT,
268
knot_signals[DOUBLECLICKED] = g_signal_new("doubleclicked",
269
G_TYPE_FROM_CLASS(klass),
271
G_STRUCT_OFFSET(SPKnotClass, doubleclicked),
273
sp_marshal_NONE__UINT,
277
knot_signals[GRABBED] = g_signal_new("grabbed",
278
G_TYPE_FROM_CLASS(klass),
280
G_STRUCT_OFFSET(SPKnotClass, grabbed),
282
sp_marshal_NONE__UINT,
286
knot_signals[UNGRABBED] = g_signal_new("ungrabbed",
287
G_TYPE_FROM_CLASS(klass),
289
G_STRUCT_OFFSET(SPKnotClass, ungrabbed),
291
sp_marshal_NONE__UINT,
295
knot_signals[MOVED] = g_signal_new("moved",
296
G_TYPE_FROM_CLASS(klass),
298
G_STRUCT_OFFSET(SPKnotClass, moved),
300
sp_marshal_NONE__POINTER_UINT,
302
G_TYPE_POINTER, G_TYPE_UINT);
304
knot_signals[REQUEST] = g_signal_new("request",
305
G_TYPE_FROM_CLASS(klass),
307
G_STRUCT_OFFSET(SPKnotClass, request),
309
sp_marshal_BOOLEAN__POINTER_UINT,
311
G_TYPE_POINTER, G_TYPE_UINT);
313
knot_signals[DISTANCE] = g_signal_new("distance",
314
G_TYPE_FROM_CLASS(klass),
316
G_STRUCT_OFFSET(SPKnotClass, distance),
318
sp_marshal_DOUBLE__POINTER_UINT,
320
G_TYPE_POINTER, G_TYPE_UINT);
322
const gchar *nograbenv = getenv("INKSCAPE_NO_GRAB");
323
nograb = (nograbenv && *nograbenv && (*nograbenv != '0'));
327
* Callback for SPKnot initialization.
329
static void sp_knot_init(SPKnot *knot)
331
knot->desktop = NULL;
336
knot->pos = NR::Point(0, 0);
337
knot->grabbed_rel_pos = NR::Point(0, 0);
338
knot->anchor = GTK_ANCHOR_CENTER;
339
knot->shape = SP_KNOT_SHAPE_SQUARE;
340
knot->mode = SP_KNOT_MODE_XOR;
343
knot->fill[SP_KNOT_STATE_NORMAL] = 0xffffff00;
344
knot->fill[SP_KNOT_STATE_MOUSEOVER] = 0xff0000ff;
345
knot->fill[SP_KNOT_STATE_DRAGGING] = 0x0000ffff;
347
knot->stroke[SP_KNOT_STATE_NORMAL] = 0x01000000;
348
knot->stroke[SP_KNOT_STATE_MOUSEOVER] = 0x01000000;
349
knot->stroke[SP_KNOT_STATE_DRAGGING] = 0x01000000;
351
knot->image[SP_KNOT_STATE_NORMAL] = NULL;
352
knot->image[SP_KNOT_STATE_MOUSEOVER] = NULL;
353
knot->image[SP_KNOT_STATE_DRAGGING] = NULL;
355
knot->cursor[SP_KNOT_STATE_NORMAL] = NULL;
356
knot->cursor[SP_KNOT_STATE_MOUSEOVER] = NULL;
357
knot->cursor[SP_KNOT_STATE_DRAGGING] = NULL;
359
knot->saved_cursor = NULL;
364
* Called before SPKnot destruction.
366
static void sp_knot_dispose(GObject *object)
368
SPKnot *knot = (SPKnot *) object;
370
if ((knot->flags & SP_KNOT_GRABBED) && gdk_pointer_is_grabbed ()) {
371
// This happens e.g. when deleting a node in node tool while dragging it
372
gdk_pointer_ungrab (GDK_CURRENT_TIME);
376
gtk_object_destroy (GTK_OBJECT (knot->item));
380
for (gint i = 0; i < SP_KNOT_VISIBLE_STATES; i++) {
381
if (knot->cursor[i]) {
382
gdk_cursor_unref(knot->cursor[i]);
383
knot->cursor[i] = NULL;
392
if (((GObjectClass *) (parent_class))->dispose) {
393
(* ((GObjectClass *) (parent_class))->dispose) (object);
398
* Callback to set property.
400
static void sp_knot_set_property(GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec)
404
SPKnot *knot = SP_KNOT(object);
408
knot->size = g_value_get_uint(value);
411
knot->anchor = (GtkAnchorType) g_value_get_enum(value);
414
knot->shape = (SPKnotShapeType) g_value_get_int(value);
417
knot->mode = (SPKnotModeType) g_value_get_int(value);
420
knot->fill[SP_KNOT_STATE_NORMAL] =
421
knot->fill[SP_KNOT_STATE_MOUSEOVER] =
422
knot->fill[SP_KNOT_STATE_DRAGGING] = g_value_get_uint(value);
424
case PROP_FILL_MOUSEOVER:
425
knot->fill[SP_KNOT_STATE_MOUSEOVER] =
426
knot->fill[SP_KNOT_STATE_DRAGGING] = g_value_get_uint(value);
428
case PROP_FILL_DRAGGING:
429
knot->fill[SP_KNOT_STATE_DRAGGING] = g_value_get_uint(value);
432
knot->stroke[SP_KNOT_STATE_NORMAL] =
433
knot->stroke[SP_KNOT_STATE_MOUSEOVER] =
434
knot->stroke[SP_KNOT_STATE_DRAGGING] = g_value_get_uint(value);
436
case PROP_STROKE_MOUSEOVER:
437
knot->stroke[SP_KNOT_STATE_MOUSEOVER] =
438
knot->stroke[SP_KNOT_STATE_DRAGGING] = g_value_get_uint(value);
440
case PROP_STROKE_DRAGGING:
441
knot->stroke[SP_KNOT_STATE_DRAGGING] = g_value_get_uint(value);
444
knot->image[SP_KNOT_STATE_NORMAL] =
445
knot->image[SP_KNOT_STATE_MOUSEOVER] =
446
knot->image[SP_KNOT_STATE_DRAGGING] = (guchar*) g_value_get_pointer(value);
448
case PROP_IMAGE_MOUSEOVER:
449
knot->image[SP_KNOT_STATE_MOUSEOVER] = (guchar*) g_value_get_pointer(value);
451
case PROP_IMAGE_DRAGGING:
452
knot->image[SP_KNOT_STATE_DRAGGING] = (guchar*) g_value_get_pointer(value);
455
cursor = (GdkCursor*) g_value_get_boxed(value);
456
for (gint i = 0; i < SP_KNOT_VISIBLE_STATES; i++) {
457
if (knot->cursor[i]) {
458
gdk_cursor_unref(knot->cursor[i]);
460
knot->cursor[i] = cursor;
462
gdk_cursor_ref(cursor);
466
case PROP_CURSOR_MOUSEOVER:
467
cursor = (GdkCursor*) g_value_get_boxed(value);
468
if (knot->cursor[SP_KNOT_STATE_MOUSEOVER]) {
469
gdk_cursor_unref(knot->cursor[SP_KNOT_STATE_MOUSEOVER]);
471
knot->cursor[SP_KNOT_STATE_MOUSEOVER] = cursor;
473
gdk_cursor_ref(cursor);
476
case PROP_CURSOR_DRAGGING:
477
cursor = (GdkCursor*) g_value_get_boxed(value);
478
if (knot->cursor[SP_KNOT_STATE_DRAGGING]) {
479
gdk_cursor_unref(knot->cursor[SP_KNOT_STATE_DRAGGING]);
481
knot->cursor[SP_KNOT_STATE_DRAGGING] = cursor;
483
gdk_cursor_ref(cursor);
487
knot->pixbuf = g_value_get_pointer(value);
490
knot->tip = g_strdup((const gchar *) g_value_get_pointer(value));
493
g_assert_not_reached();
497
sp_knot_update_ctrl(knot);
501
static void sp_knot_get_property(GObject *, guint, GValue *, GParamSpec *)
503
g_assert_not_reached();
507
* Update knot for dragging and tell canvas an item was grabbed.
509
void sp_knot_start_dragging(SPKnot *knot, NR::Point p, gint x, gint y, guint32 etime)
514
within_tolerance = true;
516
knot->grabbed_rel_pos = p - knot->pos;
517
knot->drag_origin = knot->pos;
519
sp_canvas_item_grab(knot->item,
521
knot->cursor[SP_KNOT_STATE_DRAGGING],
524
sp_knot_set_flag(knot, SP_KNOT_GRABBED, TRUE);
529
* Called to handle events on knots.
531
static int sp_knot_handler(SPCanvasItem *item, GdkEvent *event, SPKnot *knot)
533
g_assert(knot != NULL);
534
g_assert(SP_IS_KNOT(knot));
536
tolerance = prefs_get_int_attribute_limited("options.dragtolerance", "value", 0, 0, 100);
538
gboolean consumed = FALSE;
540
/* Run client universal event handler, if present */
542
g_signal_emit(G_OBJECT(knot), knot_signals[EVENT], 0, event, &consumed);
548
switch (event->type) {
549
case GDK_2BUTTON_PRESS:
550
if (event->button.button == 1) {
551
g_signal_emit(G_OBJECT(knot), knot_signals[DOUBLECLICKED], 0, event->button.state);
558
case GDK_BUTTON_PRESS:
559
if (event->button.button == 1) {
560
NR::Point const p = knot->desktop->w2d(NR::Point(event->button.x, event->button.y));
561
sp_knot_start_dragging(knot, p, (gint) event->button.x, (gint) event->button.y, event->button.time);
565
case GDK_BUTTON_RELEASE:
566
if (event->button.button == 1) {
567
if (transform_escaped) {
568
transform_escaped = false;
571
sp_knot_set_flag(knot, SP_KNOT_GRABBED, FALSE);
573
sp_canvas_item_ungrab(knot->item, event->button.time);
576
sp_knot_set_flag(knot,
579
g_signal_emit(G_OBJECT (knot),
580
knot_signals[UNGRABBED], 0,
581
event->button.state);
583
g_signal_emit(G_OBJECT (knot),
584
knot_signals[CLICKED], 0,
585
event->button.state);
593
case GDK_MOTION_NOTIFY:
597
if ( within_tolerance
598
&& ( abs( (gint) event->motion.x - xp ) < tolerance )
599
&& ( abs( (gint) event->motion.y - yp ) < tolerance ) ) {
600
break; // do not drag if we're within tolerance from origin
603
// Once the user has moved farther than tolerance from the original location
604
// (indicating they intend to move the object, not click), then always process the
605
// motion notify coordinates as given (no snapping back to origin)
606
within_tolerance = false;
609
g_signal_emit(G_OBJECT (knot),
610
knot_signals[GRABBED], 0,
611
event->motion.state);
612
sp_knot_set_flag(knot,
616
NR::Point const motion_w(event->motion.x, event->motion.y);
617
NR::Point const motion_dt = knot->desktop->w2d(motion_w);
618
NR::Point p = motion_dt - knot->grabbed_rel_pos;
619
sp_knot_request_position (knot, &p, event->motion.state);
620
knot->desktop->scroll_to_point (&motion_dt);
624
case GDK_ENTER_NOTIFY:
625
sp_knot_set_flag(knot, SP_KNOT_MOUSEOVER, TRUE);
626
sp_knot_set_flag(knot, SP_KNOT_GRABBED, FALSE);
629
knot->desktop->event_context->defaultMessageContext()->set(Inkscape::NORMAL_MESSAGE, knot->tip);
636
case GDK_LEAVE_NOTIFY:
637
sp_knot_set_flag(knot, SP_KNOT_MOUSEOVER, FALSE);
638
sp_knot_set_flag(knot, SP_KNOT_GRABBED, FALSE);
641
knot->desktop->event_context->defaultMessageContext()->clear();
649
case GDK_KEY_PRESS: // keybindings for knot
650
switch (get_group0_keyval(&event->key)) {
652
sp_knot_set_flag(knot, SP_KNOT_GRABBED, FALSE);
654
sp_canvas_item_ungrab(knot->item, event->button.time);
657
sp_knot_set_flag(knot,
660
g_signal_emit(G_OBJECT(knot),
661
knot_signals[UNGRABBED], 0,
662
event->button.state);
663
sp_document_undo(SP_DT_DOCUMENT(knot->desktop));
664
knot->desktop->messageStack()->flash(Inkscape::NORMAL_MESSAGE, _("Node or handle drag canceled."));
665
transform_escaped = true;
685
* Return new knot object.
687
SPKnot *sp_knot_new(SPDesktop *desktop, const gchar *tip)
689
g_return_val_if_fail(desktop != NULL, NULL);
691
SPKnot * knot = (SPKnot*) g_object_new(SP_TYPE_KNOT, 0);
693
knot->desktop = desktop;
694
knot->flags = SP_KNOT_VISIBLE;
696
knot->tip = g_strdup (tip);
699
knot->item = sp_canvas_item_new(SP_DT_CONTROLS (desktop),
701
"anchor", GTK_ANCHOR_CENTER,
704
"fill_color", 0xffffff00,
706
"stroke_color", 0x01000000,
707
"mode", SP_KNOT_MODE_XOR,
710
gtk_signal_connect(GTK_OBJECT(knot->item), "event",
711
GTK_SIGNAL_FUNC(sp_knot_handler), knot);
717
* Show knot on its canvas.
719
void sp_knot_show(SPKnot *knot)
721
g_return_if_fail(knot != NULL);
722
g_return_if_fail(SP_IS_KNOT (knot));
724
sp_knot_set_flag(knot, SP_KNOT_VISIBLE, TRUE);
728
* Hide knot on its canvas.
730
void sp_knot_hide(SPKnot *knot)
732
g_return_if_fail(knot != NULL);
733
g_return_if_fail(SP_IS_KNOT(knot));
735
sp_knot_set_flag(knot, SP_KNOT_VISIBLE, FALSE);
739
* Request or set new position for knot.
741
void sp_knot_request_position(SPKnot *knot, NR::Point *p, guint state)
743
g_return_if_fail(knot != NULL);
744
g_return_if_fail(SP_IS_KNOT(knot));
746
gboolean done = FALSE;
748
g_signal_emit(G_OBJECT (knot),
749
knot_signals[REQUEST], 0,
754
/* If user did not complete, we simply move knot to new position */
757
sp_knot_set_position (knot, p, state);
762
* Return distance of point to knot's position; unused.
764
gdouble sp_knot_distance(SPKnot * knot, NR::Point *p, guint state)
766
g_return_val_if_fail(knot != NULL, 1e18);
767
g_return_val_if_fail(SP_IS_KNOT(knot), 1e18);
769
gdouble distance = NR::L2(*p - knot->pos);
771
g_signal_emit(G_OBJECT(knot),
772
knot_signals[DISTANCE], 0,
781
* Move knot to new position.
783
void sp_knot_set_position(SPKnot *knot, NR::Point *p, guint state)
785
g_return_if_fail(knot != NULL);
786
g_return_if_fail(SP_IS_KNOT (knot));
791
SP_CTRL(knot->item)->moveto (*p);
794
g_signal_emit(G_OBJECT (knot),
795
knot_signals[MOVED], 0,
801
* Move knot to new position, without emitting a MOVED signal.
803
void sp_knot_moveto(SPKnot *knot, NR::Point *p)
805
g_return_if_fail(knot != NULL);
806
g_return_if_fail(SP_IS_KNOT(knot));
811
SP_CTRL(knot->item)->moveto (*p);
816
* Returns position of knot.
818
NR::Point sp_knot_position(SPKnot const *knot)
820
g_assert(knot != NULL);
821
g_assert(SP_IS_KNOT (knot));
827
* Set flag in knot, with side effects.
829
static void sp_knot_set_flag(SPKnot *knot, guint flag, bool set)
831
g_assert(knot != NULL);
832
g_assert(SP_IS_KNOT(knot));
837
knot->flags &= ~flag;
841
case SP_KNOT_VISIBLE:
843
sp_canvas_item_show(knot->item);
845
sp_canvas_item_hide(knot->item);
848
case SP_KNOT_MOUSEOVER:
849
case SP_KNOT_DRAGGING:
850
sp_knot_set_ctrl_state(knot);
852
case SP_KNOT_GRABBED:
855
g_assert_not_reached();
861
* Update knot's pixbuf and set its control state.
863
static void sp_knot_update_ctrl(SPKnot *knot)
869
gtk_object_set(GTK_OBJECT(knot->item), "shape", knot->shape, NULL);
870
gtk_object_set(GTK_OBJECT(knot->item), "mode", knot->mode, NULL);
871
gtk_object_set(GTK_OBJECT(knot->item), "size", (gdouble) knot->size, NULL);
872
gtk_object_set(GTK_OBJECT(knot->item), "anchor", knot->anchor, NULL);
874
gtk_object_set(GTK_OBJECT (knot->item), "pixbuf", knot->pixbuf, NULL);
877
sp_knot_set_ctrl_state(knot);
881
* Set knot control state (dragging/mouseover/normal).
883
static void sp_knot_set_ctrl_state(SPKnot *knot)
885
if (knot->flags & SP_KNOT_DRAGGING) {
886
gtk_object_set(GTK_OBJECT (knot->item),
888
knot->fill[SP_KNOT_STATE_DRAGGING],
890
gtk_object_set(GTK_OBJECT (knot->item),
892
knot->stroke[SP_KNOT_STATE_DRAGGING],
894
} else if (knot->flags & SP_KNOT_MOUSEOVER) {
895
gtk_object_set(GTK_OBJECT(knot->item),
897
knot->fill[SP_KNOT_STATE_MOUSEOVER],
899
gtk_object_set(GTK_OBJECT(knot->item),
901
knot->stroke[SP_KNOT_STATE_MOUSEOVER],
904
gtk_object_set(GTK_OBJECT(knot->item),
906
knot->fill[SP_KNOT_STATE_NORMAL],
908
gtk_object_set(GTK_OBJECT(knot->item),
910
knot->stroke[SP_KNOT_STATE_NORMAL],
920
c-file-style:"stroustrup"
921
c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
926
// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4 :