diff options
-rw-r--r-- | gui/main-window.cpp | 42 | ||||
-rw-r--r-- | logic/state.hpp | 2 | ||||
-rw-r--r-- | logic/work.cpp | 12 | ||||
-rw-r--r-- | logic/work.hpp | 8 |
4 files changed, 32 insertions, 32 deletions
diff --git a/gui/main-window.cpp b/gui/main-window.cpp index 3bef4da5..8a04cab4 100644 --- a/gui/main-window.cpp +++ b/gui/main-window.cpp @@ -441,39 +441,31 @@ void MainWindow::startTracker() if (work) return; - // tracker dtor needs run first - work = nullptr; - - libs = SelectedLibraries(ui.video_frame, current_tracker(), current_protocol(), current_filter()); - { double p[6] = {0,0,0, 0,0,0}; display_pose(p, p); } - if (!libs.correct) + work = std::make_shared<Work>(pose, ui.video_frame, current_tracker(), current_protocol(), current_filter()); + + if (!work->is_ok()) { QMessageBox::warning(this, tr("Library load error"), tr("One of libraries failed to load. Check installation."), QMessageBox::Ok, QMessageBox::NoButton); - libs = SelectedLibraries(); + work = nullptr; return; } - save_modules(); - - work = std::make_shared<Work>(pose, libs, winId()); - work->reload_shortcuts(); - if (pTrackerDialog) - pTrackerDialog->register_tracker(libs.pTracker.get()); + pTrackerDialog->register_tracker(work->libs.pTracker.get()); if (pFilterDialog) - pFilterDialog->register_filter(libs.pFilter.get()); + pFilterDialog->register_filter(work->libs.pFilter.get()); if (pProtocolDialog) - pProtocolDialog->register_protocol(libs.pProtocol.get()); + pProtocolDialog->register_protocol(work->libs.pProtocol.get()); pose_update_timer.start(50); @@ -505,7 +497,6 @@ void MainWindow::stopTracker() pFilterDialog->unregister_filter(); work = nullptr; - libs = SelectedLibraries(); { double p[6] = {0,0,0, 0,0,0}; @@ -521,6 +512,9 @@ void MainWindow::stopTracker() void MainWindow::display_pose(const double *mapped, const double *raw) { + if (!work) + return; + ui.pose_display->rotateBy(mapped[Yaw], mapped[Pitch], -mapped[Roll], mapped[TX], mapped[TY], mapped[TZ]); @@ -544,8 +538,8 @@ void MainWindow::display_pose(const double *mapped, const double *raw) } QString game_title; - if (libs.pProtocol) - game_title = libs.pProtocol->game_name(); + if (work->libs.pProtocol) + game_title = work->libs.pProtocol->game_name(); set_title(game_title); } @@ -623,20 +617,20 @@ bool MainWindow::mk_dialog(mem<dylib> lib, ptr<t>& d) void MainWindow::showTrackerSettings() { - if (mk_dialog(current_tracker(), pTrackerDialog) && libs.pTracker) - pTrackerDialog->register_tracker(libs.pTracker.get()); + if (mk_dialog(current_tracker(), pTrackerDialog) && work && work->libs.pTracker) + pTrackerDialog->register_tracker(work->libs.pTracker.get()); } void MainWindow::showProtocolSettings() { - if (mk_dialog(current_protocol(), pProtocolDialog) && libs.pProtocol) - pProtocolDialog->register_protocol(libs.pProtocol.get()); + if (mk_dialog(current_protocol(), pProtocolDialog) && work && work->libs.pProtocol) + pProtocolDialog->register_protocol(work->libs.pProtocol.get()); } void MainWindow::showFilterSettings() { - if (mk_dialog(current_filter(), pFilterDialog) && libs.pFilter) - pFilterDialog->register_filter(libs.pFilter.get()); + if (mk_dialog(current_filter(), pFilterDialog) && work && work->libs.pFilter) + pFilterDialog->register_filter(work->libs.pFilter.get()); } void MainWindow::show_options_dialog() diff --git a/logic/state.hpp b/logic/state.hpp index 4e021949..f5892557 100644 --- a/logic/state.hpp +++ b/logic/state.hpp @@ -13,7 +13,6 @@ using namespace options; #include "api/plugin-support.hpp" #include "main-settings.hpp" #include "mappings.hpp" -#include "selected-libraries.hpp" #include "work.hpp" #include <vector> #include <QString> @@ -25,7 +24,6 @@ struct 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/logic/work.cpp b/logic/work.cpp index ebac4c39..102b859e 100644 --- a/logic/work.cpp +++ b/logic/work.cpp @@ -60,12 +60,11 @@ std::shared_ptr<TrackLogger> Work::make_logger(main_settings &s) } -Work::Work(Mappings& m, SelectedLibraries& libs, WId handle) : - libs(libs), +Work::Work(Mappings& m, QFrame* frame, mem<dylib>& tracker_, mem<dylib>& filter_, mem<dylib>& proto_) : + libs(frame, tracker_, filter_, proto_), logger(make_logger(s)), tracker(std::make_shared<Tracker>(m, libs, *logger)), sc(std::make_shared<Shortcuts>()), - handle(handle), keys { key_tuple(s.key_center1, [&](bool) -> void { tracker->center(); }, true), key_tuple(s.key_center2, [&](bool) -> void { tracker->center(); }, true), @@ -83,6 +82,8 @@ Work::Work(Mappings& m, SelectedLibraries& libs, WId handle) : key_tuple(s.key_zero_press2, [&](bool x) -> void { tracker->set_zero(x); }, false), } { + if (!is_ok()) + return; reload_shortcuts(); tracker->start(); } @@ -92,6 +93,11 @@ void Work::reload_shortcuts() sc->reload(keys); } +bool Work::is_ok() const +{ + return libs.correct; +} + Work::~Work() { // order matters, otherwise use-after-free -sh diff --git a/logic/work.hpp b/logic/work.hpp index b614c580..ff0524bd 100644 --- a/logic/work.hpp +++ b/logic/work.hpp @@ -14,6 +14,8 @@ #include "shortcuts.h" #include "export.hpp" #include "tracklogger.hpp" +#include "logic/selected-libraries.hpp" +#include "api/plugin-support.hpp" #include <QObject> #include <QFrame> @@ -27,16 +29,16 @@ struct OPENTRACK_LOGIC_EXPORT Work using fn_t = std::function<void(bool)>; using key_tuple = std::tuple<key_opts&, fn_t, bool>; main_settings s; // tracker needs settings, so settings must come before it - SelectedLibraries& libs; std::shared_ptr<TrackLogger> logger; // must come before tracker, since tracker depends on it + SelectedLibraries libs; // idem std::shared_ptr<Tracker> tracker; std::shared_ptr<Shortcuts> sc; - WId handle; std::vector<key_tuple> keys; - Work(Mappings& m, SelectedLibraries& libs, WId handle); + Work(Mappings& m, QFrame* frame, mem<dylib>& tracker, mem<dylib>& filter, mem<dylib>& proto); ~Work(); void reload_shortcuts(); + bool is_ok() const; private: static std::shared_ptr<TrackLogger> make_logger(main_settings &s); |