00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015 #include "mouseAndKeyboard.h"
00016 #include "mouseData.h"
00017 #include "buttonHandle.h"
00018 #include "buttonEvent.h"
00019 #include "dataNodeTransmit.h"
00020 #include "graphicsWindow.h"
00021
00022 TypeHandle MouseAndKeyboard::_type_handle;
00023
00024
00025
00026
00027
00028
00029 MouseAndKeyboard::
00030 MouseAndKeyboard(GraphicsWindow *window, int device, const string &name) :
00031 DataNode(name),
00032 _window(window),
00033 _device(device)
00034 {
00035 _pixel_xy_output = define_output("pixel_xy", EventStoreVec2::get_class_type());
00036 _pixel_size_output = define_output("pixel_size", EventStoreVec2::get_class_type());
00037 _xy_output = define_output("xy", EventStoreVec2::get_class_type());
00038 _button_events_output = define_output("button_events", ButtonEventList::get_class_type());
00039 _pointer_events_output = define_output("pointer_events", PointerEventList::get_class_type());
00040
00041 _pixel_xy = new EventStoreVec2(LPoint2(0.0f, 0.0f));
00042 _pixel_size = new EventStoreVec2(LPoint2(0.0f, 0.0f));
00043 _xy = new EventStoreVec2(LPoint2(0.0f, 0.0f));
00044 _button_events = new ButtonEventList;
00045 }
00046
00047
00048
00049
00050
00051
00052
00053
00054 void MouseAndKeyboard::
00055 set_source(GraphicsWindow *window, int device) {
00056 _window = window;
00057 _device = device;
00058 }
00059
00060
00061
00062
00063
00064
00065 PT(GraphicsWindow) MouseAndKeyboard::
00066 get_source_window() const {
00067 return _window;
00068 }
00069
00070
00071
00072
00073
00074
00075 int MouseAndKeyboard::
00076 get_source_device() const {
00077 return _device;
00078 }
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093 void MouseAndKeyboard::
00094 do_transmit_data(DataGraphTraverser *, const DataNodeTransmit &,
00095 DataNodeTransmit &output) {
00096 if (_window->has_button_event(_device)) {
00097
00098 _button_events->clear();
00099 while (_window->has_button_event(_device)) {
00100 ButtonEvent be = _window->get_button_event(_device);
00101 _button_events->add_event(be);
00102 }
00103 output.set_data(_button_events_output, EventParameter(_button_events));
00104 }
00105 if (_window->has_pointer_event(_device)) {
00106 PT(PointerEventList) pel = _window->get_pointer_events(_device);
00107 output.set_data(_pointer_events_output, EventParameter(pel));
00108 }
00109
00110
00111 WindowProperties properties = _window->get_properties();
00112 if (properties.has_size()) {
00113 int w = properties.get_x_size();
00114 int h = properties.get_y_size();
00115
00116 _pixel_size->set_value(LPoint2(w, h));
00117 output.set_data(_pixel_size_output, EventParameter(_pixel_size));
00118
00119 if (_window->has_pointer(_device)) {
00120 const MouseData &mdata = _window->get_pointer(_device);
00121
00122 if (mdata._in_window) {
00123
00124 _pixel_xy->set_value(LPoint2(mdata._xpos, mdata._ypos));
00125 output.set_data(_pixel_xy_output, EventParameter(_pixel_xy));
00126
00127
00128 PN_stdfloat xf = (PN_stdfloat)(2 * mdata._xpos) / (PN_stdfloat)w - 1.0f;
00129 PN_stdfloat yf = 1.0f - (PN_stdfloat)(2 * mdata._ypos) / (PN_stdfloat)h;
00130
00131 _xy->set_value(LPoint2(xf, yf));
00132 output.set_data(_xy_output, EventParameter(_xy));
00133 }
00134 }
00135 }
00136 }