X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=synfig-studio%2Fsrc%2Fgtkmm%2Fapp.cpp;h=8dbfc6ab218df191f00ad27d89187b9d33ab389e;hb=96b814d7b04e228bf69cea0ba4a2da0295d83fda;hp=c25749bc8002ac704f864b4f9df6ea6b100b7430;hpb=b8024d47fa89ddb44139120ec7d03e2bee09db77;p=synfig.git diff --git a/synfig-studio/src/gtkmm/app.cpp b/synfig-studio/src/gtkmm/app.cpp index c25749b..8dbfc6a 100644 --- a/synfig-studio/src/gtkmm/app.cpp +++ b/synfig-studio/src/gtkmm/app.cpp @@ -9,6 +9,7 @@ ** Copyright (c) 2007, 2008 Chris Moore ** Copyright (c) 2008 Gerald Young ** Copyright (c) 2008 Carlos López +** Copyright (c) 2009 Nikita Kitaev ** ** This package is free software; you can redistribute it and/or ** modify it under the terms of the GNU General Public License as @@ -1059,79 +1060,79 @@ init_ui_manager() } // the toolbox - ACCEL("a", "//state-normal" ); - ACCEL("v", "//state-smooth_move" ); - ACCEL("s", "//state-scale" ); - ACCEL("t", "//state-rotate" ); - ACCEL("m", "//state-mirror" ); - ACCEL("c", "//state-circle" ); - ACCEL("r", "//state-rectangle" ); - ACCEL("q", "//state-star" ); - ACCEL("g", "//state-gradient" ); - ACCEL("p", "//state-polygon" ); - ACCEL("b", "//state-bline" ); - ACCEL("x", "//state-text" ); - ACCEL("f", "//state-fill" ); - ACCEL("e", "//state-eyedrop" ); - ACCEL("z", "//state-zoom" ); - ACCEL("d", "//state-draw" ); - ACCEL("k", "//state-sketch" ); - ACCEL("w", "//state-width" ); + ACCEL("a", "/action_group_state_manager/state-normal" ); + ACCEL("v", "/action_group_state_manager/state-smooth_move" ); + ACCEL("s", "/action_group_state_manager/state-scale" ); + ACCEL("t", "/action_group_state_manager/state-rotate" ); + ACCEL("m", "/action_group_state_manager/state-mirror" ); + ACCEL("c", "/action_group_state_manager/state-circle" ); + ACCEL("r", "/action_group_state_manager/state-rectangle" ); + ACCEL("q", "/action_group_state_manager/state-star" ); + ACCEL("g", "/action_group_state_manager/state-gradient" ); + ACCEL("p", "/action_group_state_manager/state-polygon" ); + ACCEL("b", "/action_group_state_manager/state-bline" ); + ACCEL("x", "/action_group_state_manager/state-text" ); + ACCEL("f", "/action_group_state_manager/state-fill" ); + ACCEL("e", "/action_group_state_manager/state-eyedrop" ); + ACCEL("z", "/action_group_state_manager/state-zoom" ); + ACCEL("d", "/action_group_state_manager/state-draw" ); + ACCEL("k", "/action_group_state_manager/state-sketch" ); + ACCEL("w", "/action_group_state_manager/state-width" ); // everything else - ACCEL("a", "//select-all-ducks" ); - ACCEL("d", "//unselect-all-ducks" ); - ACCEL("a", "//select-all-layers" ); - ACCEL("d", "//unselect-all-layers" ); - ACCEL("F9", "//render" ); - ACCEL("F11", "//preview" ); - ACCEL("F8", "//properties" ); - ACCEL("F12", "//options" ); - ACCEL("i", "//import" ); - ACCEL2(Gtk::AccelKey(GDK_Escape,static_cast(0), "//stop" )); - ACCEL("g", "//toggle-grid-show" ); - ACCEL("l", "//toggle-grid-snap" ); - ACCEL2(Gtk::AccelKey('`',Gdk::CONTROL_MASK, "//toggle-low-res" )); - ACCEL("1", "//mask-position-ducks" ); - ACCEL("2", "//mask-vertex-ducks" ); - ACCEL("3", "//mask-tangent-ducks" ); - ACCEL("4", "//mask-radius-ducks" ); - ACCEL("5", "//mask-width-ducks" ); - ACCEL("6", "//mask-angle-ducks" ); - ACCEL2(Gtk::AccelKey(GDK_Page_Up,Gdk::SHIFT_MASK, "//action-LayerRaise" )); - ACCEL2(Gtk::AccelKey(GDK_Page_Down,Gdk::SHIFT_MASK, "//action-LayerLower" )); - ACCEL("1", "//quality-01" ); - ACCEL("2", "//quality-02" ); - ACCEL("3", "//quality-03" ); - ACCEL("4", "//quality-04" ); - ACCEL("5", "//quality-05" ); - ACCEL("6", "//quality-06" ); - ACCEL("7", "//quality-07" ); - ACCEL("8", "//quality-08" ); - ACCEL("9", "//quality-09" ); - ACCEL("0", "//quality-10" ); - ACCEL("z", "//undo" ); - ACCEL("r", "//redo" ); - ACCEL2(Gtk::AccelKey(GDK_Delete,Gdk::CONTROL_MASK, "//action-LayerRemove" )); - ACCEL2(Gtk::AccelKey('(',Gdk::CONTROL_MASK, "//decrease-low-res-pixel-size" )); - ACCEL2(Gtk::AccelKey(')',Gdk::CONTROL_MASK, "//increase-low-res-pixel-size" )); - ACCEL2(Gtk::AccelKey('(',Gdk::MOD1_MASK|Gdk::CONTROL_MASK, "//amount-dec" )); - ACCEL2(Gtk::AccelKey(')',Gdk::MOD1_MASK|Gdk::CONTROL_MASK, "//amount-inc" )); - ACCEL2(Gtk::AccelKey(']',Gdk::CONTROL_MASK, "//jump-next-keyframe" )); - ACCEL2(Gtk::AccelKey('[',Gdk::CONTROL_MASK, "//jump-prev-keyframe" )); - ACCEL2(Gtk::AccelKey('=',Gdk::CONTROL_MASK, "//canvas-zoom-in" )); - ACCEL2(Gtk::AccelKey('-',Gdk::CONTROL_MASK, "//canvas-zoom-out" )); - ACCEL2(Gtk::AccelKey('+',Gdk::CONTROL_MASK, "//time-zoom-in" )); - ACCEL2(Gtk::AccelKey('_',Gdk::CONTROL_MASK, "//time-zoom-out" )); - ACCEL2(Gtk::AccelKey('.',Gdk::CONTROL_MASK, "//seek-next-frame" )); - ACCEL2(Gtk::AccelKey(',',Gdk::CONTROL_MASK, "//seek-prev-frame" )); - ACCEL2(Gtk::AccelKey('>',Gdk::CONTROL_MASK, "//seek-next-second" )); - ACCEL2(Gtk::AccelKey('<',Gdk::CONTROL_MASK, "//seek-prev-second" )); - ACCEL("o", "//toggle-onion-skin" ); - ACCEL("z", "//canvas-zoom-fit" ); - ACCEL("p", "//play" ); - ACCEL("Home", "//seek-begin" ); - ACCEL("End", "//seek-end" ); + ACCEL("a", "/canvasview/select-all-ducks" ); + ACCEL("d", "/canvasview/unselect-all-ducks" ); + ACCEL("a", "/canvasview/select-all-layers" ); + ACCEL("d", "/canvasview/unselect-all-layers" ); + ACCEL("F9", "/canvasview/render" ); + ACCEL("F11", "/canvasview/preview" ); + ACCEL("F8", "/canvasview/properties" ); + ACCEL("F12", "/canvasview/options" ); + ACCEL("i", "/canvasview/import" ); + ACCEL2(Gtk::AccelKey(GDK_Escape,static_cast(0), "/canvasview/stop" )); + ACCEL("g", "/canvasview/toggle-grid-show" ); + ACCEL("l", "/canvasview/toggle-grid-snap" ); + ACCEL2(Gtk::AccelKey('`',Gdk::CONTROL_MASK, "/canvasview/toggle-low-res" )); + ACCEL("1", "/canvasview/mask-position-ducks" ); + ACCEL("2", "/canvasview/mask-vertex-ducks" ); + ACCEL("3", "/canvasview/mask-tangent-ducks" ); + ACCEL("4", "/canvasview/mask-radius-ducks" ); + ACCEL("5", "/canvasview/mask-width-ducks" ); + ACCEL("6", "/canvasview/mask-angle-ducks" ); + ACCEL2(Gtk::AccelKey(GDK_Page_Up,Gdk::SHIFT_MASK, "/action_group_layer_action_manager/action-LayerRaise" )); + ACCEL2(Gtk::AccelKey(GDK_Page_Down,Gdk::SHIFT_MASK, "/action_group_layer_action_manager/action-LayerLower" )); + ACCEL("1", "/canvasview/quality-01" ); + ACCEL("2", "/canvasview/quality-02" ); + ACCEL("3", "/canvasview/quality-03" ); + ACCEL("4", "/canvasview/quality-04" ); + ACCEL("5", "/canvasview/quality-05" ); + ACCEL("6", "/canvasview/quality-06" ); + ACCEL("7", "/canvasview/quality-07" ); + ACCEL("8", "/canvasview/quality-08" ); + ACCEL("9", "/canvasview/quality-09" ); + ACCEL("0", "/canvasview/quality-10" ); + ACCEL("z", "/action_group_dock_history/undo" ); + ACCEL("r", "/action_group_dock_history/redo" ); + ACCEL2(Gtk::AccelKey(GDK_Delete,Gdk::CONTROL_MASK, "/action_group_layer_action_manager/action-LayerRemove" )); + ACCEL2(Gtk::AccelKey('(',Gdk::CONTROL_MASK, "/canvasview/decrease-low-res-pixel-size" )); + ACCEL2(Gtk::AccelKey(')',Gdk::CONTROL_MASK, "/canvasview/increase-low-res-pixel-size" )); + ACCEL2(Gtk::AccelKey('(',Gdk::MOD1_MASK|Gdk::CONTROL_MASK, "/action_group_layer_action_manager/amount-dec" )); + ACCEL2(Gtk::AccelKey(')',Gdk::MOD1_MASK|Gdk::CONTROL_MASK, "/action_group_layer_action_manager/amount-inc" )); + ACCEL2(Gtk::AccelKey(']',Gdk::CONTROL_MASK, "/canvasview/jump-next-keyframe" )); + ACCEL2(Gtk::AccelKey('[',Gdk::CONTROL_MASK, "/canvasview/jump-prev-keyframe" )); + ACCEL2(Gtk::AccelKey('=',Gdk::CONTROL_MASK, "/canvasview/canvas-zoom-in" )); + ACCEL2(Gtk::AccelKey('-',Gdk::CONTROL_MASK, "/canvasview/canvas-zoom-out" )); + ACCEL2(Gtk::AccelKey('+',Gdk::CONTROL_MASK, "/canvasview/time-zoom-in" )); + ACCEL2(Gtk::AccelKey('_',Gdk::CONTROL_MASK, "/canvasview/time-zoom-out" )); + ACCEL2(Gtk::AccelKey('.',Gdk::CONTROL_MASK, "/canvasview/seek-next-frame" )); + ACCEL2(Gtk::AccelKey(',',Gdk::CONTROL_MASK, "/canvasview/seek-prev-frame" )); + ACCEL2(Gtk::AccelKey('>',Gdk::CONTROL_MASK, "/canvasview/seek-next-second" )); + ACCEL2(Gtk::AccelKey('<',Gdk::CONTROL_MASK, "/canvasview/seek-prev-second" )); + ACCEL("o", "/canvasview/toggle-onion-skin" ); + ACCEL("z", "/canvasview/canvas-zoom-fit" ); + ACCEL("p", "/canvasview/play" ); + ACCEL("Home", "/canvasview/seek-begin" ); + ACCEL("End", "/canvasview/seek-end" ); #undef ACCEL } @@ -1181,7 +1182,7 @@ App::App(int *argc, char ***argv): "different version of libsynfig than what is currently\n" "installed. Synfig Studio will now abort. Try downloading\n" "the latest version from the Synfig website at\n" - "http://synfig.org/Download" + "http://synfig.org/en/current-release" ); throw 40; } @@ -1292,30 +1293,31 @@ App::App(int *argc, char ***argv): studio_init_cb.task(_("Init Tools...")); - /* row 1 */ + /* editing tools */ state_manager->add_state(&state_normal); state_manager->add_state(&state_smooth_move); state_manager->add_state(&state_scale); state_manager->add_state(&state_rotate); studio_init_cb.task(_("Init ModMirror...")); module_list_.push_back(new ModMirror()); module_list_.back()->start(); - /* row 2 */ + /* geometry */ state_manager->add_state(&state_circle); state_manager->add_state(&state_rectangle); state_manager->add_state(&state_star); state_manager->add_state(&state_gradient); if(!getenv("SYNFIG_DISABLE_POLYGON")) state_manager->add_state(&state_polygon); // Enabled - for working without ducks - /* row 3 */ + /* bline tools */ state_manager->add_state(&state_bline); - state_manager->add_state(&state_text); + if(!getenv("SYNFIG_DISABLE_DRAW" )) state_manager->add_state(&state_draw); // Enabled for now. Let's see whether they're good enough yet. + if(!getenv("SYNFIG_DISABLE_WIDTH" )) state_manager->add_state(&state_width); // Enabled since 0.61.09 state_manager->add_state(&state_fill); state_manager->add_state(&state_eyedrop); - state_manager->add_state(&state_zoom); - if(!getenv("SYNFIG_DISABLE_DRAW" )) state_manager->add_state(&state_draw); // Enabled for now. Let's see whether they're good enough yet. + /* other */ + state_manager->add_state(&state_text); if(!getenv("SYNFIG_DISABLE_SKETCH" )) state_manager->add_state(&state_sketch); - if(!getenv("SYNFIG_DISABLE_WIDTH" )) state_manager->add_state(&state_width); // Enabled since 0.61.09 + state_manager->add_state(&state_zoom); studio_init_cb.task(_("Init ModPalette...")); module_list_.push_back(new ModPalette()); module_list_.back()->start(); @@ -1390,6 +1392,15 @@ App::App(int *argc, char ***argv): studio_init_cb.task(_("Done.")); studio_init_cb.amount_complete(10000,10000); + // To avoid problems with some window managers and gtk >= 2.18 + // we should show dock dialogs after the settings load. + // If dock dialogs are shown before the settings are loaded, + // the windows manager can act over it. + // See discussions here: + // * http://synfig.org/forums/viewtopic.php?f=1&t=1131&st=0&sk=t&sd=a&start=30 + // * http://synfig.org/forums/viewtopic.php?f=15&t=1062 + dock_manager->show_all_dock_dialogs(); + toolbox->present(); } catch(String x) @@ -1468,13 +1479,10 @@ App::get_config_file(const synfig::String& file) return Glib::build_filename(get_user_app_directory(),file); } -#define SCALE_FACTOR (1280) //! set the \a instance's canvas(es) position and size to be those specified in the first entry of recent_files_window_size void App::set_recent_file_window_size(etl::handle instance) { - int screen_w(Gdk::screen_width()); - int screen_h(Gdk::screen_height()); const std::string &canvas_window_size = *recent_files_window_size.begin(); @@ -1520,22 +1528,9 @@ App::set_recent_file_window_size(etl::handle instance) current = separator+1; continue; } - - if (x > SCALE_FACTOR) x = SCALE_FACTOR - 150; if (x < 0) x = 0; - if (y > SCALE_FACTOR) y = SCALE_FACTOR - 150; if (y < 0) y = 0; - x=x*screen_w/SCALE_FACTOR; - y=y*screen_h/SCALE_FACTOR; - if(getenv("SYNFIG_WINDOW_POSITION_X_OFFSET")) - x += atoi(getenv("SYNFIG_WINDOW_POSITION_X_OFFSET")); - if(getenv("SYNFIG_WINDOW_POSITION_Y_OFFSET")) - y += atoi(getenv("SYNFIG_WINDOW_POSITION_Y_OFFSET")); - - if (w > SCALE_FACTOR) w = 150; if (w < 0) w = 0; - if (h > SCALE_FACTOR) h = 150; if (h < 0) h = 0; - CanvasView::Handle canvasview = instance->find_canvas_view(canvas); canvasview->move(x,y); - canvasview->resize(w*screen_w/SCALE_FACTOR,h*screen_h/SCALE_FACTOR); + canvasview->resize(w,h); canvasview->present(); current = separator+1; @@ -1548,8 +1543,6 @@ App::set_recent_file_window_size(etl::handle instance) void App::add_recent_file(const etl::handle instance) { - int screen_w(Gdk::screen_width()); - int screen_h(Gdk::screen_height()); std::string canvas_window_size; @@ -1568,13 +1561,12 @@ App::add_recent_file(const etl::handle instance) canvas_window_size += strprintf("%s %d %d %d %d\t", canvas->get_relative_id(canvas->get_root()).c_str(), - x_pos*SCALE_FACTOR/screen_w, y_pos*SCALE_FACTOR/screen_h, - x_size*SCALE_FACTOR/screen_w, y_size*SCALE_FACTOR/screen_h); + x_pos, y_pos, + x_size, y_size); } add_recent_file(absolute_path(instance->get_file_name()), canvas_window_size); } -#undef SCALE_FACTOR void App::add_recent_file(const std::string &file_name, const std::string &window_size) @@ -1773,20 +1765,98 @@ App::load_settings() void App::reset_initial_window_configuration() { + Glib::RefPtr display(Gdk::Display::get_default()); + Glib::RefPtr screen(display->get_default_screen()); + Gdk::Rectangle rect; + // A proper way to obtain the primary monitor is to use the + // Gdk::Screen::get_primary_monitor () const member. But as it + // was introduced in gtkmm 2.20 I assume that the monitor 0 is the + // primary one. + screen->get_monitor_geometry(0,rect); +#define hpanel_width 79.0f +#define hpanel_height 25.0f +#define vpanel_width 20.0f +#define vpanel_height 100.0f +#define vdock 20.0f +#define hdock 20.0f + +/* percentages referred to width or height of the screen + *---------------------------------------------------------------------* + * t | | + * o | | + * o | |vdock% + * l | | + * b | |------------ + * o | | + * x | |vdock% + * -------- | + * | + * |------------ + * | + * |vdock% + * | + * | + *-----hdock%----------------------------------------------|------------ + * | | + * | |vdock% + * | | + * | | + * --------------------------------------------------------------------* +*/ +// Vertical Panel + int v_xpos=rect.get_x() + rect.get_width()*(1.0-vpanel_width/100.0); + int v_xsize=rect.get_width()*vpanel_width/100.0; + int v_ypos=rect.get_y(); + int v_ysize=rect.get_height()*vpanel_height/100.0; + std::string v_pos(strprintf("%d %d", v_xpos, v_ypos)); + std::string v_size(strprintf("%d %d", v_xsize, v_ysize)); +// Horizontal Panel + int h_xpos=rect.get_x(); + int h_xsize=rect.get_width()*hpanel_width/100.0; + int h_ypos=rect.get_y()+ rect.get_height()*(1.0-hpanel_height/100.0);; + int h_ysize=rect.get_height()*hpanel_height/100.0; + std::string h_pos(strprintf("%d %d", h_xpos, h_ypos)); + std::string h_size(strprintf("%d %d", h_xsize, h_ysize)); + int v_dock1 = rect.get_height()*vdock*0.8/100.0; + int v_dock2 = rect.get_height()*vdock*0.6/100.0; + int v_dock3 = rect.get_height()*vdock*1.1/100.0; + int h_dock = rect.get_width()*hdock/100.0; +//Contents size + std::string v_contents(strprintf("%d %d %d", v_dock1, v_dock2, v_dock3)); + std::string h_contents(strprintf("%d", h_dock)); +// Tool Box position + std::string tbox_pos(strprintf("%d %d", rect.get_x(), rect.get_y())); +/* + synfig::info("tool box pos: %s", tbox_pos.c_str()); + synfig::info("v_contents sizes: %s", v_contents.c_str()); + synfig::info("v_pos: %s", v_pos.c_str()); + synfig::info("v_sizes: %s", v_size.c_str()); + synfig::info("h_contents sizes: %s", h_contents.c_str()); + synfig::info("h_pos: %s", h_pos.c_str()); + synfig::info("h_sizes: %s", h_size.c_str()); +*/ synfigapp::Main::settings().set_value("dock.dialog.1.comp_selector","1"); synfigapp::Main::settings().set_value("dock.dialog.1.contents","navigator - info pal_edit pal_browse - tool_options history canvases - layers groups"); - synfigapp::Main::settings().set_value("dock.dialog.1.contents_size","225 167 207"); - synfigapp::Main::settings().set_value("dock.dialog.1.pos","1057 32"); - synfigapp::Main::settings().set_value("dock.dialog.1.size","208 1174"); + synfigapp::Main::settings().set_value("dock.dialog.1.contents_size",v_contents); + synfigapp::Main::settings().set_value("dock.dialog.1.size",v_size); + synfigapp::Main::settings().set_value("dock.dialog.1.pos",v_pos); synfigapp::Main::settings().set_value("dock.dialog.2.comp_selector","0"); synfigapp::Main::settings().set_value("dock.dialog.2.contents","params children keyframes | timetrack curves meta_data"); - synfigapp::Main::settings().set_value("dock.dialog.2.contents_size","263"); - synfigapp::Main::settings().set_value("dock.dialog.2.pos","0 973"); - synfigapp::Main::settings().set_value("dock.dialog.2.size","1045 235"); + synfigapp::Main::settings().set_value("dock.dialog.2.contents_size",h_contents); + synfigapp::Main::settings().set_value("dock.dialog.2.size",h_size); + synfigapp::Main::settings().set_value("dock.dialog.2.pos",h_pos); + synfigapp::Main::settings().set_value("window.toolbox.pos",tbox_pos); + + dock_manager->show_all_dock_dialogs(); +} + +void +App::reset_initial_preferences() +{ synfigapp::Main::settings().set_value("pref.distance_system","pt"); synfigapp::Main::settings().set_value("pref.use_colorspace_gamma","1"); #ifdef SINGLE_THREADED - synfigapp::Main::settings().set_value("pref.single_threaded","0"); + synfigapp::Main::settings().set_value("pref.single_threaded","1"); #endif synfigapp::Main::settings().set_value("pref.restrict_radius_ducks","0"); synfigapp::Main::settings().set_value("pref.resize_imported_images","0"); @@ -1796,7 +1866,7 @@ App::reset_initial_window_configuration() synfigapp::Main::settings().set_value("pref.predefined_size",DEFAULT_PREDEFINED_SIZE); synfigapp::Main::settings().set_value("pref.preferred_fps","24.0"); synfigapp::Main::settings().set_value("pref.predefined_fps",DEFAULT_PREDEFINED_FPS); - synfigapp::Main::settings().set_value("window.toolbox.pos","4 4"); + } bool @@ -2101,7 +2171,8 @@ App::dialog_save_file(const std::string &title, std::string &filename, std::stri { file_type_enum = manage(new Widget_Enum()); file_type_enum->set_param_desc(ParamDesc().set_hint("enum") - .add_enum_value(synfig::RELEASE_VERSION_0_61_09, "0.61.09", strprintf("0.61.09 (%s)", _("current"))) + .add_enum_value(synfig::RELEASE_VERSION_0_62_00, "0.62.00", strprintf("0.62.00 (%s)", _("current"))) + .add_enum_value(synfig::RELEASE_VERSION_0_61_09, "0.61.09", "0.61.09") .add_enum_value(synfig::RELEASE_VERSION_0_61_08, "0.61.08", "0.61.08") .add_enum_value(synfig::RELEASE_VERSION_0_61_07, "0.61.07", "0.61.07") .add_enum_value(synfig::RELEASE_VERSION_0_61_06, "0.61.06", strprintf("0.61.06 %s", _("and older")))); @@ -2291,10 +2362,10 @@ try_open_url(const std::string &url) void App::dialog_help() { - if (!try_open_url("http://synfig.org/Documentation")) + if (!try_open_url("http://synfig.org/wiki/Category:Manual")) { Gtk::MessageDialog dialog(_("Documentation"), false, Gtk::MESSAGE_INFO, Gtk::BUTTONS_CLOSE, true); - dialog.set_secondary_text(_("Documentation for Synfig Studio is available on the website:\n\nhttp://www.synfig.org/Documentation")); + dialog.set_secondary_text(_("Documentation for Synfig Studio is available on the website:\n\nhttp://synfig.org/wiki/Category:Manual")); dialog.set_title(_("Help")); dialog.run(); }