Removed a bunch more DEBUGPOINT()s.
[synfig.git] / synfig-studio / trunk / src / gtkmm / canvasview.cpp
index 4b1d351..dcc436b 100644 (file)
@@ -6,6 +6,7 @@
 **
 **     \legal
 **     Copyright (c) 2002-2005 Robert B. Quattlebaum Jr., Adrian Bentley
+**     Copyright (c) 2007 Chris Moore
 **
 **     This package is free software; you can redistribute it and/or
 **     modify it under the terms of the GNU General Public License as
@@ -98,6 +99,8 @@
 #include <synfigapp/main.h>
 #include <synfigapp/inputdevice.h>
 
+#include "general.h"
+
 #endif
 
 /* === U S I N G =========================================================== */
@@ -106,7 +109,7 @@ using namespace std;
 using namespace etl;
 using namespace synfig;
 using namespace studio;
-using namespace SigC;
+using namespace sigc;
 
 /* === M A C R O S ========================================================= */
 
@@ -120,13 +123,6 @@ using namespace SigC;
 
 #define DEFAULT_TIME_WINDOW_SIZE               (10.0)
 
-/*
-#ifdef DEBUGPOINT
-#undef DEBUGPOINT
-#endif
-#define DEBUGPOINT()
-*/
-
 #ifndef SMALL_BUTTON
 #define SMALL_BUTTON(button,stockid,tooltip)   \
        button = manage(new class Gtk::Button());       \
@@ -241,7 +237,7 @@ public:
                view(view)
        {
 
-               view->statusbar->push("Idle");
+               view->statusbar->push(_("Idle"));
        }
 
        ~CanvasViewUIInterface()
@@ -331,7 +327,7 @@ public:
        virtual bool
        error(const std::string &err)
        {
-               view->statusbar->push("ERROR");
+               view->statusbar->push(_("ERROR"));
 
                // If we are in the process of canceling,
                // then just go ahead and return false --
@@ -380,7 +376,7 @@ public:
        void
        not_implemented()
        {
-               error("Feature not yet implemented");
+               error(_("Feature not yet implemented"));
        }
 };
 
@@ -446,7 +442,7 @@ public:
        {
 //             assert(view->layer_tree);
 
-               if(!view->layer_tree) { DEBUGPOINT(); synfig::error("canvas_view.layer_tree not defined!?"); return LayerList(); }
+               if(!view->layer_tree) { synfig::error("%s:%d canvas_view.layer_tree not defined!?", __FILE__, __LINE__); return LayerList(); }
                return view->layer_tree->get_selected_layers();
        }
 
@@ -455,7 +451,7 @@ public:
        {
 //             assert(view->layer_tree);
 
-               if(!view->layer_tree) { DEBUGPOINT(); synfig::error("canvas_view.layer_tree not defined!?"); return 0; }
+               if(!view->layer_tree) { synfig::error("%s:%d canvas_view.layer_tree not defined!?", __FILE__, __LINE__); return 0; }
                return view->layer_tree->get_selected_layer();
        }
 
@@ -464,7 +460,7 @@ public:
        {
 //             assert(view->layer_tree);
 
-               if(!view->layer_tree) { DEBUGPOINT(); synfig::error("canvas_view.layer_tree not defined!?"); return; }
+               if(!view->layer_tree) { synfig::error("%s:%d canvas_view.layer_tree not defined!?", __FILE__, __LINE__); return; }
                view->layer_tree->select_layers(layer_list);
                //view->get_smach().process_event(EVENT_REFRESH_DUCKS);
 
@@ -476,7 +472,7 @@ public:
        {
 //             assert(view->layer_tree);
 
-               if(!view->layer_tree) { DEBUGPOINT(); synfig::error("canvas_view.layer_tree not defined!?"); return; }
+               if(!view->layer_tree) { synfig::error("canvas_view.layer_tree not defined!?"); return; }
                view->layer_tree->select_layer(layer);
                //view->queue_rebuild_ducks();
        }
@@ -553,13 +549,13 @@ public:
        }
 
        //! Sets which value_nodes should be selected
-       virtual void set_selected_children(const ChildrenList &children_list)
+       virtual void set_selected_children(const ChildrenList &/*children_list*/)
        {
                return;
        }
 
        //! Sets which value_node should be selected. Empty handle if none.
-       virtual void set_selected_child(const ChildrenList::value_type &child)
+       virtual void set_selected_child(const ChildrenList::value_type &/*child*/)
        {
                return;
        }
@@ -610,12 +606,12 @@ public:
                return get_selected_layer_parameters().front();
        }
 
-       void set_selected_layer_parameters(const LayerParamList &layer_param_list)
+       void set_selected_layer_parameters(const LayerParamList &/*layer_param_list*/)
        {
                return;
        }
 
-       void set_selected_layer_param(const LayerParam &layer_param)
+       void set_selected_layer_param(const LayerParam &/*layer_param*/)
        {
                return;
        }
@@ -708,9 +704,9 @@ CanvasView::CanvasView(etl::loose_handle<Instance> instance,etl::handle<synfigap
 
        //notebook->show();
 
-       //notebook->append_page(*create_layer_tree(),"Layers");
-       //notebook->append_page(*create_children_tree(),"Children");
-       //notebook->append_page(*create_keyframe_tree(),"Keyframes");
+       //notebook->append_page(*create_layer_tree(),_("Layers"));
+       //notebook->append_page(*create_children_tree(),_("Children"));
+       //notebook->append_page(*create_keyframe_tree(),_("Keyframes"));
 
        //synfig::info("Canvasview: Before big chunk of allocation and tabling stuff");
        //create all allocated stuff for this canvas
@@ -783,7 +779,7 @@ CanvasView::CanvasView(etl::loose_handle<Instance> instance,etl::handle<synfigap
        refresh_time_window();
 
        /*! \todo We shouldn't need to do this at construction --
-       **      This should be preformed at the first time the window
+       **      This should be performed at the first time the window
        **      becomes visible.
        */
        work_area->queue_render_preview();
@@ -796,6 +792,13 @@ CanvasView::CanvasView(etl::loose_handle<Instance> instance,etl::handle<synfigap
        int h=get_canvas()->rend_desc().get_h()+70;
        while(w>700 || h>600)
        {
+               // Minor hack:
+               //   zoom_out() =>
+               //         WorkArea::async_update_preview() =>
+               //           WorkArea::set_zoom(float) =>
+               //                 WorkArea::async_update_preview() =>
+               //                       desc.set_time(cur_time), where cur_time isn't initialized
+               work_area->set_time(0);
                work_area->zoom_out();
                w=round_to_int(get_canvas()->rend_desc().get_w()*work_area->get_zoom()+70);
                h=round_to_int(get_canvas()->rend_desc().get_h()*work_area->get_zoom()+70);
@@ -905,6 +908,10 @@ CanvasView::~CanvasView()
 
        hide();
 
+       // don't be calling on_dirty_preview once this object has been deleted;
+       // this was causing a crash before
+       canvas_interface()->signal_dirty_preview().clear();
+
        synfig::info("CanvasView:~CanvasView(): Destructor Finished");
 }
 
@@ -935,11 +942,11 @@ CanvasView::create_time_bar()
        //time_scroll->signal_value_changed().connect(sigc::mem_fun(*work_area, &studio::WorkArea::render_preview_hook));
        //time_scroll->set_update_policy(Gtk::UPDATE_DISCONTINUOUS);
 
-       NORMAL_BUTTON(animatebutton,"gtk-yes","Animate");
+       NORMAL_BUTTON(animatebutton,"gtk-yes",_("Animate"));
        animatebutton->signal_clicked().connect(sigc::mem_fun(*this, &studio::CanvasView::on_animate_button_pressed));
        animatebutton->show();
 
-       NORMAL_BUTTON(keyframebutton,"synfig-keyframe_lock_all","All Keyframes Locked");
+       NORMAL_BUTTON(keyframebutton,"synfig-keyframe_lock_all",_("All Keyframes Locked"));
        keyframebutton->signal_clicked().connect(sigc::mem_fun(*this, &studio::CanvasView::on_keyframe_button_pressed));
        keyframebutton->show();
 
@@ -994,11 +1001,11 @@ CanvasView::create_status_bar()
        Gtk::Table *statusbartable= manage(new class Gtk::Table(7, 1, false));
 //     statusbar = manage(new class Gtk::Statusbar()); // This is already done at construction
        progressbar =manage(new class Gtk::ProgressBar());
-       SMALL_BUTTON(stopbutton,"gtk-stop","Stop");
-       SMALL_BUTTON(refreshbutton,"gtk-refresh","Refresh");
-       //SMALL_BUTTON(treetogglebutton,"gtk-go-down","Toggle Layer Tree");
-//     NEW_SMALL_BUTTON(raisebutton,"gtk-go-up","Raise Layer");
-//     NEW_SMALL_BUTTON(lowerbutton,"gtk-go-down","Lower Layer");
+       SMALL_BUTTON(stopbutton,"gtk-stop",_("Stop"));
+       SMALL_BUTTON(refreshbutton,"gtk-refresh",_("Refresh"));
+       //SMALL_BUTTON(treetogglebutton,"gtk-go-down",_("Toggle Layer Tree"));
+//     NEW_SMALL_BUTTON(raisebutton,"gtk-go-up",_("Raise Layer"));
+//     NEW_SMALL_BUTTON(lowerbutton,"gtk-go-down",_("Lower Layer"));
        //statusbartable->attach(*treetogglebutton, 0, 1, 0, 1, Gtk::SHRINK, Gtk::SHRINK, 0, 0);
 //     statusbartable->attach(*lowerbutton, 0, 1, 0, 1, Gtk::SHRINK, Gtk::SHRINK, 0, 0);
 //     statusbartable->attach(*raisebutton, 1, 2, 0, 1, Gtk::SHRINK, Gtk::SHRINK, 0, 0);
@@ -1088,9 +1095,9 @@ CanvasView::create_keyframe_tree()
        Gtk::Image *icon;
        Gtk::IconSize iconsize(Gtk::IconSize::from_name("synfig-small_icon"));
 
-       NEW_SMALL_BUTTON(button_add,"gtk-add","New Keyframe");
-       NEW_SMALL_BUTTON(button_duplicate,"synfig-duplicate","Duplicate Keyframe");
-       NEW_SMALL_BUTTON(button_delete,"gtk-delete","Delete Keyframe");
+       NEW_SMALL_BUTTON(button_add,"gtk-add",_("New Keyframe"));
+       NEW_SMALL_BUTTON(button_duplicate,"synfig-duplicate",_("Duplicate Keyframe"));
+       NEW_SMALL_BUTTON(button_delete,"gtk-delete",_("Delete Keyframe"));
 
        Gtk::HBox *hbox(manage(new Gtk::HBox()));
        layout_table->attach(*hbox, 0, 1, 1, 2, Gtk::EXPAND|Gtk::FILL, Gtk::SHRINK, 0, 0);
@@ -1172,7 +1179,7 @@ CanvasView::init_menus()
        */
        action_group = Gtk::ActionGroup::create();
 
-       //action_group->add( Gtk::Action::create("MenuFile", "_File") );
+       //action_group->add( Gtk::Action::create("MenuFile", _("_File")) );
        action_group->add( Gtk::Action::create("save", Gtk::Stock::SAVE),
                hide_return(sigc::mem_fun(*get_instance().get(), &studio::Instance::save))
        );
@@ -1209,8 +1216,11 @@ CanvasView::init_menus()
        action_group->add( Gtk::Action::create("options", _("Options")),
                sigc::mem_fun0(canvas_options,&studio::CanvasOptions::present)
        );
-       action_group->add( Gtk::Action::create("close", Gtk::StockID("gtk-close")),
-               sigc::hide_return(sigc::mem_fun(*this,&studio::CanvasView::close))
+       action_group->add( Gtk::Action::create("close", Gtk::StockID("gtk-close"), _("Close Window")),
+               sigc::hide_return(sigc::mem_fun(*this,&studio::CanvasView::close_view))
+       );
+       action_group->add( Gtk::Action::create("close-document", Gtk::StockID("gtk-close"), _("Close Document")),
+               sigc::hide_return(sigc::mem_fun(*this,&studio::CanvasView::close_instance))
        );
 
        //action_group->add( Gtk::Action::create("undo", Gtk::StockID("gtk-undo")),
@@ -1252,9 +1262,16 @@ CanvasView::init_menus()
                );
                for(i=1;i<=10;i++)
                {
-                       Glib::RefPtr<Gtk::RadioAction> action(Gtk::RadioAction::create(quality_group,strprintf("quality-%02d",i), strprintf("Set Quality to %d",i)));
-                       if(i==10)
-                               action->property_value()=10;
+                       String note;
+                       if (i == 1) note = _(" (best)");
+                       if (i == 10) note = _(" (fastest)");
+                       Glib::RefPtr<Gtk::RadioAction> action(Gtk::RadioAction::create(quality_group,strprintf("quality-%02d",i),
+                                                                                                                                                  strprintf(_("Set Quality to %d"),i) + note));
+                       if(i==9)                        // default quality
+                       {
+                               action->set_active();
+                               work_area->set_quality(i);
+                       }
                        action_group->add( action,
                                sigc::bind(
                                        sigc::mem_fun(*work_area, &studio::WorkArea::set_quality),
@@ -1264,7 +1281,7 @@ CanvasView::init_menus()
                }
        }
 
-       action_group->add( Gtk::Action::create("play", Gtk::StockID("synfig-play")),
+       action_group->add( Gtk::Action::create("play", Gtk::Stock::MEDIA_PLAY),
                sigc::mem_fun(*this, &studio::CanvasView::play)
        );
 
@@ -1305,7 +1322,7 @@ CanvasView::init_menus()
                action=Gtk::Action::create("seek-prev-frame", Gtk::Stock::GO_BACK,_("Prev Frame"),_("Prev Frame"));
                action_group->add( action, sigc::bind(sigc::mem_fun(*canvas_interface().get(), &synfigapp::CanvasInterface::seek_frame),-1));
 
-               action=Gtk::Action::create("seek-next-second", Gtk::Stock::GO_FORWARD,_("Seek Foward"),_("Seek Foward"));
+               action=Gtk::Action::create("seek-next-second", Gtk::Stock::GO_FORWARD,_("Seek Forward"),_("Seek Forward"));
                action_group->add(action,sigc::bind(sigc::mem_fun(*canvas_interface().get(), &synfigapp::CanvasInterface::seek_time),Time(1)));
                action=Gtk::Action::create("seek-prev-second", Gtk::Stock::GO_BACK,_("Seek Backward"),_("Seek Backward"));
                action_group->add( action, sigc::bind(sigc::mem_fun(*canvas_interface().get(), &synfigapp::CanvasInterface::seek_time),Time(-1)));
@@ -1337,8 +1354,8 @@ CanvasView::init_menus()
        }
 
 
-#define DUCK_MASK(lower,upper) \
-       duck_mask_##lower=Gtk::ToggleAction::create("mask-" #lower "-ducks", _("Show "#lower" ducks")); \
+#define DUCK_MASK(lower,upper,string)  \
+       duck_mask_##lower=Gtk::ToggleAction::create("mask-" #lower "-ducks", string); \
        duck_mask_##lower->set_active((bool)(work_area->get_type_mask()&Duck::TYPE_##upper)); \
        action_group->add( duck_mask_##lower, \
                sigc::bind( \
@@ -1346,12 +1363,12 @@ CanvasView::init_menus()
                        Duck::TYPE_##upper \
                ) \
        )
-       DUCK_MASK(position,POSITION);
-       DUCK_MASK(tangent,TANGENT);
-       DUCK_MASK(vertex,VERTEX);
-       DUCK_MASK(radius,RADIUS);
-       DUCK_MASK(width,WIDTH);
-       DUCK_MASK(angle,ANGLE);
+       DUCK_MASK(position,POSITION,_("Show Position Ducks"));
+       DUCK_MASK(tangent,TANGENT,_("Show Tangent Ducks"));
+       DUCK_MASK(vertex,VERTEX,_("Show Vertex Ducks"));
+       DUCK_MASK(radius,RADIUS,_("Show Radius Ducks"));
+       DUCK_MASK(width,WIDTH,_("Show Width Ducks"));
+       DUCK_MASK(angle,ANGLE,_("Show Angle Ducks"));
 #undef DUCK_MASK
 
        add_accel_group(App::ui_manager()->get_accel_group());
@@ -1414,240 +1431,247 @@ CanvasView::init_menus()
 
 
 #if 0
-
-       //Test some key stuff
-
-       filemenu.items().push_back(Gtk::Menu_Helpers::StockMenuElem(Gtk::StockID("gtk-save"),
-               hide_return(sigc::mem_fun(*get_instance().get(), &studio::Instance::save))));
-       filemenu.items().push_back(Gtk::Menu_Helpers::StockMenuElem(Gtk::StockID("gtk-save-as"),sigc::hide_return(sigc::mem_fun(*get_instance(), &studio::Instance::dialog_save_as))));
-       filemenu.items().push_back(Gtk::Menu_Helpers::StockMenuElem(Gtk::StockID("gtk-revert-to-saved"),hide_return(sigc::mem_fun(*get_instance().get(), &studio::Instance::safe_revert))));
-       filemenu.items().push_back(Gtk::Menu_Helpers::SeparatorElem());
-
-       filemenu.items().push_back(Gtk::Menu_Helpers::StockMenuElem(Gtk::StockID("synfig-cvs_add"),sigc::hide_return(sigc::mem_fun(*get_instance(), &studio::Instance::dialog_cvs_add))));
-       filemenu.items().push_back(Gtk::Menu_Helpers::StockMenuElem(Gtk::StockID("synfig-cvs_update"),sigc::hide_return(sigc::mem_fun(*get_instance(), &studio::Instance::dialog_cvs_update))));
-       filemenu.items().push_back(Gtk::Menu_Helpers::StockMenuElem(Gtk::StockID("synfig-cvs_commit"),sigc::hide_return(sigc::mem_fun(*get_instance(), &studio::Instance::dialog_cvs_commit))));
-
-       filemenu.items().push_back(Gtk::Menu_Helpers::SeparatorElem());
-       filemenu.items().push_back(Gtk::Menu_Helpers::MenuElem(_("Import..."),Gtk::AccelKey('I',Gdk::CONTROL_MASK),sigc::hide_return(sigc::mem_fun(*this, &studio::CanvasView::image_import))));
-       filemenu.items().push_back(Gtk::Menu_Helpers::SeparatorElem());
-       filemenu.items().push_back(Gtk::Menu_Helpers::MenuElem(_("Render"),Gtk::AccelKey("F9"),
-               sigc::mem_fun(render_settings,&studio::RenderSettings::present)
-       ));
-       filemenu.items().push_back(Gtk::Menu_Helpers::MenuElem(_("Preview"),Gtk::AccelKey("F11"),
-               sigc::mem_fun(*this,&CanvasView::on_preview_option)
-       ));
-       filemenu.items().push_back(Gtk::Menu_Helpers::MenuElem(_("Sound File"),
-               sigc::mem_fun(*this,&CanvasView::on_audio_option)
-       ));
-
-       filemenu.items().push_back(Gtk::Menu_Helpers::SeparatorElem());
-       filemenu.items().push_back(Gtk::Menu_Helpers::MenuElem(_("Options"),Gtk::AccelKey("F12"),
-               sigc::mem_fun(canvas_options,&studio::CanvasOptions::present)
-       ));
-       filemenu.items().push_back(Gtk::Menu_Helpers::SeparatorElem());
-       filemenu.items().push_back(Gtk::Menu_Helpers::StockMenuElem(Gtk::StockID("gtk-close"),sigc::hide_return(sigc::mem_fun(*this,&studio::CanvasView::close))));
-
-       editmenu.items().push_back(Gtk::Menu_Helpers::StockMenuElem(Gtk::StockID("gtk-undo"),Gtk::AccelKey('Z',Gdk::CONTROL_MASK),SLOT_EVENT(EVENT_UNDO)));
-       editmenu.items().push_back(Gtk::Menu_Helpers::StockMenuElem(Gtk::StockID("gtk-redo"),Gtk::AccelKey('R',Gdk::CONTROL_MASK),SLOT_EVENT(EVENT_REDO)));
-       editmenu.items().push_back(Gtk::Menu_Helpers::SeparatorElem());
-       editmenu.items().push_back(Gtk::Menu_Helpers::StockMenuElem(Gtk::StockID("gtk-cut"),NOT_IMPLEMENTED_SLOT));
-       editmenu.items().push_back(Gtk::Menu_Helpers::StockMenuElem(Gtk::StockID("gtk-copy"),NOT_IMPLEMENTED_SLOT));
-       editmenu.items().push_back(Gtk::Menu_Helpers::StockMenuElem(Gtk::StockID("gtk-paste"),NOT_IMPLEMENTED_SLOT));
-       editmenu.items().push_back(Gtk::Menu_Helpers::SeparatorElem());
-       editmenu.items().push_back(Gtk::Menu_Helpers::MenuElem(_("Select All Ducks"),Gtk::AccelKey('E',Gdk::CONTROL_MASK),sigc::mem_fun(*work_area,&studio::WorkArea::select_all_ducks)));
-       editmenu.items().push_back(Gtk::Menu_Helpers::MenuElem(_("Unselect All Layers"),Gtk::AccelKey('D',Gdk::CONTROL_MASK),sigc::mem_fun(*this,&CanvasView::on_unselect_layers)));
-       editmenu.items().push_back(Gtk::Menu_Helpers::SeparatorElem());
-
-       //editmenu.items().push_back(Gtk::Menu_Helpers::StockMenuElem(Gtk::StockID("gtk-stop"),Gtk::AccelKey(GDK_Escape,static_cast<Gdk::ModifierType>(0)),sigc::hide_return(sigc::mem_fun(*this, &studio::CanvasView::stop))));
-       //editmenu.items().push_back(Gtk::Menu_Helpers::StockMenuElem(Gtk::StockID("gtk-refresh"),Gtk::AccelKey('k',Gdk::CONTROL_MASK),sigc::hide_return(sigc::mem_fun(*this, &studio::CanvasView::on_refresh_pressed))));
-       editmenu.items().push_back(Gtk::Menu_Helpers::StockMenuElem(Gtk::StockID("gtk-stop"),Gtk::AccelKey(GDK_Escape,static_cast<Gdk::ModifierType>(0)),SLOT_EVENT(EVENT_STOP)));
-       editmenu.items().push_back(Gtk::Menu_Helpers::StockMenuElem(Gtk::StockID("gtk-refresh"),Gtk::AccelKey('k',Gdk::CONTROL_MASK),SLOT_EVENT(EVENT_REFRESH)));
-       editmenu.items().push_back(Gtk::Menu_Helpers::SeparatorElem());
-       editmenu.items().push_back(Gtk::Menu_Helpers::StockMenuElem(Gtk::StockID("gtk-properties"),Gtk::AccelKey("F8"),
-               sigc::mem_fun(canvas_properties,&studio::CanvasProperties::present)
-       ));
-
-       build_new_layer_menu(newlayermenu);
-       layermenu.items().push_back(Gtk::Menu_Helpers::MenuElem("New",newlayermenu));
-
-
-       {
-               synfigapp::Action::ParamList param_list;
-               param_list.add("canvas",Canvas::Handle(get_canvas()));
-               param_list.add("canvas_interface",canvas_interface());
-               add_actions_to_menu(&canvasmenu, param_list,synfigapp::Action::CATEGORY_CANVAS);
-       }
-
-
-       //canvasmenu.items().push_back(Gtk::Menu_Helpers::MenuElem("Keyframe Dialog",sigc::mem_fun(keyframe_dialog,&studio::Dialog_Keyframe::present)));
-
-       // Duck Mask Menu
-       if(1)
-               {
-               duckmaskmenu.items().push_back(Gtk::Menu_Helpers::TearoffMenuElem());
-
-               duckmaskmenu.items().push_back(Gtk::Menu_Helpers::CheckMenuElem(_("Position Ducks"),Gtk::AccelKey('1',Gdk::MOD1_MASK)));
-               duck_mask_position=static_cast<Gtk::CheckMenuItem*>(&duckmaskmenu.items().back());
-               duck_mask_position->set_active((bool)(work_area->get_type_mask()&Duck::TYPE_POSITION));
-               duck_mask_position->signal_toggled().connect(
-                       sigc::bind(
-                               sigc::mem_fun(*this, &studio::CanvasView::toggle_duck_mask),
-                               Duck::TYPE_POSITION
-                       )
-               );
-
-               duckmaskmenu.items().push_back(Gtk::Menu_Helpers::CheckMenuElem(_("Vertex Ducks"),Gtk::AccelKey('2',Gdk::MOD1_MASK)));
-               duck_mask_vertex=static_cast<Gtk::CheckMenuItem*>(&duckmaskmenu.items().back());
-               duck_mask_vertex->set_active((bool)(work_area->get_type_mask()&Duck::TYPE_VERTEX));
-               duck_mask_vertex->signal_toggled().connect(
-                       sigc::bind(
-                               sigc::mem_fun(*this, &studio::CanvasView::toggle_duck_mask),
-                               Duck::TYPE_VERTEX
-                       )
-               );
-
-               duckmaskmenu.items().push_back(Gtk::Menu_Helpers::CheckMenuElem(_("Tangent Ducks"),Gtk::AccelKey('3',Gdk::MOD1_MASK)));
-               duck_mask_tangent=static_cast<Gtk::CheckMenuItem*>(&duckmaskmenu.items().back());
-               duck_mask_tangent->set_active((bool)(work_area->get_type_mask()&Duck::TYPE_TANGENT));
-               duck_mask_tangent->signal_toggled().connect(
-                       sigc::bind(
-                               sigc::mem_fun(*this, &studio::CanvasView::toggle_duck_mask),
-                               Duck::TYPE_TANGENT
-                       )
-               );
-
-               duckmaskmenu.items().push_back(Gtk::Menu_Helpers::CheckMenuElem(_("Radius Ducks"),Gtk::AccelKey('4',Gdk::MOD1_MASK)));
-               duck_mask_radius=static_cast<Gtk::CheckMenuItem*>(&duckmaskmenu.items().back());
-               duck_mask_radius->set_active((bool)(work_area->get_type_mask()&Duck::TYPE_RADIUS));
-               duck_mask_radius->signal_toggled().connect(
-                       sigc::bind(
-                               sigc::mem_fun(*this, &studio::CanvasView::toggle_duck_mask),
-                               Duck::TYPE_RADIUS
-                       )
-               );
-
-               duckmaskmenu.items().push_back(Gtk::Menu_Helpers::CheckMenuElem(_("Width Ducks"),Gtk::AccelKey('5',Gdk::MOD1_MASK)));
-               duck_mask_width=static_cast<Gtk::CheckMenuItem*>(&duckmaskmenu.items().back());
-               duck_mask_width->set_active((bool)(work_area->get_type_mask()&Duck::TYPE_WIDTH));
-               duck_mask_width->signal_toggled().connect(
-                       sigc::bind(
-                               sigc::mem_fun(*this, &studio::CanvasView::toggle_duck_mask),
-                               Duck::TYPE_WIDTH
-                       )
-               );
-
-               duckmaskmenu.items().push_back(Gtk::Menu_Helpers::CheckMenuElem(_("Angle Ducks"),Gtk::AccelKey('6',Gdk::MOD1_MASK)));
-               duck_mask_angle=static_cast<Gtk::CheckMenuItem*>(&duckmaskmenu.items().back());
-               duck_mask_angle->set_active((bool)(work_area->get_type_mask()&Duck::TYPE_ANGLE));
-               duck_mask_angle->signal_toggled().connect(
-                       sigc::bind(
-                               sigc::mem_fun(*this, &studio::CanvasView::toggle_duck_mask),
-                               Duck::TYPE_ANGLE
-                       )
-               );
-
-               viewmenu.items().push_back(Gtk::Menu_Helpers::MenuElem(_("_Mask Ducks"),duckmaskmenu));
-       }
-
-       // Preview Quality Menu
-       if(1)
-       {
-               qualitymenu.items().push_back(Gtk::Menu_Helpers::TearoffMenuElem());
-               int i;
-               qualitymenu.items().push_back(Gtk::Menu_Helpers::MenuElem(strprintf(_("Use Parametric Renderer"),0),
-                       sigc::bind(
-                               sigc::mem_fun(*work_area, &studio::WorkArea::set_quality),
-                               0
-                       )
-               ));
-               for(i=1;i<=10;i++)
-               {
-                       qualitymenu.items().push_back(Gtk::Menu_Helpers::MenuElem(strprintf(_("Set Quality to %d"),i),Gtk::AccelKey('0'+(i%10),Gdk::CONTROL_MASK),
-                               sigc::bind(
-                                       sigc::mem_fun(*work_area, &studio::WorkArea::set_quality),
-                                       i
-                               )
-                       ));
-               }
-               viewmenu.items().push_back(Gtk::Menu_Helpers::MenuElem(_("Preview Quality"),qualitymenu));
-       }
-
-       viewmenu.items().push_back(Gtk::Menu_Helpers::StockMenuElem(Gtk::StockID("synfig-play"),
-               sigc::mem_fun(*this, &studio::CanvasView::play)));
-       viewmenu.items().push_back(Gtk::Menu_Helpers::StockMenuElem(Gtk::StockID("Flipbook Dialog"),
-               sigc::mem_fun(*preview_dialog, &studio::Dialog_Preview::present)));
-
-       viewmenu.items().push_back(Gtk::Menu_Helpers::SeparatorElem());
-
-       viewmenu.items().push_back(Gtk::Menu_Helpers::MenuElem(_("Toggle Grid Show"),Gtk::AccelKey('g',Gdk::CONTROL_MASK),
-               sigc::mem_fun(*work_area, &studio::WorkArea::toggle_grid)));
-       viewmenu.items().push_back(Gtk::Menu_Helpers::MenuElem(_("Toggle Grid Snap"),Gtk::AccelKey('l',Gdk::CONTROL_MASK),
-               sigc::mem_fun(*work_area, &studio::WorkArea::toggle_grid_snap)));
-       viewmenu.items().push_back(Gtk::Menu_Helpers::MenuElem(_("Toggle Guide Snap"),Gtk::AccelKey('k',Gdk::CONTROL_MASK),
-               sigc::mem_fun(*work_area, &studio::WorkArea::toggle_guide_snap)));
-       viewmenu.items().push_back(Gtk::Menu_Helpers::MenuElem(_("Toggle Low-Res"),Gtk::AccelKey('`',Gdk::CONTROL_MASK),
-               sigc::mem_fun(*work_area, &studio::WorkArea::toggle_low_resolution_flag)));
-
-       viewmenu.items().push_back(Gtk::Menu_Helpers::SeparatorElem());
-
-       viewmenu.items().push_back(Gtk::Menu_Helpers::StockMenuElem(Gtk::StockID("gtk-zoom-in"),Gtk::AccelKey('=',static_cast<Gdk::ModifierType>(0)),
-               sigc::mem_fun(*work_area, &studio::WorkArea::zoom_in)));
-       viewmenu.items().push_back(Gtk::Menu_Helpers::StockMenuElem(Gtk::StockID("gtk-zoom-out"),Gtk::AccelKey('-',static_cast<Gdk::ModifierType>(0)),
-               sigc::mem_fun(*work_area, &studio::WorkArea::zoom_out)));
-       viewmenu.items().push_back(Gtk::Menu_Helpers::StockMenuElem(Gtk::StockID("gtk-zoom-fit"),
-               sigc::mem_fun(*work_area, &studio::WorkArea::zoom_fit)));
-       viewmenu.items().push_back(Gtk::Menu_Helpers::StockMenuElem(Gtk::StockID("gtk-zoom-100"),Gtk::AccelKey('`',static_cast<Gdk::ModifierType>(0)),
-               sigc::mem_fun(*work_area, &studio::WorkArea::zoom_norm)));
-       viewmenu.items().push_back(Gtk::Menu_Helpers::SeparatorElem());
-
-       viewmenu.items().push_back(Gtk::Menu_Helpers::StockMenuElem(Gtk::StockID("gtk-zoom-in"),Gtk::AccelKey('+',static_cast<Gdk::ModifierType>(0)),
-               sigc::mem_fun(*this, &studio::CanvasView::time_zoom_in)));
-       viewmenu.items().push_back(Gtk::Menu_Helpers::StockMenuElem(Gtk::StockID("gtk-zoom-out"),Gtk::AccelKey('_',static_cast<Gdk::ModifierType>(0)),
-               sigc::mem_fun(*this, &studio::CanvasView::time_zoom_out)));
-
-       viewmenu.items().push_back(Gtk::Menu_Helpers::MenuElem(_("Jump to Next Keyframe"),Gtk::AccelKey(']',static_cast<Gdk::ModifierType>(0)),
-               sigc::mem_fun(*canvas_interface().get(), &synfigapp::CanvasInterface::jump_to_next_keyframe)));
-       viewmenu.items().push_back(Gtk::Menu_Helpers::MenuElem(_("Jump to Prev Keyframe"),Gtk::AccelKey('[',static_cast<Gdk::ModifierType>(0)),
-               sigc::mem_fun(*canvas_interface().get(), &synfigapp::CanvasInterface::jump_to_prev_keyframe)));
-
-       mainmenu.items().push_back(Gtk::Menu_Helpers::TearoffMenuElem());
-       mainmenu.items().push_back(Gtk::Menu_Helpers::MenuElem("_File",filemenu));
-       mainmenu.items().push_back(Gtk::Menu_Helpers::MenuElem("_Edit",editmenu));
-       mainmenu.items().push_back(Gtk::Menu_Helpers::MenuElem("_View",viewmenu));
-       mainmenu.items().push_back(Gtk::Menu_Helpers::MenuElem("_Canvas",canvasmenu));
-       mainmenu.items().push_back(Gtk::Menu_Helpers::MenuElem("_Layer",layermenu));
-
-       mainmenu.accelerate(*this);
-
-       {
-
-               trackmenu.items().push_back(Gtk::Menu_Helpers::MenuElem("New Waypoint",NOT_IMPLEMENTED_SLOT));
-               trackmenu.items().push_back(Gtk::Menu_Helpers::MenuElem("Delete Waypoint",NOT_IMPLEMENTED_SLOT));
-               trackmenu.items().push_back(Gtk::Menu_Helpers::MenuElem("Export",NOT_IMPLEMENTED_SLOT));
-               trackmenu.items().push_back(Gtk::Menu_Helpers::SeparatorElem());
-               trackmenu.items().push_back(Gtk::Menu_Helpers::MenuElem("Properties",NOT_IMPLEMENTED_SLOT));
-       }
-       mainmenu.show();
-       filemenu.show();
-       editmenu.show();
-       canvasmenu.show();
-       layermenu.show();
-
-       keyframemenu.items().push_back(Gtk::Menu_Helpers::StockMenuElem(Gtk::StockID("gtk-properties"),
-               sigc::mem_fun(*this,&studio::CanvasView::show_keyframe_dialog)
-       ));
-
-
-       get_accel_group()->unlock();
-
-       //Set the accelerator paths for all the menus
-       filemenu.set_accel_path("<synfig>/File");
-       editmenu.set_accel_path("<synfig>/Edit");
-       layermenu.set_accel_path("<synfig>/Layer");
-       //mainmenu.set_accel_path("<synfig-main>");
-       canvasmenu.set_accel_path("<synfig>/Canvas");
-       viewmenu.set_accel_path("<synfig>/View");
-       duckmaskmenu.set_accel_path("<synfig>/DuckMask");
+//
+//     //Test some key stuff
+//
+//     filemenu.items().push_back(Gtk::Menu_Helpers::StockMenuElem(Gtk::StockID("gtk-save"),
+//             hide_return(sigc::mem_fun(*get_instance().get(), &studio::Instance::save))));
+//     filemenu.items().push_back(Gtk::Menu_Helpers::StockMenuElem(Gtk::StockID("gtk-save-as"),sigc::hide_return(sigc::mem_fun(*get_instance(), &studio::Instance::dialog_save_as))));
+//     filemenu.items().push_back(Gtk::Menu_Helpers::StockMenuElem(Gtk::StockID("gtk-revert-to-saved"),hide_return(sigc::mem_fun(*get_instance().get(), &studio::Instance::safe_revert))));
+//     filemenu.items().push_back(Gtk::Menu_Helpers::SeparatorElem());
+//
+//     filemenu.items().push_back(Gtk::Menu_Helpers::StockMenuElem(Gtk::StockID("synfig-cvs_add"),sigc::hide_return(sigc::mem_fun(*get_instance(), &studio::Instance::dialog_cvs_add))));
+//     filemenu.items().push_back(Gtk::Menu_Helpers::StockMenuElem(Gtk::StockID("synfig-cvs_update"),sigc::hide_return(sigc::mem_fun(*get_instance(), &studio::Instance::dialog_cvs_update))));
+//     filemenu.items().push_back(Gtk::Menu_Helpers::StockMenuElem(Gtk::StockID("synfig-cvs_commit"),sigc::hide_return(sigc::mem_fun(*get_instance(), &studio::Instance::dialog_cvs_commit))));
+//
+//     filemenu.items().push_back(Gtk::Menu_Helpers::SeparatorElem());
+//     filemenu.items().push_back(Gtk::Menu_Helpers::MenuElem(_("Import..."),Gtk::AccelKey('I',Gdk::CONTROL_MASK),sigc::hide_return(sigc::mem_fun(*this, &studio::CanvasView::image_import))));
+//     filemenu.items().push_back(Gtk::Menu_Helpers::SeparatorElem());
+//     filemenu.items().push_back(Gtk::Menu_Helpers::MenuElem(_("Render"),Gtk::AccelKey("F9"),
+//             sigc::mem_fun(render_settings,&studio::RenderSettings::present)
+//     ));
+//     filemenu.items().push_back(Gtk::Menu_Helpers::MenuElem(_("Preview"),Gtk::AccelKey("F11"),
+//             sigc::mem_fun(*this,&CanvasView::on_preview_option)
+//     ));
+//     filemenu.items().push_back(Gtk::Menu_Helpers::MenuElem(_("Sound File"),
+//             sigc::mem_fun(*this,&CanvasView::on_audio_option)
+//     ));
+//
+//     filemenu.items().push_back(Gtk::Menu_Helpers::SeparatorElem());
+//     filemenu.items().push_back(Gtk::Menu_Helpers::MenuElem(_("Options"),Gtk::AccelKey("F12"),
+//             sigc::mem_fun(canvas_options,&studio::CanvasOptions::present)
+//     ));
+//     filemenu.items().push_back(Gtk::Menu_Helpers::SeparatorElem());
+//     filemenu.items().push_back(Gtk::Menu_Helpers::MenuElem(_("Close View"),
+//             sigc::hide_return(sigc::mem_fun(*this,&studio::CanvasView::close_view))
+//     ));
+//     filemenu.items().push_back(Gtk::Menu_Helpers::MenuElem(_("Close Document"),
+//             sigc::hide_return(sigc::mem_fun(*this,&studio::CanvasView::close_document))
+//     ));
+//
+//     editmenu.items().push_back(Gtk::Menu_Helpers::StockMenuElem(Gtk::StockID("gtk-undo"),Gtk::AccelKey('Z',Gdk::CONTROL_MASK),SLOT_EVENT(EVENT_UNDO)));
+//     editmenu.items().push_back(Gtk::Menu_Helpers::StockMenuElem(Gtk::StockID("gtk-redo"),Gtk::AccelKey('R',Gdk::CONTROL_MASK),SLOT_EVENT(EVENT_REDO)));
+//     editmenu.items().push_back(Gtk::Menu_Helpers::SeparatorElem());
+//     editmenu.items().push_back(Gtk::Menu_Helpers::StockMenuElem(Gtk::StockID("gtk-cut"),NOT_IMPLEMENTED_SLOT));
+//     editmenu.items().push_back(Gtk::Menu_Helpers::StockMenuElem(Gtk::StockID("gtk-copy"),NOT_IMPLEMENTED_SLOT));
+//     editmenu.items().push_back(Gtk::Menu_Helpers::StockMenuElem(Gtk::StockID("gtk-paste"),NOT_IMPLEMENTED_SLOT));
+//     editmenu.items().push_back(Gtk::Menu_Helpers::SeparatorElem());
+//     editmenu.items().push_back(Gtk::Menu_Helpers::MenuElem(_("Select All Ducks"),Gtk::AccelKey('E',Gdk::CONTROL_MASK),sigc::mem_fun(*work_area,&studio::WorkArea::select_all_ducks)));
+//     editmenu.items().push_back(Gtk::Menu_Helpers::MenuElem(_("Unselect All Layers"),Gtk::AccelKey('D',Gdk::CONTROL_MASK),sigc::mem_fun(*this,&CanvasView::on_unselect_layers)));
+//     editmenu.items().push_back(Gtk::Menu_Helpers::SeparatorElem());
+//
+//     //editmenu.items().push_back(Gtk::Menu_Helpers::StockMenuElem(Gtk::StockID("gtk-stop"),Gtk::AccelKey(GDK_Escape,static_cast<Gdk::ModifierType>(0)),sigc::hide_return(sigc::mem_fun(*this, &studio::CanvasView::stop))));
+//     //editmenu.items().push_back(Gtk::Menu_Helpers::StockMenuElem(Gtk::StockID("gtk-refresh"),Gtk::AccelKey('k',Gdk::CONTROL_MASK),sigc::hide_return(sigc::mem_fun(*this, &studio::CanvasView::on_refresh_pressed))));
+//     editmenu.items().push_back(Gtk::Menu_Helpers::StockMenuElem(Gtk::StockID("gtk-stop"),Gtk::AccelKey(GDK_Escape,static_cast<Gdk::ModifierType>(0)),SLOT_EVENT(EVENT_STOP)));
+//     editmenu.items().push_back(Gtk::Menu_Helpers::StockMenuElem(Gtk::StockID("gtk-refresh"),Gtk::AccelKey('k',Gdk::CONTROL_MASK),SLOT_EVENT(EVENT_REFRESH)));
+//     editmenu.items().push_back(Gtk::Menu_Helpers::SeparatorElem());
+//     editmenu.items().push_back(Gtk::Menu_Helpers::StockMenuElem(Gtk::StockID("gtk-properties"),Gtk::AccelKey("F8"),
+//             sigc::mem_fun(canvas_properties,&studio::CanvasProperties::present)
+//     ));
+//
+//     build_new_layer_menu(newlayermenu);
+//     layermenu.items().push_back(Gtk::Menu_Helpers::MenuElem(_("New"),newlayermenu));
+//
+//
+//     {
+//             synfigapp::Action::ParamList param_list;
+//             param_list.add("canvas",Canvas::Handle(get_canvas()));
+//             param_list.add("canvas_interface",canvas_interface());
+//             add_actions_to_menu(&canvasmenu, param_list,synfigapp::Action::CATEGORY_CANVAS);
+//     }
+//
+//
+//     //canvasmenu.items().push_back(Gtk::Menu_Helpers::MenuElem(_("Keyframe Dialog"),sigc::mem_fun(keyframe_dialog,&studio::Dialog_Keyframe::present)));
+//
+//     // Duck Mask Menu
+//     if(1)
+//             {
+//             duckmaskmenu.items().push_back(Gtk::Menu_Helpers::TearoffMenuElem());
+//
+//             duckmaskmenu.items().push_back(Gtk::Menu_Helpers::CheckMenuElem(_("Position Ducks"),Gtk::AccelKey('1',Gdk::MOD1_MASK)));
+//             duck_mask_position=static_cast<Gtk::CheckMenuItem*>(&duckmaskmenu.items().back());
+//             duck_mask_position->set_active((bool)(work_area->get_type_mask()&Duck::TYPE_POSITION));
+//             duck_mask_position->signal_toggled().connect(
+//                     sigc::bind(
+//                             sigc::mem_fun(*this, &studio::CanvasView::toggle_duck_mask),
+//                             Duck::TYPE_POSITION
+//                     )
+//             );
+//
+//             duckmaskmenu.items().push_back(Gtk::Menu_Helpers::CheckMenuElem(_("Vertex Ducks"),Gtk::AccelKey('2',Gdk::MOD1_MASK)));
+//             duck_mask_vertex=static_cast<Gtk::CheckMenuItem*>(&duckmaskmenu.items().back());
+//             duck_mask_vertex->set_active((bool)(work_area->get_type_mask()&Duck::TYPE_VERTEX));
+//             duck_mask_vertex->signal_toggled().connect(
+//                     sigc::bind(
+//                             sigc::mem_fun(*this, &studio::CanvasView::toggle_duck_mask),
+//                             Duck::TYPE_VERTEX
+//                     )
+//             );
+//
+//             duckmaskmenu.items().push_back(Gtk::Menu_Helpers::CheckMenuElem(_("Tangent Ducks"),Gtk::AccelKey('3',Gdk::MOD1_MASK)));
+//             duck_mask_tangent=static_cast<Gtk::CheckMenuItem*>(&duckmaskmenu.items().back());
+//             duck_mask_tangent->set_active((bool)(work_area->get_type_mask()&Duck::TYPE_TANGENT));
+//             duck_mask_tangent->signal_toggled().connect(
+//                     sigc::bind(
+//                             sigc::mem_fun(*this, &studio::CanvasView::toggle_duck_mask),
+//                             Duck::TYPE_TANGENT
+//                     )
+//             );
+//
+//             duckmaskmenu.items().push_back(Gtk::Menu_Helpers::CheckMenuElem(_("Radius Ducks"),Gtk::AccelKey('4',Gdk::MOD1_MASK)));
+//             duck_mask_radius=static_cast<Gtk::CheckMenuItem*>(&duckmaskmenu.items().back());
+//             duck_mask_radius->set_active((bool)(work_area->get_type_mask()&Duck::TYPE_RADIUS));
+//             duck_mask_radius->signal_toggled().connect(
+//                     sigc::bind(
+//                             sigc::mem_fun(*this, &studio::CanvasView::toggle_duck_mask),
+//                             Duck::TYPE_RADIUS
+//                     )
+//             );
+//
+//             duckmaskmenu.items().push_back(Gtk::Menu_Helpers::CheckMenuElem(_("Width Ducks"),Gtk::AccelKey('5',Gdk::MOD1_MASK)));
+//             duck_mask_width=static_cast<Gtk::CheckMenuItem*>(&duckmaskmenu.items().back());
+//             duck_mask_width->set_active((bool)(work_area->get_type_mask()&Duck::TYPE_WIDTH));
+//             duck_mask_width->signal_toggled().connect(
+//                     sigc::bind(
+//                             sigc::mem_fun(*this, &studio::CanvasView::toggle_duck_mask),
+//                             Duck::TYPE_WIDTH
+//                     )
+//             );
+//
+//             duckmaskmenu.items().push_back(Gtk::Menu_Helpers::CheckMenuElem(_("Angle Ducks"),Gtk::AccelKey('6',Gdk::MOD1_MASK)));
+//             duck_mask_angle=static_cast<Gtk::CheckMenuItem*>(&duckmaskmenu.items().back());
+//             duck_mask_angle->set_active((bool)(work_area->get_type_mask()&Duck::TYPE_ANGLE));
+//             duck_mask_angle->signal_toggled().connect(
+//                     sigc::bind(
+//                             sigc::mem_fun(*this, &studio::CanvasView::toggle_duck_mask),
+//                             Duck::TYPE_ANGLE
+//                     )
+//             );
+//
+//             viewmenu.items().push_back(Gtk::Menu_Helpers::MenuElem(_("_Mask Ducks"),duckmaskmenu));
+//     }
+//
+//     // Preview Quality Menu
+//     if(1)
+//     {
+//             qualitymenu.items().push_back(Gtk::Menu_Helpers::TearoffMenuElem());
+//             int i;
+//             qualitymenu.items().push_back(Gtk::Menu_Helpers::MenuElem(strprintf(_("Use Parametric Renderer"),0),
+//                     sigc::bind(
+//                             sigc::mem_fun(*work_area, &studio::WorkArea::set_quality),
+//                             0
+//                     )
+//             ));
+//             for(i=1;i<=10;i++)
+//             {
+//                     qualitymenu.items().push_back(Gtk::Menu_Helpers::MenuElem(strprintf(_("Set Quality to %d"),i),Gtk::AccelKey('0'+(i%10),Gdk::CONTROL_MASK),
+//                             sigc::bind(
+//                                     sigc::mem_fun(*work_area, &studio::WorkArea::set_quality),
+//                                     i
+//                             )
+//                     ));
+//             }
+//             viewmenu.items().push_back(Gtk::Menu_Helpers::MenuElem(_("Preview Quality"),qualitymenu));
+//     }
+//
+//     viewmenu.items().push_back(Gtk::Menu_Helpers::StockMenuElem(Gtk::Stock::MEDIA_PLAY,
+//             sigc::mem_fun(*this, &studio::CanvasView::play)));
+//     viewmenu.items().push_back(Gtk::Menu_Helpers::StockMenuElem(Gtk::StockID("Flipbook Dialog"),
+//             sigc::mem_fun(*preview_dialog, &studio::Dialog_Preview::present)));
+//
+//     viewmenu.items().push_back(Gtk::Menu_Helpers::SeparatorElem());
+//
+//     viewmenu.items().push_back(Gtk::Menu_Helpers::MenuElem(_("Toggle Grid Show"),Gtk::AccelKey('g',Gdk::CONTROL_MASK),
+//             sigc::mem_fun(*work_area, &studio::WorkArea::toggle_grid)));
+//     viewmenu.items().push_back(Gtk::Menu_Helpers::MenuElem(_("Toggle Grid Snap"),Gtk::AccelKey('l',Gdk::CONTROL_MASK),
+//             sigc::mem_fun(*work_area, &studio::WorkArea::toggle_grid_snap)));
+//     viewmenu.items().push_back(Gtk::Menu_Helpers::MenuElem(_("Toggle Guide Snap"),Gtk::AccelKey('k',Gdk::CONTROL_MASK),
+//             sigc::mem_fun(*work_area, &studio::WorkArea::toggle_guide_snap)));
+//     viewmenu.items().push_back(Gtk::Menu_Helpers::MenuElem(_("Toggle Low-Res"),Gtk::AccelKey('`',Gdk::CONTROL_MASK),
+//             sigc::mem_fun(*work_area, &studio::WorkArea::toggle_low_resolution_flag)));
+//
+//     viewmenu.items().push_back(Gtk::Menu_Helpers::SeparatorElem());
+//
+//     viewmenu.items().push_back(Gtk::Menu_Helpers::StockMenuElem(Gtk::StockID("gtk-zoom-in"),Gtk::AccelKey('=',static_cast<Gdk::ModifierType>(0)),
+//             sigc::mem_fun(*work_area, &studio::WorkArea::zoom_in)));
+//     viewmenu.items().push_back(Gtk::Menu_Helpers::StockMenuElem(Gtk::StockID("gtk-zoom-out"),Gtk::AccelKey('-',static_cast<Gdk::ModifierType>(0)),
+//             sigc::mem_fun(*work_area, &studio::WorkArea::zoom_out)));
+//     viewmenu.items().push_back(Gtk::Menu_Helpers::StockMenuElem(Gtk::StockID("gtk-zoom-fit"),
+//             sigc::mem_fun(*work_area, &studio::WorkArea::zoom_fit)));
+//     viewmenu.items().push_back(Gtk::Menu_Helpers::StockMenuElem(Gtk::StockID("gtk-zoom-100"),Gtk::AccelKey('`',static_cast<Gdk::ModifierType>(0)),
+//             sigc::mem_fun(*work_area, &studio::WorkArea::zoom_norm)));
+//     viewmenu.items().push_back(Gtk::Menu_Helpers::SeparatorElem());
+//
+//     viewmenu.items().push_back(Gtk::Menu_Helpers::StockMenuElem(Gtk::StockID("gtk-zoom-in"),Gtk::AccelKey('+',static_cast<Gdk::ModifierType>(0)),
+//             sigc::mem_fun(*this, &studio::CanvasView::time_zoom_in)));
+//     viewmenu.items().push_back(Gtk::Menu_Helpers::StockMenuElem(Gtk::StockID("gtk-zoom-out"),Gtk::AccelKey('_',static_cast<Gdk::ModifierType>(0)),
+//             sigc::mem_fun(*this, &studio::CanvasView::time_zoom_out)));
+//
+//     viewmenu.items().push_back(Gtk::Menu_Helpers::MenuElem(_("Jump to Next Keyframe"),Gtk::AccelKey(']',static_cast<Gdk::ModifierType>(0)),
+//             sigc::mem_fun(*canvas_interface().get(), &synfigapp::CanvasInterface::jump_to_next_keyframe)));
+//     viewmenu.items().push_back(Gtk::Menu_Helpers::MenuElem(_("Jump to Prev Keyframe"),Gtk::AccelKey('[',static_cast<Gdk::ModifierType>(0)),
+//             sigc::mem_fun(*canvas_interface().get(), &synfigapp::CanvasInterface::jump_to_prev_keyframe)));
+//
+//     mainmenu.items().push_back(Gtk::Menu_Helpers::TearoffMenuElem());
+//     mainmenu.items().push_back(Gtk::Menu_Helpers::MenuElem(_("_File"),filemenu));
+//     mainmenu.items().push_back(Gtk::Menu_Helpers::MenuElem(_("_Edit"),editmenu));
+//     mainmenu.items().push_back(Gtk::Menu_Helpers::MenuElem(_("_View"),viewmenu));
+//     mainmenu.items().push_back(Gtk::Menu_Helpers::MenuElem(_("_Canvas"),canvasmenu));
+//     mainmenu.items().push_back(Gtk::Menu_Helpers::MenuElem(_("_Layer"),layermenu));
+//
+//     mainmenu.accelerate(*this);
+//
+///*
+//     {
+//
+//             trackmenu.items().push_back(Gtk::Menu_Helpers::MenuElem(_("New Waypoint"),NOT_IMPLEMENTED_SLOT));
+//             trackmenu.items().push_back(Gtk::Menu_Helpers::MenuElem(_("Delete Waypoint"),NOT_IMPLEMENTED_SLOT));
+//             trackmenu.items().push_back(Gtk::Menu_Helpers::MenuElem(_("Export"),NOT_IMPLEMENTED_SLOT));
+//             trackmenu.items().push_back(Gtk::Menu_Helpers::SeparatorElem());
+//             trackmenu.items().push_back(Gtk::Menu_Helpers::MenuElem(_("Properties"),NOT_IMPLEMENTED_SLOT));
+//     }
+//*/
+//     mainmenu.show();
+//     filemenu.show();
+//     editmenu.show();
+//     canvasmenu.show();
+//     layermenu.show();
+//
+//     keyframemenu.items().push_back(Gtk::Menu_Helpers::StockMenuElem(Gtk::StockID("gtk-properties"),
+//             sigc::mem_fun(*this,&studio::CanvasView::show_keyframe_dialog)
+//     ));
+//
+//
+//     get_accel_group()->unlock();
+//
+//     //Set the accelerator paths for all the menus
+//     filemenu.set_accel_path("<synfig>/File");
+//     editmenu.set_accel_path("<synfig>/Edit");
+//     layermenu.set_accel_path("<synfig>/Layer");
+//     //mainmenu.set_accel_path("<synfig-main>");
+//     canvasmenu.set_accel_path("<synfig>/Canvas");
+//     viewmenu.set_accel_path("<synfig>/View");
+//     duckmaskmenu.set_accel_path("<synfig>/DuckMask");
 #endif
 }
 
@@ -1737,9 +1761,9 @@ CanvasView::popup_layer_menu(synfig::Layer::Handle layer)
 }
 
 void
-CanvasView::register_layer_type(synfig::Layer::Book::value_type &lyr,std::map<synfig::String,Gtk::Menu*>* category_map)
+CanvasView::register_layer_type(synfig::Layer::Book::value_type &/*lyr*/,std::map<synfig::String,Gtk::Menu*>* /*category_map*/)
 {
-/*     if(lyr.second.category==_("Do Not Use"))
+/*     if(lyr.second.category==CATEGORY_DO_NOT_USE)
                return;
 
        if(category_map->count(lyr.second.category)==0)
@@ -1757,7 +1781,7 @@ CanvasView::register_layer_type(synfig::Layer::Book::value_type &lyr,std::map<sy
 }
 
 void
-CanvasView::build_new_layer_menu(Gtk::Menu &menu)
+CanvasView::build_new_layer_menu(Gtk::Menu &/*menu*/)
 {
 /*
        std::map<synfig::String,Gtk::Menu*> category_map;
@@ -1925,14 +1949,45 @@ CanvasView::refresh_rend_desc()
 
 
 bool
-CanvasView::close()
+CanvasView::close_view()
+{
+       if(get_instance()->get_visible_canvases()==1)
+               close_instance();
+       else
+               hide();
+       return false;
+}
+
+static bool _close_instance(etl::handle<Instance> instance)
 {
-       get_instance()->safe_close();
+       etl::handle<Instance> argh(instance);
+       instance->safe_close();
+       synfig::info("closed");
+       return false;
+}
+
+bool
+CanvasView::close_instance()
+{
+       if (get_work_area()->get_updating())
+       {
+               get_work_area()->stop_updating(true); // stop and mark as cancelled
+
+               // give the workarea chances to stop updating
+               Glib::signal_timeout().connect(
+                       sigc::mem_fun(*this, &CanvasView::close_instance),
+                       250);
+       }
+       else
+               Glib::signal_timeout().connect(
+                       sigc::bind(sigc::ptr_fun(_close_instance),
+                                          (etl::handle<Instance>)get_instance()),
+                       250);
        return false;
 }
 
 handle<CanvasView>
-CanvasView::create(loose_handle<Instance> instance,handle<Canvas> canvas)
+CanvasView::create(etl::loose_handle<Instance> instance, etl::handle<synfig::Canvas> canvas)
 {
        etl::handle<studio::CanvasView> view(new CanvasView(instance,instance->synfigapp::Instance::find_canvas_interface(canvas)));
        instance->canvas_view_list().push_front(view);
@@ -1945,6 +2000,8 @@ CanvasView::update_title()
 {
        string title;
 
+       if(get_instance()->synfigapp::Instance::get_action_count())
+               title="*";
        title+=etl::basename(get_instance()->get_file_name())
                +" : ";
        if(get_canvas()->get_name().empty())
@@ -1952,9 +2009,6 @@ CanvasView::update_title()
        else
                title+='"'+get_canvas()->get_name()+'"';
 
-       if(get_instance()->synfigapp::Instance::get_action_count())
-               title+=_(" (Unsaved)");
-
        if(get_instance()->synfigapp::Instance::in_repository())
        {
                title+=" (CVS";
@@ -2079,7 +2133,7 @@ CanvasView::add_actions_to_menu(Gtk::Menu *menu, const synfigapp::Action::ParamL
 }
 
 bool
-CanvasView::on_layer_user_click(int button, Gtk::TreeRow row, LayerTree::ColumnID column_id)
+CanvasView::on_layer_user_click(int button, Gtk::TreeRow /*row*/, LayerTree::ColumnID /*column_id*/)
 {
        switch(button)
        {
@@ -2143,9 +2197,11 @@ CanvasView::on_layer_user_click(int button, Gtk::TreeRow row, LayerTree::ColumnI
                                parammenu.items().clear();
 
                                Gtk::Menu *newlayers(manage(new Gtk::Menu()));
+                               // do we need this?  the code is all #ifdef'ed out anyway
+                               // newlayers->signal_hide().connect(sigc::bind(sigc::ptr_fun(&delete_widget), newlayers));
                                build_new_layer_menu(*newlayers);
 
-                               parammenu.items().push_back(Gtk::Menu_Helpers::MenuElem("New Layer",*newlayers));
+                               parammenu.items().push_back(Gtk::Menu_Helpers::MenuElem(_("New Layer"),*newlayers));
                                if(!multiple_selected && layer->get_name()=="PasteCanvas")
                                {
                                        parammenu.items().push_back(Gtk::Menu_Helpers::MenuElem(_("Select All Children"),
@@ -2182,10 +2238,10 @@ CanvasView::on_layer_user_click(int button, Gtk::TreeRow row, LayerTree::ColumnI
 #warning update me!
 #if 0
                                        parammenu.items().clear();
-                                       parammenu.items().push_back(Gtk::Menu_Helpers::MenuElem("Connect",
+                                       parammenu.items().push_back(Gtk::Menu_Helpers::MenuElem(_("Connect"),
                                                hide_return(sigc::mem_fun(*canvas_interface().get(),&synfigapp::CanvasInterface::connect_selected_layer_params))
                                        ));
-                                       parammenu.items().push_back(Gtk::Menu_Helpers::MenuElem("Disconnect",
+                                       parammenu.items().push_back(Gtk::Menu_Helpers::MenuElem(_("Disconnect"),
                                                hide_return(sigc::mem_fun(*canvas_interface().get(),&synfigapp::CanvasInterface::disconnect_selected_layer_params))
                                        ));
                                        parammenu.popup(0,0);
@@ -2219,6 +2275,12 @@ CanvasView::on_children_user_click(int button, Gtk::TreeRow row, ChildrenTree::C
                        if(!(bool)row[children_tree_model.is_canvas])
                        {
                                synfigapp::ValueDesc value_desc=row[children_tree_model.value_desc];
+                               if (!value_desc)
+                               {
+                                       //! \todo fix properly -- what is the child dialog for?
+                                       synfig::info("preventing child dialog right-click crash");
+                                       return true;
+                               }
                                assert(value_desc);
                                popup_param_menu(value_desc);
                                return true;
@@ -2372,7 +2434,7 @@ CanvasView::on_id_changed()
 void
 CanvasView::on_mode_changed(synfigapp::CanvasInterface::Mode mode)
 {
-       // If the aninimate flag was set in mode...
+       // If the animate flag was set in mode...
        if(mode&synfigapp::MODE_ANIMATE)
        {
                Gtk::Image *icon;
@@ -2471,7 +2533,7 @@ CanvasView::on_keyframe_button_pressed()
 }
 
 bool
-CanvasView::duck_change_param(const Point &value,synfig::Layer::Handle layer, synfig::String param_name)
+CanvasView::duck_change_param(const synfig::Point &value,synfig::Layer::Handle layer, synfig::String param_name)
 {
        return canvas_interface()->change_value(synfigapp::ValueDesc(layer,param_name),value);
 }
@@ -2495,8 +2557,16 @@ CanvasView::on_duck_changed(const synfig::Point &value,const synfigapp::ValueDes
        return true;
 }
 
+bool
+CanvasView::on_duck_angle_changed(const synfig::Angle &rotation,const synfigapp::ValueDesc& value_desc)
+{
+       // \todo will this really always be the case?
+       assert(value_desc.get_value_type() == ValueBase::TYPE_ANGLE);
+       return canvas_interface()->change_value(value_desc, value_desc.get_value(get_time()).get(Angle()) + rotation);
+}
+
 void
-CanvasView::selected_layer_color_set(Color color)
+CanvasView::selected_layer_color_set(synfig::Color color)
 {
        synfigapp::SelectionManager::LayerList selected_list(get_selection_manager()->get_selected_layers());
        synfigapp::SelectionManager::LayerList::iterator iter;
@@ -2515,7 +2585,7 @@ CanvasView::selected_layer_color_set(Color color)
 }
 
 void
-CanvasView::rebuild_ducks_layer_(synfig::TransformStack& transform_stack, Canvas::Handle canvas, std::set<synfig::Layer::Handle>& selected_list)
+CanvasView::rebuild_ducks_layer_(synfig::TransformStack& transform_stack, synfig::Canvas::Handle canvas, std::set<synfig::Layer::Handle>& selected_list)
 {
        int transforms(0);
        String layer_name;
@@ -2545,7 +2615,7 @@ CanvasView::rebuild_ducks_layer_(synfig::TransformStack& transform_stack, Canvas
                        // do the bounding box thing
                        bbox|=transform_stack.perform(layer->get_bounding_rect());
 
-                       // Grab the layer's list pf parameters
+                       // Grab the layer's list of parameters
                        Layer::ParamList paramlist(layer->get_param_list());
 
                        // Grab the layer vocabulary
@@ -2815,10 +2885,15 @@ CanvasView::play()
                if(!work_area->sync_render_preview())
                        break;
 
-               studio::App::iteration(false);
+               // wait for the workarea to refresh itself
+               while (studio::App::events_pending())
+                       studio::App::iteration(false);
 
                if(get_cancel_status())
+               {
+                       is_playing_=false;
                        return;
+               }
        }
        is_playing_=false;
 
@@ -2926,6 +3001,7 @@ CanvasView::on_waypoint_clicked(synfigapp::ValueDesc value_desc,synfig::Waypoint
        case 2:
                {
                        Gtk::Menu* waypoint_menu(manage(new Gtk::Menu()));
+                       waypoint_menu->signal_hide().connect(sigc::bind(sigc::ptr_fun(&delete_widget), waypoint_menu));
 
                        waypoint_menu->items().push_back(Gtk::Menu_Helpers::StockMenuElem(Gtk::StockID("gtk-jump-to"),
                                sigc::bind(
@@ -2937,7 +3013,7 @@ CanvasView::on_waypoint_clicked(synfigapp::ValueDesc value_desc,synfig::Waypoint
                                )
                        ));
 
-                       waypoint_menu->items().push_back(Gtk::Menu_Helpers::StockMenuElem(Gtk::StockID("Edit Waypoint"),
+                       waypoint_menu->items().push_back(Gtk::Menu_Helpers::StockMenuElem(Gtk::StockID(_("Edit Waypoint")),
                                sigc::mem_fun(
                                        waypoint_dialog,
                                        &Gtk::Widget::show
@@ -3003,12 +3079,12 @@ CanvasView::on_waypoint_delete()
 }
 
 void
-CanvasView::on_drop_drag_data_received(const Glib::RefPtr<Gdk::DragContext>& context, int x, int y, const Gtk::SelectionData& selection_data_, guint info, guint time)
+CanvasView::on_drop_drag_data_received(const Glib::RefPtr<Gdk::DragContext>& context, int /*x*/, int /*y*/, const Gtk::SelectionData& selection_data_, guint /*info*/, guint time)
 {
        // We will make this true once we have a solid drop
        bool success(false);
-       //synfig::info("Droped data of type \"%s\"",selection_data.get_data_type());
-       //synfig::info("Droped data of target \"%s\"",gdk_atom_name(selection_data->target));
+       //synfig::info("Dropped data of type \"%s\"",selection_data.get_data_type());
+       //synfig::info("Dropped data of target \"%s\"",gdk_atom_name(selection_data->target));
        //synfig::info("selection=\"%s\"",gdk_atom_name(selection_data->selection));
 
        if ((selection_data_.get_length() >= 0) && (selection_data_.get_format() == 8))
@@ -3036,7 +3112,7 @@ CanvasView::on_drop_drag_data_received(const Glib::RefPtr<Gdk::DragContext>& con
                        if(!get_instance()->perform_action(action))
                                break;
 
-                       // Ok, we have successfuly imported at least one item.
+                       // Ok, we have successfully imported at least one item.
                        success=true;
                } while(0); // END of "STRING"
 
@@ -3044,8 +3120,8 @@ CanvasView::on_drop_drag_data_received(const Glib::RefPtr<Gdk::DragContext>& con
                {
                        synfig::String selection_data((gchar *)(selection_data_.get_data()));
 
-                       // For some reason, GTK hands us a list of URL's seperated
-                       // by not only Carrage-Returns, but also Line-Feeds.
+                       // For some reason, GTK hands us a list of URLs separated
+                       // by not only Carriage-Returns, but also Line-Feeds.
                        // Line-Feeds will mess us up. Remove all the line-feeds.
                        while(selection_data.find_first_of('\r')!=synfig::String::npos)
                                selection_data.erase(selection_data.begin()+selection_data.find_first_of('\r'));
@@ -3073,8 +3149,8 @@ CanvasView::on_drop_drag_data_received(const Glib::RefPtr<Gdk::DragContext>& con
                                // Strip the "file://" part from the filename
                                filename=synfig::String(filename.begin()+sizeof("file://")-1,filename.end());
 
-                               String ext;
-                               try{ext=(String(filename.begin()+filename.find_last_of('.')+1,filename.end()));}catch(...){continue;}
+                               String ext(filename_extension(filename));
+                               if (ext.size()) ext = ext.substr(1); // skip initial '.'
 
                                // If this is a SIF file, then we need to do things slightly differently
                                if(ext=="sketch")
@@ -3342,7 +3418,7 @@ CanvasView::on_audio_file_change(const std::string &f)
 }
 
 void
-CanvasView::on_audio_offset_change(const Time &t)
+CanvasView::on_audio_offset_change(const synfig::Time &t)
 {
        canvas_interface()->set_meta_data("audiooffset",t.get_string());
 }
@@ -3393,7 +3469,7 @@ CanvasView::on_audio_offset_notify()
        sound_dialog->set_offset(t);
        disp_audio->queue_draw();
 
-       synfig::info("CanvasView::on_audio_offset_notify(): offset time set to %s",t.get_string(get_canvas()->rend_desc().get_frame_rate()).c_str());
+       // synfig::info("CanvasView::on_audio_offset_notify(): offset time set to %s",t.get_string(get_canvas()->rend_desc().get_frame_rate()).c_str());
 }
 
 void
@@ -3491,30 +3567,14 @@ CanvasView::set_ext_widget(const synfig::String& x, Gtk::Widget* y)
                keyframe_tree=dynamic_cast<KeyframeTree*>(y);
 }
 
-static bool _close_instance(etl::handle<Instance> instance)
-{
-       etl::handle<Instance> argh(instance);
-       instance->safe_close();
-       synfig::info("closed");
-       return false;
-}
-
 bool
 CanvasView::on_delete_event(GdkEventAny* event)
 {
-       if(get_instance()->get_visible_canvases()==1)
-       {
-               // Schedule a close to occur in a few moments
-               Glib::signal_timeout().connect(
-                       sigc::bind(
-                               sigc::ptr_fun(_close_instance),
-                               (etl::handle<Instance>)get_instance()
-                       )
-                       ,250
-               );
-       }
-       if(event)
-               return Gtk::Window::on_delete_event(event);
+       close_view();
+
+       //! \todo This causes the window to be deleted straight away - but what if we prompt 'save?' and the user cancels?
+       //                Is there ever any need to pass on the delete event to the window here?
+       // if(event) return Gtk::Window::on_delete_event(event);
 
        return true;
 }