diff --git a/build-aux/windows/QElectroTech.wxs b/build-aux/windows/QElectroTech.wxs
index 7b0d97a18..00614b98f 100644
--- a/build-aux/windows/QElectroTech.wxs
+++ b/build-aux/windows/QElectroTech.wxs
@@ -97,8 +97,13 @@
+
+ Value=""[INSTALLDIR]bin\qelectrotech.exe" --common-elements-dir="[INSTALLDIR]elements/" --common-tbt-dir="[INSTALLDIR]titleblocks/" --lang-dir="[INSTALLDIR]lang/" $(var.QtPlatformArgs) "%1"" />
diff --git a/cmake/paths_compilation_installation.cmake b/cmake/paths_compilation_installation.cmake
index 33fbc29d5..f8cf763dd 100644
--- a/cmake/paths_compilation_installation.cmake
+++ b/cmake/paths_compilation_installation.cmake
@@ -58,7 +58,10 @@ if(WIN32)
set(QET_BINARY_PATH "./")
set(QET_COMMON_COLLECTION_PATH "elements/")
set(QET_COMMON_TBT_PATH "titleblocks/")
- set(QET_LANG_PATH "l10n/")
+ # "lang/" and not "l10n/": that is where every Windows packaging actually
+ # puts the .qm files (see build-aux/windows/QElectroTech.wxs and the
+ # windows-build workflow), and what the shortcuts pass as --lang-dir.
+ set(QET_LANG_PATH "lang/")
set(QET_LICENSE_PATH "./")
# Liste des ressources Windows
#RC_FILE = qelectrotech.rc
diff --git a/sources/qetapp.cpp b/sources/qetapp.cpp
index adac51c54..191e820fa 100644
--- a/sources/qetapp.cpp
+++ b/sources/qetapp.cpp
@@ -539,6 +539,48 @@ TitleBlockTemplatesCollection *QETApp::titleBlockTemplatesCollection(
return(nullptr);
}
+/**
+ @brief resolveConfiguredDataPath
+ Resolve a data directory baked in at compile time.
+
+ An absolute path is returned unchanged. A relative one used to be
+ interpreted against the process working directory, which is only correct
+ when QET is started from its own installation folder: opening a document
+ from a file manager sets the working directory to the document's folder,
+ so the data was not found there. Resolve it against the executable
+ instead, trying the folder next to the binary and then its parent -- some
+ packagings put the binary in a "bin" subfolder with the data beside it
+ (see issue #86).
+
+ The working-directory interpretation is still attempted first, so any
+ setup that relied on it keeps working.
+
+ \~French Resout un dossier de donnees fixe a la compilation.
+ @param configured : the compile-time path
+ @return an existing directory if one is found, @a configured otherwise
+*/
+static QString resolveConfiguredDataPath(const QString &configured)
+{
+ if (configured.isEmpty() || QDir::isAbsolutePath(configured)) {
+ return(configured);
+ }
+ if (QDir(configured).exists()) {
+ return(configured);
+ }
+
+ const QString bin_dir = QCoreApplication::applicationDirPath();
+ const QStringList candidates = {
+ QDir::cleanPath(bin_dir + "/" + configured) + "/",
+ QDir::cleanPath(bin_dir + "/../" + configured) + "/"
+ };
+ for (const QString &candidate : candidates) {
+ if (QDir(candidate).exists()) {
+ return(candidate);
+ }
+ }
+ return(configured);
+}
+
/**
@brief QETApp::commonElementsDir
@return the dir path of the common elements collection.
@@ -586,7 +628,8 @@ QString QETApp::commonElementsDir()
/* the compilation option represents a classic absolute
* or relative path
*/
- m_common_element_dir = QUOTE(QET_COMMON_COLLECTION_PATH);
+ m_common_element_dir =
+ resolveConfiguredDataPath(QUOTE(QET_COMMON_COLLECTION_PATH));
return m_common_element_dir;
#else
/* the compilation option represents a path
@@ -754,7 +797,7 @@ QString QETApp::commonTitleBlockTemplatesDir()
#ifndef QET_COMMON_COLLECTION_PATH_RELATIVE_TO_BINARY_PATH
// the compile-time option represents a usual path
// (be it absolute or relative)
- return(QUOTE(QET_COMMON_TBT_PATH));
+ return(resolveConfiguredDataPath(QUOTE(QET_COMMON_TBT_PATH)));
#else
/* the compile-time option represents a path relative
* to the directory that contains the executable binary
@@ -1261,7 +1304,7 @@ QString QETApp::languagesPath()
* l'option de compilation represente
* un chemin absolu ou relatif classique
*/
- return(QUOTE(QET_LANG_PATH));
+ return(resolveConfiguredDataPath(QUOTE(QET_LANG_PATH)));
#else
/* the compilation option represents a path relative
* to the folder containing the executable binary