diff options
-rw-r--r-- | proto-mouse/ftnoir_mousecontrols.ui | 201 | ||||
-rw-r--r-- | proto-mouse/ftnoir_protocol_mouse.cpp | 49 | ||||
-rw-r--r-- | proto-mouse/ftnoir_protocol_mouse.h | 10 | ||||
-rw-r--r-- | proto-mouse/ftnoir_protocol_mouse_dialog.cpp | 19 | ||||
-rw-r--r-- | proto-mouse/lang/nl_NL.ts | 30 | ||||
-rw-r--r-- | proto-mouse/lang/ru_RU.ts | 30 | ||||
-rw-r--r-- | proto-mouse/lang/stub.ts | 30 | ||||
-rw-r--r-- | proto-mouse/lang/zh_CN.ts | 30 | ||||
-rw-r--r-- | proto-mouse/mouse-settings.hpp | 22 | ||||
-rw-r--r-- | proto-vjoystick/lang/nl_NL.ts | 4 | ||||
-rw-r--r-- | proto-vjoystick/lang/ru_RU.ts | 4 | ||||
-rw-r--r-- | proto-vjoystick/lang/stub.ts | 4 | ||||
-rw-r--r-- | proto-vjoystick/lang/zh_CN.ts | 4 | ||||
-rw-r--r-- | proto-vjoystick/vjoystick.cpp | 78 | ||||
-rw-r--r-- | proto-vjoystick/vjoystick.h | 25 |
15 files changed, 271 insertions, 269 deletions
diff --git a/proto-mouse/ftnoir_mousecontrols.ui b/proto-mouse/ftnoir_mousecontrols.ui index f970f887..45b33470 100644 --- a/proto-mouse/ftnoir_mousecontrols.ui +++ b/proto-mouse/ftnoir_mousecontrols.ui @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="UTF-8"?> <ui version="4.0"> - <class>UICMOUSEControls</class> - <widget class="QWidget" name="UICMOUSEControls"> + <class>UI_mouse</class> + <widget class="QWidget" name="UI_mouse"> <property name="windowModality"> <enum>Qt::NonModal</enum> </property> @@ -9,70 +9,42 @@ <rect> <x>0</x> <y>0</y> - <width>413</width> - <height>155</height> + <width>360</width> + <height>146</height> </rect> </property> <property name="minimumSize"> <size> - <width>413</width> + <width>360</width> <height>0</height> </size> </property> <property name="windowTitle"> - <string>Mouse protocol settings</string> + <string>Mouse protocol</string> </property> <property name="windowIcon"> <iconset resource="win32-mouse-protocol.qrc"> <normaloff>:/images/mouse.png</normaloff>:/images/mouse.png</iconset> </property> - <property name="layoutDirection"> - <enum>Qt::LeftToRight</enum> - </property> - <property name="autoFillBackground"> - <bool>false</bool> - </property> - <layout class="QGridLayout" name="gridLayout"> + <layout class="QFormLayout" name="formLayout"> + <property name="leftMargin"> + <number>9</number> + </property> + <property name="topMargin"> + <number>11</number> + </property> + <property name="rightMargin"> + <number>6</number> + </property> <item row="0" column="0"> <widget class="QLabel" name="textLabel2_2"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Minimum" vsizetype="Maximum"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="text"> - <string>Map mouse X to:</string> - </property> - <property name="alignment"> - <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> - </property> - <property name="wordWrap"> - <bool>false</bool> - </property> - </widget> - </item> - <item row="1" column="0"> - <widget class="QLabel" name="textLabel2_3"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Minimum" vsizetype="Maximum"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> <property name="text"> - <string>Map mouse Y to:</string> - </property> - <property name="alignment"> - <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> - </property> - <property name="wordWrap"> - <bool>false</bool> + <string>X axis</string> </property> </widget> </item> - <item row="0" column="1" colspan="2"> - <widget class="QComboBox" name="cbxSelectMouse_X"> + <item row="0" column="1"> + <widget class="QComboBox" name="axis_x"> <property name="sizePolicy"> <sizepolicy hsizetype="Preferred" vsizetype="Maximum"> <horstretch>0</horstretch> @@ -81,16 +53,10 @@ </property> <property name="maximumSize"> <size> - <width>80</width> + <width>105</width> <height>16777215</height> </size> </property> - <property name="toolTip"> - <string>Select Number</string> - </property> - <property name="insertPolicy"> - <enum>QComboBox::InsertAlphabetically</enum> - </property> <item> <property name="text"> <string>None</string> @@ -128,8 +94,38 @@ </item> </widget> </item> - <item row="1" column="1" colspan="2"> - <widget class="QComboBox" name="cbxSelectMouse_Y"> + <item row="1" column="0"> + <widget class="QLabel" name="textLabel2_6"> + <property name="text"> + <string>Sensitivity</string> + </property> + </widget> + </item> + <item row="1" column="1"> + <widget class="QSlider" name="sensitivity_x"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Preferred" vsizetype="Minimum"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="tickInterval"> + <number>25</number> + </property> + </widget> + </item> + <item row="2" column="0"> + <widget class="QLabel" name="textLabel2_3"> + <property name="text"> + <string>Y axis</string> + </property> + </widget> + </item> + <item row="2" column="1"> + <widget class="QComboBox" name="axis_y"> <property name="sizePolicy"> <sizepolicy hsizetype="Preferred" vsizetype="Maximum"> <horstretch>0</horstretch> @@ -138,16 +134,10 @@ </property> <property name="maximumSize"> <size> - <width>80</width> + <width>105</width> <height>16777215</height> </size> </property> - <property name="toolTip"> - <string>Select Number</string> - </property> - <property name="insertPolicy"> - <enum>QComboBox::InsertAlphabetically</enum> - </property> <item> <property name="text"> <string>None</string> @@ -185,36 +175,17 @@ </item> </widget> </item> - <item row="4" column="1"> - <widget class="QDialogButtonBox" name="buttonBox"> - <property name="standardButtons"> - <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set> - </property> - </widget> - </item> - <item row="2" column="0"> - <widget class="QLabel" name="textLabel2_4"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Minimum" vsizetype="Maximum"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> + <item row="3" column="0"> + <widget class="QLabel" name="textLabel2_7"> <property name="text"> - <string>X axis sensitivity</string> - </property> - <property name="alignment"> - <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> - </property> - <property name="wordWrap"> - <bool>false</bool> + <string>Sensitivity</string> </property> </widget> </item> - <item row="2" column="1"> - <widget class="QSlider" name="sensitivity_x"> + <item row="3" column="1"> + <widget class="QSlider" name="sensitivity_y"> <property name="sizePolicy"> - <sizepolicy hsizetype="Expanding" vsizetype="Maximum"> + <sizepolicy hsizetype="Preferred" vsizetype="Minimum"> <horstretch>0</horstretch> <verstretch>0</verstretch> </sizepolicy> @@ -227,38 +198,49 @@ </property> </widget> </item> - <item row="3" column="0"> - <widget class="QLabel" name="textLabel2_5"> + <item row="4" column="0"> + <widget class="QLabel" name="label"> + <property name="text"> + <string>Method</string> + </property> + </widget> + </item> + <item row="4" column="1"> + <widget class="QComboBox" name="input_method"> <property name="sizePolicy"> - <sizepolicy hsizetype="Minimum" vsizetype="Maximum"> + <sizepolicy hsizetype="Preferred" vsizetype="Maximum"> <horstretch>0</horstretch> <verstretch>0</verstretch> </sizepolicy> </property> - <property name="text"> - <string>Y axis sensitivity</string> - </property> - <property name="alignment"> - <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> - </property> - <property name="wordWrap"> - <bool>false</bool> + <property name="maximumSize"> + <size> + <width>105</width> + <height>16777215</height> + </size> </property> + <item> + <property name="text"> + <string>Direct input</string> + </property> + </item> + <item> + <property name="text"> + <string>Legacy</string> + </property> + </item> </widget> </item> - <item row="3" column="1"> - <widget class="QSlider" name="sensitivity_y"> + <item row="5" column="0" colspan="2"> + <widget class="QDialogButtonBox" name="buttonBox"> <property name="sizePolicy"> - <sizepolicy hsizetype="Expanding" vsizetype="Maximum"> + <sizepolicy hsizetype="Expanding" vsizetype="Preferred"> <horstretch>0</horstretch> <verstretch>0</verstretch> </sizepolicy> </property> - <property name="orientation"> - <enum>Qt::Horizontal</enum> - </property> - <property name="tickInterval"> - <number>25</number> + <property name="standardButtons"> + <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set> </property> </widget> </item> @@ -268,9 +250,4 @@ <include location="win32-mouse-protocol.qrc"/> </resources> <connections/> - <slots> - <slot>startEngineClicked()</slot> - <slot>stopEngineClicked()</slot> - <slot>cameraSettingsClicked()</slot> - </slots> </ui> diff --git a/proto-mouse/ftnoir_protocol_mouse.cpp b/proto-mouse/ftnoir_protocol_mouse.cpp index 60c04cbe..2b3af2f0 100644 --- a/proto-mouse/ftnoir_protocol_mouse.cpp +++ b/proto-mouse/ftnoir_protocol_mouse.cpp @@ -9,14 +9,11 @@ #include "api/plugin-api.hpp" #include "compat/math.hpp" + #include <cmath> #include <algorithm> #include <windows.h> -#ifndef MOUSEEVENTF_MOVE_NOCOALESCE -# define MOUSEEVENTF_MOVE_NOCOALESCE 0x2000 -#endif - static const double invert[] = { 1., 1., 1., 1., -1., 1. @@ -24,8 +21,8 @@ static const double invert[] = { void mouse::pose(const double* headpose) { - const int axis_x = s.Mouse_X - 1; - const int axis_y = s.Mouse_Y - 1; + const int axis_x = s.mouse_x - 1; + const int axis_y = s.mouse_y - 1; int mouse_x = 0, mouse_y = 0; @@ -42,18 +39,38 @@ void mouse::pose(const double* headpose) const int dx = get_delta(mouse_x, last_x), dy = get_delta(mouse_y, last_y); + last_x = mouse_x; last_y = mouse_y; + if (dx || dy) { - INPUT input; - input.type = INPUT_MOUSE; - MOUSEINPUT& mi = input.mi; - mi = {}; - mi.dx = dx; - mi.dy = dy; - mi.dwFlags = MOUSEEVENTF_MOVE | MOUSEEVENTF_MOVE_NOCOALESCE; - - (void)SendInput(1, &input, sizeof(input)); - last_x = mouse_x; last_y = mouse_y; + switch (s.input_method) + { + default: + eval_once(qDebug() << "proto/mouse: invalid input method"); + [[fallthrough]]; + case input_direct: + { + INPUT input; + input.type = INPUT_MOUSE; + MOUSEINPUT& mi = input.mi; + mi = {}; + mi.dx = dx; + mi.dy = dy; + mi.dwFlags = MOUSEEVENTF_MOVE; + + (void)SendInput(1, &input, sizeof(input)); + + break; + } + case input_legacy: + { + POINT pt{}; + (void)GetCursorPos(&pt); + (void)SetCursorPos(pt.x + dx, pt.y + dy); + + break; + } + } } } diff --git a/proto-mouse/ftnoir_protocol_mouse.h b/proto-mouse/ftnoir_protocol_mouse.h index c8709604..b7cf61cf 100644 --- a/proto-mouse/ftnoir_protocol_mouse.h +++ b/proto-mouse/ftnoir_protocol_mouse.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2015 Stanislaw Halik <sthalik@misaki.pl> +/* Copyright (c) 2015, 2019 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 @@ -10,10 +10,10 @@ #include "ui_ftnoir_mousecontrols.h" #include "mouse-settings.hpp" -#include "compat/tr.hpp" +#include "api/plugin-api.hpp" #include <QDebug> -#include "api/plugin-api.hpp" + using namespace options; class mouse : public TR, public IProtocol @@ -37,7 +37,7 @@ class MOUSEControls: public IProtocolDialog { Q_OBJECT - Ui::UICMOUSEControls ui; + Ui::UI_mouse ui; mouse_settings s; private slots: @@ -46,7 +46,7 @@ private slots: public: MOUSEControls(); - void register_protocol(IProtocol *) override {} + void register_protocol(IProtocol*) override {} void unregister_protocol() override {} }; diff --git a/proto-mouse/ftnoir_protocol_mouse_dialog.cpp b/proto-mouse/ftnoir_protocol_mouse_dialog.cpp index 77b1ff2e..5646718c 100644 --- a/proto-mouse/ftnoir_protocol_mouse_dialog.cpp +++ b/proto-mouse/ftnoir_protocol_mouse_dialog.cpp @@ -3,19 +3,25 @@ MOUSEControls::MOUSEControls() { - ui.setupUi( this ); + ui.setupUi(this); - connect(ui.buttonBox, SIGNAL(accepted()), this, SLOT(doOK())); - connect(ui.buttonBox, SIGNAL(rejected()), this, SLOT(doCancel())); + connect(ui.buttonBox, &QDialogButtonBox::accepted, this, &MOUSEControls::doOK); + connect(ui.buttonBox, &QDialogButtonBox::rejected, this, &MOUSEControls::doCancel); - tie_setting(s.Mouse_X, ui.cbxSelectMouse_X); - tie_setting(s.Mouse_Y, ui.cbxSelectMouse_Y); + tie_setting(s.mouse_x, ui.axis_x); + tie_setting(s.mouse_y, ui.axis_y); tie_setting(s.sensitivity_x, ui.sensitivity_x); tie_setting(s.sensitivity_y, ui.sensitivity_y); + + const int data[] = { input_direct, input_legacy }; + for (unsigned k = 0; k < std::size(data); k++) + ui.input_method->setItemData(k, data[k]); + tie_setting(s.input_method, ui.input_method); } -void MOUSEControls::doOK() { +void MOUSEControls::doOK() +{ s.b->save(); close(); } @@ -24,4 +30,3 @@ void MOUSEControls::doCancel() { close(); } - diff --git a/proto-mouse/lang/nl_NL.ts b/proto-mouse/lang/nl_NL.ts index 8994756b..13a75520 100644 --- a/proto-mouse/lang/nl_NL.ts +++ b/proto-mouse/lang/nl_NL.ts @@ -2,21 +2,13 @@ <!DOCTYPE TS> <TS version="2.1" language="nl_NL"> <context> - <name>UICMOUSEControls</name> + <name>UI_mouse</name> <message> - <source>Mouse protocol settings</source> + <source>Mouse protocol</source> <translation type="unfinished"></translation> </message> <message> - <source>Map mouse X to:</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Map mouse Y to:</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Select Number</source> + <source>X axis</source> <translation type="unfinished"></translation> </message> <message> @@ -48,11 +40,23 @@ <translation type="unfinished"></translation> </message> <message> - <source>X axis sensitivity</source> + <source>Y axis</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Sensitivity</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Method</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Direct input</source> <translation type="unfinished"></translation> </message> <message> - <source>Y axis sensitivity</source> + <source>Legacy</source> <translation type="unfinished"></translation> </message> </context> diff --git a/proto-mouse/lang/ru_RU.ts b/proto-mouse/lang/ru_RU.ts index ab5e650c..bdadb6bd 100644 --- a/proto-mouse/lang/ru_RU.ts +++ b/proto-mouse/lang/ru_RU.ts @@ -2,21 +2,13 @@ <!DOCTYPE TS> <TS version="2.1" language="ru_RU"> <context> - <name>UICMOUSEControls</name> + <name>UI_mouse</name> <message> - <source>Mouse protocol settings</source> + <source>Mouse protocol</source> <translation type="unfinished"></translation> </message> <message> - <source>Map mouse X to:</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Map mouse Y to:</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Select Number</source> + <source>X axis</source> <translation type="unfinished"></translation> </message> <message> @@ -48,11 +40,23 @@ <translation type="unfinished"></translation> </message> <message> - <source>X axis sensitivity</source> + <source>Y axis</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Sensitivity</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Method</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Direct input</source> <translation type="unfinished"></translation> </message> <message> - <source>Y axis sensitivity</source> + <source>Legacy</source> <translation type="unfinished"></translation> </message> </context> diff --git a/proto-mouse/lang/stub.ts b/proto-mouse/lang/stub.ts index 1bbd5991..2a811df1 100644 --- a/proto-mouse/lang/stub.ts +++ b/proto-mouse/lang/stub.ts @@ -2,21 +2,13 @@ <!DOCTYPE TS> <TS version="2.1"> <context> - <name>UICMOUSEControls</name> + <name>UI_mouse</name> <message> - <source>Mouse protocol settings</source> + <source>Mouse protocol</source> <translation type="unfinished"></translation> </message> <message> - <source>Map mouse X to:</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Map mouse Y to:</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Select Number</source> + <source>X axis</source> <translation type="unfinished"></translation> </message> <message> @@ -48,11 +40,23 @@ <translation type="unfinished"></translation> </message> <message> - <source>X axis sensitivity</source> + <source>Y axis</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Sensitivity</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Method</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Direct input</source> <translation type="unfinished"></translation> </message> <message> - <source>Y axis sensitivity</source> + <source>Legacy</source> <translation type="unfinished"></translation> </message> </context> diff --git a/proto-mouse/lang/zh_CN.ts b/proto-mouse/lang/zh_CN.ts index 1bbd5991..2a811df1 100644 --- a/proto-mouse/lang/zh_CN.ts +++ b/proto-mouse/lang/zh_CN.ts @@ -2,21 +2,13 @@ <!DOCTYPE TS> <TS version="2.1"> <context> - <name>UICMOUSEControls</name> + <name>UI_mouse</name> <message> - <source>Mouse protocol settings</source> + <source>Mouse protocol</source> <translation type="unfinished"></translation> </message> <message> - <source>Map mouse X to:</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Map mouse Y to:</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Select Number</source> + <source>X axis</source> <translation type="unfinished"></translation> </message> <message> @@ -48,11 +40,23 @@ <translation type="unfinished"></translation> </message> <message> - <source>X axis sensitivity</source> + <source>Y axis</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Sensitivity</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Method</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Direct input</source> <translation type="unfinished"></translation> </message> <message> - <source>Y axis sensitivity</source> + <source>Legacy</source> <translation type="unfinished"></translation> </message> </context> diff --git a/proto-mouse/mouse-settings.hpp b/proto-mouse/mouse-settings.hpp index c485e534..fda06166 100644 --- a/proto-mouse/mouse-settings.hpp +++ b/proto-mouse/mouse-settings.hpp @@ -2,20 +2,22 @@ #include "options/options.hpp" +enum input_method { + input_direct = 0, input_legacy = 1, +}; + namespace mouse_impl { using namespace options; -struct mouse_settings : opts { - value<int> Mouse_X, Mouse_Y; - value<slider_value> sensitivity_x, sensitivity_y; - mouse_settings() : - opts("mouse-proto"), - Mouse_X(b, "mouse-x", 0), - Mouse_Y(b, "mouse-y", 0), - sensitivity_x(b, "mouse-sensitivity-x", { 200, 25, 500 }), - sensitivity_y(b, "mouse-sensitivity-y", { 200, 25, 500 }) - {} +struct mouse_settings : opts +{ + value<int> mouse_x { b, "mouse-x", 0 }, mouse_y { b, "mouse-y", 0 }; + value<slider_value> sensitivity_x { b, "mouse-sensitivity-x", { 200, 25, 500 } }; + value<slider_value> sensitivity_y { b, "mouse-sensitivity-y", { 200, 25, 500 } }; + value<input_method> input_method { b, "input-method", input_direct }; + + mouse_settings() : opts("mouse-proto") {} }; } // ns mouse_impl diff --git a/proto-vjoystick/lang/nl_NL.ts b/proto-vjoystick/lang/nl_NL.ts index 46d0398d..027e5f39 100644 --- a/proto-vjoystick/lang/nl_NL.ts +++ b/proto-vjoystick/lang/nl_NL.ts @@ -46,10 +46,6 @@ <translation type="unfinished"></translation> </message> <message> - <source>unknown error</source> - <translation type="unfinished"></translation> - </message> - <message> <source>Virtual joystick</source> <translation type="unfinished"></translation> </message> diff --git a/proto-vjoystick/lang/ru_RU.ts b/proto-vjoystick/lang/ru_RU.ts index 6a618904..583144ef 100644 --- a/proto-vjoystick/lang/ru_RU.ts +++ b/proto-vjoystick/lang/ru_RU.ts @@ -46,10 +46,6 @@ <translation type="unfinished"></translation> </message> <message> - <source>unknown error</source> - <translation type="unfinished"></translation> - </message> - <message> <source>Virtual joystick</source> <translation type="unfinished"></translation> </message> diff --git a/proto-vjoystick/lang/stub.ts b/proto-vjoystick/lang/stub.ts index c8909cfe..a71e2882 100644 --- a/proto-vjoystick/lang/stub.ts +++ b/proto-vjoystick/lang/stub.ts @@ -46,10 +46,6 @@ <translation type="unfinished"></translation> </message> <message> - <source>unknown error</source> - <translation type="unfinished"></translation> - </message> - <message> <source>Virtual joystick</source> <translation type="unfinished"></translation> </message> diff --git a/proto-vjoystick/lang/zh_CN.ts b/proto-vjoystick/lang/zh_CN.ts index c8909cfe..a71e2882 100644 --- a/proto-vjoystick/lang/zh_CN.ts +++ b/proto-vjoystick/lang/zh_CN.ts @@ -46,10 +46,6 @@ <translation type="unfinished"></translation> </message> <message> - <source>unknown error</source> - <translation type="unfinished"></translation> - </message> - <message> <source>Virtual joystick</source> <translation type="unfinished"></translation> </message> diff --git a/proto-vjoystick/vjoystick.cpp b/proto-vjoystick/vjoystick.cpp index bb0f0f51..d781d8e1 100644 --- a/proto-vjoystick/vjoystick.cpp +++ b/proto-vjoystick/vjoystick.cpp @@ -39,7 +39,7 @@ const unsigned char handle::axis_ids[6] = // HID_USAGE_WHL, }; -static const double val_minmax[6] = +static constexpr double val_minmax[6] = { 50, 50, @@ -49,56 +49,54 @@ static const double val_minmax[6] = 180 }; -void handle::init() +bool handle::init() { + if (!AcquireVJD(OPENTRACK_VJOYSTICK_ID)) + return false; + + unsigned cnt = 0; + bool status = true; + for (unsigned i = 0; i < axis_count; i++) { if (!GetVJDAxisExist(OPENTRACK_VJOYSTICK_ID, axis_ids[i])) - { - // avoid floating point division by zero - axis_min[i] = 0; - axis_max[i] = 1; continue; - } - GetVJDAxisMin(OPENTRACK_VJOYSTICK_ID, axis_ids[i], &axis_min[i]); - GetVJDAxisMax(OPENTRACK_VJOYSTICK_ID, axis_ids[i], &axis_max[i]); + cnt++; + status &= !!GetVJDAxisMin(OPENTRACK_VJOYSTICK_ID, axis_ids[i], &axis_min[i]); + status &= !!GetVJDAxisMax(OPENTRACK_VJOYSTICK_ID, axis_ids[i], &axis_max[i]); } - (void) ResetVJD(OPENTRACK_VJOYSTICK_ID); + //(void)ResetVJD(OPENTRACK_VJOYSTICK_ID); + + return status && cnt; } handle::handle() { - const bool ret = AcquireVJD(OPENTRACK_VJOYSTICK_ID); - if (!ret) - { - if (!isVJDExists(OPENTRACK_VJOYSTICK_ID)) - joy_state = state_notent; - else - joy_state = state_fail; - } + if (!isVJDExists(OPENTRACK_VJOYSTICK_ID)) + joy_state = state::notent; + else if (init()) + joy_state = state::success; else - { - joy_state = state_success; - init(); - } + joy_state = state::fail; } handle::~handle() { - if (joy_state == state_success) - { - (void) RelinquishVJD(OPENTRACK_VJOYSTICK_ID); - joy_state = state_fail; - } + if (joy_state == state::success) + RelinquishVJD(OPENTRACK_VJOYSTICK_ID); } -LONG handle::to_axis_value(unsigned axis_id, double val) +bool handle::to_axis_value(unsigned axis_id, double val, int& ret) const { + if (!axis_min[axis_id] && !axis_max[axis_id]) + return false; + const double minmax = val_minmax[axis_id]; const double min = axis_min[axis_id]; const double max = axis_max[axis_id]; - return LONG(clamp((val+minmax) * max / (2*minmax) - min, min, max)); + ret = int(clamp((val+minmax) * max / (2*minmax) - min, min, max)); + return true; } vjoystick_proto::vjoystick_proto() = default; @@ -106,7 +104,9 @@ vjoystick_proto::~vjoystick_proto() = default; module_status vjoystick_proto::initialize() { - if (h.get_state() != state_success) + h = handle{}; + + if (h->get_state() != state::success) { QMessageBox msgbox; msgbox.setIcon(QMessageBox::Critical); @@ -131,27 +131,29 @@ module_status vjoystick_proto::initialize() } } - switch (h.get_state()) + switch (h->get_state()) { - case state_notent: + default: + case state::notent: return error(tr("vjoystick not installed or disabled")); - case state_fail: + case state::fail: return error(tr("can't initialize vjoystick")); - case state_success: + case state::success: return status_ok(); - default: - return error(tr("unknown error")); } } void vjoystick_proto::pose(const double *pose) { - if (h.get_state() != state_success) + if (h->get_state() != state::success) return; for (unsigned i = 0; i < handle::axis_count; i++) { - SetAxis(h.to_axis_value(i, pose[i]), OPENTRACK_VJOYSTICK_ID, handle::axis_ids[i]); + int val; + if (!h->to_axis_value(i, pose[i], val)) + continue; + SetAxis(val, OPENTRACK_VJOYSTICK_ID, handle::axis_ids[i]); } } diff --git a/proto-vjoystick/vjoystick.h b/proto-vjoystick/vjoystick.h index 0de86638..96d10e9e 100644 --- a/proto-vjoystick/vjoystick.h +++ b/proto-vjoystick/vjoystick.h @@ -10,13 +10,13 @@ #include "api/plugin-api.hpp" #include "compat/macros.hpp" -#include <windows.h> +#include <optional> -enum state : signed char +enum class state : int { - state_notent = -1, - state_fail = -2, - state_success = 1, + notent = -1, + fail = -2, + success = 1, }; class handle final @@ -26,23 +26,22 @@ public: static const unsigned char axis_ids[axis_count]; private: - state joy_state; - LONG axis_min[6] {}; - LONG axis_max[6] {}; - - void init(); + state joy_state = state::notent; + long axis_min[6] {}; + long axis_max[6] {}; + [[nodiscard]] bool init(); public: handle(); ~handle(); - state get_state() { return joy_state; } - LONG to_axis_value(unsigned axis_id, double val); + state get_state() const { return joy_state; } + [[nodiscard]] bool to_axis_value(unsigned axis_id, double val, int& ret) const; }; class vjoystick_proto : public TR, public IProtocol { Q_OBJECT - handle h; + std::optional<handle> h; public: vjoystick_proto(); ~vjoystick_proto() override; |