21 using std::shared_ptr;
32 , deltaX(deltaX_), deltaY(deltaY_)
33 , press(press_), release(release_) {}
39 template<
typename Archive>
void serialize(Archive& ar,
unsigned )
41 ar.template serializeBase<StateChange>(*this);
42 ar.serialize(
"deltaX", deltaX);
43 ar.serialize(
"deltaY", deltaY);
44 ar.serialize(
"press", press);
45 ar.serialize(
"release", release);
56 : eventDistributor(eventDistributor_)
57 , stateChangeDistributor(stateChangeDistributor_)
58 , deltaX(0), deltaY(0)
60 , status(JOY_BUTTONA | JOY_BUTTONB)
73 const string& Trackball::getName()
const
75 static const string name(
"trackball");
81 return "MSX Trackball";
108 signed char& delta = (lastValue & 4) ? deltaY : deltaX;
109 unsigned t = delta + 128;
110 return (status & ~0x0F) | ((t & 0x80) >> 4) | (t & 0x07);
115 byte diff = lastValue ^ value;
128 void Trackball::signalEvent(
const shared_ptr<const Event>& event,
131 switch (event->getType()) {
133 auto& mev = checked_cast<
const MouseMotionEvent&>(*event);
134 static const int SCALE = 2;
135 int dx = mev.getX() / SCALE;
136 int dy = mev.getY() / SCALE;
137 if ((dx != 0) || (dy != 0)) {
138 createTrackballStateChange(time, dx, dy, 0, 0);
143 auto& butEv = checked_cast<
const MouseButtonEvent&>(*event);
144 switch (butEv.getButton()) {
146 createTrackballStateChange(time, 0, 0,
JOY_BUTTONA, 0);
149 createTrackballStateChange(time, 0, 0,
JOY_BUTTONB, 0);
158 auto& butEv = checked_cast<
const MouseButtonEvent&>(*event);
159 switch (butEv.getButton()) {
161 createTrackballStateChange(time, 0, 0, 0,
JOY_BUTTONA);
164 createTrackballStateChange(time, 0, 0, 0,
JOY_BUTTONB);
178 void Trackball::createTrackballStateChange(
181 stateChangeDistributor.
distributeNew(std::make_shared<TrackballState>(
182 time, deltaX, deltaY, press, release));
186 void Trackball::signalStateChange(
const shared_ptr<StateChange>& event)
188 auto ts =
dynamic_cast<TrackballState*
>(
event.get());
191 deltaX = std::min(127, std::max(-128, deltaX + ts->getDeltaX()));
192 deltaY = std::min(127, std::max(-128, deltaY + ts->getDeltaY()));
193 status = (status & ~ts->getPress()) | ts->getRelease();
200 if ((deltaX != 0) || (deltaY != 0) || (release != 0)) {
202 std::make_shared<TrackballState>(
203 time, -deltaX, -deltaY, 0, release));
208 template<
typename Archive>
211 ar.serialize(
"deltaX", deltaX);
212 ar.serialize(
"deltaY", deltaY);
213 ar.serialize(
"lastValue", lastValue);
214 ar.serialize(
"status", status);