summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorStanislaw Halik <sthalik@misaki.pl>2021-08-21 14:15:43 +0200
committerStanislaw Halik <sthalik@misaki.pl>2021-08-21 14:15:43 +0200
commitdae6a98f826f78bda7511ba6de4c8b813353501e (patch)
tree7c531774f9d4b5865393190e8ae1527b86e63bd6
parentb615cc6d60beede9cb76b143007a7a1720846c5c (diff)
proto/freetrack: implement more dll location controls
-rw-r--r--proto-ft/ftnoir_ftcontrols.ui183
-rw-r--r--proto-ft/ftnoir_protocol_ft.cpp73
-rw-r--r--proto-ft/ftnoir_protocol_ft.h16
-rw-r--r--proto-ft/ftnoir_protocol_ft_dialog.cpp26
-rw-r--r--proto-ft/lang/nl_NL.ts36
-rw-r--r--proto-ft/lang/ru_RU.ts36
-rw-r--r--proto-ft/lang/stub.ts36
-rw-r--r--proto-ft/lang/zh_CN.ts36
8 files changed, 333 insertions, 109 deletions
diff --git a/proto-ft/ftnoir_ftcontrols.ui b/proto-ft/ftnoir_ftcontrols.ui
index 0d142d09..90c9db46 100644
--- a/proto-ft/ftnoir_ftcontrols.ui
+++ b/proto-ft/ftnoir_ftcontrols.ui
@@ -12,22 +12,10 @@
<rect>
<x>0</x>
<y>0</y>
- <width>508</width>
- <height>232</height>
+ <width>533</width>
+ <height>326</height>
</rect>
</property>
- <property name="sizePolicy">
- <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="minimumSize">
- <size>
- <width>0</width>
- <height>0</height>
- </size>
- </property>
<property name="windowTitle">
<string>freetrack protocol settings</string>
</property>
@@ -42,6 +30,13 @@
<bool>false</bool>
</property>
<layout class="QGridLayout" name="gridLayout_2">
+ <item row="5" column="0">
+ <widget class="QDialogButtonBox" name="buttonBox">
+ <property name="standardButtons">
+ <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
+ </property>
+ </widget>
+ </item>
<item row="0" column="0">
<widget class="QGroupBox" name="groupBox_3">
<property name="sizePolicy">
@@ -95,64 +90,138 @@
</layout>
</widget>
</item>
- <item row="1" column="0">
+ <item row="1" column="0" rowspan="2">
<widget class="QGroupBox" name="groupBox_4">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
<property name="title">
- <string>Repair NPClient location</string>
+ <string>Library location</string>
</property>
<property name="alignment">
<set>Qt::AlignJustify|Qt::AlignTop</set>
</property>
- <property name="flat">
- <bool>false</bool>
- </property>
- <layout class="QHBoxLayout" name="horizontalLayout_2">
- <property name="spacing">
- <number>9</number>
- </property>
- <item>
- <widget class="QPushButton" name="bntLocateNPClient">
- <property name="text">
- <string>Locate DLL</string>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QLabel" name="label_10">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Preferred" vsizetype="Minimum">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="text">
- <string>Replace the registry entry if you want to use other software with the NPClient protocol and it doesn't work automatically.
+ <layout class="QGridLayout" name="gridLayout">
+ <item row="0" column="0">
+ <widget class="QWidget" name="widget" native="true">
+ <layout class="QHBoxLayout" name="horizontalLayout">
+ <property name="topMargin">
+ <number>0</number>
+ </property>
+ <property name="bottomMargin">
+ <number>0</number>
+ </property>
+ <item>
+ <widget class="QPushButton" name="bntLocateNPClient">
+ <property name="text">
+ <string>Locate DLL</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLabel" name="label_10">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Preferred" vsizetype="Maximum">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Replace the registry entry if you want to use other software with the NPClient protocol and it doesn't work automatically.
Starting tracking will again overwrite the DLL locations.</string>
- </property>
- <property name="wordWrap">
- <bool>true</bool>
- </property>
+ </property>
+ <property name="wordWrap">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item row="1" column="0">
+ <widget class="QWidget" name="widget" native="true">
+ <layout class="QHBoxLayout" name="horizontalLayout_2">
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <property name="topMargin">
+ <number>0</number>
+ </property>
+ <property name="bottomMargin">
+ <number>0</number>
+ </property>
+ <item>
+ <widget class="QCheckBox" name="enable_custom_location">
+ <property name="toolTip">
+ <string>Useful for titles like Elite: Dangerous that require the library to reside in a specified location. Use this to avoid relocating your opentrack installation.</string>
+ </property>
+ <property name="text">
+ <string>Custom location</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLineEdit" name="custom_location">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Expanding" vsizetype="Maximum">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="set_custom_location">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Maximum" vsizetype="Maximum">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Browse...</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item row="2" column="0">
+ <widget class="QWidget" name="widget_2" native="true">
+ <layout class="QHBoxLayout" name="horizontalLayout_4">
+ <property name="spacing">
+ <number>0</number>
+ </property>
+ <property name="topMargin">
+ <number>0</number>
+ </property>
+ <property name="bottomMargin">
+ <number>0</number>
+ </property>
+ <item>
+ <widget class="QCheckBox" name="ephemeral_registry_entry">
+ <property name="toolTip">
+ <string>This is useful when you're only evaluating opentrack, and haven't yet decided to use it all the time.</string>
+ </property>
+ <property name="text">
+ <string>Clear location when tracking is stopped</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
</widget>
</item>
</layout>
</widget>
</item>
- <item row="2" column="0">
- <widget class="QDialogButtonBox" name="buttonBox">
- <property name="standardButtons">
- <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
- </property>
- </widget>
- </item>
</layout>
</widget>
+ <tabstops>
+ <tabstop>cbxSelectInterface</tabstop>
+ <tabstop>bntLocateNPClient</tabstop>
+ <tabstop>enable_custom_location</tabstop>
+ <tabstop>custom_location</tabstop>
+ <tabstop>set_custom_location</tabstop>
+ <tabstop>ephemeral_registry_entry</tabstop>
+ </tabstops>
<resources>
<include location="ft-protocol.qrc"/>
<include location="ft-protocol.qrc"/>
diff --git a/proto-ft/ftnoir_protocol_ft.cpp b/proto-ft/ftnoir_protocol_ft.cpp
index c6259593..9613f4a8 100644
--- a/proto-ft/ftnoir_protocol_ft.cpp
+++ b/proto-ft/ftnoir_protocol_ft.cpp
@@ -10,6 +10,7 @@
#include "ftnoir_protocol_ft.h"
#include "csv/csv.h"
+#include <QDir>
#include <cstddef>
#include <cmath>
@@ -17,7 +18,15 @@
freetrack::~freetrack()
{
- dummyTrackIR.close();
+ //dummyTrackIR.kill(); dummyTrackIR.waitForFinished();
+ if (s.ephemeral_library_location)
+ {
+ QSettings settings_ft("Freetrack", "FreetrackClient");
+ QSettings settings_npclient("NaturalPoint", "NATURALPOINT\\NPClient Location");
+
+ settings_ft.setValue("Path", "");
+ settings_npclient.setValue("Path", "");
+ }
}
static_assert(sizeof(LONG) == sizeof(std::int32_t));
@@ -133,7 +142,7 @@ void freetrack::start_dummy() {
dummyTrackIR.start();
}
-void freetrack::set_protocols(bool ft, bool npclient)
+module_status freetrack::set_protocols()
{
static const QString program_dir = OPENTRACK_BASE_PATH + OPENTRACK_LIBRARY_PATH;
@@ -141,15 +150,39 @@ void freetrack::set_protocols(bool ft, bool npclient)
QSettings settings_ft("Freetrack", "FreetrackClient");
QSettings settings_npclient("NaturalPoint", "NATURALPOINT\\NPClient Location");
- if (ft)
- settings_ft.setValue("Path", program_dir);
- else
- settings_ft.setValue("Path", "");
+ QString location = *s.custom_location_pathname;
+ const auto selection = *s.used_interface;
+
+ bool use_freetrack = ~selection & settings::enable_freetrack,
+ use_npclient = ~selection & settings::enable_npclient;
- if (npclient)
- settings_npclient.setValue("Path", program_dir);
+ if (!s.use_custom_location || s.custom_location_pathname->isEmpty() || !QDir{s.custom_location_pathname}.exists())
+ location = program_dir;
else
- settings_npclient.setValue("Path", "");
+ {
+ bool copy = true;
+
+ if (use_npclient && !QFile{location + "/NPClient.dll"}.exists())
+ copy &= QFile::copy(program_dir + "/NPClient.dll", location + "/NPClient.dll");
+ if (use_npclient && !QFile{location + "/NPClient64.dll"}.exists())
+ copy &= QFile::copy(program_dir + "/NPClient64.dll", location + "/NPClient64.dll");
+ if (use_freetrack && !QFile{location + "/freetrackclient.dll"}.exists())
+ copy &= QFile::copy(program_dir + "/freetrackclient.dll", location + "/freetrackclient.dll");
+ if (use_freetrack && !QFile{location + "/freetrackclient64.dll"}.exists())
+ copy &= QFile::copy(program_dir + "/freetrackclient64.dll", location + "/freetrackclient64.dll");
+
+ if (!copy)
+ return {tr("Can't copy library to selected custom location '%1'").arg(s.custom_location_pathname)};
+ }
+
+ if (!location.endsWith('/'))
+ location += '/';
+ location.replace('\\', '/');
+
+ settings_ft.setValue("Path", use_freetrack ? location : "");
+ settings_npclient.setValue("Path", use_npclient ? location : "");
+
+ return {};
}
module_status freetrack::initialize()
@@ -157,24 +190,8 @@ module_status freetrack::initialize()
if (!shm.success())
return error(tr("Can't load freetrack memory mapping"));
- bool use_ft = false, use_npclient = false;
-
- switch (s.intUsedInterface) {
- case 0:
- use_ft = true;
- use_npclient = true;
- break;
- case 1:
- use_ft = true;
- break;
- case 2:
- use_npclient = true;
- break;
- default:
- break;
- }
-
- set_protocols(use_ft, use_npclient);
+ if (auto ret = set_protocols(); !ret.is_ok())
+ return ret;
pMemData->data.DataID = 1;
pMemData->data.CamWidth = 100;
@@ -195,7 +212,7 @@ module_status freetrack::initialize()
store(pMemData->table_ints[k], 0);
// more games need the dummy executable than previously thought
- if (use_npclient)
+ if (~s.used_interface & settings::enable_npclient)
start_dummy();
return status_ok();
diff --git a/proto-ft/ftnoir_protocol_ft.h b/proto-ft/ftnoir_protocol_ft.h
index a59796dd..4b7ab89e 100644
--- a/proto-ft/ftnoir_protocol_ft.h
+++ b/proto-ft/ftnoir_protocol_ft.h
@@ -27,11 +27,12 @@
using namespace options;
struct settings : opts {
- value<int> intUsedInterface;
- settings() :
- opts("proto-freetrack"),
- intUsedInterface(b, "used-interfaces", 0)
- {}
+ enum enable_status { enable_both, enable_freetrack, enable_npclient, };
+ value<int> used_interface{b, "used-interfaces", (int)enable_both};
+ value<bool> ephemeral_library_location{b, "ephemeral-library-location", false};
+ value<bool> use_custom_location{b, "use-custom-location", false};
+ value<QString> custom_location_pathname{b, "custom-library-location", {}};
+ settings() : opts("proto-freetrack") {}
};
class freetrack : TR, public IProtocol
@@ -58,7 +59,9 @@ private:
void start_dummy();
public:
- static void set_protocols(bool ft, bool npclient);
+ enum class status { starting, stopping };
+ [[nodiscard]] module_status set_protocols();
+ void clear_protocols();
};
class FTControls: public IProtocolDialog
@@ -75,6 +78,7 @@ private slots:
void selectDLL();
void doOK();
void doCancel();
+ void set_custom_location();
};
class freetrackDll : public Metadata
diff --git a/proto-ft/ftnoir_protocol_ft_dialog.cpp b/proto-ft/ftnoir_protocol_ft_dialog.cpp
index 58077b87..9686ee92 100644
--- a/proto-ft/ftnoir_protocol_ft_dialog.cpp
+++ b/proto-ft/ftnoir_protocol_ft_dialog.cpp
@@ -22,7 +22,17 @@ FTControls::FTControls()
connect(ui.buttonBox, SIGNAL(rejected()), this, SLOT(doCancel()));
connect(ui.bntLocateNPClient, SIGNAL(clicked()), this, SLOT(selectDLL()));
- tie_setting(s.intUsedInterface, ui.cbxSelectInterface);
+ const settings::enable_status cbx[] = {
+ settings::enable_both,
+ settings::enable_freetrack,
+ settings::enable_npclient,
+ };
+ tie_setting(s.used_interface, ui.cbxSelectInterface);
+ tie_setting(s.ephemeral_library_location, ui.ephemeral_registry_entry);
+ tie_setting(s.custom_location_pathname, ui.custom_location);
+ tie_setting(s.use_custom_location, ui.enable_custom_location);
+
+ connect(ui.set_custom_location, &QAbstractButton::clicked, this, &FTControls::set_custom_location);
}
void FTControls::doOK()
@@ -50,4 +60,16 @@ void FTControls::selectDLL()
node.setValue("Path", dllname.dir().path());
}
}
-
+void FTControls::set_custom_location()
+{
+ static const auto program_directory = OPENTRACK_BASE_PATH + OPENTRACK_LIBRARY_PATH;
+ auto previous_location = *s.custom_location_pathname;
+ if (!s.use_custom_location || previous_location.isEmpty() || !QDir{previous_location}.exists())
+ previous_location = program_directory;
+ auto dir = QFileDialog::getExistingDirectory(this, tr("Select library location"), previous_location);
+ if (dir.isEmpty() || !QDir{dir}.exists())
+ dir = QString{};
+ else
+ ui.enable_custom_location->setEnabled(true);
+ ui.custom_location->setText(dir);
+}
diff --git a/proto-ft/lang/nl_NL.ts b/proto-ft/lang/nl_NL.ts
index ec4f58da..f8408198 100644
--- a/proto-ft/lang/nl_NL.ts
+++ b/proto-ft/lang/nl_NL.ts
@@ -11,6 +11,10 @@
<source>Dll file (*.dll);;All Files (*)</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Select library location</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UICFTControls</name>
@@ -27,10 +31,6 @@
<translation type="unfinished"></translation>
</message>
<message>
- <source>Repair NPClient location</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>Locate DLL</source>
<translation type="unfinished"></translation>
</message>
@@ -52,6 +52,30 @@ Starting tracking will again overwrite the DLL locations.</source>
<source>Use TrackIR, disable freetrack</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Library location</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Custom location</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Browse...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>This is useful when you&apos;re only evaluating opentrack, and haven&apos;t yet decided to use it all the time.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Clear location when tracking is stopped</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Useful for titles like Elite: Dangerous that require the library to reside in a specified location. Use this to avoid relocating your opentrack installation.</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>freetrack</name>
@@ -63,6 +87,10 @@ Starting tracking will again overwrite the DLL locations.</source>
<source>Can&apos;t load freetrack memory mapping</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Can&apos;t copy library to selected custom location &apos;%1&apos;</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>freetrackDll</name>
diff --git a/proto-ft/lang/ru_RU.ts b/proto-ft/lang/ru_RU.ts
index c793ae6b..c934e0f7 100644
--- a/proto-ft/lang/ru_RU.ts
+++ b/proto-ft/lang/ru_RU.ts
@@ -11,6 +11,10 @@
<source>Dll file (*.dll);;All Files (*)</source>
<translation></translation>
</message>
+ <message>
+ <source>Select library location</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UICFTControls</name>
@@ -27,10 +31,6 @@
<translation>Отключите один из протоколов в случае, если при включении обоих интерфейсов игра не корректно определяет их.</translation>
</message>
<message>
- <source>Repair NPClient location</source>
- <translation>Решение проблем с расположением NPClient&apos;а </translation>
- </message>
- <message>
<source>Locate DLL</source>
<translation>Укажите DLL</translation>
</message>
@@ -54,6 +54,30 @@ Starting tracking will again overwrite the DLL locations.</source>
<source>Use TrackIR, disable freetrack</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Library location</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Custom location</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Browse...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>This is useful when you&apos;re only evaluating opentrack, and haven&apos;t yet decided to use it all the time.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Clear location when tracking is stopped</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Useful for titles like Elite: Dangerous that require the library to reside in a specified location. Use this to avoid relocating your opentrack installation.</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>freetrack</name>
@@ -65,6 +89,10 @@ Starting tracking will again overwrite the DLL locations.</source>
<source>Can&apos;t load freetrack memory mapping</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Can&apos;t copy library to selected custom location &apos;%1&apos;</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>freetrackDll</name>
diff --git a/proto-ft/lang/stub.ts b/proto-ft/lang/stub.ts
index 635844a5..e15244b9 100644
--- a/proto-ft/lang/stub.ts
+++ b/proto-ft/lang/stub.ts
@@ -11,6 +11,10 @@
<source>Dll file (*.dll);;All Files (*)</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Select library location</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UICFTControls</name>
@@ -27,10 +31,6 @@
<translation type="unfinished"></translation>
</message>
<message>
- <source>Repair NPClient location</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>Locate DLL</source>
<translation type="unfinished"></translation>
</message>
@@ -52,6 +52,30 @@ Starting tracking will again overwrite the DLL locations.</source>
<source>Use TrackIR, disable freetrack</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Library location</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Custom location</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Browse...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>This is useful when you&apos;re only evaluating opentrack, and haven&apos;t yet decided to use it all the time.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Clear location when tracking is stopped</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Useful for titles like Elite: Dangerous that require the library to reside in a specified location. Use this to avoid relocating your opentrack installation.</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>freetrack</name>
@@ -63,6 +87,10 @@ Starting tracking will again overwrite the DLL locations.</source>
<source>Can&apos;t load freetrack memory mapping</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Can&apos;t copy library to selected custom location &apos;%1&apos;</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>freetrackDll</name>
diff --git a/proto-ft/lang/zh_CN.ts b/proto-ft/lang/zh_CN.ts
index 442a1aa1..2425f48b 100644
--- a/proto-ft/lang/zh_CN.ts
+++ b/proto-ft/lang/zh_CN.ts
@@ -11,6 +11,10 @@
<source>Dll file (*.dll);;All Files (*)</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Select library location</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UICFTControls</name>
@@ -19,10 +23,6 @@
<translation type="unfinished"></translation>
</message>
<message>
- <source>Repair NPClient location</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>Locate DLL</source>
<translation type="unfinished"></translation>
</message>
@@ -52,6 +52,30 @@ Starting tracking will again overwrite the DLL locations.</source>
<source>Use TrackIR, disable freetrack</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Library location</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Custom location</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Browse...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>This is useful when you&apos;re only evaluating opentrack, and haven&apos;t yet decided to use it all the time.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Clear location when tracking is stopped</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Useful for titles like Elite: Dangerous that require the library to reside in a specified location. Use this to avoid relocating your opentrack installation.</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>freetrack</name>
@@ -63,6 +87,10 @@ Starting tracking will again overwrite the DLL locations.</source>
<source>Can&apos;t load freetrack memory mapping</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Can&apos;t copy library to selected custom location &apos;%1&apos;</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>freetrackDll</name>