X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=synfig-studio%2Ftrunk%2Fsrc%2Fgtkmm%2Fapp.cpp;h=feb0c025df21bd97e2685f09348b7cdd72f07a27;hb=4089a02df7938fb36081d29b30eabd690ffcd96d;hp=27a7373cb5ae6d75bbbb54a681b64943d7a3c0e9;hpb=862376ea15b9fe602e787b03652b83a49aa28cd1;p=synfig.git diff --git a/synfig-studio/trunk/src/gtkmm/app.cpp b/synfig-studio/trunk/src/gtkmm/app.cpp index 27a7373..feb0c02 100644 --- a/synfig-studio/trunk/src/gtkmm/app.cpp +++ b/synfig-studio/trunk/src/gtkmm/app.cpp @@ -31,6 +31,11 @@ # include #endif +#ifdef WIN32 +#define WINVER 0x0500 +#include +#endif + #include #include #include @@ -122,10 +127,6 @@ #include #endif -#ifdef WIN32 -#define _WIN32_WINNT 0x0500 -#include -#endif #include #include #include @@ -270,7 +271,11 @@ bool studio::App::use_colorspace_gamma=true; bool studio::App::single_threaded=false; #endif bool studio::App::restrict_radius_ducks=false; -String studio::App::browser_command("firefox"); +#ifdef USE_OPEN_FOR_URLS +String studio::App::browser_command("open"); // MacOS only +#else +String studio::App::browser_command("xdg-open"); // Linux XDG standard +#endif static int max_recent_files_=25; int studio::App::get_max_recent_files() { return max_recent_files_; } @@ -1069,7 +1074,6 @@ App::App(int *argc, char ***argv): Glib::set_application_name(_("Synfig Studio")); Splash splash_screen; - splash_screen.set_can_self_destruct(false); splash_screen.show(); shutdown_in_progress=false; @@ -1327,7 +1331,12 @@ App::~App() String App::get_user_app_directory() { +//! \todo do we need locale_from_utf8() on non-Windows boxes too? (bug #1837445) +#ifdef WIN32 + return Glib::locale_from_utf8(Glib::build_filename(Glib::get_home_dir(),SYNFIG_USER_APP_DIR)); +#else return Glib::build_filename(Glib::get_home_dir(),SYNFIG_USER_APP_DIR); +#endif } synfig::String @@ -1371,9 +1380,6 @@ App::set_recent_file_window_size(etl::handle instance) continue; } - CanvasView::Handle canvasview = instance->find_canvas_view(canvas); - canvasview->present(); - if (canvas->is_root()) seen_root = true; else @@ -1399,14 +1405,14 @@ App::set_recent_file_window_size(etl::handle instance) x += atoi(getenv("SYNFIG_WINDOW_POSITION_X_OFFSET")); if(getenv("SYNFIG_WINDOW_POSITION_Y_OFFSET")) y += atoi(getenv("SYNFIG_WINDOW_POSITION_Y_OFFSET")); - canvasview->move(x,y); if (w > SCALE_FACTOR) w = 150; if (w < 0) w = 0; if (h > SCALE_FACTOR) h = 150; if (h < 0) h = 0; - w=w*screen_w/SCALE_FACTOR; - h=h*screen_h/SCALE_FACTOR; - canvasview->set_default_size(w,h); - canvasview->set_size_request(w,h); + + 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->present(); current = separator+1; } @@ -1622,7 +1628,7 @@ App::load_settings() std::string filename=get_config_file("settings"); if(!synfigapp::Main::settings().load_from_file(filename)) { - //std::string filename=Glib::build_filename(Glib::get_home_dir(),".synfigrc"); + //std::string filename=Glib::locale_from_utf8(Glib::build_filename(Glib::get_home_dir(),".synfigrc")); //if(!synfigapp::Main::settings().load_from_file(filename)) { gamma.set_gamma(1.0/2.2); @@ -1961,7 +1967,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_08, "0.61.08", strprintf("0.61.08 (%s)", _("current"))) + .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_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")))); file_type_enum->set_value(RELEASE_VERSION_END-1); // default to the most recent version @@ -2076,24 +2083,75 @@ try_open_url(const std::string &url) { #ifdef WIN32 return ShellExecute(GetDesktopWindow(), "open", url.c_str(), NULL, NULL, SW_SHOW); -#else // WIN32 - gchar* argv[3] = {strdup(App::browser_command.c_str()), strdup(url.c_str()), NULL}; - - GError* gerror = NULL; - gboolean retval; - retval = g_spawn_async(NULL, argv, NULL, G_SPAWN_SEARCH_PATH, NULL, NULL, NULL, &gerror); - free(argv[0]); - free(argv[1]); - - if (!retval) - { - error(_("Could not execute specified web browser: %s"), gerror->message); - g_error_free(gerror); - return false; - } +#else // !WIN32 + std::vector command_line; + std::vector browsers; + browsers.reserve(23); + + // Browser wrapper scripts +#ifdef USE_OPEN_FOR_URLS + browsers.push_back("open"); // Apple MacOS X wrapper, on Linux it opens a virtual console +#endif + browsers.push_back("xdg-open"); // XDG wrapper + browsers.push_back("sensible-browser"); // Debian wrapper + browsers.push_back("gnome-open"); // GNOME wrapper + browsers.push_back("kfmclient"); // KDE wrapper + browsers.push_back("exo-open"); // XFCE wrapper + + // Alternatives system + browsers.push_back("gnome-www-browser"); // Debian GNOME alternative + browsers.push_back("x-www-browser"); // Debian GUI alternative + + // Individual browsers + browsers.push_back("firefox"); + browsers.push_back("epiphany-browser"); + browsers.push_back("epiphany"); + browsers.push_back("konqueror"); + browsers.push_back("iceweasel"); + browsers.push_back("mozilla"); + browsers.push_back("netscape"); + browsers.push_back("icecat"); + browsers.push_back("galeon"); + browsers.push_back("midori"); + browsers.push_back("safari"); + browsers.push_back("opera"); + browsers.push_back("amaya"); + browsers.push_back("netsurf"); + browsers.push_back("dillo"); + + // Try the user-specified browser first + command_line.push_back(App::browser_command); + if( command_line[0] == "kfmclient" ) command_line.push_back("openURL"); + command_line.push_back(url); + + try { Glib::spawn_async(".", command_line, Glib::SPAWN_SEARCH_PATH); return true; } + catch( Glib::SpawnError& exception ){ + + while ( !browsers.empty() ) + { + // Skip the browser if we already tried it + if( browsers[0] == App::browser_command ) + continue; + + // Construct the command line + command_line.clear(); + command_line.push_back(browsers[0]); + if( command_line[0] == "kfmclient" ) command_line.push_back("openURL"); + command_line.push_back(url); + + // Remove the browser from the list + browsers.erase(browsers.begin()); + + // Try to spawn the browser + try { Glib::spawn_async(".", command_line, Glib::SPAWN_SEARCH_PATH); } + // Failed, move on to the next one + catch(Glib::SpawnError& exception){ continue; } + return true; // No exception means we succeeded! + } + } - return true; -#endif // WIN32 + return false; +#endif // !WIN32 } void @@ -2111,7 +2169,13 @@ App::dialog_help() void App::open_url(const std::string &url) { - try_open_url(url); + if(!try_open_url(url)) + { + Gtk::MessageDialog dialog(_("No browser was found. Please load this website manually:"), false, Gtk::MESSAGE_ERROR, Gtk::BUTTONS_CLOSE, true); + dialog.set_secondary_text(url); + dialog.set_title(_("No browser found")); + dialog.run(); + } } bool @@ -2164,7 +2228,10 @@ App::open_as(std::string filename,std::string as) #ifdef WIN32 char long_name[1024]; if(GetLongPathName(as.c_str(),long_name,sizeof(long_name))); - as=long_name; + // when called from autorecover.cpp, filename doesn't exist, and so long_name is empty + // don't use it if that's the case + if (long_name[0] != '\0') + as=long_name; #endif try @@ -2183,7 +2250,8 @@ App::open_as(std::string filename,std::string as) if(!canvas) throw (String)strprintf(_("Unable to open file \"%s\""),filename.c_str()); - add_recent_file(as); + if (as.find(DEFAULT_FILENAME_PREFIX) != 0) + add_recent_file(as); handle instance(Instance::create(canvas));