X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=adaptors%2Fx11%2Fevent-handler-x.cpp;h=900dc609e81f135ba275b9026ddb10186c326cea;hb=daa1518d9c75283161a46b5bbdb2d40e07b7d2c6;hp=d6655518c4772c9e4aedb36dcf4ec1abb2523095;hpb=231b7a8a4438dd714e67b2500a41f66bfb62e6b2;p=platform%2Fcore%2Fuifw%2Fdali-adaptor.git diff --git a/adaptors/x11/event-handler-x.cpp b/adaptors/x11/event-handler-x.cpp index d665551..900dc60 100644 --- a/adaptors/x11/event-handler-x.cpp +++ b/adaptors/x11/event-handler-x.cpp @@ -23,6 +23,10 @@ #include #include +#include +#include +#include + #include #include @@ -35,12 +39,12 @@ #include #include #include -#include +#include #include #include #include #include -#include +#include // INTERNAL INCLUDES #include @@ -51,8 +55,6 @@ #include #include -using namespace std; - namespace Dali { @@ -76,6 +78,9 @@ Integration::Log::Filter* gSelectionEventLogFilter = Integration::Log::Filter::N namespace { + +const char * DETENT_DEVICE_NAME = "tizen_detent"; + #ifndef DALI_PROFILE_UBUNTU const char * DALI_VCONFKEY_SETAPPL_ACCESSIBILITY_FONT_NAME = "db/setting/accessibility/font_name"; // It will be update at vconf-key.h and replaced. #endif // DALI_PROFILE_UBUNTU @@ -193,7 +198,8 @@ struct EventHandler::Impl Impl( EventHandler* handler, Ecore_X_Window window ) : mHandler( handler ), mEcoreEventHandler(), - mWindow( window ) + mWindow( window ), + mXiDeviceId( 0 ) { // Only register for touch and key events if we have a window if ( window != 0 ) @@ -234,13 +240,74 @@ struct EventHandler::Impl mEcoreEventHandler.push_back( ecore_event_handler_add( ECORE_X_EVENT_SELECTION_CLEAR, EcoreEventSelectionClear, handler ) ); mEcoreEventHandler.push_back( ecore_event_handler_add( ECORE_X_EVENT_SELECTION_NOTIFY, EcoreEventSelectionNotify, handler ) ); + // Initialize Xi2 system + Display* display = static_cast< Display* >(ecore_x_display_get()); + Ecore_X_Window rootWindow = ecore_x_window_root_first_get(); + int opcode = 0, event = 0, error = 0; + int major = XI_2_Major; + int minor = XI_2_Minor; + int deviceCount = 0; + XIEventMask xiEventMask; + + // Check if X input extension available + if( XQueryExtension( display, "XInputExtension", &opcode, &event, &error ) ) + { + // We support version 2.0 + if( XIQueryVersion( display, &major, &minor ) != BadRequest ) + { + xiEventMask.deviceid = XIAllDevices; + + // Check device id + bool match = false; + XIDeviceInfo* deviceInfo = NULL; + deviceInfo = XIQueryDevice( display, XIAllDevices, &deviceCount ); + + for( int i = 0; i < deviceCount; i++ ) + { + if( !strncmp( deviceInfo[i].name, DETENT_DEVICE_NAME, strlen( DETENT_DEVICE_NAME ) ) ) + { + xiEventMask.deviceid = deviceInfo[i].deviceid; + match = true; + break; + } + } + + if( match ) + { + mXiDeviceId = xiEventMask.deviceid; + + // SelectXi2Event + xiEventMask.mask = (unsigned char*)(calloc( 1, XIMaskLen( XI_LASTEVENT ) ) ); + XISetMask( xiEventMask.mask, XI_RawMotion ); + + xiEventMask.mask_len = sizeof( xiEventMask.mask ); + + int ret = XISelectEvents( display, rootWindow, &xiEventMask, 1 ); + if( ret == 0 ) + { + // Register custom wheel events + mEcoreEventHandler.push_back( ecore_event_handler_add( ECORE_X_EVENT_GENERIC, EcoreEventCustomWheel, handler ) ); + } + else + { + DALI_LOG_INFO( gImfLogging, Debug::General, "Failed to Select Events\n" ); + } + } + } + else + { + DALI_LOG_INFO( gImfLogging, Debug::General, "Failed to query XI Version\n" ); + } + } + else + { + DALI_LOG_INFO( gImfLogging, Debug::General, "Failed to query XInputExtension\n" ); + } + #ifndef DALI_PROFILE_UBUNTU // Register Vconf notify - font name, font size and style vconf_notify_key_changed( DALI_VCONFKEY_SETAPPL_ACCESSIBILITY_FONT_NAME, VconfNotifyFontNameChanged, handler ); vconf_notify_key_changed( VCONFKEY_SETAPPL_ACCESSIBILITY_FONT_SIZE, VconfNotifyFontSizeChanged, handler ); -#if defined(DALI_PROFILE_MOBILE) || defined(DALI_PROFILE_LITE) - vconf_notify_key_changed( VCONFKEY_SETAPPL_CHANGE_UI_THEME_INT, VconfNotifyThemeChanged, handler ); -#endif #endif // DALI_PROFILE_UBUNTU } } @@ -251,9 +318,6 @@ struct EventHandler::Impl ~Impl() { #ifndef DALI_PROFILE_UBUNTU -#if defined(DALI_PROFILE_MOBILE) || defined(DALI_PROFILE_LITE) - vconf_ignore_key_changed( VCONFKEY_SETAPPL_CHANGE_UI_THEME_INT, VconfNotifyThemeChanged ); -#endif vconf_ignore_key_changed( VCONFKEY_SETAPPL_ACCESSIBILITY_FONT_SIZE, VconfNotifyFontSizeChanged ); vconf_ignore_key_changed( DALI_VCONFKEY_SETAPPL_ACCESSIBILITY_FONT_NAME, VconfNotifyFontNameChanged ); #endif // DALI_PROFILE_UBUNTU @@ -315,35 +379,98 @@ struct EventHandler::Impl } /** - * Called when a touch up is received. + * Called when a touch motion is received. + */ + static Eina_Bool EcoreEventMouseButtonMove( void* data, int type, void* event ) + { + Ecore_Event_Mouse_Move *touchEvent( (Ecore_Event_Mouse_Move*)event ); + EventHandler* handler( (EventHandler*)data ); + + if ( touchEvent->window == handler->mImpl->mWindow ) + { + TouchPoint point( touchEvent->multi.device, TouchPoint::Motion, touchEvent->x, touchEvent->y ); + handler->SendEvent( point, touchEvent->timestamp ); + } + + return ECORE_CALLBACK_PASS_ON; + } + + ///////////////////////////////////////////////////////////////////////////////////////////////// + // Wheel Callbacks + ///////////////////////////////////////////////////////////////////////////////////////////////// + + /** + * Called when a mouse wheel is received. */ static Eina_Bool EcoreEventMouseWheel( void* data, int type, void* event ) { Ecore_Event_Mouse_Wheel *mouseWheelEvent( (Ecore_Event_Mouse_Wheel*)event ); - DALI_LOG_INFO( gImfLogging, Debug::General, "EVENT Ecore_Event_Mouse_Wheel: direction: %d, modifiers: %d, x: %d, y: %d, z: %d\n", mouseWheelEvent->direction, mouseWheelEvent->modifiers, mouseWheelEvent->x, mouseWheelEvent->y, mouseWheelEvent->z); + DALI_LOG_INFO( gImfLogging, Debug::General, "EVENT Ecore_Event_Mouse_Wheel: direction: %d, modifiers: %d, x: %d, y: %d, z: %d\n", mouseWheelEvent->direction, mouseWheelEvent->modifiers, mouseWheelEvent->x, mouseWheelEvent->y, mouseWheelEvent->z ); EventHandler* handler( (EventHandler*)data ); if ( mouseWheelEvent->window == handler->mImpl->mWindow ) { - MouseWheelEvent wheelEvent(mouseWheelEvent->direction, mouseWheelEvent->modifiers, Vector2(mouseWheelEvent->x, mouseWheelEvent->y), mouseWheelEvent->z, mouseWheelEvent->timestamp); - handler->SendMouseWheelEvent( wheelEvent ); + WheelEvent wheelEvent( WheelEvent::MOUSE_WHEEL, mouseWheelEvent->direction, mouseWheelEvent->modifiers, Vector2(mouseWheelEvent->x, mouseWheelEvent->y), mouseWheelEvent->z, mouseWheelEvent->timestamp ); + handler->SendWheelEvent( wheelEvent ); } return ECORE_CALLBACK_PASS_ON; } /** - * Called when a touch motion is received. + * Called when a custom wheel is received. */ - static Eina_Bool EcoreEventMouseButtonMove( void* data, int type, void* event ) + static Eina_Bool EcoreEventCustomWheel( void* data, int type, void* event ) { - Ecore_Event_Mouse_Move *touchEvent( (Ecore_Event_Mouse_Move*)event ); + Ecore_X_Event_Generic *genericEvent( (Ecore_X_Event_Generic*)event ); EventHandler* handler( (EventHandler*)data ); - if ( touchEvent->window == handler->mImpl->mWindow ) + switch( genericEvent->evtype ) { - TouchPoint point( touchEvent->multi.device, TouchPoint::Motion, touchEvent->x, touchEvent->y ); - handler->SendEvent( point, touchEvent->timestamp ); + case XI_RawMotion: + { + XIRawEvent* xiRawEvent = static_cast< XIRawEvent* >( genericEvent->data ); + unsigned int timeStamp = 0; + + if( xiRawEvent->deviceid != handler->mImpl->mXiDeviceId ) + { + return ECORE_CALLBACK_PASS_ON; + } + + // X(0): rotate: NOT USED + // Y(1): timestamp + // Z(2): direction + + double* value = xiRawEvent->raw_values; + + if( XIMaskIsSet( xiRawEvent->valuators.mask, 1) ) + { + timeStamp = static_cast< unsigned int >( *(value + 1) ); + } + + if( XIMaskIsSet( xiRawEvent->valuators.mask, 2) ) + { + // if z == 1, clockwise + // otherwise counter-clockwise + int z = static_cast< int >( *(value + 2) ); + + // In DALi, positive value means clockwise, and negative value means counter-clockwise + if( z == 0 ) + { + z = -1; + } + + DALI_LOG_INFO( gImfLogging, Debug::General, "EVENT EcoreEventCustomWheel: z: %d\n", z ); + + WheelEvent wheelEvent( WheelEvent::CUSTOM_WHEEL, 0, 0, Vector2(0.0f, 0.0f), z, timeStamp ); + handler->SendWheelEvent( wheelEvent ); + } + break; + } + default: + { + break; + } } return ECORE_CALLBACK_PASS_ON; @@ -441,8 +568,8 @@ struct EventHandler::Impl // XF86Stop and XF86Send must skip ecore_imf_context_filter_event. if ( strcmp( keyEvent->keyname, "XF86Send" ) && - strcmp( keyEvent->keyname, "XF86Phone" ) && - strcmp( keyEvent->keyname, "XF86Stop" ) ) + strcmp( keyEvent->keyname, "XF86Home" ) && + strcmp( keyEvent->keyname, "XF86Back" ) ) { Ecore_IMF_Context* imfContext = NULL; Dali::ImfManager imfManager( ImfManager::Get() ); @@ -1068,11 +1195,7 @@ struct EventHandler::Impl static void VconfNotifyFontNameChanged( keynode_t* node, void* data ) { EventHandler* handler = static_cast( data ); - - StyleChange fontChange; - fontChange.defaultFontChange = true; - - handler->SendEvent( fontChange ); + handler->SendEvent( StyleChange::DEFAULT_FONT_CHANGE ); } /** @@ -1081,24 +1204,7 @@ struct EventHandler::Impl static void VconfNotifyFontSizeChanged( keynode_t* node, void* data ) { EventHandler* handler = static_cast( data ); - - StyleChange fontChange; - fontChange.defaultFontSizeChange = true; - - handler->SendEvent( fontChange ); - } - - /** - * Called when style is changed - */ - static void VconfNotifyThemeChanged( keynode_t* node, void* data ) - { - EventHandler* handler( static_cast(data) ); - - StyleChange themeChange; - themeChange.themeChange = true; - - handler->SendEvent( themeChange ); + handler->SendEvent( StyleChange::DEFAULT_FONT_SIZE_CHANGE ); } #endif // DALI_PROFILE_UBUNTU @@ -1106,6 +1212,7 @@ struct EventHandler::Impl EventHandler* mHandler; std::vector mEcoreEventHandler; Ecore_X_Window mWindow; + int mXiDeviceId; }; EventHandler::EventHandler( RenderSurface* surface, CoreEventInterface& coreEventInterface, GestureManager& gestureManager, DamageObserver& damageObserver, DragAndDropDetectorPtr dndDetector ) @@ -1122,16 +1229,12 @@ EventHandler::EventHandler( RenderSurface* surface, CoreEventInterface& coreEven { Ecore_X_Window window = 0; - if( surface->GetType() == Dali::RenderSurface::WINDOW ) + // this code only works with the EcoreX11 RenderSurface so need to downcast + ECore::WindowRenderSurface* ecoreSurface = dynamic_cast< ECore::WindowRenderSurface* >( surface ); + if( ecoreSurface ) { - // this code only works with the EcoreX11 RenderSurface so need to downcast - ECore::WindowRenderSurface* ecoreSurface = dynamic_cast< ECore::WindowRenderSurface* >( surface ); - if( ecoreSurface ) - { - // enable multi touch - window = ecoreSurface->GetXWindow(); - ecore_x_input_multi_select( window ); - } + // enable multi touch + window = ecoreSurface->GetXWindow(); } mImpl = new Impl(this, window); @@ -1196,15 +1299,15 @@ void EventHandler::SendEvent(KeyEvent& keyEvent) mCoreEventInterface.ProcessCoreEvents(); } -void EventHandler::SendMouseWheelEvent( MouseWheelEvent& wheelEvent ) +void EventHandler::SendWheelEvent( WheelEvent& wheelEvent ) { - // Create MouseWheelEvent and send to Core. - Integration::MouseWheelEvent event(wheelEvent.direction, wheelEvent.modifiers, wheelEvent.point, wheelEvent.z, wheelEvent.timeStamp); + // Create WheelEvent and send to Core. + Integration::WheelEvent event( static_cast< Integration::WheelEvent::Type >(wheelEvent.type), wheelEvent.direction, wheelEvent.modifiers, wheelEvent.point, wheelEvent.z, wheelEvent.timeStamp ); mCoreEventInterface.QueueCoreEvent( event ); mCoreEventInterface.ProcessCoreEvents(); } -void EventHandler::SendEvent(StyleChange styleChange) +void EventHandler::SendEvent( StyleChange::Type styleChange ) { DALI_ASSERT_DEBUG( mStyleMonitor && "StyleMonitor Not Available" ); GetImplementation( mStyleMonitor ).StyleChanged(styleChange); @@ -1236,9 +1339,9 @@ void EventHandler::FeedTouchPoint( TouchPoint& point, int timeStamp) SendEvent(point, timeStamp); } -void EventHandler::FeedWheelEvent( MouseWheelEvent& wheelEvent ) +void EventHandler::FeedWheelEvent( WheelEvent& wheelEvent ) { - SendMouseWheelEvent( wheelEvent ); + SendWheelEvent( wheelEvent ); } void EventHandler::FeedKeyEvent( KeyEvent& event )