From e66a0faba0e5dee175b88f2413cd62bf913eb78c Mon Sep 17 00:00:00 2001 From: David Rose Date: Fri, 13 May 2005 21:46:10 +0000 Subject: [PATCH] add MouseSubregion --- panda/src/tform/mouseSubregion.cxx | 35 ++++++++++++++++++++++++++---- panda/src/tform/mouseSubregion.h | 3 ++- 2 files changed, 33 insertions(+), 5 deletions(-) diff --git a/panda/src/tform/mouseSubregion.cxx b/panda/src/tform/mouseSubregion.cxx index 78c507af6d..780090bdf2 100644 --- a/panda/src/tform/mouseSubregion.cxx +++ b/panda/src/tform/mouseSubregion.cxx @@ -41,8 +41,9 @@ MouseSubregion(const string &name) : _button_events_output = define_output("button_events", ButtonEventList::get_class_type()); _pixel_xy = new EventStoreVec2(LPoint2f(0.0f, 0.0f)); - _xy = new EventStoreVec2(LPoint2f(0.0f, 0.0f)); _pixel_size = new EventStoreVec2(LPoint2f(0.0f, 0.0f)); + _xy = new EventStoreVec2(LPoint2f(0.0f, 0.0f)); + _button_events = new ButtonEventList; } //////////////////////////////////////////////////////////////////// @@ -69,6 +70,8 @@ MouseSubregion:: //////////////////////////////////////////////////////////////////// void MouseSubregion:: do_transmit_data(const DataNodeTransmit &input, DataNodeTransmit &output) { + bool has_mouse = false; + if (input.has_data(_xy_input)) { const EventStoreVec2 *xy; DCAST_INTO_V(xy, input.get_data(_xy_input).get_ptr()); @@ -97,12 +100,36 @@ do_transmit_data(const DataNodeTransmit &input, DataNodeTransmit &output) { output.set_data(_pixel_xy_output, EventParameter(_pixel_xy)); } - // Only send the button events if the mouse is within the - // display region. - output.set_data(_button_events_output, input.get_data(_button_events_input)); + has_mouse = true; } } + if (has_mouse) { + // If we have the mouse, send all of the mouse buttons. + output.set_data(_button_events_output, input.get_data(_button_events_input)); + } else { + // Otherwise, send only the button-up events. + _button_events->clear(); + + if (input.has_data(_button_events_input)) { + const ButtonEventList *button_events; + DCAST_INTO_V(button_events, input.get_data(_button_events_input).get_ptr()); + int num_events = button_events->get_num_events(); + for (int i = 0; i < num_events; i++) { + const ButtonEvent &be = button_events->get_event(i); + if (be._type == ButtonEvent::T_up) { + // Don't suppress this button event; pass it through. + _button_events->add_event(be); + } + } + } + + if (_button_events->get_num_events() != 0) { + output.set_data(_button_events_output, EventParameter(_button_events)); + } + } + + // Now scale the window size. if (input.has_data(_pixel_size_input)) { const EventStoreVec2 *pixel_size; diff --git a/panda/src/tform/mouseSubregion.h b/panda/src/tform/mouseSubregion.h index 96fc221ff8..506ccbfd33 100644 --- a/panda/src/tform/mouseSubregion.h +++ b/panda/src/tform/mouseSubregion.h @@ -75,8 +75,9 @@ private: int _button_events_output; PT(EventStoreVec2) _pixel_xy; - PT(EventStoreVec2) _xy; PT(EventStoreVec2) _pixel_size; + PT(EventStoreVec2) _xy; + PT(ButtonEventList) _button_events; public: static TypeHandle get_class_type() {