From d86262162b86f398309d72755e78bb89bd941888 Mon Sep 17 00:00:00 2001 From: Hombre Date: Fri, 9 Mar 2018 00:35:37 +0100 Subject: [PATCH 1/3] Updated settings folder handling when in single user mode (see #4428) --- rtengine/profilestore.cc | 13 +++--- rtgui/options.cc | 87 +++++++++++++++++----------------------- 2 files changed, 44 insertions(+), 56 deletions(-) diff --git a/rtengine/profilestore.cc b/rtengine/profilestore.cc index e79c8e322..ec57fc669 100644 --- a/rtengine/profilestore.cc +++ b/rtengine/profilestore.cc @@ -121,11 +121,14 @@ void ProfileStore::_parseProfiles () Glib::ustring p2 = options.getGlobalProfilePath(); bool displayLevel0 = options.useBundledProfiles && !p1.empty() && !p2.empty() && p1 != p2; - Glib::ustring virtualPath ("${U}"); - Glib::ustring currDir ("${U}"); - parseDir (p1, virtualPath, currDir, 0, 0, displayLevel0); - - if (displayLevel0) { + Glib::ustring virtualPath; + Glib::ustring currDir; + if (!p1.empty()) { + virtualPath = "${U}"; + currDir = "${U}"; + parseDir (p1, virtualPath, currDir, 0, 0, displayLevel0); + } + if (p1.empty() || displayLevel0) { virtualPath = "${G}"; currDir = "${G}"; parseDir (p2, virtualPath, currDir, 0, 0, displayLevel0); diff --git a/rtgui/options.cc b/rtgui/options.cc index 68cd39e6d..5f3c2be82 100644 --- a/rtgui/options.cc +++ b/rtgui/options.cc @@ -107,17 +107,13 @@ void Options::updatePaths() } if (checkDirPath (profilePath, "Error: the specified user's profiles' path doesn't point to a directory or doesn't exist!\n")) { - if (multiUser) { - userProfilePath = profilePath; - tmpPath = Glib::build_filename (argv0, "profiles"); + userProfilePath = profilePath; + tmpPath = Glib::build_filename (argv0, "profiles"); - if (checkDirPath (tmpPath, "Error: the global's profiles' path doesn't point to a directory or doesn't exist!\n")) { - if (userProfilePath != tmpPath) { - globalProfilePath = tmpPath; - } + if (checkDirPath (tmpPath, "Error: the global's profiles' path doesn't point to a directory or doesn't exist!\n")) { + if (userProfilePath != tmpPath) { + globalProfilePath = tmpPath; } - } else { - globalProfilePath = profilePath; } } else { tmpPath = Glib::build_filename (argv0, "profiles"); @@ -128,34 +124,24 @@ void Options::updatePaths() } } else { // relative paths - if (multiUser) { - tmpPath = Glib::build_filename (rtdir, profilePath); + tmpPath = Glib::build_filename (rtdir, profilePath); + + if (!checkDirPath (tmpPath, "")) { + g_mkdir_with_parents (tmpPath.c_str (), 511); if (!checkDirPath (tmpPath, "")) { - g_mkdir_with_parents (tmpPath.c_str (), 511); - - if (!checkDirPath (tmpPath, "")) { - printf ("Error: user's profiles' directory \"%s\" creation failed\n", tmpPath.c_str()); - } + printf ("Error: user's profiles' directory \"%s\" creation failed\n", tmpPath.c_str()); } + } - if (checkDirPath (tmpPath, "Error: the specified user's profiles' path doesn't point to a directory!\n")) { - userProfilePath = tmpPath; - } + if (checkDirPath (tmpPath, "Error: the specified user's profiles' path doesn't point to a directory!\n")) { + userProfilePath = tmpPath; + } - tmpPath = Glib::build_filename (argv0, "profiles"); + tmpPath = Glib::build_filename (argv0, "profiles"); - if (checkDirPath (tmpPath, "Error: the specified user's profiles' path doesn't point to a directory or doesn't exist!\n")) { - globalProfilePath = tmpPath; - } - } else { - // common directory - // directory name set in options is ignored, we use the default directory name - tmpPath = Glib::build_filename (argv0, "profiles"); - - if (checkDirPath (tmpPath, "Error: no global profiles' directory found!\n")) { - globalProfilePath = tmpPath; - } + if (checkDirPath (tmpPath, "Error: the specified user's profiles' path doesn't point to a directory or doesn't exist!\n")) { + globalProfilePath = tmpPath; } } @@ -2133,7 +2119,7 @@ void Options::load (bool lightweight) } // Set the cache folder in RT's base folder - cacheBaseDir = Glib::build_filename (argv0, "cache"); + cacheBaseDir = Glib::build_filename (argv0, "mycache"); // Read the global option file (the one located in the application's base folder) try { @@ -2142,6 +2128,10 @@ void Options::load (bool lightweight) // ignore errors here } + if (!options.multiUser && path == nullptr) { + rtdir = Glib::build_filename (argv0, "mysettings"); + } + // Modify the path of the cache folder to the one provided in RT_CACHE environment variable path = g_getenv ("RT_CACHE"); @@ -2153,7 +2143,7 @@ void Options::load (bool lightweight) throw Error (msg); } } - // No environment variable provided, so falling back to the multi user mode, is enabled + // No environment variable provided, so falling back to the multi user mode, if enabled else if (options.multiUser) { #ifdef WIN32 cacheBaseDir = Glib::build_filename (rtdir, "cache"); @@ -2162,25 +2152,24 @@ void Options::load (bool lightweight) #endif } - // Check if RT is installed in Multi-User mode - if (options.multiUser) { - // Read the user option file (the one located somewhere in the user's home folder) - // Those values supersets those of the global option file - try { - options.readFromFile (Glib::build_filename (rtdir, "options")); - } catch (Options::Error &) { - // If the local option file does not exist or is broken, and the local cache folder does not exist, recreate it - if (!g_mkdir_with_parents (rtdir.c_str (), 511)) { - // Save the option file - options.saveToFile (Glib::build_filename (rtdir, "options")); - } + // Read the user option file (the one located somewhere in the user's home folder) + // Those values supersets those of the global option file + try { + options.readFromFile (Glib::build_filename (rtdir, "options")); + } catch (Options::Error &) { + // If the local option file does not exist or is broken, and the local cache folder does not exist, recreate it + if (!g_mkdir_with_parents (rtdir.c_str (), 511)) { + // Save the option file + options.saveToFile (Glib::build_filename (rtdir, "options")); } + } #ifdef __APPLE__ + if (options.multiUser) { // make sure .local/share exists on OS X so we don't get problems with recently-used.xbel g_mkdir_with_parents (g_get_user_data_dir(), 511); -#endif } +#endif if (options.rtSettings.verbose) { printf ("Cache directory (cacheBaseDir) = %s\n", cacheBaseDir.c_str()); @@ -2275,11 +2264,7 @@ void Options::load (bool lightweight) void Options::save () { - if (!options.multiUser) { - options.saveToFile (Glib::build_filename (argv0, "options")); - } else { - options.saveToFile (Glib::build_filename (rtdir, "options")); - } + options.saveToFile (Glib::build_filename (rtdir, "options")); } /* From 185f072481d1fb4e8f30b2cf5e6fbc7fd0f126a0 Mon Sep 17 00:00:00 2001 From: Morgan Hardwood Date: Fri, 9 Mar 2018 11:32:47 +0100 Subject: [PATCH 2/3] Error strings revised, #4428 --- rtgui/options.cc | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/rtgui/options.cc b/rtgui/options.cc index 5f3c2be82..0cc20e68a 100644 --- a/rtgui/options.cc +++ b/rtgui/options.cc @@ -102,15 +102,15 @@ void Options::updatePaths() g_mkdir_with_parents (profilePath.c_str (), 511); if (!checkDirPath (profilePath, "")) { // had problems with mkdir_with_parents return value on OS X, just check dir again - printf ("Error: user's profiles' directory \"%s\" creation failed\n", profilePath.c_str()); + printf ("Error: creation of the user's processing profile directory \"%s\" failed!\n", profilePath.c_str()); } } - if (checkDirPath (profilePath, "Error: the specified user's profiles' path doesn't point to a directory or doesn't exist!\n")) { + if (checkDirPath (profilePath, "Error: the user's processing profile path doesn't point to a directory or doesn't exist!\n")) { userProfilePath = profilePath; tmpPath = Glib::build_filename (argv0, "profiles"); - if (checkDirPath (tmpPath, "Error: the global's profiles' path doesn't point to a directory or doesn't exist!\n")) { + if (checkDirPath (tmpPath, "Error: the global's processing profile path doesn't point to a directory or doesn't exist!\n")) { if (userProfilePath != tmpPath) { globalProfilePath = tmpPath; } @@ -118,7 +118,7 @@ void Options::updatePaths() } else { tmpPath = Glib::build_filename (argv0, "profiles"); - if (checkDirPath (tmpPath, "Error: the global's profiles' path doesn't point to a directory or doesn't exist!\n")) { + if (checkDirPath (tmpPath, "Error: the global's processing profile path doesn't point to a directory or doesn't exist!\n")) { globalProfilePath = tmpPath; } } @@ -130,17 +130,17 @@ void Options::updatePaths() g_mkdir_with_parents (tmpPath.c_str (), 511); if (!checkDirPath (tmpPath, "")) { - printf ("Error: user's profiles' directory \"%s\" creation failed\n", tmpPath.c_str()); + printf ("Error: creation of the user's processing profile directory \"%s\" failed!\n", tmpPath.c_str()); } } - if (checkDirPath (tmpPath, "Error: the specified user's profiles' path doesn't point to a directory!\n")) { + if (checkDirPath (tmpPath, "Error: the user's processing profile path doesn't point to a directory!\n")) { userProfilePath = tmpPath; } tmpPath = Glib::build_filename (argv0, "profiles"); - if (checkDirPath (tmpPath, "Error: the specified user's profiles' path doesn't point to a directory or doesn't exist!\n")) { + if (checkDirPath (tmpPath, "Error: the user's processing profile path doesn't point to a directory or doesn't exist!\n")) { globalProfilePath = tmpPath; } } From 01f8f4123ad4402a0b4945ea3e528fb7ce36c7ea Mon Sep 17 00:00:00 2001 From: Hombre Date: Fri, 9 Mar 2018 22:08:29 +0100 Subject: [PATCH 3/3] An alert window is opened on event catching from Options::load (#4428) --- rtgui/main.cc | 13 ++++++------- rtgui/options.cc | 6 ++++-- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/rtgui/main.cc b/rtgui/main.cc index 2ae442e5a..55d27125c 100644 --- a/rtgui/main.cc +++ b/rtgui/main.cc @@ -628,20 +628,19 @@ int main (int argc, char **argv) int ret = 0; + Glib::ustring fatalError; + try { Options::load(); } catch (Options::Error &e) { - std::cout << "ERROR: " << e.get_msg() << std::endl; - std::cerr << "Fatal error!" << std::endl; - std::cerr << "The RT_SETTINGS and/or RT_PATH environment variables are set, but use a relative path. The path must be absolute!" << std::endl; - return -2; + fatalError = e.get_msg(); } gdk_threads_set_lock_functions (G_CALLBACK (myGdkLockEnter), (G_CALLBACK (myGdkLockLeave))); gdk_threads_init(); gtk_init (&argc, &argv); // use the "--g-fatal-warnings" command line flag to make warnings fatal - if (remote) { + if (fatalError.empty() && remote) { char *app_argv[2] = { const_cast (argv0.c_str()) }; int app_argc = 1; @@ -653,7 +652,7 @@ int main (int argc, char **argv) RTApplication app; ret = app.run (app_argc, app_argv); } else { - if (init_rt()) { + if (fatalError.empty() && init_rt()) { Gtk::Main m (&argc, &argv); gdk_threads_enter(); const std::unique_ptr rtWindow (create_rt_window()); @@ -679,7 +678,7 @@ int main (int argc, char **argv) cleanup_rt(); } else { Gtk::Main m (&argc, &argv); - Gtk::MessageDialog msgd ("Fatal error!\nThe RT_SETTINGS and/or RT_PATH environment variables are set, but use a relative path. The path must be absolute!", true, Gtk::MESSAGE_ERROR, Gtk::BUTTONS_OK, true); + Gtk::MessageDialog msgd (Glib::ustring::compose("FATAL ERROR!\n\n%1", fatalError), true, Gtk::MESSAGE_ERROR, Gtk::BUTTONS_OK, true); msgd.run (); ret = -2; } diff --git a/rtgui/options.cc b/rtgui/options.cc index 0cc20e68a..d5e422159 100644 --- a/rtgui/options.cc +++ b/rtgui/options.cc @@ -102,7 +102,8 @@ void Options::updatePaths() g_mkdir_with_parents (profilePath.c_str (), 511); if (!checkDirPath (profilePath, "")) { // had problems with mkdir_with_parents return value on OS X, just check dir again - printf ("Error: creation of the user's processing profile directory \"%s\" failed!\n", profilePath.c_str()); + Glib::ustring msg = Glib::ustring::compose ("Creation of the user's processing profile directory \"%1\" failed!\n", profilePath); + throw Error (msg); } } @@ -130,7 +131,8 @@ void Options::updatePaths() g_mkdir_with_parents (tmpPath.c_str (), 511); if (!checkDirPath (tmpPath, "")) { - printf ("Error: creation of the user's processing profile directory \"%s\" failed!\n", tmpPath.c_str()); + Glib::ustring msg = Glib::ustring::compose ("Creation of the user's processing profile directory \"%1\" failed!\n", tmpPath.c_str()); + throw Error (msg); } }