From 0760fe011114fa440275b487eaf766b015f40e5b Mon Sep 17 00:00:00 2001 From: Stanislaw Halik Date: Thu, 16 Jun 2016 12:34:31 +0200 Subject: all: split "api" into "api" and "logic" Here, the "logic" module has all the stuff for building one's own graphical user interface. The "api" module has stuff used by other trackers. While at it, each of "api", "logic", and "compat" need their own export headers. This is because of preprocessor symbol clashes. This is all because a change in the "gui"-only dependency required a relink of all the trackers, protocols, and flters. It takes too long when building in the release configuration. With the split, only the "gui" module gets rebuilt. Since it has close to no static dependencies, it's fast enough. --- opentrack/CMakeLists.txt | 10 +- opentrack/dtors.cpp | 1 - opentrack/export.hpp | 18 +++ opentrack/import.hpp | 13 ++ opentrack/keybinding-worker.cpp | 194 ------------------------- opentrack/keybinding-worker.hpp | 82 ----------- opentrack/main-settings.hpp | 87 ----------- opentrack/mappings.hpp | 89 ------------ opentrack/nan.cpp | 16 -- opentrack/plugin-api.hpp | 22 ++- opentrack/selected-libraries.cpp | 37 ----- opentrack/selected-libraries.hpp | 29 ---- opentrack/shortcuts.cpp | 130 ----------------- opentrack/shortcuts.h | 69 --------- opentrack/simple-mat.hpp | 6 +- opentrack/state.hpp | 29 ---- opentrack/tracker.cpp | 305 --------------------------------------- opentrack/tracker.h | 87 ----------- opentrack/win32-joystick.cpp | 297 -------------------------------------- opentrack/win32-joystick.hpp | 100 ------------- opentrack/win32-shortcuts.cpp | 197 ------------------------- opentrack/win32-shortcuts.h | 28 ---- opentrack/work.hpp | 63 -------- 23 files changed, 45 insertions(+), 1864 deletions(-) create mode 100644 opentrack/export.hpp create mode 100644 opentrack/import.hpp delete mode 100644 opentrack/keybinding-worker.cpp delete mode 100644 opentrack/keybinding-worker.hpp delete mode 100644 opentrack/main-settings.hpp delete mode 100644 opentrack/mappings.hpp delete mode 100644 opentrack/nan.cpp delete mode 100644 opentrack/selected-libraries.cpp delete mode 100644 opentrack/selected-libraries.hpp delete mode 100644 opentrack/shortcuts.cpp delete mode 100644 opentrack/shortcuts.h delete mode 100644 opentrack/state.hpp delete mode 100644 opentrack/tracker.cpp delete mode 100644 opentrack/tracker.h delete mode 100644 opentrack/win32-joystick.cpp delete mode 100644 opentrack/win32-joystick.hpp delete mode 100644 opentrack/win32-shortcuts.cpp delete mode 100644 opentrack/win32-shortcuts.h delete mode 100644 opentrack/work.hpp (limited to 'opentrack') 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 - - * 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 -#include -#include -#include - -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; - - 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(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 - - * 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 -#include -#include -#include -#include -#include - -#undef DIRECTINPUT_VERSION -#define DIRECTINPUT_VERSION 0x0800 -#include -#include -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; - std::vector> 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 - - * 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 -#include "opentrack-compat/options.hpp" -#include "opentrack/plugin-api.hpp" - -using namespace options; - -struct axis_opts { - pbundle b; - value zero; - value invert, altp; - value 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 keycode, guid; - value 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 tracker_dll, filter_dll, protocol_dll; - axis_opts a_x, a_y, a_z, a_yaw, a_pitch, a_roll; - value tcomp_p, tcomp_tz; - value tray_enabled; - value camera_yaw, camera_pitch, camera_roll; - value center_at_startup; - value 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 -#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 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 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 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 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 - -#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 #include -#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 - -SelectedLibraries::SelectedLibraries(QFrame* frame, dylibptr t, dylibptr p, dylibptr f) : - pTracker(nullptr), - pFilter(nullptr), - pProtocol(nullptr), - correct(false) -{ - pProtocol = make_dylib_instance(p); - - if (!pProtocol) - { - qDebug() << "protocol dylib load failure"; - return; - } - - if(!pProtocol->correct()) - { - qDebug() << "protocol load failure"; - pProtocol = nullptr; - return; - } - - pTracker = make_dylib_instance(t); - pFilter = make_dylib_instance(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 - - * 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 - - -#ifdef BUILD_api -# include "opentrack-compat/export.hpp" -#else -# include "opentrack-compat/import.hpp" -#endif - -struct OPENTRACK_EXPORT SelectedLibraries { - using dylibptr = mem; - mem pTracker; - mem pFilter; - mem 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 - - * 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 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(); - - 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> &keys_) -{ - const unsigned sz = keys_.size(); - keys = std::vector(); - - 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 - - * 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 -#include -#include -#include - -#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 -#else - Key -#endif - ; - - using fun = std::function; - using tt = std::tuple; - std::vector keys; -#ifdef _WIN32 - KeybindingWorker::Token key_token; -#endif - - Shortcuts() -#ifdef _WIN32 - : key_token([&](const Key& k) { receiver(k); }) -#endif - {} - - void reload(const std::vector> &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 using dmat = Mat; 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 - - * 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 -#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{&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; -}; 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 - * - * 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 -#include - -#if defined(_WIN32) -# include -#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(*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 - - * 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 - -#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 -#include - -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 -#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::get_joy_info() -{ - QMutexLocker l(&mtx); - - std::vector 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>(); - 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> &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(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(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(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 -#include -#include -#include -#include -#include -#ifndef DIRECTINPUT_VERSION -# define DIRECTINPUT_VERSION 0x800 -#endif -#include -#include -#include "opentrack-compat/timer.hpp" -#include -#include -#include -#include -#include - -namespace std { -template<> -struct hash -{ - 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; - - 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 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> joys; - - class enum_state - { - std::unordered_map> joys; - QMainWindow& fake_main_window; - LPDIRECTINPUT8 di; - - std::vector 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>& 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 - - * 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 -# include - -#include -#include -#include -#include "win32-shortcuts.h" - -QList windows_key_mods = - QList({ - 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 windows_key_sequences = - QList({ - 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(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(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(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 -#include "opentrack/shortcuts.h" - -struct win_key; - -extern QList windows_key_mods; -extern QList 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 - - * 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 -#include -#include -#include -#include -#include - -struct Work -{ - main_settings& s; - SelectedLibraries& libs; - mem tracker; - mem sc; - WId handle; - using fn = std::function; - using tt = std::tuple; - std::vector keys; - - Work(main_settings& s, Mappings& m, SelectedLibraries& libs, WId handle) : - s(s), libs(libs), - tracker(std::make_shared(s, m, libs)), - sc(std::make_shared()), - 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(); - } -}; -- cgit v1.2.3