Line data Source code
1 :
2 : /* Copyright (c) 2014, Daniel Nachbaur <danielnachbaur@gmail.com>
3 : * 2015, Juan Hernando <jhernando@fi.upm.es>
4 : *
5 : * This library is free software; you can redistribute it and/or modify it under
6 : * the terms of the GNU Lesser General Public License version 2.1 as published
7 : * by the Free Software Foundation.
8 : *
9 : * This library is distributed in the hope that it will be useful, but WITHOUT
10 : * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
11 : * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
12 : * details.
13 : *
14 : * You should have received a copy of the GNU Lesser General Public License
15 : * along with this library; if not, write to the Free Software Foundation, Inc.,
16 : * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
17 : */
18 :
19 : #include "eventHandler.h"
20 :
21 : #include "window.h"
22 : #include "windowEvent.h"
23 :
24 : #include <QApplication>
25 : #include <QKeyEvent>
26 :
27 : namespace eq
28 : {
29 : namespace qt
30 : {
31 :
32 : namespace
33 : {
34 0 : uint32_t _getKey( const QKeyEvent& keyEvent )
35 : {
36 0 : switch( keyEvent.key( ))
37 : {
38 0 : case Qt::Key_Escape: return KC_ESCAPE;
39 0 : case Qt::Key_Backspace: return KC_BACKSPACE;
40 0 : case Qt::Key_Return: return KC_RETURN;
41 0 : case Qt::Key_Tab: return KC_TAB;
42 0 : case Qt::Key_Home: return KC_HOME;
43 0 : case Qt::Key_Left: return KC_LEFT;
44 0 : case Qt::Key_Up: return KC_UP;
45 0 : case Qt::Key_Right: return KC_RIGHT;
46 0 : case Qt::Key_Down: return KC_DOWN;
47 0 : case Qt::Key_PageUp: return KC_PAGE_UP;
48 0 : case Qt::Key_PageDown: return KC_PAGE_DOWN;
49 0 : case Qt::Key_End: return KC_END;
50 0 : case Qt::Key_F1: return KC_F1;
51 0 : case Qt::Key_F2: return KC_F2;
52 0 : case Qt::Key_F3: return KC_F3;
53 0 : case Qt::Key_F4: return KC_F4;
54 0 : case Qt::Key_F5: return KC_F5;
55 0 : case Qt::Key_F6: return KC_F6;
56 0 : case Qt::Key_F7: return KC_F7;
57 0 : case Qt::Key_F8: return KC_F8;
58 0 : case Qt::Key_F9: return KC_F9;
59 0 : case Qt::Key_F10: return KC_F10;
60 0 : case Qt::Key_F11: return KC_F11;
61 0 : case Qt::Key_F12: return KC_F12;
62 0 : case Qt::Key_F13: return KC_F13;
63 0 : case Qt::Key_F14: return KC_F14;
64 0 : case Qt::Key_F15: return KC_F15;
65 0 : case Qt::Key_F16: return KC_F16;
66 0 : case Qt::Key_F17: return KC_F17;
67 0 : case Qt::Key_F18: return KC_F18;
68 0 : case Qt::Key_F19: return KC_F19;
69 0 : case Qt::Key_F20: return KC_F20;
70 0 : case Qt::Key_F21: return KC_F21;
71 0 : case Qt::Key_F22: return KC_F22;
72 0 : case Qt::Key_F23: return KC_F23;
73 0 : case Qt::Key_F24: return KC_F24;
74 0 : case Qt::Key_Shift: return KC_SHIFT_L;
75 0 : case Qt::Key_Control: return KC_CONTROL_L;
76 0 : case Qt::Key_Alt: return KC_ALT_L;
77 0 : case Qt::Key_AltGr: return KC_ALT_R;
78 0 : case Qt::Key_unknown: return KC_VOID;
79 : default:
80 0 : if( keyEvent.text().isEmpty( ))
81 0 : return KC_VOID;
82 0 : return keyEvent.text().at( 0 ).unicode();
83 : }
84 : }
85 : // Qt buttons 2 & 3 are inversed with EQ (X11/AGL/WGL)
86 0 : uint32_t _getButtons( const Qt::MouseButtons& eventButtons )
87 : {
88 0 : if( (eventButtons & (Qt::MidButton | Qt::RightButton)) ==
89 0 : (Qt::MidButton | Qt::RightButton) )
90 : {
91 0 : return eventButtons;
92 : }
93 :
94 0 : uint32_t buttons = eventButtons;
95 0 : if( eventButtons & Qt::MidButton || eventButtons & Qt::RightButton )
96 0 : buttons ^= PTR_BUTTON2 | PTR_BUTTON3;
97 0 : return buttons;
98 : }
99 :
100 0 : uint32_t _getButton( const Qt::MouseButton button )
101 : {
102 0 : if( button == Qt::RightButton )
103 0 : return PTR_BUTTON2;
104 0 : if( button == Qt::MidButton )
105 0 : return PTR_BUTTON3;
106 0 : return button;
107 : }
108 : }
109 :
110 0 : EventHandler::EventHandler( WindowIF& window )
111 0 : : _window( window )
112 : {
113 0 : }
114 :
115 0 : EventHandler::~EventHandler()
116 : {
117 0 : }
118 :
119 0 : void EventHandler::exposeEvent()
120 : {
121 0 : QApplication::postEvent( this, _simpleWindowEvent( Event::WINDOW_EXPOSE ));
122 0 : }
123 :
124 0 : void EventHandler::hideEvent()
125 : {
126 0 : QApplication::postEvent( this, _simpleWindowEvent( Event::WINDOW_HIDE ));
127 0 : }
128 :
129 0 : void EventHandler::resizeEvent( QResizeEvent* qevent )
130 : {
131 0 : QApplication::postEvent( this, _resizeEvent( qevent ));
132 0 : }
133 :
134 0 : void EventHandler::closeEvent()
135 : {
136 0 : QApplication::postEvent( this, _simpleWindowEvent( Event::WINDOW_CLOSE ));
137 0 : }
138 :
139 0 : void EventHandler::mousePressEvent( QMouseEvent* qevent )
140 : {
141 0 : QApplication::postEvent( this, _mousePressEvent( qevent ));
142 0 : }
143 :
144 0 : void EventHandler::mouseReleaseEvent( QMouseEvent* qevent )
145 : {
146 0 : QApplication::postEvent( this, _mouseReleaseEvent( qevent ));
147 0 : }
148 :
149 0 : void EventHandler::mouseMoveEvent( QMouseEvent* qevent )
150 : {
151 0 : QApplication::postEvent( this, _mouseMoveEvent( qevent ));
152 0 : }
153 :
154 : #ifndef QT_NO_WHEELEVENT
155 0 : void EventHandler::wheelEvent( QWheelEvent* qevent )
156 : {
157 0 : QApplication::postEvent( this, _wheelEvent( qevent ));
158 0 : }
159 : #endif
160 :
161 0 : void EventHandler::keyPressEvent( QKeyEvent* qevent )
162 : {
163 0 : QApplication::postEvent( this, _keyEvent( qevent, Event::KEY_PRESS ));
164 0 : }
165 :
166 0 : void EventHandler::keyReleaseEvent( QKeyEvent* qevent )
167 : {
168 0 : QApplication::postEvent( this, _keyEvent( qevent, Event::KEY_RELEASE ));
169 0 : }
170 :
171 0 : bool EventHandler::event( QEvent* qevent )
172 : {
173 0 : if( qevent->type() != QEvent::User )
174 : {
175 : // This event is coming directly into this object from the GUI thread.
176 : // Reposting with the supported type and to ensure that the correct
177 : // thread processes it.
178 0 : WindowEvent* windowEvent = _translateEvent( qevent );
179 0 : if( windowEvent )
180 : {
181 0 : QApplication::postEvent( this, windowEvent );
182 0 : return true;
183 : }
184 0 : return false;
185 : }
186 :
187 0 : WindowEvent* windowEvent = dynamic_cast< WindowEvent* >( qevent );
188 0 : if( !windowEvent )
189 0 : return false;
190 :
191 0 : switch( windowEvent->eq::Event::type )
192 : {
193 : case Event::WINDOW_POINTER_MOTION:
194 : case Event::WINDOW_POINTER_BUTTON_PRESS:
195 : case Event::WINDOW_POINTER_BUTTON_RELEASE:
196 0 : _computePointerDelta( *windowEvent );
197 0 : break;
198 : default:
199 0 : break;
200 : }
201 :
202 0 : return _window.processEvent( *windowEvent );
203 : }
204 :
205 0 : WindowEvent* EventHandler::_translateEvent( QEvent* qevent )
206 : {
207 0 : switch( qevent->type( ))
208 : {
209 : case QEvent::Expose:
210 0 : return _simpleWindowEvent( Event::WINDOW_EXPOSE );
211 : case QEvent::Hide:
212 0 : return _simpleWindowEvent( Event::WINDOW_HIDE );
213 : case QEvent::Resize:
214 0 : return _resizeEvent( static_cast< QResizeEvent* >( qevent ));
215 : case QEvent::Close:
216 0 : return _simpleWindowEvent( Event::WINDOW_CLOSE );
217 : case QEvent::MouseMove:
218 0 : return _mouseMoveEvent( static_cast< QMouseEvent* >( qevent ));
219 : case QEvent::MouseButtonPress:
220 0 : return _mousePressEvent( static_cast< QMouseEvent* >( qevent ));
221 : case QEvent::MouseButtonRelease:
222 0 : return _mouseReleaseEvent( static_cast< QMouseEvent* >( qevent ));
223 : #ifndef QT_NO_WHEELEVENT
224 : case QEvent::Wheel:
225 0 : return _wheelEvent( static_cast< QWheelEvent* >( qevent ));
226 : #endif
227 : case QEvent::KeyPress:
228 : return _keyEvent( static_cast< QKeyEvent* >( qevent ),
229 0 : Event::KEY_PRESS);
230 : case QEvent::KeyRelease:
231 : return _keyEvent( static_cast< QKeyEvent* >( qevent ),
232 0 : Event::KEY_RELEASE );
233 : default:
234 : ;
235 : }
236 0 : return 0;
237 : }
238 :
239 0 : WindowEvent* EventHandler::_simpleWindowEvent( const eq::Event::Type type )
240 : {
241 0 : WindowEvent* windowEvent = new WindowEvent;
242 0 : windowEvent->eq::Event::type = type;
243 0 : return windowEvent;
244 : }
245 :
246 0 : WindowEvent* EventHandler::_resizeEvent( QResizeEvent* qevent )
247 : {
248 0 : WindowEvent* windowEvent = new WindowEvent;
249 0 : windowEvent->eq::Event::type = Event::WINDOW_RESIZE;
250 0 : windowEvent->resize.w = qevent->size().width();
251 0 : windowEvent->resize.h = qevent->size().height();
252 0 : return windowEvent;
253 : }
254 :
255 0 : WindowEvent* EventHandler::_mousePressEvent( QMouseEvent* qevent )
256 : {
257 0 : WindowEvent* windowEvent = new WindowEvent;
258 0 : windowEvent->eq::Event::type = Event::WINDOW_POINTER_BUTTON_PRESS;
259 0 : windowEvent->pointerButtonPress.x = qevent->x();
260 0 : windowEvent->pointerButtonPress.y = qevent->y();
261 0 : windowEvent->pointerButtonPress.buttons = _getButtons( qevent->buttons( ));
262 0 : windowEvent->pointerButtonPress.button = _getButton( qevent->button( ));
263 0 : return windowEvent;
264 : }
265 :
266 0 : WindowEvent* EventHandler::_mouseReleaseEvent( QMouseEvent* qevent )
267 : {
268 0 : WindowEvent* windowEvent = new WindowEvent;
269 0 : windowEvent->eq::Event::type = Event::WINDOW_POINTER_BUTTON_RELEASE;
270 0 : windowEvent->pointerButtonRelease.x = qevent->x();
271 0 : windowEvent->pointerButtonRelease.y = qevent->y();
272 0 : windowEvent->pointerButtonRelease.buttons = _getButtons( qevent->buttons());
273 0 : windowEvent->pointerButtonRelease.button = _getButton( qevent->button( ));
274 0 : return windowEvent;
275 : }
276 :
277 0 : WindowEvent* EventHandler::_mouseMoveEvent( QMouseEvent* qevent )
278 : {
279 0 : WindowEvent* windowEvent = new WindowEvent;
280 0 : windowEvent->eq::Event::type = Event::WINDOW_POINTER_MOTION;
281 0 : windowEvent->pointerMotion.x = qevent->x();
282 0 : windowEvent->pointerMotion.y = qevent->y();
283 0 : windowEvent->pointerMotion.buttons = _getButtons( qevent->buttons( ));
284 0 : windowEvent->pointerMotion.button = _getButton( qevent->button( ));
285 0 : return windowEvent;
286 : }
287 :
288 : #ifndef QT_NO_WHEELEVENT
289 0 : WindowEvent* EventHandler::_wheelEvent( QWheelEvent* qevent )
290 : {
291 0 : WindowEvent* windowEvent = new WindowEvent;
292 0 : windowEvent->eq::Event::type = Event::WINDOW_POINTER_WHEEL;
293 0 : switch( qevent->orientation( ))
294 : {
295 : case Qt::Horizontal:
296 0 : windowEvent->pointerWheel.xAxis = qevent->delta() > 0 ? 1 : -1;
297 0 : break;
298 : case Qt::Vertical:
299 0 : windowEvent->pointerWheel.yAxis = qevent->delta() > 0 ? 1 : -1;
300 0 : break;
301 : }
302 0 : windowEvent->pointerWheel.buttons = _getButtons( qevent->buttons( ));
303 0 : windowEvent->pointerWheel.button = PTR_BUTTON_NONE;
304 0 : return windowEvent;
305 : }
306 : #endif
307 :
308 0 : WindowEvent* EventHandler::_keyEvent( QKeyEvent* qevent,
309 : const eq::Event::Type type )
310 : {
311 0 : WindowEvent* windowEvent = new WindowEvent;
312 0 : windowEvent->eq::Event::type = type;
313 0 : windowEvent->keyPress.key = _getKey( *qevent );
314 0 : return windowEvent;
315 : }
316 :
317 : }
318 42 : }
|