Code

NEW: temporary on-canvas indicators
authorjohanengelen <johanengelen@users.sourceforge.net>
Sun, 2 Mar 2008 13:38:15 +0000 (13:38 +0000)
committerjohanengelen <johanengelen@users.sourceforge.net>
Sun, 2 Mar 2008 13:38:15 +0000 (13:38 +0000)
13 files changed:
src/desktop-handles.cpp
src/desktop-handles.h
src/desktop.cpp
src/desktop.h
src/display/Makefile_insert
src/display/canvas-temporary-item-list.cpp [new file with mode: 0644]
src/display/canvas-temporary-item-list.h [new file with mode: 0644]
src/display/canvas-temporary-item.cpp [new file with mode: 0644]
src/display/canvas-temporary-item.h [new file with mode: 0644]
src/live_effects/effect.h
src/live_effects/lpe-test-doEffect-stack.cpp
src/live_effects/lpe-test-doEffect-stack.h
src/live_effects/parameter/point.cpp

index 1241bfa02c7a19bf87c68d96ca52d226c924c527..481bf35ea56ab3cabfbd8b0f30b6b35c6fb9b2be 100644 (file)
@@ -103,6 +103,14 @@ sp_desktop_controls (SPDesktop const * desktop)
        return desktop->controls;
 }
 
+SPCanvasGroup *
+sp_desktop_tempgroup (SPDesktop const * desktop)
+{
+    g_return_val_if_fail (desktop != NULL, NULL);
+
+    return desktop->tempgroup;
+}
+
 Inkscape::MessageStack *
 sp_desktop_message_stack (SPDesktop const * desktop)
 {
index d7e3bfdae1843a211e2b0580787a41492160d5d5..72c943949bc1499007e13c8059e3e37700963625 100644 (file)
@@ -39,6 +39,7 @@ SPCanvasGroup * sp_desktop_guides (SPDesktop const * desktop);
 SPCanvasItem *sp_desktop_drawing (SPDesktop const *desktop);
 SPCanvasGroup * sp_desktop_sketch (SPDesktop const * desktop);
 SPCanvasGroup * sp_desktop_controls (SPDesktop const * desktop);
+SPCanvasGroup * sp_desktop_tempgroup (SPDesktop const * desktop);
 Inkscape::MessageStack * sp_desktop_message_stack (SPDesktop const * desktop);
 SPNamedView * sp_desktop_namedview (SPDesktop const * desktop);
 
index d2547f5a60895fce146a486dcc1a286285d646d0..65025027ad9641e7c5395d664eb3d3dfb306ace0 100644 (file)
@@ -12,7 +12,7 @@
  *   Johan Engelen <j.b.c.engelen@ewi.utwente.nl>
  *
  * Copyright (C) 2007 Jon A. Cruz
- * Copyright (C) 2006-2007 Johan Engelen
+ * Copyright (C) 2006-2008 Johan Engelen
  * Copyright (C) 2006 John Bintz
  * Copyright (C) 2004 MenTaLguY
  * Copyright (C) 1999-2002 Lauris Kaplinski
@@ -77,6 +77,7 @@
 #include "display/gnome-canvas-acetate.h"
 #include "display/sodipodi-ctrlrect.h"
 #include "display/sp-canvas-util.h"
+#include "display/canvas-temporary-item-list.h"
 #include "libnr/nr-matrix-div.h"
 #include "libnr/nr-rect-ops.h"
 #include "ui/dialog/dialog-manager.h"
@@ -115,6 +116,7 @@ SPDesktop::SPDesktop() :
     event_context( 0 ),
     layer_manager( 0 ),
     event_log( 0 ),
+    temporary_item_list( 0 ),
     acetate( 0 ),
     main( 0 ),
     gridgroup( 0 ),
@@ -122,6 +124,7 @@ SPDesktop::SPDesktop() :
     drawing( 0 ),
     sketch( 0 ),
     controls( 0 ),
+    tempgroup ( 0 ),
     table( 0 ),
     page( 0 ),
     page_border( 0 ),
@@ -217,6 +220,7 @@ SPDesktop::init (SPNamedView *nv, SPCanvas *aCanvas)
     guides = (SPCanvasGroup *) sp_canvas_item_new (main, SP_TYPE_CANVAS_GROUP, NULL);
     sketch = (SPCanvasGroup *) sp_canvas_item_new (main, SP_TYPE_CANVAS_GROUP, NULL);
     controls = (SPCanvasGroup *) sp_canvas_item_new (main, SP_TYPE_CANVAS_GROUP, NULL);
+    tempgroup = (SPCanvasGroup *) sp_canvas_item_new (main, SP_TYPE_CANVAS_GROUP, NULL);
 
     /* Push select tool to the bottom of stack */
     /** \todo
@@ -310,11 +314,16 @@ SPDesktop::init (SPNamedView *nv, SPCanvas *aCanvas)
     layer_manager = new Inkscape::LayerManager( this );
 
     showGrids(namedview->grids_visible, false);
+
+    temporary_item_list = new Inkscape::Display::TemporaryItemList( this );
 }
 
 
 void SPDesktop::destroy()
 {
+    delete temporary_item_list;
+    temporary_item_list = NULL;
+
     namedview->hide(this);
 
     _activate_connection.disconnect();
@@ -368,6 +377,25 @@ SPDesktop::~SPDesktop() {}
 //--------------------------------------------------------------------
 /* Public methods */
 
+
+/** Note that lifetime is measured in milliseconds
+* it is perfectly safe to ignore the returned pointer: the object is deleted by itself, so don't delete it elsewhere!
+* The return value should only be used as argument for SPDesktop::remove_temporary_canvasitem, because the object might be deleted already.
+*/
+Inkscape::Display::TemporaryItem *
+SPDesktop::add_temporary_canvasitem (SPCanvasItem *item, guint lifetime)
+{
+    return temporary_item_list->add_item(item, lifetime);
+}
+
+/** It is perfectly safe to call this function while the object has already been deleted due to a timeout.
+*/
+void
+SPDesktop::remove_temporary_canvasitem (Inkscape::Display::TemporaryItem * tempitem)
+{
+    temporary_item_list->delete_item(tempitem);
+}
+
 void SPDesktop::setDisplayModeNormal()
 {
     SP_CANVAS_ARENA (drawing)->arena->rendermode = RENDERMODE_NORMAL;
index 84b8297268f83672b71f2a3c65e6c86bb1bb7fa9..bb05331b6add722ff1cd3f0565a14736467227e9 100644 (file)
@@ -72,6 +72,10 @@ namespace Inkscape {
   namespace Whiteboard {
       class SessionManager;
   }
+  namespace Display {
+      class TemporaryItemList;
+      class TemporaryItem;
+  }
 }
 
 /**
@@ -90,6 +94,8 @@ struct SPDesktop : public Inkscape::UI::View::View
     Inkscape::LayerManager    *layer_manager;
     Inkscape::EventLog        *event_log;
 
+    Inkscape::Display::TemporaryItemList *temporary_item_list;
+
     SPCanvasItem  *acetate;
     SPCanvasGroup *main;
     SPCanvasGroup *gridgroup;
@@ -97,6 +103,7 @@ struct SPDesktop : public Inkscape::UI::View::View
     SPCanvasItem  *drawing;
     SPCanvasGroup *sketch;
     SPCanvasGroup *controls;
+    SPCanvasGroup *tempgroup;   ///< contains temporary canvas items
     SPCanvasItem  *table;       ///< outside-of-page background
     SPCanvasItem  *page;        ///< page background
     SPCanvasItem  *page_border; ///< page border
@@ -173,6 +180,9 @@ struct SPDesktop : public Inkscape::UI::View::View
         return _guides_message_context;
     }
 
+    Inkscape::Display::TemporaryItem * add_temporary_canvasitem (SPCanvasItem *item, guint lifetime);
+    void remove_temporary_canvasitem (Inkscape::Display::TemporaryItem * tempitem);
+
     void setDisplayModeNormal();
     void setDisplayModeOutline();
     void displayModeToggle();
index 4994434d73e4158a42fdda4bcef670e45639d0fe..61cb02155b101c0a02fa5647d74194afe6d45767 100644 (file)
@@ -40,6 +40,10 @@ display_libspdisplay_a_SOURCES = \
        display/canvas-grid.h   \
        display/canvas-axonomgrid.cpp   \
        display/canvas-axonomgrid.h     \
+       display/canvas-temporary-item.cpp       \
+       display/canvas-temporary-item.h \
+       display/canvas-temporary-item-list.cpp  \
+       display/canvas-temporary-item-list.h    \
        display/curve.cpp       \
        display/curve.h \
        display/display-forward.h       \
diff --git a/src/display/canvas-temporary-item-list.cpp b/src/display/canvas-temporary-item-list.cpp
new file mode 100644 (file)
index 0000000..5b92e18
--- /dev/null
@@ -0,0 +1,83 @@
+/** \file\r
+ * Provides a class that can contain active TemporaryItem's on a desktop\r
+ * Code inspired by message-stack.cpp\r
+ *\r
+ * Authors:\r
+ *   Johan Engelen\r
+ *\r
+ * Copyright (C) Johan Engelen 2008 <j.b.c.engelen@utwente.nl>\r
+ *\r
+ * Released under GNU GPL, read the file 'COPYING' for more information\r
+ */\r
+\r
+#include "display/canvas-temporary-item-list.h"\r
+\r
+#include "display/canvas-temporary-item.h"\r
+\r
+namespace Inkscape {\r
+namespace Display {\r
+\r
+TemporaryItemList::TemporaryItemList(SPDesktop *desktop)\r
+    : desktop(desktop)\r
+{\r
+\r
+}\r
+\r
+TemporaryItemList::~TemporaryItemList()\r
+{\r
+    // delete all items in list so the timeouts are removed\r
+    for ( std::list<TemporaryItem*>::iterator it = itemlist.begin(); it != itemlist.end(); ++it ) {\r
+        TemporaryItem * tempitem = *it;\r
+        delete tempitem;\r
+    }\r
+    itemlist.clear();\r
+}\r
+\r
+/* Note that TemporaryItem or TemporaryItemList is responsible for deletion and such, so this return pointer can safely be ignored. */\r
+TemporaryItem *\r
+TemporaryItemList::add_item(SPCanvasItem *item, guint lifetime)\r
+{\r
+    if (lifetime > 100) { // beware of strange things happening due to very short timeouts\r
+        TemporaryItem * tempitem = new TemporaryItem(item, lifetime);\r
+        itemlist.push_back(tempitem);\r
+        tempitem->signal_timeout.connect( sigc::mem_fun(*this, &TemporaryItemList::_item_timeout) );\r
+    }\r
+}\r
+\r
+void\r
+TemporaryItemList::delete_item( TemporaryItem * tempitem )\r
+{\r
+    // check if the item is in the list, if so, delete it. (in other words, don't wait for the item to delete itself)\r
+    bool in_list = false;\r
+    for ( std::list<TemporaryItem*>::iterator it = itemlist.begin(); it != itemlist.end(); ++it ) {\r
+        if ( *it == tempitem ) {\r
+            in_list = true;\r
+            break;\r
+        }\r
+    }\r
+    if (in_list) {\r
+        itemlist.remove(tempitem);\r
+        delete tempitem;\r
+    }\r
+}\r
+\r
+void\r
+TemporaryItemList::_item_timeout(TemporaryItem * tempitem)\r
+{\r
+    itemlist.remove(tempitem);\r
+    // no need to delete the item, it does that itself after signal_timeout.emit() completes\r
+}\r
+\r
+} //namespace Display\r
+} /* namespace Inkscape */\r
+\r
+/*\r
+  Local Variables:\r
+  mode:c++\r
+  c-file-style:"stroustrup"\r
+  c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))\r
+  indent-tabs-mode:nil\r
+  fill-column:99\r
+  End:\r
+*/\r
+// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4 :\r
diff --git a/src/display/canvas-temporary-item-list.h b/src/display/canvas-temporary-item-list.h
new file mode 100644 (file)
index 0000000..cd4bcfe
--- /dev/null
@@ -0,0 +1,58 @@
+#ifndef INKSCAPE_CANVAS_TEMPORARY_ITEM_LIST_H\r
+#define INKSCAPE_CANVAS_TEMPORARY_ITEM_LIST_H\r
+\r
+/** \file\r
+ * Provides a class that can contain active TemporaryItem's on a desktop\r
+ *\r
+ * Authors:\r
+ *   Johan Engelen\r
+ *\r
+ * Copyright (C) Johan Engelen 2008 <j.b.c.engelen@utwente.nl>\r
+ *\r
+ * Released under GNU GPL, read the file 'COPYING' for more information\r
+ */\r
+\r
+#include "forward.h"\r
+#include "display/display-forward.h"\r
+#include <list>\r
+\r
+namespace Inkscape {\r
+namespace Display {\r
+\r
+class TemporaryItem;\r
+\r
+class TemporaryItemList  {\r
+public:\r
+    TemporaryItemList(SPDesktop *desktop);\r
+    virtual ~TemporaryItemList();\r
+\r
+    TemporaryItem* add_item (SPCanvasItem *item, guint lifetime);\r
+    void           delete_item (TemporaryItem * tempitem);\r
+\r
+protected:\r
+    SPDesktop *desktop;   /** Desktop we are on. */\r
+\r
+    std::list<TemporaryItem *> itemlist; /** list of temp items */ \r
+\r
+    void _item_timeout (TemporaryItem * tempitem);\r
+\r
+private:\r
+    TemporaryItemList(const TemporaryItemList&);\r
+    TemporaryItemList& operator=(const TemporaryItemList&);\r
+};\r
+\r
+} //namespace Display\r
+} //namespace Inkscape\r
+\r
+#endif\r
+\r
+/*\r
+  Local Variables:\r
+  mode:c++\r
+  c-file-style:"stroustrup"\r
+  c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))\r
+  indent-tabs-mode:nil\r
+  fill-column:99\r
+  End:\r
+*/\r
+// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4 :\r
diff --git a/src/display/canvas-temporary-item.cpp b/src/display/canvas-temporary-item.cpp
new file mode 100644 (file)
index 0000000..da6caf2
--- /dev/null
@@ -0,0 +1,72 @@
+/** \file\r
+ * Provides a class that can contain active TemporaryItem's on a desktop\r
+ * When the object is deleted, it also deletes the canvasitem it contains!\r
+ * This object should be created/managed by a TemporaryItemList.\r
+ * After its lifetime, it fires the timeout signal, afterwards *it deletes itself*.\r
+ *\r
+ * (part of code inspired by message-stack.cpp)\r
+ *\r
+ * Authors:\r
+ *   Johan Engelen\r
+ *\r
+ * Copyright (C) Johan Engelen 2008 <j.b.c.engelen@utwente.nl>\r
+ *\r
+ * Released under GNU GPL, read the file 'COPYING' for more information\r
+ */\r
+\r
+#include "display/canvas-temporary-item.h"\r
+\r
+#include <gtk/gtkobject.h>\r
+\r
+namespace Inkscape {\r
+namespace Display {\r
+\r
+/** lifetime is measured in milliseconds\r
+ */\r
+TemporaryItem::TemporaryItem(SPCanvasItem *item, guint lifetime)\r
+    : canvasitem(item),\r
+      timeout_id(0)\r
+{\r
+    if (lifetime > 0) {\r
+        timeout_id = g_timeout_add(lifetime, &TemporaryItem::_timeout, this);\r
+    }\r
+}\r
+\r
+TemporaryItem::~TemporaryItem()\r
+{\r
+    // when it has not expired yet...\r
+    if (timeout_id) {\r
+        g_source_remove(timeout_id);\r
+        timeout_id = 0;\r
+    }\r
+\r
+    if (canvasitem) {\r
+        // destroying the item automatically hides it\r
+        gtk_object_destroy (GTK_OBJECT (canvasitem));\r
+        canvasitem = NULL;\r
+    }\r
+}\r
+\r
+/* static method*/\r
+gboolean TemporaryItem::_timeout(gpointer data) {\r
+    TemporaryItem *tempitem = reinterpret_cast<TemporaryItem *>(data);\r
+    tempitem->timeout_id = 0;\r
+    tempitem->signal_timeout.emit(tempitem);\r
+    delete tempitem;\r
+    return FALSE;\r
+}\r
+\r
+\r
+} //namespace Display\r
+} /* namespace Inkscape */\r
+\r
+/*\r
+  Local Variables:\r
+  mode:c++\r
+  c-file-style:"stroustrup"\r
+  c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))\r
+  indent-tabs-mode:nil\r
+  fill-column:99\r
+  End:\r
+*/\r
+// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4 :\r
diff --git a/src/display/canvas-temporary-item.h b/src/display/canvas-temporary-item.h
new file mode 100644 (file)
index 0000000..0caa0d9
--- /dev/null
@@ -0,0 +1,56 @@
+#ifndef INKSCAPE_CANVAS_TEMPORARY_ITEM_H\r
+#define INKSCAPE_CANVAS_TEMPORARY_ITEM_H\r
+\r
+/** \file\r
+ * Provides a class to put a canvasitem temporarily on-canvas.\r
+ *\r
+ * Authors:\r
+ *   Johan Engelen\r
+ *\r
+ * Copyright (C) Johan Engelen 2008 <j.b.c.engelen@utwente.nl>\r
+ *\r
+ * Released under GNU GPL, read the file 'COPYING' for more information\r
+ */\r
+\r
+#include "display/display-forward.h"\r
+\r
+#include <sigc++/sigc++.h>\r
+\r
+namespace Inkscape {\r
+namespace Display {\r
+\r
+class TemporaryItem  {\r
+public:\r
+    TemporaryItem(SPCanvasItem *item, guint lifetime);\r
+    virtual ~TemporaryItem();\r
+\r
+    sigc::signal<void, TemporaryItem *> signal_timeout;\r
+\r
+protected:\r
+    friend class TemporaryItemList;\r
+\r
+    SPCanvasItem * canvasitem;   /** The item we are holding on to */\r
+    guint timeout_id;     /** ID by which glib knows the timeout event */\r
+\r
+    static gboolean _timeout(gpointer data); ///< callback for when lifetime expired\r
+\r
+private:\r
+    TemporaryItem(const TemporaryItem&);\r
+    TemporaryItem& operator=(const TemporaryItem&);\r
+};\r
+\r
+} //namespace Display\r
+} //namespace Inkscape\r
+\r
+#endif\r
+\r
+/*\r
+  Local Variables:\r
+  mode:c++\r
+  c-file-style:"stroustrup"\r
+  c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))\r
+  indent-tabs-mode:nil\r
+  fill-column:99\r
+  End:\r
+*/\r
+// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4 :\r
index fb5e85b1bc60d0c72946521aadcd78f88c7c616f..6b5295071724a32f4bf97435104911ae66758b2a 100644 (file)
@@ -19,7 +19,7 @@
 
 #define  LPE_CONVERSION_TOLERANCE 0.01    // FIXME: find good solution for this.
 
-//#define LPE_ENABLE_TEST_EFFECTS
+#define LPE_ENABLE_TEST_EFFECTS
 
 struct SPDocument;
 struct SPDesktop;
@@ -117,7 +117,6 @@ protected:
     std::vector<Parameter *> param_vector;
     int oncanvasedit_it;
 
-
     Inkscape::UI::Widget::Registry wr;
 
     LivePathEffectObject *lpeobj;
index f6ecad562f13ac37b8246312a814ae3d68a41401..f20ce8cec6f803841a551d91ebb477dab45fad9b 100644 (file)
@@ -18,9 +18,11 @@ namespace LivePathEffect {
 
 LPEdoEffectStackTest::LPEdoEffectStackTest(LivePathEffectObject *lpeobject) :
     Effect(lpeobject),
-    step(_("Stack step"), (""), "step", &wr, this)
+    step(_("Stack step"), (""), "step", &wr, this),
+    point(_("point param"), "", "point_param", &wr, this)
 {
     registerParameter( dynamic_cast<Parameter *>(&step) );
+    registerParameter( dynamic_cast<Parameter *>(&point) );
 }
 
 LPEdoEffectStackTest::~LPEdoEffectStackTest()
index 3d853aa8cd2334426dbbfea987ef6f1b69b7c332..1417512d1e13fae6f2571005def85dc6e766f858 100644 (file)
@@ -15,6 +15,7 @@
 
 #include "live_effects/effect.h"
 #include "live_effects/parameter/parameter.h"
+#include "live_effects/parameter/point.h"
 
 namespace Inkscape {
 namespace LivePathEffect {
@@ -31,6 +32,7 @@ public:
 
 private:
     ScalarParam step;
+    PointParam point;
 
     LPEdoEffectStackTest(const LPEdoEffectStackTest&);
     LPEdoEffectStackTest& operator=(const LPEdoEffectStackTest&);
index 1859a0a09749168e4c109c131df2e834da669978..38bf4be57607ddbf7b576a144908ce197f37589e 100644 (file)
 #include "ui/widget/point.h"
 #include "widgets/icon.h"
 #include "ui/widget/registered-widget.h"
-#include "knot.h"
 #include "inkscape.h"
 #include "verbs.h"
 
 // needed for on-canvas editting:
 #include "tools-switch.h"
-#include "shape-editor.h"
 #include "node-context.h"
-#include "desktop-handles.h"
-#include "selection.h"
+#include "shape-editor.h"
 #include "desktop.h"
+#include "selection.h"
 
-#define LPEPOINTPARAM_DEBUG // undefine to disable all on-canvas editing code for PointParam
+// temporarily needed for tempitem tryout
+#include "desktop-handles.h"
+#include "display/sodipodi-ctrl.h"
+#include "knot.h"
+#include "display/canvas-temporary-item-list.h"
 
-#define PRM_KNOT_COLOR_NORMAL 0xffffff00
-#define PRM_KNOT_COLOR_SELECTED 0x0000ff00
+#define LPEPOINTPARAM_DEBUG // undefine to disable all on-canvas editing code for PointParam
 
 namespace Inkscape {
 
@@ -93,6 +94,7 @@ PointParam::param_newWidget(Gtk::Tooltips * tooltips)
                                                    param_effect->getRepr(),
                                                    param_effect->getSPDoc() ) );
     pointwdg->setValue( (*this)[0], (*this)[1] );
+    pointwdg->clearProgrammatically();
     pointwdg->set_undo_parameters(SP_VERB_DIALOG_LIVE_PATH_EFFECT, _("Change point parameter"));
 
     Gtk::Widget*  pIcon = Gtk::manage( sp_icon_get_icon( "draw_node", Inkscape::ICON_SIZE_BUTTON) );
@@ -142,6 +144,22 @@ PointParam::param_editOncanvas(SPItem * item, SPDesktop * dt)
 
     ShapeEditor * shape_editor = SP_NODE_CONTEXT( dt->event_context )->shape_editor;
     shape_editor->set_item_lpe_point_parameter(item, SP_OBJECT(param_effect->getLPEObj()), param_key.c_str());
+
+
+    /* TEMPORARY CODE TO TEST TEMPORARY CANVAS ITEMS */
+    SPDesktop *desktop = SP_ACTIVE_DESKTOP;
+    SPCanvasItem * canvasitem = sp_canvas_item_new( sp_desktop_tempgroup (desktop),
+                                                    SP_TYPE_CTRL,
+                                                    "anchor", GTK_ANCHOR_CENTER,
+                                                    "size", 8.0,
+                                                    "stroked", TRUE,
+                                                    "stroke_color", 0xf000f0ff,
+                                                    "mode", SP_KNOT_MODE_XOR,
+                                                    "shape", SP_KNOT_SHAPE_CROSS,
+                                                    NULL );
+    SP_CTRL(canvasitem)->moveto ( static_cast<Geom::Point> (*this) );
+    desktop->add_temporary_canvasitem(canvasitem, 2000);
+    /* END ----   TEMPORARY CODE TO TEST TEMPORARY CANVAS ITEMS */
 }
 
 
@@ -158,9 +176,10 @@ PointParam::param_transform_multiply(Geom::Matrix const& postmul, bool /*set*/)
 void
 PointParam::on_button_click()
 {
-    SPItem * item = sp_desktop_selection(SP_ACTIVE_DESKTOP)->singleItem();
+    SPDesktop *desktop = SP_ACTIVE_DESKTOP;
+    SPItem * item = sp_desktop_selection(desktop)->singleItem();
     if (item != NULL) {
-        param_editOncanvas(item, SP_ACTIVE_DESKTOP);
+        param_editOncanvas(item, desktop);
     }
 }