|
@@ -29,6 +29,7 @@ InputDevice(const std::string &name, DeviceClass dev_class) :
|
|
|
_is_connected(true)
|
|
_is_connected(true)
|
|
|
{
|
|
{
|
|
|
_button_events = new ButtonEventList;
|
|
_button_events = new ButtonEventList;
|
|
|
|
|
+ _pointer_events = new PointerEventList;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
/**
|
|
@@ -80,7 +81,7 @@ get_button_events() {
|
|
|
bool InputDevice::
|
|
bool InputDevice::
|
|
|
has_pointer_event() const {
|
|
has_pointer_event() const {
|
|
|
LightMutexHolder holder(_lock);
|
|
LightMutexHolder holder(_lock);
|
|
|
- return (_pointer_events != 0);
|
|
|
|
|
|
|
+ return _pointer_events != nullptr && !_pointer_events->empty();
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
/**
|
|
@@ -90,8 +91,8 @@ has_pointer_event() const {
|
|
|
PT(PointerEventList) InputDevice::
|
|
PT(PointerEventList) InputDevice::
|
|
|
get_pointer_events() {
|
|
get_pointer_events() {
|
|
|
LightMutexHolder holder(_lock);
|
|
LightMutexHolder holder(_lock);
|
|
|
- PT(PointerEventList) result = _pointer_events;
|
|
|
|
|
- _pointer_events.clear();
|
|
|
|
|
|
|
+ PT(PointerEventList) result = new PointerEventList;
|
|
|
|
|
+ swap(_pointer_events, result);
|
|
|
return result;
|
|
return result;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -149,69 +150,116 @@ add_axis(Axis axis, int minimum, int maximum) {
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
/**
|
|
|
- * Records that a mouse movement has taken place.
|
|
|
|
|
|
|
+ * Records that a new pointer was found.
|
|
|
|
|
+ */
|
|
|
|
|
+int InputDevice::
|
|
|
|
|
+add_pointer(PointerType type, int id, bool primary) {
|
|
|
|
|
+ nassertr(_lock.debug_is_locked(), -1);
|
|
|
|
|
+
|
|
|
|
|
+ PointerData data;
|
|
|
|
|
+ data._id = id;
|
|
|
|
|
+ data._type = type;
|
|
|
|
|
+
|
|
|
|
|
+ int index = (int)_pointers.size();
|
|
|
|
|
+ if (_num_pointers == _pointers.size()) {
|
|
|
|
|
+ _pointers.push_back(data);
|
|
|
|
|
+ } else {
|
|
|
|
|
+ _pointers[index] = data;
|
|
|
|
|
+ }
|
|
|
|
|
+ ++_num_pointers;
|
|
|
|
|
+
|
|
|
|
|
+ return index;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+/**
|
|
|
|
|
+ * Removes a previously added pointer. If the current pressure is not zero,
|
|
|
|
|
+ * it will generate an event doing so.
|
|
|
*/
|
|
*/
|
|
|
void InputDevice::
|
|
void InputDevice::
|
|
|
-set_pointer(bool inwin, double x, double y, double time) {
|
|
|
|
|
|
|
+remove_pointer(int id) {
|
|
|
nassertv(_lock.debug_is_locked());
|
|
nassertv(_lock.debug_is_locked());
|
|
|
- _pointer_data._in_window = inwin;
|
|
|
|
|
- _pointer_data._xpos = x;
|
|
|
|
|
- _pointer_data._ypos = y;
|
|
|
|
|
|
|
|
|
|
- if (_enable_pointer_events) {
|
|
|
|
|
- int seq = _event_sequence++;
|
|
|
|
|
- if (_pointer_events.is_null()) {
|
|
|
|
|
- _pointer_events = new PointerEventList();
|
|
|
|
|
|
|
+ size_t i;
|
|
|
|
|
+ for (i = 0; i < _pointers.size(); ++i) {
|
|
|
|
|
+ if (_pointers[i]._id == id) {
|
|
|
|
|
+ break;
|
|
|
}
|
|
}
|
|
|
- _pointer_events->add_event(_pointer_data._in_window,
|
|
|
|
|
- _pointer_data._xpos,
|
|
|
|
|
- _pointer_data._ypos,
|
|
|
|
|
- seq, time);
|
|
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ if (i < _pointers.size()) {
|
|
|
|
|
+ if (_pointers[i]._pressure != 0.0) {
|
|
|
|
|
+ _pointers[i]._pressure = 0.0;
|
|
|
|
|
+
|
|
|
|
|
+ if (_enable_pointer_events) {
|
|
|
|
|
+ int seq = _event_sequence++;
|
|
|
|
|
+ double time = ClockObject::get_global_clock()->get_frame_time();
|
|
|
|
|
+ _pointer_events->add_event(_pointers[i], seq, time);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // Replace it with the last one.
|
|
|
|
|
+ if (i != _pointers.size() - 1) {
|
|
|
|
|
+ _pointers[i] = _pointers.back();
|
|
|
|
|
+ }
|
|
|
|
|
+ --_num_pointers;
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
/**
|
|
|
- * Records that the mouse pointer has left the window.
|
|
|
|
|
|
|
+ * Records that pointer data for a pointer has changed. This can also be used
|
|
|
|
|
+ * to add a new pointer.
|
|
|
*/
|
|
*/
|
|
|
void InputDevice::
|
|
void InputDevice::
|
|
|
-set_pointer_out_of_window(double time) {
|
|
|
|
|
|
|
+update_pointer(PointerData data, double time) {
|
|
|
nassertv(_lock.debug_is_locked());
|
|
nassertv(_lock.debug_is_locked());
|
|
|
- _pointer_data._in_window = false;
|
|
|
|
|
|
|
+
|
|
|
|
|
+ PointerData *ptr = nullptr;
|
|
|
|
|
+ for (size_t i = 0; i < _pointers.size(); ++i) {
|
|
|
|
|
+ if (_pointers[i]._id == data._id) {
|
|
|
|
|
+ ptr = &_pointers[i];
|
|
|
|
|
+ *ptr = data;
|
|
|
|
|
+ break;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ if (ptr == nullptr) {
|
|
|
|
|
+ _pointers.push_back(data);
|
|
|
|
|
+ ptr = &_pointers.back();
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
if (_enable_pointer_events) {
|
|
if (_enable_pointer_events) {
|
|
|
int seq = _event_sequence++;
|
|
int seq = _event_sequence++;
|
|
|
- if (_pointer_events.is_null()) {
|
|
|
|
|
- _pointer_events = new PointerEventList();
|
|
|
|
|
- }
|
|
|
|
|
- _pointer_events->add_event(_pointer_data._in_window,
|
|
|
|
|
- _pointer_data._xpos,
|
|
|
|
|
- _pointer_data._ypos,
|
|
|
|
|
- seq, time);
|
|
|
|
|
|
|
+ _pointer_events->add_event(*ptr, seq, time);
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
/**
|
|
|
- * Records that a relative mouse movement has taken place.
|
|
|
|
|
|
|
+ * Records that a relative pointer movement has taken place.
|
|
|
*/
|
|
*/
|
|
|
void InputDevice::
|
|
void InputDevice::
|
|
|
-pointer_moved(double x, double y, double time) {
|
|
|
|
|
|
|
+pointer_moved(int id, double x, double y, double time) {
|
|
|
nassertv(_lock.debug_is_locked());
|
|
nassertv(_lock.debug_is_locked());
|
|
|
- _pointer_data._xpos += x;
|
|
|
|
|
- _pointer_data._ypos += y;
|
|
|
|
|
|
|
+
|
|
|
|
|
+ PointerData *ptr = nullptr;
|
|
|
|
|
+ for (size_t i = 0; i < _pointers.size(); ++i) {
|
|
|
|
|
+ if (_pointers[i]._id == id) {
|
|
|
|
|
+ ptr = &_pointers[i];
|
|
|
|
|
+ _pointers[i]._xpos = x;
|
|
|
|
|
+ _pointers[i]._ypos = y;
|
|
|
|
|
+ break;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ nassertv_always(ptr != nullptr);
|
|
|
|
|
|
|
|
if (device_cat.is_spam() && (x != 0 || y != 0)) {
|
|
if (device_cat.is_spam() && (x != 0 || y != 0)) {
|
|
|
device_cat.spam()
|
|
device_cat.spam()
|
|
|
- << "Pointer moved by " << x << " x " << y << "\n";
|
|
|
|
|
|
|
+ << "Pointer " << id << " moved by " << x << " x " << y << "\n";
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
if (_enable_pointer_events) {
|
|
if (_enable_pointer_events) {
|
|
|
int seq = _event_sequence++;
|
|
int seq = _event_sequence++;
|
|
|
- if (_pointer_events.is_null()) {
|
|
|
|
|
- _pointer_events = new PointerEventList();
|
|
|
|
|
- }
|
|
|
|
|
- _pointer_events->add_event(_pointer_data._in_window,
|
|
|
|
|
- _pointer_data._xpos,
|
|
|
|
|
- _pointer_data._ypos,
|
|
|
|
|
|
|
+ _pointer_events->add_event(ptr->_in_window,
|
|
|
|
|
+ ptr->_xpos,
|
|
|
|
|
+ ptr->_ypos,
|
|
|
x, y, seq, time);
|
|
x, y, seq, time);
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|