X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Fsupport%2FPackage.cpp;h=1fd47eca6880cdea39b09b6f7926f3ac88e7c415;hb=e2bc7ffae3eb387661064be8b9dc927742f9e7e8;hp=ec08a55b7be91ff6058a6185a83ecea416f662f5;hpb=b4fc66621da456dadd213578f1b078dbc6db6e46;p=lyx.git diff --git a/src/support/Package.cpp b/src/support/Package.cpp index ec08a55b7b..1fd47eca68 100644 --- a/src/support/Package.cpp +++ b/src/support/Package.cpp @@ -21,22 +21,28 @@ #include "support/lassert.h" #include "support/lstrings.h" #include "support/os.h" +#include "support/PathChanger.h" +#include "support/Systemcall.h" #if defined (USE_WINDOWS_PACKAGING) # include "support/os_win32.h" #endif +#include #include #if !defined (USE_WINDOWS_PACKAGING) && \ !defined (USE_MACOSX_PACKAGING) && \ + !defined (USE_HAIKU_PACKAGING) && \ !defined (USE_POSIX_PACKAGING) -#error USE_FOO_PACKAGING must be defined for FOO = WINDOWS, MACOSX or POSIX. +#error USE_FOO_PACKAGING must be defined for FOO = WINDOWS, MACOSX, HAIKU or POSIX. #endif #if defined (USE_MACOSX_PACKAGING) -# include // FSFindFolder, FSRefMakePath +# include "support/qstring_helpers.h" +# include +# include #endif using namespace std; @@ -65,7 +71,7 @@ void init_package(string const & command_line_arg0, Package const & package() { - LASSERT(initialised_, /**/); + LAPPERR(initialised_); return package_; } @@ -117,13 +123,13 @@ Package::Package(string const & command_line_arg0, lyx_dir_ = FileName(lyx_dir_.realPath()); // Is LyX being run in-place from the build tree? - bool in_build_dir = inBuildDir(abs_binary, build_support_dir_, system_support_dir_); + in_build_dir_ = inBuildDir(abs_binary, build_support_dir_, system_support_dir_); - if (!in_build_dir) { + if (!in_build_dir_) { system_support_dir_ = get_system_support_dir(abs_binary, command_line_system_support_dir); - } + } // Find the LyX executable lyx_binary_ = findLyxBinary(abs_binary); @@ -136,10 +142,6 @@ Package::Package(string const & command_line_arg0, explicit_user_support_dir_ = userSupportDir(default_user_support_dir, command_line_user_support_dir, user_support_dir_); - FileName const configure_script(addName(system_support().absFileName(), "configure.py")); - configure_command_ = os::python() + ' ' + - quoteName(configure_script.toFilesystemEncoding(), quote_python) + - with_version_suffix(); LYXERR(Debug::INIT, "\n" << "\tbinary_dir " << binary_dir().absFileName() << '\n' @@ -154,6 +156,31 @@ Package::Package(string const & command_line_arg0, } +int Package::reconfigureUserLyXDir(string const & option) const +{ + if (configure_command_.empty()) { + FileName const configure_script(addName(system_support().absFileName(), "configure.py")); + configure_command_ = os::python() + ' ' + + quoteName(configure_script.toFilesystemEncoding()) + + with_version_suffix() + " --binary-dir=" + + quoteName(FileName(binary_dir().absFileName()).toFilesystemEncoding()); + } + + lyxerr << to_utf8(_("LyX: reconfiguring user directory")) << endl; + PathChanger p(user_support()); + Systemcall one; + int const ret = one.startscript(Systemcall::Wait, configure_command_ + option); + lyxerr << "LyX: " << to_utf8(_("Done!")) << endl; + return ret; +} + + +string Package::getConfigureLockName() const +{ + return addName(user_support().absFileName(), ".lyx_configure_lock"); +} + + void Package::set_temp_dir(FileName const & temp_dir) const { if (temp_dir.empty()) @@ -162,6 +189,20 @@ void Package::set_temp_dir(FileName const & temp_dir) const temp_dir_ = temp_dir; } + +FileName Package::messages_file(string const & c) const +{ + if (in_build_dir_) { + FileName res = FileName(lyx_dir().absFileName() + "/../po/" + c + ".gmo"); + if (!res.isReadableFile()) + res = FileName(top_srcdir().absFileName() + "/po/" + c + ".gmo"); + return res; + } else + return FileName(locale_dir_.absFileName() + "/" + c + + "/LC_MESSAGES/" PACKAGE ".mo"); +} + + // The specification of home_dir_ is fixed for a given OS. // A typical example on Windows: "C:/Documents and Settings/USERNAME" // and on a Posix-like machine: "/home/USERNAME". @@ -169,6 +210,8 @@ FileName const & Package::get_home_dir() { #if defined (USE_WINDOWS_PACKAGING) static FileName const home_dir(getEnv("USERPROFILE")); +#elif defined (USE_MACOSX_PACKAGING) + static FileName const home_dir(fromqstr(QDir::homePath())); #else // Posix-like. static FileName const home_dir(getEnv("HOME")); #endif @@ -259,7 +302,7 @@ bool isBuildDir(FileName const & abs_binary, string const & dir_location, return true; } // cmake file, no Makefile in lib - FileName build_boost_dir = FileName(addPath(search_dir, "boost")); + FileName build_boost_dir = FileName(addPath(search_dir + "/3rdparty", "boost")); if (!fileSearch(build_boost_dir.absFileName(), "cmake_install.cmake").empty()) { return true; } @@ -344,7 +387,14 @@ bool lyxBinaryPath(FileName & lyx_binary, string const & search_dir, string cons FileName findLyxBinary(FileName const & abs_binary) { string ext; - if (!abs_binary.extension().empty()) { + string checkname = abs_binary.toFilesystemEncoding(); + int check_len = checkname.length(); + int prgsuffixlen = string(PROGRAM_SUFFIX).length(); + if ((prgsuffixlen > 0) && (check_len > prgsuffixlen) && + (checkname.substr(check_len-prgsuffixlen) == string(PROGRAM_SUFFIX))) { + ext = ""; + } + else if (!abs_binary.extension().empty()) { ext = "." + abs_binary.extension(); } @@ -370,6 +420,12 @@ FileName const get_document_dir(FileName const & home_dir) (void)home_dir; // Silence warning about unused variable. os::GetFolderPath win32_folder_path; return FileName(win32_folder_path(os::GetFolderPath::PERSONAL)); +#elif defined (USE_MACOSX_PACKAGING) && (QT_VERSION >= 0x050000) + (void)home_dir; // Silence warning about unused variable. + return FileName(fromqstr(QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation))); +#elif defined (USE_MACOSX_PACKAGING) + (void)home_dir; // Silence warning about unused variable. + return FileName(fromqstr(QDesktopServices::storageLocation(QDesktopServices::DocumentsLocation))); #else // Posix-like. return home_dir; #endif @@ -633,25 +689,16 @@ FileName const get_default_user_support_dir(FileName const & home_dir) os::GetFolderPath win32_folder_path; return FileName(addPath(win32_folder_path(os::GetFolderPath::APPDATA), PACKAGE)); -#elif defined (USE_MACOSX_PACKAGING) +#elif defined (USE_MACOSX_PACKAGING) && (QT_VERSION >= 0x050000) (void)home_dir; // Silence warning about unused variable. + return FileName(addPath(fromqstr(QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation)), PACKAGE)); - FSRef fsref; - OSErr const error_code = - FSFindFolder(kUserDomain, kApplicationSupportFolderType, - kDontCreateFolder, &fsref); - if (error_code != 0) - return FileName(); - - // FSRefMakePath returns the result in utf8 - char store[PATH_MAX + 1]; - OSStatus const status_code = - FSRefMakePath(&fsref, - reinterpret_cast(store), PATH_MAX); - if (status_code != 0) - return FileName(); +#elif defined (USE_MACOSX_PACKAGING) + (void)home_dir; // Silence warning about unused variable. + return FileName(addPath(fromqstr(QDesktopServices::storageLocation(QDesktopServices::DataLocation)), PACKAGE)); - return FileName(addPath(reinterpret_cast(store), PACKAGE)); +#elif defined (USE_HAIKU_PACKAGING) + return FileName(addPath(home_dir.absFileName(), string("/config/settings/") + PACKAGE)); #else // USE_POSIX_PACKAGING return FileName(addPath(home_dir.absFileName(), string(".") + PACKAGE));