diff options
Diffstat (limited to 'opentrack')
-rw-r--r-- | opentrack/CMakeLists.txt | 10 | ||||
-rw-r--r-- | opentrack/dtors.cpp | 1 | ||||
-rw-r--r-- | opentrack/export.hpp | 18 | ||||
-rw-r--r-- | opentrack/import.hpp | 13 | ||||
-rw-r--r-- | opentrack/keybinding-worker.cpp | 194 | ||||
-rw-r--r-- | opentrack/keybinding-worker.hpp | 82 | ||||
-rw-r--r-- | opentrack/main-settings.hpp | 87 | ||||
-rw-r--r-- | opentrack/mappings.hpp | 89 | ||||
-rw-r--r-- | opentrack/nan.cpp | 16 | ||||
-rw-r--r-- | opentrack/plugin-api.hpp | 22 | ||||
-rw-r--r-- | opentrack/selected-libraries.cpp | 37 | ||||
-rw-r--r-- | opentrack/selected-libraries.hpp | 29 | ||||
-rw-r--r-- | opentrack/shortcuts.cpp | 130 | ||||
-rw-r--r-- | opentrack/shortcuts.h | 69 | ||||
-rw-r--r-- | opentrack/simple-mat.hpp | 6 | ||||
-rw-r--r-- | opentrack/state.hpp | 29 | ||||
-rw-r--r-- | opentrack/tracker.cpp | 305 | ||||
-rw-r--r-- | opentrack/tracker.h | 87 | ||||
-rw-r--r-- | opentrack/win32-joystick.cpp | 297 | ||||
-rw-r--r-- | opentrack/win32-joystick.hpp | 100 | ||||
-rw-r--r-- | opentrack/win32-shortcuts.cpp | 197 | ||||
-rw-r--r-- | opentrack/win32-shortcuts.h | 28 | ||||
-rw-r--r-- | opentrack/work.hpp | 63 |
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(); - } -}; |