summaryrefslogtreecommitdiffhomepage
path: root/opentrack
diff options
context:
space:
mode:
Diffstat (limited to 'opentrack')
-rw-r--r--opentrack/CMakeLists.txt10
-rw-r--r--opentrack/dtors.cpp1
-rw-r--r--opentrack/export.hpp18
-rw-r--r--opentrack/import.hpp13
-rw-r--r--opentrack/keybinding-worker.cpp194
-rw-r--r--opentrack/keybinding-worker.hpp82
-rw-r--r--opentrack/main-settings.hpp87
-rw-r--r--opentrack/mappings.hpp89
-rw-r--r--opentrack/nan.cpp16
-rw-r--r--opentrack/plugin-api.hpp22
-rw-r--r--opentrack/selected-libraries.cpp37
-rw-r--r--opentrack/selected-libraries.hpp29
-rw-r--r--opentrack/shortcuts.cpp130
-rw-r--r--opentrack/shortcuts.h69
-rw-r--r--opentrack/simple-mat.hpp6
-rw-r--r--opentrack/state.hpp29
-rw-r--r--opentrack/tracker.cpp305
-rw-r--r--opentrack/tracker.h87
-rw-r--r--opentrack/win32-joystick.cpp297
-rw-r--r--opentrack/win32-joystick.hpp100
-rw-r--r--opentrack/win32-shortcuts.cpp197
-rw-r--r--opentrack/win32-shortcuts.h28
-rw-r--r--opentrack/work.hpp63
23 files changed, 45 insertions, 1864 deletions
diff --git a/opentrack/CMakeLists.txt b/opentrack/CMakeLists.txt
index dd90bda6..6dc6a96d 100644
--- a/opentrack/CMakeLists.txt
+++ b/opentrack/CMakeLists.txt
@@ -1,10 +1,2 @@
opentrack_boilerplate(opentrack-api NO-COMPAT)
-target_link_libraries(opentrack-api opentrack-spline-widget opentrack-compat)
-if(NOT WIN32)
- target_link_libraries(opentrack-api opentrack-qxt-mini)
-else()
- target_link_libraries(opentrack-api winmm)
-endif()
-if(CMAKE_COMPILER_IS_GNUCXX)
- set_source_files_properties(nan.cpp PROPERTIES COMPILE_FLAGS "-fno-fast-math -fno-finite-math-only -fno-fast-math -O2")
-endif()
+target_link_libraries(opentrack-api opentrack-compat)
diff --git a/opentrack/dtors.cpp b/opentrack/dtors.cpp
index 578d067a..5cc87187 100644
--- a/opentrack/dtors.cpp
+++ b/opentrack/dtors.cpp
@@ -1,5 +1,4 @@
#include "plugin-api.hpp"
-#include "main-settings.hpp"
// these exist only so that vtable is emitted in a single compilation unit, not all of them.
diff --git a/opentrack/export.hpp b/opentrack/export.hpp
new file mode 100644
index 00000000..2dab8bef
--- /dev/null
+++ b/opentrack/export.hpp
@@ -0,0 +1,18 @@
+#pragma once
+
+#ifdef BUILD_api
+# ifdef _WIN32
+# define OPENTRACK_API_LINKAGE __declspec(dllexport)
+# else
+# define OPENTRACK_API_LINKAGE
+# endif
+
+# ifndef _MSC_VER
+# define OPENTRACK_API_EXPORT __attribute__ ((visibility ("default"))) OPENTRACK_API_LINKAGE
+# else
+# define OPENTRACK_API_EXPORT OPENTRACK_LINKAGE
+# endif
+
+#else
+# include "import.hpp"
+#endif
diff --git a/opentrack/import.hpp b/opentrack/import.hpp
new file mode 100644
index 00000000..7448416a
--- /dev/null
+++ b/opentrack/import.hpp
@@ -0,0 +1,13 @@
+#pragma once
+
+#ifdef _WIN32
+# define OPENTRACK_API_LINKAGE __declspec(dllimport)
+#else
+# define OPENTRACK_API_LINKAGE
+#endif
+
+#ifndef _MSC_VER
+# define OPENTRACK_API_EXPORT __attribute__ ((visibility ("default"))) OPENTRACK_API_LINKAGE
+#else
+# define OPENTRACK_API_EXPORT OPENTRACK_API_LINKAGE
+#endif
diff --git a/opentrack/keybinding-worker.cpp b/opentrack/keybinding-worker.cpp
deleted file mode 100644
index a0c7178c..00000000
--- a/opentrack/keybinding-worker.cpp
+++ /dev/null
@@ -1,194 +0,0 @@
-/* Copyright (c) 2014-2015, Stanislaw Halik <sthalik@misaki.pl>
-
- * Permission to use, copy, modify, and/or distribute this
- * software for any purpose with or without fee is hereby granted,
- * provided that the above copyright notice and this permission
- * notice appear in all copies.
- */
-
-#ifdef _WIN32
-
-#include "keybinding-worker.hpp"
-#include <functional>
-#include <windows.h>
-#include <QDebug>
-#include <QMutexLocker>
-
-bool Key::should_process()
-{
- if (!enabled || (keycode == 0 && guid == ""))
- return false;
- bool ret = timer.elapsed_ms() > 100;
- timer.start();
- return ret;
-}
-
-KeybindingWorker::~KeybindingWorker() {
- should_quit = true;
- wait();
- if (dinkeyboard) {
- dinkeyboard->Unacquire();
- dinkeyboard->Release();
- }
- if (din)
- din->Release();
-}
-
-KeybindingWorker::KeybindingWorker() :
- should_quit(true)
-{
- if (DirectInput8Create(GetModuleHandle(NULL), DIRECTINPUT_VERSION, IID_IDirectInput8, (void**)&din, NULL) != DI_OK) {
- qDebug() << "setup DirectInput8 Creation failed!" << GetLastError();
- return;
- }
- if (din->CreateDevice(GUID_SysKeyboard, &dinkeyboard, NULL) != DI_OK) {
- din->Release();
- din = 0;
- qDebug() << "setup CreateDevice function failed!" << GetLastError();
- return;
- }
- if (dinkeyboard->SetDataFormat(&c_dfDIKeyboard) != DI_OK) {
- qDebug() << "setup SetDataFormat function failed!" << GetLastError();
- dinkeyboard->Release();
- dinkeyboard = 0;
- din->Release();
- din = 0;
- return;
- }
-
- if (dinkeyboard->SetCooperativeLevel((HWND) fake_main_window.winId(), DISCL_NONEXCLUSIVE | DISCL_BACKGROUND) != DI_OK) {
- dinkeyboard->Release();
- din->Release();
- din = 0;
- dinkeyboard = 0;
- qDebug() << "setup SetCooperativeLevel function failed!" << GetLastError();
- return;
- }
- if (dinkeyboard->Acquire() != DI_OK)
- {
- dinkeyboard->Release();
- din->Release();
- din = 0;
- dinkeyboard = 0;
- qDebug() << "setup dinkeyboard Acquire failed!" << GetLastError();
- return;
- }
- should_quit = false;
- start();
-}
-
-KeybindingWorker& KeybindingWorker::make()
-{
- static KeybindingWorker k;
- return k;
-}
-
-void KeybindingWorker::run() {
- BYTE keystate[256] = {0};
- BYTE old_keystate[256] = {0};
-
- while (!should_quit)
- {
- {
- QMutexLocker l(&mtx);
-
- if (receivers.size())
- {
- {
- const HRESULT hr = dinkeyboard->GetDeviceState(256, (LPVOID)keystate);
-
- if (hr != DI_OK) {
- qDebug() << "Tracker::run GetDeviceState function failed!" << GetLastError();
- Sleep(25);
- continue;
- }
- }
-
- {
- using joy_fn = std::function<void(const QString& guid, int idx, bool held)>;
-
- joy_fn f = [&](const QString& guid, int idx, bool held) -> void {
- Key k;
- k.keycode = idx;
- k.shift = !!(keystate[DIK_LSHIFT] & 0x80 || keystate[DIK_RSHIFT] & 0x80);
- k.alt = !!(keystate[DIK_LALT] & 0x80 || keystate[DIK_RALT] & 0x80);
- k.ctrl = !!(keystate[DIK_LCONTROL] & 0x80 || keystate[DIK_RCONTROL] & 0x80);
- k.guid = guid;
- k.held = held;
-
- for (auto& r : receivers)
- r->operator()(k);
- };
-
- joy_ctx.poll(f);
- }
-
- for (int i = 0; i < 256; i++)
- {
- Key k;
- if (old_keystate[i] != keystate[i])
- {
- const bool held = keystate[i] & 0x80;
- switch (i)
- {
- case DIK_LCONTROL:
- case DIK_LSHIFT:
- case DIK_LALT:
- case DIK_RCONTROL:
- case DIK_RSHIFT:
- case DIK_RALT:
- break;
- default:
- k.shift = !!(keystate[DIK_LSHIFT] & 0x80) || !!(keystate[DIK_RSHIFT] & 0x80);
- k.alt = !!(keystate[DIK_LALT] & 0x80) || !!(keystate[DIK_RALT] & 0x80);
- k.ctrl = !!(keystate[DIK_LCONTROL] & 0x80) || !!(keystate[DIK_RCONTROL] & 0x80);
- k.keycode = i;
- k.held = held;
-
- for (auto& r : receivers)
- r->operator()(k);
- break;
- }
- }
- old_keystate[i] = keystate[i];
- }
- }
- }
-
- // keypresses get dropped with high values
- Sleep(4);
- }
-}
-
-KeybindingWorker::fun* KeybindingWorker::_add_receiver(fun& receiver)
-{
- QMutexLocker l(&mtx);
- receivers.push_back(std::unique_ptr<fun>(new fun(receiver)));
- fun* f = receivers[receivers.size() - 1].get();
- qDebug() << "add receiver" << (long) f;
- joy_ctx.refresh();
- return f;
-}
-
-void KeybindingWorker::remove_receiver(KeybindingWorker::fun* pos)
-{
- QMutexLocker l(&mtx);
- bool ok = false;
-
- for (int i = receivers.size() - 1; i >= 0; i--)
- {
- if (receivers[i].get() == pos)
- {
- ok = true;
- qDebug() << "remove receiver" << (long) pos;
- receivers.erase(receivers.begin() + i);
- break;
- }
- }
- if (!ok)
- {
- qDebug() << "bad remove receiver" << (long) pos;
- }
-}
-
-#endif
diff --git a/opentrack/keybinding-worker.hpp b/opentrack/keybinding-worker.hpp
deleted file mode 100644
index 19db0fa9..00000000
--- a/opentrack/keybinding-worker.hpp
+++ /dev/null
@@ -1,82 +0,0 @@
-/* Copyright (c) 2014-2015, Stanislaw Halik <sthalik@misaki.pl>
-
- * Permission to use, copy, modify, and/or distribute this
- * software for any purpose with or without fee is hereby granted,
- * provided that the above copyright notice and this permission
- * notice appear in all copies.
- */
-
-#pragma once
-
-#ifdef BUILD_api
-# include "opentrack-compat/export.hpp"
-#else
-# include "opentrack-compat/import.hpp"
-#endif
-
-#include "opentrack-compat/timer.hpp"
-#include "opentrack/win32-joystick.hpp"
-#include <QThread>
-#include <QMutex>
-#include <QWidget>
-#include <QMainWindow>
-#include <functional>
-#include <vector>
-
-#undef DIRECTINPUT_VERSION
-#define DIRECTINPUT_VERSION 0x0800
-#include <windows.h>
-#include <dinput.h>
-struct Key {
- BYTE keycode;
- QString guid;
- bool shift;
- bool ctrl;
- bool alt;
- bool held;
- bool enabled;
- Timer timer;
-public:
- Key() : keycode(0), shift(false), ctrl(false), alt(false), held(true), enabled(true) {}
-
- bool should_process();
-};
-
-struct OPENTRACK_EXPORT KeybindingWorker : private QThread
-{
-private:
- LPDIRECTINPUT8 din;
- LPDIRECTINPUTDEVICE8 dinkeyboard;
- win32_joy_ctx joy_ctx;
- volatile bool should_quit;
- using fun = std::function<void(const Key&)>;
- std::vector<std::unique_ptr<fun>> receivers;
- QMutex mtx;
- QMainWindow fake_main_window;
-
- void run() override;
- KeybindingWorker();
-
- KeybindingWorker(const KeybindingWorker&) = delete;
- KeybindingWorker& operator=(KeybindingWorker&) = delete;
- static KeybindingWorker& make();
- fun* _add_receiver(fun &receiver);
- void remove_receiver(fun* pos);
- ~KeybindingWorker();
-public:
- class Token
- {
- fun* pos;
- Token(const Token&) = delete;
- Token& operator=(Token&) = delete;
- public:
- ~Token()
- {
- make().remove_receiver(pos);
- }
- Token(fun receiver)
- {
- pos = make()._add_receiver(receiver);
- }
- };
-};
diff --git a/opentrack/main-settings.hpp b/opentrack/main-settings.hpp
deleted file mode 100644
index 7c04fd6d..00000000
--- a/opentrack/main-settings.hpp
+++ /dev/null
@@ -1,87 +0,0 @@
-/* Copyright (c) 2015, Stanislaw Halik <sthalik@misaki.pl>
-
- * Permission to use, copy, modify, and/or distribute this
- * software for any purpose with or without fee is hereby granted,
- * provided that the above copyright notice and this permission
- * notice appear in all copies.
- */
-
-#pragma once
-
-#include <QString>
-#include "opentrack-compat/options.hpp"
-#include "opentrack/plugin-api.hpp"
-
-using namespace options;
-
-struct axis_opts {
- pbundle b;
- value<double> zero;
- value<bool> invert, altp;
- value<int> src;
- axis_opts(pbundle b, QString pfx, int idx) :
- b(b),
- zero(b, n(pfx, "zero-pos"), 0),
- invert(b, n(pfx, "invert-sign"), false),
- altp(b, n(pfx, "alt-axis-sign"), false),
- src(b, n(pfx, "source-index"), idx)
- {}
-private:
- static inline QString n(QString pfx, QString name) {
- return QString("%1-%2").arg(pfx, name);
- }
-};
-
-struct key_opts {
- value<QString> keycode, guid;
- value<int> button;
-
- key_opts(pbundle b, const QString& name) :
- keycode(b, QString("keycode-%1").arg(name), ""),
- guid(b, QString("guid-%1").arg(name), ""),
- button(b, QString("button-%1").arg(name), -1)
- {}
-};
-
-struct main_settings : opts {
- value<QString> tracker_dll, filter_dll, protocol_dll;
- axis_opts a_x, a_y, a_z, a_yaw, a_pitch, a_roll;
- value<bool> tcomp_p, tcomp_tz;
- value<bool> tray_enabled;
- value<int> camera_yaw, camera_pitch, camera_roll;
- value<bool> center_at_startup;
- value<int> center_method;
- key_opts key_start_tracking, key_stop_tracking, key_toggle_tracking, key_restart_tracking;
- key_opts key_center, key_toggle, key_zero;
- key_opts key_toggle_press, key_zero_press;
- main_settings() :
- opts("opentrack-ui"),
- tracker_dll(b, "tracker-dll", ""),
- filter_dll(b, "filter-dll", "Accela"),
- protocol_dll(b, "protocol-dll", "freetrack 2.0 Enhanced"),
- a_x(b, "x", TX),
- a_y(b, "y", TY),
- a_z(b, "z", TZ),
- a_yaw(b, "yaw", Yaw),
- a_pitch(b, "pitch", Pitch),
- a_roll(b, "roll", Roll),
- tcomp_p(b, "compensate-translation", true),
- tcomp_tz(b, "compensate-translation-disable-z-axis", false),
- tray_enabled(b, "use-system-tray", false),
- camera_yaw(b, "camera-yaw", 0),
- camera_pitch(b, "camera-pitch", 0),
- camera_roll(b, "camera-roll", 0),
- center_at_startup(b, "center-at-startup", true),
- center_method(b, "centering-method", true),
- key_start_tracking(b, "start-tracking"),
- key_stop_tracking(b, "stop-tracking"),
- key_toggle_tracking(b, "toggle-tracking"),
- key_restart_tracking(b, "restart-tracking"),
- key_center(b, "center"),
- key_toggle(b, "toggle"),
- key_zero(b, "zero"),
- key_toggle_press(b, "toggle-press"),
- key_zero_press(b, "zero-press")
- {
- }
-};
diff --git a/opentrack/mappings.hpp b/opentrack/mappings.hpp
deleted file mode 100644
index 087ea7f3..00000000
--- a/opentrack/mappings.hpp
+++ /dev/null
@@ -1,89 +0,0 @@
-/* Copyright (c) 2014-2015 Stanislaw Halik
- *
- * Permission to use, copy, modify, and/or distribute this software for any
- * purpose with or without fee is hereby granted, provided that the above
- * copyright notice and this permission notice appear in all copies.
- */
-
-#pragma once
-
-#include <QSettings>
-#include "opentrack-compat/options.hpp"
-using namespace options;
-#include "spline-widget/functionconfig.h"
-#include "main-settings.hpp"
-
-class Mapping {
-public:
- Mapping(QString primary,
- QString secondary,
- int max_x,
- int max_y,
- axis_opts& opts) :
- curve(max_x, max_y),
- curveAlt(max_x, max_y),
- opts(opts),
- name1(primary),
- name2(secondary)
- {
- mem<QSettings> iniFile = group::ini_file();
- curve.loadSettings(*iniFile, primary);
- curveAlt.loadSettings(*iniFile, secondary);
- }
- Map curve;
- Map curveAlt;
- axis_opts& opts;
- QString name1, name2;
-};
-
-class Mappings {
-private:
- Mapping axes[6];
-public:
- Mappings(std::vector<axis_opts*> opts) :
- axes {
- Mapping("tx","tx_alt", 100, 100, *opts[TX]),
- Mapping("ty","ty_alt", 100, 100, *opts[TY]),
- Mapping("tz","tz_alt", 100, 100, *opts[TZ]),
- Mapping("rx", "rx_alt", 180, 180, *opts[Yaw]),
- Mapping("ry", "ry_alt", 180, 180, *opts[Pitch]),
- Mapping("rz", "rz_alt", 180, 180, *opts[Roll])
- }
- {}
-
- inline Mapping& operator()(int i) { return axes[i]; }
- inline const Mapping& operator()(int i) const { return axes[i]; }
-
- void load_mappings()
- {
- mem<QSettings> iniFile = group::ini_file();
-
- for (int i = 0; i < 6; i++)
- {
- axes[i].curve.loadSettings(*iniFile, axes[i].name1);
- axes[i].curveAlt.loadSettings(*iniFile, axes[i].name2);
- axes[i].opts.b->reload();
- }
- }
- void save_mappings()
- {
- mem<QSettings> iniFile = group::ini_file();
-
- for (int i = 0; i < 6; i++)
- {
- axes[i].curve.saveSettings(*iniFile, axes[i].name1);
- axes[i].curveAlt.saveSettings(*iniFile, axes[i].name2);
- axes[i].opts.b->save();
- }
- }
-
- void invalidate_unsaved()
- {
- for (int i = 0; i < 6; i++)
- {
- axes[i].curve.invalidate_unsaved_settings();
- axes[i].curveAlt.invalidate_unsaved_settings();
- axes[i].opts.b->reload();
- }
- }
-};
diff --git a/opentrack/nan.cpp b/opentrack/nan.cpp
deleted file mode 100644
index 2522ba38..00000000
--- a/opentrack/nan.cpp
+++ /dev/null
@@ -1,16 +0,0 @@
-#include <cmath>
-
-#if defined(__GNUC__)
-bool __attribute__ ((noinline)) nanp(double value)
-#elif defined(_WIN32)
-__declspec(noinline) bool nanp(double value)
-#else
-bool nanp(double value)
-#endif
-{
- using std::isnan;
- using std::isinf;
-
- const volatile double x = value;
- return isnan(x) || isinf(x);
-} \ No newline at end of file
diff --git a/opentrack/plugin-api.hpp b/opentrack/plugin-api.hpp
index e715780e..6cd76a16 100644
--- a/opentrack/plugin-api.hpp
+++ b/opentrack/plugin-api.hpp
@@ -13,11 +13,7 @@
#include <QFrame>
#include <QIcon>
-#ifdef BUILD_api
-# include "opentrack-compat/export.hpp"
-#else
-# include "opentrack-compat/import.hpp"
-#endif
+#include "export.hpp"
#ifndef OPENTRACK_PLUGIN_EXPORT
# ifdef _WIN32
@@ -39,7 +35,7 @@ enum Axis {
namespace plugin_api {
namespace detail {
-class OPENTRACK_EXPORT BaseDialog : public QWidget
+class OPENTRACK_API_EXPORT BaseDialog : public QWidget
{
Q_OBJECT
public:
@@ -67,7 +63,7 @@ signals:
// implement this in all plugins
// also you must link against "opentrack-api" in CMakeLists.txt to avoid vtable link errors
-struct OPENTRACK_EXPORT Metadata
+struct OPENTRACK_API_EXPORT Metadata
{
Metadata(const Metadata&) = delete;
Metadata(Metadata&&) = delete;
@@ -83,7 +79,7 @@ struct OPENTRACK_EXPORT Metadata
};
// implement this in filters
-struct OPENTRACK_EXPORT IFilter
+struct OPENTRACK_API_EXPORT IFilter
{
IFilter(const IFilter&) = delete;
IFilter(IFilter&&) = delete;
@@ -99,7 +95,7 @@ struct OPENTRACK_EXPORT IFilter
virtual void center() {}
};
-struct OPENTRACK_EXPORT IFilterDialog : public plugin_api::detail::BaseDialog
+struct OPENTRACK_API_EXPORT IFilterDialog : public plugin_api::detail::BaseDialog
{
// optional destructor
virtual ~IFilterDialog();
@@ -114,7 +110,7 @@ struct OPENTRACK_EXPORT IFilterDialog : public plugin_api::detail::BaseDialog
OPENTRACK_DECLARE_PLUGIN_INTERNAL(filter_class, IFilter, metadata_class, dialog_class, IFilterDialog)
// implement this in protocols
-struct OPENTRACK_EXPORT IProtocol
+struct OPENTRACK_API_EXPORT IProtocol
{
IProtocol(const IProtocol&) = delete;
IProtocol(IProtocol&&) = delete;
@@ -132,7 +128,7 @@ struct OPENTRACK_EXPORT IProtocol
virtual QString game_name() = 0;
};
-struct OPENTRACK_EXPORT IProtocolDialog : public plugin_api::detail::BaseDialog
+struct OPENTRACK_API_EXPORT IProtocolDialog : public plugin_api::detail::BaseDialog
{
// optional destructor
virtual ~IProtocolDialog();
@@ -147,7 +143,7 @@ struct OPENTRACK_EXPORT IProtocolDialog : public plugin_api::detail::BaseDialog
OPENTRACK_DECLARE_PLUGIN_INTERNAL(protocol_class, IProtocol, metadata_class, dialog_class, IProtocolDialog)
// implement this in trackers
-struct OPENTRACK_EXPORT ITracker
+struct OPENTRACK_API_EXPORT ITracker
{
ITracker(const ITracker&) = delete;
ITracker(ITracker&&) = delete;
@@ -162,7 +158,7 @@ struct OPENTRACK_EXPORT ITracker
virtual void data(double *data) = 0;
};
-struct OPENTRACK_EXPORT ITrackerDialog : public plugin_api::detail::BaseDialog
+struct OPENTRACK_API_EXPORT ITrackerDialog : public plugin_api::detail::BaseDialog
{
// optional destructor
virtual ~ITrackerDialog();
diff --git a/opentrack/selected-libraries.cpp b/opentrack/selected-libraries.cpp
deleted file mode 100644
index 63517774..00000000
--- a/opentrack/selected-libraries.cpp
+++ /dev/null
@@ -1,37 +0,0 @@
-#include "opentrack/selected-libraries.hpp"
-#include <QDebug>
-
-SelectedLibraries::SelectedLibraries(QFrame* frame, dylibptr t, dylibptr p, dylibptr f) :
- pTracker(nullptr),
- pFilter(nullptr),
- pProtocol(nullptr),
- correct(false)
-{
- pProtocol = make_dylib_instance<IProtocol>(p);
-
- if (!pProtocol)
- {
- qDebug() << "protocol dylib load failure";
- return;
- }
-
- if(!pProtocol->correct())
- {
- qDebug() << "protocol load failure";
- pProtocol = nullptr;
- return;
- }
-
- pTracker = make_dylib_instance<ITracker>(t);
- pFilter = make_dylib_instance<IFilter>(f);
-
- if (!pTracker)
- {
- qDebug() << "tracker dylib load failure";
- return;
- }
-
- pTracker->start_tracker(frame);
-
- correct = true;
-}
diff --git a/opentrack/selected-libraries.hpp b/opentrack/selected-libraries.hpp
deleted file mode 100644
index b396b5ec..00000000
--- a/opentrack/selected-libraries.hpp
+++ /dev/null
@@ -1,29 +0,0 @@
-/* Copyright (c) 2014-2015, Stanislaw Halik <sthalik@misaki.pl>
-
- * Permission to use, copy, modify, and/or distribute this
- * software for any purpose with or without fee is hereby granted,
- * provided that the above copyright notice and this permission
- * notice appear in all copies.
- */
-
-#pragma once
-
-#include "opentrack/plugin-support.hpp"
-#include <QFrame>
-
-
-#ifdef BUILD_api
-# include "opentrack-compat/export.hpp"
-#else
-# include "opentrack-compat/import.hpp"
-#endif
-
-struct OPENTRACK_EXPORT SelectedLibraries {
- using dylibptr = mem<dylib>;
- mem<ITracker> pTracker;
- mem<IFilter> pFilter;
- mem<IProtocol> pProtocol;
- SelectedLibraries(QFrame* frame, dylibptr t, dylibptr p, dylibptr f);
- SelectedLibraries() : pTracker(nullptr), pFilter(nullptr), pProtocol(nullptr), correct(false) {}
- bool correct;
-};
diff --git a/opentrack/shortcuts.cpp b/opentrack/shortcuts.cpp
deleted file mode 100644
index 06c246af..00000000
--- a/opentrack/shortcuts.cpp
+++ /dev/null
@@ -1,130 +0,0 @@
-/* Copyright (c) 2014-2015, Stanislaw Halik <sthalik@misaki.pl>
-
- * Permission to use, copy, modify, and/or distribute this
- * software for any purpose with or without fee is hereby granted,
- * provided that the above copyright notice and this permission
- * notice appear in all copies.
- */
-
-#include "shortcuts.h"
-#include "win32-shortcuts.h"
-
-void Shortcuts::free_binding(K& key)
-{
-#ifndef _WIN32
- if (key)
- {
- key->setEnabled(false);
- key->setShortcut(QKeySequence::UnknownKey);
- std::shared_ptr<QxtGlobalShortcut> tmp(nullptr);
- key.swap(tmp);
- }
-#else
- key.keycode = 0;
- key.guid = "";
-#endif
-}
-
-void Shortcuts::bind_keyboard_shortcut(K &key, const key_opts& k, unused_on_unix(bool, held))
-{
-#if !defined(_WIN32)
- using sh = QxtGlobalShortcut;
- if (key)
- {
- free_binding(key);
- }
-
- key = std::make_shared<sh>();
-
- if (k.keycode != "")
- {
- key->setShortcut(QKeySequence::fromString(k.keycode, QKeySequence::PortableText));
- key->setEnabled();
- }
-}
-#else
- key = K();
- int idx = 0;
- QKeySequence code;
-
- if (k.guid != "")
- {
- key.guid = k.guid;
- key.keycode = k.button & ~Qt::KeyboardModifierMask;
- key.ctrl = !!(k.button & Qt::ControlModifier);
- key.alt = !!(k.button & Qt::AltModifier);
- key.shift = !!(k.button & Qt::ShiftModifier);
- }
- else
- {
- if (k.keycode == "")
- code = QKeySequence(Qt::Key_unknown);
- else
- code = QKeySequence::fromString(k.keycode, QKeySequence::PortableText);
-
- Qt::KeyboardModifiers mods = Qt::NoModifier;
- if (code != Qt::Key_unknown)
- win_key::from_qt(code, idx, mods);
- key.shift = !!(mods & Qt::ShiftModifier);
- key.alt = !!(mods & Qt::AltModifier);
- key.ctrl = !!(mods & Qt::ControlModifier);
- key.keycode = idx;
- key.held = held;
- }
-}
-#endif
-
-#ifdef _WIN32
-void Shortcuts::receiver(const Key& k)
-{
- const unsigned sz = keys.size();
- for (unsigned i = 0; i < sz; i++)
- {
- K& k_ = std::get<0>(keys[i]);
- auto& fun = std::get<1>(keys[i]);
- if (k.guid != k_.guid)
- continue;
- if (k.keycode != k_.keycode)
- continue;
- if (k_.held && !k.held) continue;
- if (k_.alt != k.alt) continue;
- if (k_.ctrl != k.ctrl) continue;
- if (k_.shift != k.shift) continue;
- if (!k_.should_process())
- continue;
-
- fun(k.held);
- }
-}
-#endif
-
-void Shortcuts::reload(const std::vector<std::tuple<key_opts&, fun, bool>> &keys_)
-{
- const unsigned sz = keys_.size();
- keys = std::vector<tt>();
-
- for (unsigned i = 0; i < sz; i++)
- {
- const auto& kk = keys_[i];
- const key_opts& opts = std::get<0>(kk);
- const bool held = std::get<2>(kk);
- auto fun = std::get<1>(kk);
- K k;
- bind_keyboard_shortcut(k, opts, held);
- keys.push_back(tt(k, [=](unused_on_unix(bool, flag)) -> void
- {
-#ifdef _WIN32
- fun(flag);
-#else
- fun(true);
-#endif
- },
- held));
-#ifndef _WIN32
- const int idx = keys.size() - 1;
- tt& kk_ = keys[idx];
- auto& fn = std::get<1>(kk_);
- connect(k.get(), &QxtGlobalShortcut::activated, [=]() -> void { fn(true); });
-#endif
- }
-}
diff --git a/opentrack/shortcuts.h b/opentrack/shortcuts.h
deleted file mode 100644
index 2362c88b..00000000
--- a/opentrack/shortcuts.h
+++ /dev/null
@@ -1,69 +0,0 @@
-/* Copyright (c) 2014-2015, Stanislaw Halik <sthalik@misaki.pl>
-
- * Permission to use, copy, modify, and/or distribute this
- * software for any purpose with or without fee is hereby granted,
- * provided that the above copyright notice and this permission
- * notice appear in all copies.
- */
-
-#pragma once
-#include <QObject>
-#include <tuple>
-#include <vector>
-#include <functional>
-
-#ifdef BUILD_api
-# include "opentrack-compat/export.hpp"
-#else
-# include "opentrack-compat/import.hpp"
-#endif
-
-#include "qxt-mini/QxtGlobalShortcut"
-#include "opentrack-compat/options.hpp"
-#include "opentrack/main-settings.hpp"
-
-#ifdef _WIN32
-# include "keybinding-worker.hpp"
-#endif
-
-#if defined(__GNUC__) && !defined(_WIN32)
-# define unused_on_unix(t, i) t __attribute__((unused)) i
-#else
-# define unused_on_unix(t, i) t i
-#endif
-
-using namespace options;
-
-struct OPENTRACK_EXPORT Shortcuts : public QObject {
- Q_OBJECT
-
-public:
- using K =
-#ifndef _WIN32
- mem<QxtGlobalShortcut>
-#else
- Key
-#endif
- ;
-
- using fun = std::function<void(bool)>;
- using tt = std::tuple<K, fun, bool>;
- std::vector<tt> keys;
-#ifdef _WIN32
- KeybindingWorker::Token key_token;
-#endif
-
- Shortcuts()
-#ifdef _WIN32
- : key_token([&](const Key& k) { receiver(k); })
-#endif
- {}
-
- void reload(const std::vector<std::tuple<key_opts&, fun, bool>> &keys_);
-private:
- void free_binding(K& key);
- void bind_keyboard_shortcut(K &key, const key_opts& k, bool held);
-#ifdef _WIN32
- void receiver(const Key& k);
-#endif
-};
diff --git a/opentrack/simple-mat.hpp b/opentrack/simple-mat.hpp
index 54ebb920..ce2bccc5 100644
--- a/opentrack/simple-mat.hpp
+++ b/opentrack/simple-mat.hpp
@@ -242,16 +242,18 @@ public:
}
};
+#include "export.hpp"
+
namespace euler {
template<int y, int x> using dmat = Mat<double, y, x>;
using rmat = dmat<3, 3>;
using euler_t = dmat<3, 1>;
-rmat euler_to_rmat(const double* input);
+rmat OPENTRACK_API_EXPORT euler_to_rmat(const double* input);
// http://stackoverflow.com/a/18436193
-euler_t rmat_to_euler(const dmat<3, 3>& R);
+euler_t OPENTRACK_API_EXPORT rmat_to_euler(const dmat<3, 3>& R);
} // end ns euler
diff --git a/opentrack/state.hpp b/opentrack/state.hpp
deleted file mode 100644
index dcb18293..00000000
--- a/opentrack/state.hpp
+++ /dev/null
@@ -1,29 +0,0 @@
-/* Copyright (c) 2014-2015, Stanislaw Halik <sthalik@misaki.pl>
-
- * Permission to use, copy, modify, and/or distribute this
- * software for any purpose with or without fee is hereby granted,
- * provided that the above copyright notice and this permission
- * notice appear in all copies.
- */
-
-#pragma once
-
-#include <vector>
-#include "opentrack-compat/options.hpp"
-using namespace options;
-#include "opentrack/plugin-support.hpp"
-#include "opentrack/main-settings.hpp"
-#include "opentrack/mappings.hpp"
-#include "opentrack/selected-libraries.hpp"
-#include "opentrack/work.hpp"
-
-struct State {
- State() :
- pose(std::vector<axis_opts*>{&s.a_x, &s.a_y, &s.a_z, &s.a_yaw, &s.a_pitch, &s.a_roll})
- {}
- Modules modules;
- SelectedLibraries libs;
- main_settings s;
- Mappings pose;
- mem<Work> work;
-};
diff --git a/opentrack/tracker.cpp b/opentrack/tracker.cpp
deleted file mode 100644
index 9d754324..00000000
--- a/opentrack/tracker.cpp
+++ /dev/null
@@ -1,305 +0,0 @@
-/* Copyright (c) 2012-2015 Stanislaw Halik <sthalik@misaki.pl>
- *
- * Permission to use, copy, modify, and/or distribute this software for any
- * purpose with or without fee is hereby granted, provided that the above
- * copyright notice and this permission notice appear in all copies.
- */
-
-/*
- * this file appeared originally in facetracknoir, was rewritten completely
- * following opentrack fork.
- *
- * originally written by Wim Vriend.
- */
-
-
-#include "tracker.h"
-#include <cmath>
-#include <algorithm>
-
-#if defined(_WIN32)
-# include <windows.h>
-#endif
-
-Tracker::Tracker(main_settings& s, Mappings &m, SelectedLibraries &libs) :
- s(s),
- m(m),
- newpose {0,0,0, 0,0,0},
- centerp(s.center_at_startup),
- enabledp(true),
- zero_(false),
- should_quit(false),
- libs(libs),
- r_b(dmat<3,3>::eye()),
- t_b {0,0,0}
-{
-}
-
-Tracker::~Tracker()
-{
- should_quit = true;
- wait();
-}
-
-double Tracker::map(double pos, Mapping& axis)
-{
- bool altp = (pos < 0) && axis.opts.altp;
- axis.curve.setTrackingActive( !altp );
- axis.curveAlt.setTrackingActive( altp );
- auto& fc = altp ? axis.curveAlt : axis.curve;
- return fc.getValue(pos);
-}
-
-void Tracker::t_compensate(const rmat& rmat, const double* xyz, double* output, bool rz)
-{
- // TY is really yaw axis. need swapping accordingly.
- dmat<3, 1> tvec( xyz[2], -xyz[0], -xyz[1] );
- const dmat<3, 1> ret = rmat * tvec;
- if (!rz)
- output[2] = ret(0);
- else
- output[2] = xyz[2];
- output[1] = -ret(2);
- output[0] = -ret(1);
-}
-
-#ifdef _WIN32
-__declspec(noinline) bool nanp(double value);
-#elif defined(__GNUC__)
-bool __attribute__ ((noinline)) nanp(double value);
-#else
-bool nanp(double value);
-#endif
-
-static inline double elide_nan(double value, double def)
-{
- if (nanp(value))
- {
- if (nanp(def))
- return 0;
- return def;
- }
- return value;
-}
-
-static bool is_nan(const dmat<3,3>& r, const dmat<3, 1>& t)
-{
- for (int i = 0; i < 3; i++)
- for (int j = 0; j < 3; j++)
- if (nanp(r(i, j)))
- return true;
-
- for (int i = 0; i < 3; i++)
- if (nanp(t(i)))
- return true;
-
- return false;
-}
-
-static bool is_nan(const Pose& value)
-{
- for (int i = 0; i < 6; i++)
- if (nanp(value(i)))
- return true;
- return false;
-}
-
-void Tracker::logic()
-{
- bool inverts[6] = {
- m(0).opts.invert,
- m(1).opts.invert,
- m(2).opts.invert,
- m(3).opts.invert,
- m(4).opts.invert,
- m(5).opts.invert,
- };
-
- static constexpr double pi = 3.141592653;
- static constexpr double r2d = 180. / pi;
-
- using namespace euler;
-
- Pose value, raw;
-
- for (int i = 0; i < 6; i++)
- {
- auto& axis = m(i);
- int k = axis.opts.src;
- if (k < 0 || k >= 6)
- value(i) = 0;
- else
- value(i) = newpose[k];
- raw(i) = newpose[i];
- }
-
- if (is_nan(raw))
- raw = last_raw;
-
- const double off[] =
- {
- (double)-s.camera_yaw,
- (double)-s.camera_pitch,
- (double)-s.camera_roll
- };
- const rmat cam = euler_to_rmat(off);
- rmat r = euler_to_rmat(&value[Yaw]);
- euler_t t(value(0), value(1), value(2));
-
- r = cam * r;
-
- bool can_center = false;
- const bool nan = is_nan(r, t);
-
- if (centerp && !nan)
- {
- for (int i = 0; i < 6; i++)
- if (fabs(newpose[i]) != 0)
- {
- can_center = true;
- break;
- }
- }
-
- if (can_center)
- {
- if (libs.pFilter)
- libs.pFilter->center();
- centerp = false;
- for (int i = 0; i < 3; i++)
- t_b[i] = t(i);
- r_b = r;
- }
-
- {
- double tmp[3] = { t(0) - t_b[0], t(1) - t_b[1], t(2) - t_b[2] };
- t_compensate(cam, tmp, tmp, false);
- rmat m_;
- switch (s.center_method)
- {
- case 0:
- default:
- m_ = r * r_b.t();
- break;
- case 1:
- m_ = r_b.t() * r;
- }
-
- const euler_t euler = rmat_to_euler(m_);
-
- for (int i = 0; i < 3; i++)
- {
- value(i) = tmp[i];
- value(i+3) = euler(i) * r2d;
- }
- }
-
- bool nan_ = false;
- // whenever something can corrupt its internal state due to nan/inf, elide the call
- if (is_nan(value))
- {
- nan_ = true;
- }
- else
- {
- {
- Pose tmp = value;
-
- if (libs.pFilter)
- libs.pFilter->filter(tmp, value);
- }
-
- for (int i = 0; i < 6; i++)
- value(i) = map(value(i), m(i));
-
- if (s.tcomp_p)
- t_compensate(euler_to_rmat(&value[Yaw]),
- value,
- value,
- s.tcomp_tz);
-
- for (int i = 0; i < 6; i++)
- value(i) += m(i).opts.zero;
-
- for (int i = 0; i < 6; i++)
- value[i] *= inverts[i] ? -1. : 1.;
-
- if (zero_)
- for (int i = 0; i < 6; i++)
- value(i) = 0;
-
- if (is_nan(value))
- nan_ = true;
- }
-
- if (nan_)
- {
- value = last_mapped;
-
- // for widget last value display
- for (int i = 0; i < 6; i++)
- (void) map(value(i), m(i));
- }
-
- libs.pProtocol->pose(value);
-
- last_mapped = value;
- last_raw = raw;
-
- QMutexLocker foo(&mtx);
- output_pose = value;
- raw_6dof = raw;
-}
-
-void Tracker::run()
-{
- const int sleep_ms = 3;
-
-#if defined(_WIN32)
- (void) timeBeginPeriod(1);
-#endif
-
- while (!should_quit)
- {
- t.start();
-
- double tmp[6] {0,0,0, 0,0,0};
- libs.pTracker->data(tmp);
-
- if (enabledp)
- for (int i = 0; i < 6; i++)
- newpose[i] = elide_nan(tmp[i], newpose[i]);
-
- logic();
-
- long q = sleep_ms * 1000L - t.elapsed()/1000L;
- using std::max;
- usleep(max(1L, q));
- }
-
- {
- // filter may inhibit exact origin
- Pose p;
- libs.pProtocol->pose(p);
- }
-
-#if defined(_WIN32)
- (void) timeEndPeriod(1);
-#endif
-
- for (int i = 0; i < 6; i++)
- {
- m(i).curve.setTrackingActive(false);
- m(i).curveAlt.setTrackingActive(false);
- }
-}
-
-void Tracker::get_raw_and_mapped_poses(double* mapped, double* raw) const {
- QMutexLocker foo(&const_cast<Tracker&>(*this).mtx);
- for (int i = 0; i < 6; i++)
- {
- raw[i] = raw_6dof(i);
- mapped[i] = output_pose(i);
- }
-}
-
diff --git a/opentrack/tracker.h b/opentrack/tracker.h
deleted file mode 100644
index ea831eb0..00000000
--- a/opentrack/tracker.h
+++ /dev/null
@@ -1,87 +0,0 @@
-/* Copyright (c) 2014-2015, Stanislaw Halik <sthalik@misaki.pl>
-
- * Permission to use, copy, modify, and/or distribute this
- * software for any purpose with or without fee is hereby granted,
- * provided that the above copyright notice and this permission
- * notice appear in all copies.
- */
-
-#pragma once
-
-#include <vector>
-
-#include "opentrack-compat/timer.hpp"
-#include "plugin-support.hpp"
-#include "mappings.hpp"
-#include "simple-mat.hpp"
-#include "selected-libraries.hpp"
-
-#include "spline-widget/functionconfig.h"
-#include "main-settings.hpp"
-#include "opentrack-compat/options.hpp"
-
-#include <QMutex>
-#include <QThread>
-
-class Pose {
-private:
- static constexpr double pi = 3.141592653;
- static constexpr double d2r = pi/180.0;
- static constexpr double r2d = 180./pi;
-
- double axes[6];
-public:
- Pose() : axes {0,0,0, 0,0,0} {}
-
- inline operator double*() { return axes; }
- inline operator const double*() const { return axes; }
-
- inline double& operator()(int i) { return axes[i]; }
- inline double operator()(int i) const { return axes[i]; }
-};
-
-#ifdef BUILD_api
-# include "opentrack-compat/export.hpp"
-#else
-# include "opentrack-compat/import.hpp"
-#endif
-
-class OPENTRACK_EXPORT Tracker : private QThread {
- Q_OBJECT
-private:
- QMutex mtx;
- main_settings& s;
- Mappings& m;
-
- Timer t;
- Pose output_pose, raw_6dof, last_mapped, last_raw;
-
- double newpose[6];
- volatile bool centerp;
- volatile bool enabledp;
- volatile bool zero_;
- volatile bool should_quit;
- SelectedLibraries const& libs;
-
- using rmat = dmat<3, 3>;
-
- dmat<3, 3> r_b;
- double t_b[3];
-
- double map(double pos, Mapping& axis);
- void logic();
-
- void t_compensate(const rmat& rmat, const double* ypr, double* output, bool rz);
- void run() override;
-public:
- Tracker(main_settings& s, Mappings& m, SelectedLibraries& libs);
- ~Tracker();
-
- void get_raw_and_mapped_poses(double* mapped, double* raw) const;
- void start() { QThread::start(); }
- void toggle_enabled() { qDebug() << "toggle enabled"; enabledp = !enabledp; }
- void set_toggle(bool value) { qDebug() << "enabled" << value; enabledp = value; }
- void set_zero(bool value) { qDebug() << "zero" << value; zero_ = value; }
- void center() { qDebug() << "toggle center"; centerp = !centerp; }
- void zero() { qDebug() << "toggle zero"; zero_ = !zero_; }
-};
diff --git a/opentrack/win32-joystick.cpp b/opentrack/win32-joystick.cpp
deleted file mode 100644
index bf919f4a..00000000
--- a/opentrack/win32-joystick.cpp
+++ /dev/null
@@ -1,297 +0,0 @@
-#undef NDEBUG
-#include <cassert>
-#include "win32-joystick.hpp"
-
-#ifdef _WIN32
-
-void win32_joy_ctx::poll(fn f)
-{
- //refresh(false);
-
- QMutexLocker l(&mtx);
-
- for (auto& j : joys)
- {
- j.second->poll(f);
- }
-}
-
-bool win32_joy_ctx::poll_axis(const QString &guid, int axes[])
-{
- //refresh(false);
-
- QMutexLocker l(&mtx);
-
- auto iter = joys.find(guid);
-
- if (iter == joys.end())
- return false;
-
- auto& j = iter->second;
-
- auto& joy_handle = j->joy_handle;
- bool ok = false;
- HRESULT hr;
-
- (void) joy_handle->Acquire();
-
- if (!FAILED(hr = joy_handle->Poll()))
- ok = true;
-
- if (!ok)
- {
- qDebug() << "joy acquire failed" << guid << hr;
- (void) joy_handle->Unacquire();
- return false;
- }
-
- DIJOYSTATE2 js;
- memset(&js, 0, sizeof(js));
-
- if (FAILED(hr = joy_handle->GetDeviceState(sizeof(js), &js)))
- {
- qDebug() << "joy get state failed" << guid << hr;
- return false;
- }
-
- const int values[] = {
- js.lX,
- js.lY,
- js.lZ,
- js.lRx,
- js.lRy,
- js.lRz,
- js.rglSlider[0],
- js.rglSlider[1]
- };
-
- for (int i = 0; i < 8; i++)
- axes[i] = values[i];
-
- return true;
-}
-
-win32_joy_ctx::~win32_joy_ctx()
-{
- release();
-}
-
-std::vector<win32_joy_ctx::joy_info> win32_joy_ctx::get_joy_info()
-{
- QMutexLocker l(&mtx);
-
- std::vector<joy_info> ret;
-
- for (auto& j : joys)
- ret.push_back(joy_info { j.second->name, j.first });
-
- return ret;
-}
-
-win32_joy_ctx::win32_joy_ctx()
-{
- if (DirectInput8Create(GetModuleHandle(NULL), DIRECTINPUT_VERSION, IID_IDirectInput8, (void**)&di, NULL) != DI_OK) {
- qDebug() << "setup DirectInput8 Creation failed!" << GetLastError();
- assert(!"direct input handle can't be created");
- }
- refresh();
-}
-
-void win32_joy_ctx::release()
-{
- joys = std::unordered_map<QString, std::shared_ptr<joy>>();
- di->Release();
- di = nullptr;
-}
-
-void win32_joy_ctx::refresh()
-{
- QMutexLocker l(&mtx);
-
- qDebug() << "joy list refresh";
- enum_state st(joys, fake_main_window, di);
-}
-
-QString win32_joy_ctx::guid_to_string(const GUID guid)
-{
- char buf[40] = {0};
- wchar_t szGuidW[40] = {0};
-
- StringFromGUID2(guid, szGuidW, 40);
- WideCharToMultiByte(0, 0, szGuidW, -1, buf, 40, NULL, NULL);
-
- return QString(buf);
-}
-
-using fn = win32_joy_ctx::fn;
-
-void win32_joy_ctx::joy::release()
-{
- if (joy_handle)
- {
- (void) joy_handle->Unacquire();
- joy_handle->Release();
- joy_handle = nullptr;
- }
-}
-
-bool win32_joy_ctx::joy::poll(fn f)
-{
- HRESULT hr;
- bool ok = false;
-
- (void) joy_handle->Acquire();
-
- if (!FAILED(hr = joy_handle->Poll()))
- ok = true;
-
- if (!ok)
- {
- qDebug() << "joy acquire failed" << guid << hr;
- (void) joy_handle->Unacquire();
- return false;
- }
-
- DIJOYSTATE2 js;
- memset(&js, 0, sizeof(js));
-
- if (FAILED(hr = joy_handle->GetDeviceState(sizeof(js), &js)))
- {
- qDebug() << "joy get state failed" << guid << hr;
- return false;
- }
-
- for (int i = 0; i < 128; i++)
- {
- const bool state = !!(js.rgbButtons[i] & 0x80) && js.rgbButtons[i] != js_old.rgbButtons[i];
- if (state != pressed[i])
- {
- f(guid, i, state);
- qDebug() << "btn" << guid << i << state;
- }
- pressed[i] = state;
- }
-
- js_old = js;
-
- return true;
-}
-
-win32_joy_ctx::enum_state::enum_state(std::unordered_map<QString, std::shared_ptr<joy>> &joys_,
- QMainWindow &fake_main_window,
- LPDIRECTINPUT8 di) :
- fake_main_window(fake_main_window),
- di(di)
-{
- joys = joys_;
-
- HRESULT hr;
-
- if(FAILED(hr = di->EnumDevices(DI8DEVCLASS_GAMECTRL,
- EnumJoysticksCallback,
- this,
- DIEDFL_ATTACHEDONLY)))
- {
- qDebug() << "failed enum joysticks" << hr;
- return;
- }
-
- for (auto it = joys.begin(); it != joys.end(); )
- {
- if (std::find_if(all.cbegin(), all.cend(), [&](const QString& guid2) -> bool { return it->second->guid == guid2; }) == all.cend())
- it = joys.erase(it);
- else
- it++;
- }
-
- joys_ = joys;
-}
-
-win32_joy_ctx::enum_state::EnumJoysticksCallback(const DIDEVICEINSTANCE *pdidInstance, void *pContext)
-{
- enum_state& state = *reinterpret_cast<enum_state*>(pContext);
- const QString guid = guid_to_string(pdidInstance->guidInstance);
- const QString name = QString(pdidInstance->tszInstanceName);
-
- auto it = state.joys.find(guid);
- const bool exists = it != state.joys.end();
-
- state.all.push_back(guid);
-
- if (!exists)
- {
- HRESULT hr;
- LPDIRECTINPUTDEVICE8 h;
- if (FAILED(hr = state.di->CreateDevice(pdidInstance->guidInstance, &h, nullptr)))
- {
- qDebug() << "createdevice" << guid << hr;
- goto end;
- }
- if (FAILED(h->SetDataFormat(&c_dfDIJoystick2)))
- {
- qDebug() << "format";
- h->Release();
- goto end;
- }
-
- if (FAILED(h->SetCooperativeLevel((HWND) state.fake_main_window.winId(), DISCL_NONEXCLUSIVE | DISCL_BACKGROUND)))
- {
- qDebug() << "coop";
- h->Release();
- goto end;
- }
- if (FAILED(hr = h->EnumObjects(EnumObjectsCallback, h, DIDFT_ALL)))
- {
- qDebug() << "enum-objects";
- h->Release();
- goto end;
- }
-
- qDebug() << "add joy" << guid;
- state.joys[guid] = std::make_shared<joy>(h, guid, name);
- }
-end:
- return DIENUM_CONTINUE;
-}
-
-win32_joy_ctx::enum_state::EnumObjectsCallback(const DIDEVICEOBJECTINSTANCE *pdidoi, void *ctx)
-{
- if (pdidoi->dwType & DIDFT_AXIS)
- {
- DIPROPRANGE diprg;
- memset(&diprg, 0, sizeof(diprg));
- diprg.diph.dwSize = sizeof( DIPROPRANGE );
- diprg.diph.dwHeaderSize = sizeof( DIPROPHEADER );
- diprg.diph.dwHow = DIPH_BYID;
- diprg.diph.dwObj = pdidoi->dwType;
- diprg.lMax = joy_axis_size;
- diprg.lMin = -joy_axis_size;
-
- HRESULT hr;
-
- if (FAILED(hr = reinterpret_cast<LPDIRECTINPUTDEVICE8>(ctx)->SetProperty(DIPROP_RANGE, &diprg.diph)))
- {
- qDebug() << "DIPROP_RANGE" << hr;
- return DIENUM_STOP;
- }
- }
-
- return DIENUM_CONTINUE;
-}
-
-win32_joy_ctx::joy::joy(LPDIRECTINPUTDEVICE8 handle, const QString &guid, const QString &name)
- : joy_handle(handle), guid(guid), name(name)
-{
- qDebug() << "got joy" << guid;
- for (int i = 0; i < 128; i++)
- pressed[i] = false;
- memset(&js_old, 0, sizeof(js_old));
-}
-
-win32_joy_ctx::joy::~joy()
-{
- qDebug() << "nix joy" << guid;
- release();
-}
-
-#endif
diff --git a/opentrack/win32-joystick.hpp b/opentrack/win32-joystick.hpp
deleted file mode 100644
index 9c888326..00000000
--- a/opentrack/win32-joystick.hpp
+++ /dev/null
@@ -1,100 +0,0 @@
-#pragma once
-
-#ifdef _WIN32
-
-#include <cstring>
-#include <memory>
-#include <vector>
-#include <functional>
-#include <algorithm>
-#include <unordered_map>
-#ifndef DIRECTINPUT_VERSION
-# define DIRECTINPUT_VERSION 0x800
-#endif
-#include <dinput.h>
-#include <windows.h>
-#include "opentrack-compat/timer.hpp"
-#include <QString>
-#include <QDebug>
-#include <QMutex>
-#include <QMutexLocker>
-#include <QMainWindow>
-
-namespace std {
-template<>
-struct hash<QString>
-{
- inline std::size_t operator()(const QString& value) const
- {
- return qHash(value);
- }
-};
-}
-
-#ifdef BUILD_api
-# include "opentrack-compat/export.hpp"
-#else
-# include "opentrack-compat/import.hpp"
-#endif
-
-struct OPENTRACK_EXPORT win32_joy_ctx
-{
- using fn = std::function<void(const QString& guid, int btn, bool held)>;
-
- enum { joy_axis_size = 65535 };
-
- struct joy_info
- {
- QString name, guid;
- };
-
- void poll(fn f);
- bool poll_axis(const QString& guid, int axes[8]);
- std::vector<joy_info> get_joy_info();
-
- win32_joy_ctx(const win32_joy_ctx&) = delete;
- win32_joy_ctx& operator=(const win32_joy_ctx&) = delete;
-
- win32_joy_ctx();
- ~win32_joy_ctx();
- void refresh();
-private:
- QMutex mtx;
- QMainWindow fake_main_window;
- LPDIRECTINPUT8 di;
-
- static QString guid_to_string(const GUID guid);
- void release();
-
- struct joy
- {
- LPDIRECTINPUTDEVICE8 joy_handle;
- QString guid, name;
- bool pressed[128];
- Timer first_timer;
- DIJOYSTATE2 js_old;
-
- joy(LPDIRECTINPUTDEVICE8 handle, const QString& guid, const QString& name);
- ~joy();
-
- void release();
- bool poll(fn f);
- };
-
- std::unordered_map<QString, std::shared_ptr<joy>> joys;
-
- class enum_state
- {
- std::unordered_map<QString, std::shared_ptr<joy>> joys;
- QMainWindow& fake_main_window;
- LPDIRECTINPUT8 di;
-
- std::vector<QString> all;
- static BOOL CALLBACK EnumJoysticksCallback(const DIDEVICEINSTANCE* pdidInstance, VOID* pContext);
- static BOOL CALLBACK EnumObjectsCallback(const DIDEVICEOBJECTINSTANCE* pdidoi, VOID* ctx);
- public:
- enum_state(std::unordered_map<QString, std::shared_ptr<joy>>& joys, QMainWindow& fake_main_window, LPDIRECTINPUT8 di);
- };
-};
-
-#endif
diff --git a/opentrack/win32-shortcuts.cpp b/opentrack/win32-shortcuts.cpp
deleted file mode 100644
index a93803a3..00000000
--- a/opentrack/win32-shortcuts.cpp
+++ /dev/null
@@ -1,197 +0,0 @@
-/* Copyright (c) 2015, Stanislaw Halik <sthalik@misaki.pl>
-
- * Permission to use, copy, modify, and/or distribute this
- * software for any purpose with or without fee is hereby granted,
- * provided that the above copyright notice and this permission
- * notice appear in all copies.
- */
-
-#if defined(_WIN32)
-# ifndef DIRECTINPUT_VERSION
-# define DIRECTINPUT_VERSION 0x800
-# endif
-# include <windows.h>
-# include <dinput.h>
-
-#include <QList>
-#include <QVariant>
-#include <QDebug>
-#include "win32-shortcuts.h"
-
-QList<win_key> windows_key_mods =
- QList<win_key>({
- win_key(DIK_LCONTROL, Qt::Key::Key_Control),
- win_key(DIK_RCONTROL, Qt::Key::Key_Control),
- win_key(DIK_LALT, Qt::Key::Key_Alt),
- win_key(DIK_RALT, Qt::Key::Key_Alt),
- win_key(DIK_LSHIFT, Qt::Key::Key_Shift),
- win_key(DIK_RSHIFT, Qt::Key::Key_Shift),
- win_key(DIK_LWIN, Qt::Key::Key_unknown),
- win_key(DIK_RWIN, Qt::Key::Key_unknown)
- });
-
-QList<win_key> windows_key_sequences =
- QList<win_key>({
- win_key(DIK_F1, Qt::Key::Key_F1 ),
- win_key(DIK_F2, Qt::Key::Key_F2 ),
- win_key(DIK_F3, Qt::Key::Key_F3 ),
- win_key(DIK_F4, Qt::Key::Key_F4 ),
- win_key(DIK_F5, Qt::Key::Key_F5 ),
- win_key(DIK_F6, Qt::Key::Key_F6 ),
- win_key(DIK_F7, Qt::Key::Key_F7 ),
- win_key(DIK_F8, Qt::Key::Key_F8 ),
- win_key(DIK_F9, Qt::Key::Key_F9 ),
- win_key(DIK_F10, Qt::Key::Key_F10 ),
- win_key(DIK_F11, Qt::Key::Key_F11 ),
- win_key(DIK_F12, Qt::Key::Key_F12 ),
- win_key(DIK_LEFT, Qt::Key::Key_Left ),
- win_key(DIK_RIGHT, Qt::Key::Key_Right ),
- win_key(DIK_UP, Qt::Key::Key_Up ),
- win_key(DIK_DOWN, Qt::Key::Key_Down ),
- win_key(DIK_PRIOR, Qt::Key::Key_PageUp ),
- win_key(DIK_NEXT, Qt::Key::Key_PageDown ),
- win_key(DIK_HOME, Qt::Key::Key_Home ),
- win_key(DIK_END, Qt::Key::Key_End ),
- win_key(DIK_BACK, Qt::Key::Key_Backspace ),
- win_key(DIK_COMMA, Qt::Key::Key_Comma ),
- win_key(DIK_PERIOD, Qt::Key::Key_Period ),
- win_key(DIK_LBRACKET, Qt::Key::Key_BracketLeft ),
- win_key(DIK_RBRACKET, Qt::Key::Key_BracketRight ),
- win_key(DIK_SEMICOLON, Qt::Key::Key_Semicolon ),
- win_key(DIK_SLASH, Qt::Key::Key_Slash ),
- win_key(DIK_BACKSLASH, Qt::Key::Key_Backslash ),
- win_key(DIK_BACKSPACE, Qt::Key::Key_Backspace ),
- win_key(DIK_APOSTROPHE, Qt::Key::Key_Apostrophe ),
- win_key(DIK_GRAVE, Qt::Key::Key_QuoteLeft ),
- win_key(DIK_MINUS, Qt::Key::Key_Minus ),
- win_key(DIK_EQUALS, Qt::Key::Key_Equal ),
- win_key(DIK_PERIOD, Qt::Key::Key_Period ),
- win_key(DIK_F1, Qt::Key::Key_F1 ),
- win_key(DIK_F2, Qt::Key::Key_F2 ),
- win_key(DIK_F3, Qt::Key::Key_F3 ),
- win_key(DIK_F4, Qt::Key::Key_F4 ),
- win_key(DIK_F5, Qt::Key::Key_F5 ),
- win_key(DIK_F6, Qt::Key::Key_F6 ),
- win_key(DIK_F7, Qt::Key::Key_F7 ),
- win_key(DIK_F8, Qt::Key::Key_F8 ),
- win_key(DIK_F9, Qt::Key::Key_F9 ),
- win_key(DIK_F10, Qt::Key::Key_F10 ),
- win_key(DIK_F11, Qt::Key::Key_F11 ),
- win_key(DIK_F12, Qt::Key::Key_F12 ),
- win_key(DIK_0, Qt::Key::Key_0 ),
- win_key(DIK_1, Qt::Key::Key_1 ),
- win_key(DIK_2, Qt::Key::Key_2 ),
- win_key(DIK_3, Qt::Key::Key_3 ),
- win_key(DIK_4, Qt::Key::Key_4 ),
- win_key(DIK_5, Qt::Key::Key_5 ),
- win_key(DIK_6, Qt::Key::Key_6 ),
- win_key(DIK_7, Qt::Key::Key_7 ),
- win_key(DIK_8, Qt::Key::Key_8 ),
- win_key(DIK_9, Qt::Key::Key_9 ),
- win_key(DIK_A, Qt::Key::Key_A ),
- win_key(DIK_B, Qt::Key::Key_B ),
- win_key(DIK_C, Qt::Key::Key_C ),
- win_key(DIK_D, Qt::Key::Key_D ),
- win_key(DIK_E, Qt::Key::Key_E ),
- win_key(DIK_F, Qt::Key::Key_F ),
- win_key(DIK_G, Qt::Key::Key_G ),
- win_key(DIK_H, Qt::Key::Key_H ),
- win_key(DIK_I, Qt::Key::Key_I ),
- win_key(DIK_J, Qt::Key::Key_J ),
- win_key(DIK_K, Qt::Key::Key_K ),
- win_key(DIK_L, Qt::Key::Key_L ),
- win_key(DIK_M, Qt::Key::Key_M ),
- win_key(DIK_N, Qt::Key::Key_N ),
- win_key(DIK_O, Qt::Key::Key_O ),
- win_key(DIK_P, Qt::Key::Key_P ),
- win_key(DIK_Q, Qt::Key::Key_Q ),
- win_key(DIK_R, Qt::Key::Key_R ),
- win_key(DIK_S, Qt::Key::Key_S ),
- win_key(DIK_T, Qt::Key::Key_T ),
- win_key(DIK_U, Qt::Key::Key_U ),
- win_key(DIK_V, Qt::Key::Key_V ),
- win_key(DIK_W, Qt::Key::Key_W ),
- win_key(DIK_X, Qt::Key::Key_X ),
- win_key(DIK_Y, Qt::Key::Key_Y ),
- win_key(DIK_Z, Qt::Key::Key_Z ),
- win_key(DIK_RETURN, Qt::Key::Key_Return),
- win_key(DIK_INSERT, Qt::Key::Key_Insert),
- win_key(DIK_DELETE, Qt::Key::Key_Delete),
- win_key(DIK_SPACE, Qt::Key::Key_Space),
- win_key(DIK_SYSRQ, Qt::Key::Key_Print),
- win_key(DIK_SCROLL, Qt::Key::Key_ScrollLock),
- win_key(DIK_PAUSE, Qt::Key::Key_Pause),
- win_key(DIK_NUMLOCK, Qt::Key::Key_NumLock),
-#define mod(x, y) static_cast<Qt::Key>(x | y)
- win_key(DIK_NUMPAD0, mod(Qt::Key::Key_0, Qt::KeypadModifier)),
- win_key(DIK_NUMPAD0, mod(Qt::Key::Key_0, Qt::KeypadModifier)),
- win_key(DIK_NUMPAD1, mod(Qt::Key::Key_1, Qt::KeypadModifier)),
- win_key(DIK_NUMPAD2, mod(Qt::Key::Key_2, Qt::KeypadModifier)),
- win_key(DIK_NUMPAD3, mod(Qt::Key::Key_3, Qt::KeypadModifier)),
- win_key(DIK_NUMPAD4, mod(Qt::Key::Key_4, Qt::KeypadModifier)),
- win_key(DIK_NUMPAD5, mod(Qt::Key::Key_5, Qt::KeypadModifier)),
- win_key(DIK_NUMPAD6, mod(Qt::Key::Key_6, Qt::KeypadModifier)),
- win_key(DIK_NUMPAD7, mod(Qt::Key::Key_7, Qt::KeypadModifier)),
- win_key(DIK_NUMPAD8, mod(Qt::Key::Key_8, Qt::KeypadModifier)),
- win_key(DIK_NUMPAD9, mod(Qt::Key::Key_9, Qt::KeypadModifier)),
- win_key(DIK_NUMPADCOMMA, mod(Qt::Key::Key_Comma, Qt::KeypadModifier)),
- win_key(DIK_NUMPADENTER, mod(Qt::Key::Key_Enter, Qt::KeypadModifier)),
- win_key(DIK_NUMPADEQUALS, mod(Qt::Key::Key_Equal, Qt::KeypadModifier)),
- win_key(DIK_NUMPADMINUS, mod(Qt::Key::Key_Minus, Qt::KeypadModifier)),
- win_key(DIK_NUMPADPERIOD, mod(Qt::Key::Key_Period, Qt::KeypadModifier)),
- win_key(DIK_NUMPADPLUS, mod(Qt::Key::Key_Plus, Qt::KeypadModifier)),
- win_key(DIK_NUMPADSLASH, mod(Qt::Key::Key_Slash, Qt::KeypadModifier)),
- win_key(DIK_NUMPADSTAR, mod(Qt::Key::Key_multiply, Qt::KeypadModifier)),
- });
-
-bool win_key::to_qt(const Key& k, QKeySequence& qt_, Qt::KeyboardModifiers &mods)
-{
- for (auto& wk : windows_key_sequences)
- {
- if (wk.win == k.keycode)
- {
- qt_ = wk.qt;
- mods = Qt::NoModifier;
- if (k.ctrl) mods |= Qt::ControlModifier;
- if (k.shift) mods |= Qt::ShiftModifier;
- if (k.alt) mods |= Qt::AltModifier;
- return true;
- }
- }
- return false;
-}
-
-bool win_key::from_qt(QKeySequence qt_, int& dik, Qt::KeyboardModifiers& mods)
-{
- // CAVEAT don't use QVariant::toUInt() or conversion fails
- const unsigned qt = static_cast<unsigned>(QVariant(qt_).toInt());
- const unsigned our_mods = qt & Qt::KeyboardModifierMask;
-
- {
- const auto key_ = qt;
- for (auto& wk : windows_key_sequences)
- {
- if (wk.qt == key_)
- {
- dik = wk.win;
- mods = Qt::NoModifier;
- return true;
- }
- }
- }
- {
- const unsigned key = qt & ~Qt::KeyboardModifierMask;
- for (auto& wk : windows_key_sequences)
- {
- if (wk.qt == key)
- {
- dik = wk.win;
- mods = static_cast<Qt::KeyboardModifiers>(our_mods);
- return true;
- }
- }
- }
- return false;
-}
-
-#endif
diff --git a/opentrack/win32-shortcuts.h b/opentrack/win32-shortcuts.h
deleted file mode 100644
index 9b2c6121..00000000
--- a/opentrack/win32-shortcuts.h
+++ /dev/null
@@ -1,28 +0,0 @@
-#pragma once
-
-#ifdef _WIN32
-
-#include <QKeySequence>
-#include "opentrack/shortcuts.h"
-
-struct win_key;
-
-extern QList<win_key> windows_key_mods;
-extern QList<win_key> windows_key_sequences;
-
-#ifdef BUILD_api
-# include "opentrack-compat/export.hpp"
-#else
-# include "opentrack-compat/import.hpp"
-#endif
-
-struct OPENTRACK_EXPORT win_key
-{
- win_key(int win, Qt::Key qt) : win(win), qt(qt) {}
- int win;
- Qt::Key qt;
- static bool from_qt(QKeySequence qt_, int& dik, Qt::KeyboardModifiers &mods);
- static bool to_qt(const Key& k, QKeySequence& qt_, Qt::KeyboardModifiers &mods);
-};
-
-#endif
diff --git a/opentrack/work.hpp b/opentrack/work.hpp
deleted file mode 100644
index 3b65ba52..00000000
--- a/opentrack/work.hpp
+++ /dev/null
@@ -1,63 +0,0 @@
-/* Copyright (c) 2014-2015, Stanislaw Halik <sthalik@misaki.pl>
-
- * Permission to use, copy, modify, and/or distribute this
- * software for any purpose with or without fee is hereby granted,
- * provided that the above copyright notice and this permission
- * notice appear in all copies.
- */
-
-#pragma once
-
-#include "opentrack/main-settings.hpp"
-#include "opentrack/plugin-support.hpp"
-#include "opentrack/tracker.h"
-#include "opentrack/shortcuts.h"
-
-#include <QObject>
-#include <QFrame>
-#include <memory>
-#include <vector>
-#include <functional>
-#include <tuple>
-
-struct Work
-{
- main_settings& s;
- SelectedLibraries& libs;
- mem<Tracker> tracker;
- mem<Shortcuts> sc;
- WId handle;
- using fn = std::function<void(bool)>;
- using tt = std::tuple<key_opts&, fn, bool>;
- std::vector<tt> keys;
-
- Work(main_settings& s, Mappings& m, SelectedLibraries& libs, WId handle) :
- s(s), libs(libs),
- tracker(std::make_shared<Tracker>(s, m, libs)),
- sc(std::make_shared<Shortcuts>()),
- handle(handle),
- keys {
- tt(s.key_center, [&](bool) -> void { tracker->center(); }, true),
- tt(s.key_toggle, [&](bool) -> void { tracker->toggle_enabled(); }, true),
- tt(s.key_zero, [&](bool) -> void { tracker->zero(); }, true),
- tt(s.key_toggle_press, [&](bool x) -> void { tracker->set_toggle(!x); }, false),
- tt(s.key_zero_press, [&](bool x) -> void { tracker->set_zero(x); }, false),
- }
- {
- reload_shortcuts();
- tracker->start();
- }
-
- void reload_shortcuts()
- {
- sc->reload(keys);
- }
-
- ~Work()
- {
- sc = nullptr;
- // order matters, otherwise use-after-free -sh
- tracker = nullptr;
- libs = SelectedLibraries();
- }
-};