16 #include "graphicsWindowInputDevice.h"
17 #include "graphicsWindow.h"
18 #include "mouseButton.h"
19 #include "keyboardButton.h"
21 #define EXPCL EXPCL_PANDA_DISPLAY
22 #define EXPTP EXPTP_PANDA_DISPLAY
23 #define TYPE GraphicsWindowInputDevice
24 #define NAME vector_GraphicsWindowInputDevice
26 #include "vector_src.cxx"
30 #pragma implementation
44 GraphicsWindowInputDevice::
45 GraphicsWindowInputDevice(
GraphicsWindow *host,
const string &name,
int flags) :
51 _pointer_mode_enable(false),
53 _enable_pointer_events(false)
96 GraphicsWindowInputDevice::
107 void GraphicsWindowInputDevice::
114 _flags = copy._flags;
115 _device_index = copy._device_index;
116 _event_sequence = copy._event_sequence;
117 _pointer_mode_enable = copy._pointer_mode_enable;
118 _pointer_speed = copy._pointer_speed;
119 _enable_pointer_events = copy._enable_pointer_events;
120 _mouse_data = copy._mouse_data;
121 _true_mouse_data = copy._true_mouse_data;
122 _button_events = copy._button_events;
123 _pointer_events = copy._pointer_events;
131 GraphicsWindowInputDevice::
132 ~GraphicsWindowInputDevice() {
147 return !_button_events.empty();
160 _button_events.pop_front();
175 return (_pointer_events != 0);
185 get_pointer_events() {
211 enable_pointer_mode(
double speed) {
213 nassertv(_device_index != 0);
214 _pointer_mode_enable =
true;
215 _pointer_speed = speed;
216 _mouse_data._xpos = _host->get_x_size() * 0.5;
217 _mouse_data._ypos = _host->get_y_size() * 0.5;
218 _mouse_data._in_window =
true;
229 nassertv(_device_index != 0);
230 _pointer_mode_enable =
false;
231 _pointer_speed = 1.0;
232 _mouse_data = _true_mouse_data;
244 double delta_x = x - _true_mouse_data._xpos;
245 double delta_y = y - _true_mouse_data._ypos;
246 _true_mouse_data._in_window = inwin;
247 _true_mouse_data._xpos = x;
248 _true_mouse_data._ypos = y;
250 if (_pointer_mode_enable) {
251 double pointer_x = _mouse_data._xpos;
252 double pointer_y = _mouse_data._ypos;
253 pointer_x += (delta_x * _pointer_speed);
254 pointer_y += (delta_y * _pointer_speed);
257 if (pointer_x < 0.0) pointer_x = 0.0;
258 if (pointer_y < 0.0) pointer_y = 0.0;
259 if (pointer_x > xhi) pointer_x = xhi;
260 if (pointer_y > yhi) pointer_y = yhi;
261 _mouse_data._in_window =
true;
262 _mouse_data._xpos = pointer_x;
263 _mouse_data._ypos = pointer_y;
265 _mouse_data = _true_mouse_data;
268 if (_enable_pointer_events) {
269 int seq = _event_sequence++;
270 if (_pointer_events == 0) {
273 _pointer_events->add_event(_mouse_data._in_window,
288 _button_events.push_back(
ButtonEvent(button, ButtonEvent::T_down, time));
289 _buttons_held.insert(button);
303 _button_events.push_back(
ButtonEvent(button, ButtonEvent::T_resume_down, time));
304 _buttons_held.insert(button);
315 _button_events.push_back(
ButtonEvent(button, ButtonEvent::T_up, time));
316 _buttons_held.erase(button);
328 _button_events.push_back(
ButtonEvent(keycode, time));
340 candidate(
const wstring &candidate_string,
size_t highlight_start,
341 size_t highlight_end,
size_t cursor_pos) {
343 _button_events.push_back(
ButtonEvent(candidate_string,
344 highlight_start, highlight_end,
362 ButtonsHeld::iterator bi;
363 for (bi = _buttons_held.begin(); bi != _buttons_held.end(); ++bi) {
364 _button_events.push_back(
ButtonEvent(*bi, ButtonEvent::T_up, time));
366 _buttons_held.clear();
377 _button_events.push_back(
ButtonEvent(button, ButtonEvent::T_raw_down, time));
388 _button_events.push_back(
ButtonEvent(button, ButtonEvent::T_raw_up, time));
Records a set of pointer events that happened recently.
int get_y_size() const
Returns the visible height of the window or buffer, if it is known.
A window, fullscreen or on a desktop, into which a graphics device sends its output for interactive d...
Similar to MutexHolder, but for a light mutex.
int get_x_size() const
Returns the visible width of the window or buffer, if it is known.