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(); -    } -}; | 
