LCOV - code coverage report
Current view: top level - eq/qt - eventHandler.cpp (source / functions) Hit Total Coverage
Test: Equalizer Lines: 1 174 0.6 %
Date: 2016-07-30 05:04:55 Functions: 2 27 7.4 %

          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 : }

Generated by: LCOV version 1.11