Add GUI control panel (first draft)
[mouse-tracker-for-cubism.git] / include / mouse_cursor_tracker.h
CommitLineData
126d8fa4
AIL
1// -*- mode: c++ -*-
2
3#ifndef __MOUSE_CURSOR_TRACKER_H__
4#define __MOUSE_CURSOR_TRACKER_H__
5
6/****
7Copyright (c) 2020 Adrian I. Lam
8
9Permission is hereby granted, free of charge, to any person obtaining a copy
10of this software and associated documentation files (the "Software"), to deal
11in the Software without restriction, including without limitation the rights
12to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
13copies of the Software, and to permit persons to whom the Software is
14furnished to do so, subject to the following conditions:
15
16The above copyright notice and this permission notice shall be included in all
17copies or substantial portions of the Software.
18
19THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
20IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
22AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
23LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
24OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
25SOFTWARE.
26****/
27
28#include <string>
126d8fa4 29#include <thread>
eba2eb3a
AIL
30#include <vector>
31#include <utility>
32#include <mutex>
33#include <map>
33ad240c
AIL
34#include <gtkmm/application.h>
35#include <gtkmm/builder.h>
36#include <gtkmm/scale.h>
37#include <gtkmm/checkbutton.h>
38#include <gtkmm/button.h>
39#include <gtkmm/window.h>
40
126d8fa4
AIL
41extern "C"
42{
43#include <xdo.h>
44#include <pulse/simple.h>
45}
46
47class MouseCursorTracker
48{
49public:
eba2eb3a
AIL
50 MouseCursorTracker(std::string cfgPath,
51 std::vector<std::pair<std::string, int> > motions = {},
52 std::vector<std::string> expressions = {});
126d8fa4
AIL
53 ~MouseCursorTracker();
54
eba2eb3a
AIL
55 enum class MotionPriority
56 {
57 // See LAppDefine.cpp in Demo
58 none,
59 idle,
60 normal,
61 force
62 };
63
126d8fa4
AIL
64 struct Params
65 {
eba2eb3a
AIL
66 std::map<std::string, double> live2d;
67
126d8fa4
AIL
68 bool autoBlink;
69 bool autoBreath;
eba2eb3a 70 bool randomIdleMotion;
126d8fa4
AIL
71 bool useLipSync;
72 double lipSyncParam;
eba2eb3a
AIL
73
74 MotionPriority motionPriority;
75 std::string motionGroup;
76 int motionNumber;
77
78 std::string expression;
126d8fa4
AIL
79 };
80
eba2eb3a 81 Params getParams(void);
126d8fa4
AIL
82
83 void stop(void);
84
85 void mainLoop(void);
86
87private:
88 struct Coord
89 {
90 int x;
91 int y;
92 };
93
94 struct Config
95 {
96 int sleepMs;
97 bool autoBlink;
98 bool autoBreath;
eba2eb3a 99 bool randomIdleMotion;
126d8fa4
AIL
100 bool useLipSync;
101 double lipSyncGain;
102 double lipSyncCutOff;
103 unsigned int audioBufSize;
104 double mouthForm;
105 int top;
106 int bottom;
107 int left;
108 int right;
109 int screen;
eba2eb3a 110 Coord origin;
126d8fa4
AIL
111 } m_cfg;
112
eba2eb3a
AIL
113 std::map<std::string, double> m_overrideMap;
114
126d8fa4
AIL
115 bool m_stop;
116
117 Coord m_curPos;
118
119 xdo_t *m_xdo;
120
121 std::thread m_getVolumeThread;
eba2eb3a 122 std::thread m_parseCommandThread;
33ad240c 123 std::thread m_guiThread;
126d8fa4 124 void audioLoop(void);
eba2eb3a 125 void cliLoop(void);
33ad240c 126 void guiLoop(void);
eba2eb3a 127 void processCommand(std::string);
126d8fa4
AIL
128 double m_currentVol;
129 pa_simple *m_pulse;
130
eba2eb3a
AIL
131 MotionPriority m_motionPriority;
132 std::string m_motionGroup;
133 int m_motionNumber;
134 std::mutex m_motionMutex;
135 std::string m_expression;
136
126d8fa4
AIL
137 void populateDefaultConfig(void);
138 void parseConfig(std::string cfgPath);
33ad240c
AIL
139
140 Glib::RefPtr<Gtk::Application> m_gtkapp;
141 Glib::RefPtr<Gtk::Builder> m_builder;
142
143 std::vector<std::string> m_onClearResettingParams;
144
145 // GUI signal handlers
146 void onMotionStartButton(void);
147 void onExpressionStartButton(void);
148 void onParamUpdateButton(Gtk::Scale *scale, bool isInc);
149 void onParamValChanged(Glib::RefPtr<Gtk::Adjustment> adj, std::string paramName);
150 void onAutoToggle(Gtk::CheckButton *check, Gtk::Scale *scale,
151 Gtk::Button *buttonDec, Gtk::Button *buttonInc,
152 std::string paramName);
153 void onClearButton(Glib::RefPtr<Gtk::Button> button, std::string paramName, Glib::RefPtr<Gtk::Adjustment> adj);
154 void onExpanderChange(Gtk::Window *window);
126d8fa4
AIL
155};
156
157#endif