X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=adaptors%2Fecore%2Fwayland%2Fwindow-impl-ecore-wl.cpp;h=24c6cca598214b4a84352765d1f0958f6d66275d;hb=4769d57f040fdb40c96b242f3ff5239d3a82bf3a;hp=600445badaecfc8ac6bea2455ba0e116c30b8678;hpb=9c16e6cf506d82eec83deed26fc48c9ef9a5c697;p=platform%2Fcore%2Fuifw%2Fdali-adaptor.git diff --git a/adaptors/ecore/wayland/window-impl-ecore-wl.cpp b/adaptors/ecore/wayland/window-impl-ecore-wl.cpp index 600445b..24c6cca 100644 --- a/adaptors/ecore/wayland/window-impl-ecore-wl.cpp +++ b/adaptors/ecore/wayland/window-impl-ecore-wl.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014 Samsung Electronics Co., Ltd. + * Copyright (c) 2017 Samsung Electronics Co., Ltd. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,7 +16,7 @@ */ // CLASS HEADER -#include "window-impl.h" +#include // EXTERNAL HEADERS #include @@ -34,6 +34,7 @@ #include #include #include + namespace { const float INDICATOR_ANIMATION_DURATION( 0.18f ); // 180 milli seconds @@ -63,7 +64,9 @@ struct Window::EventHandler EventHandler( Window* window ) : mWindow( window ), mWindowPropertyHandler( NULL ), - mClientMessageHandler( NULL ), + mWindowIconifyStateHandler( NULL ), + mWindowFocusInHandler( NULL ), + mWindowFocusOutHandler( NULL ), mEcoreWindow( 0 ) { // store ecore window handle @@ -73,6 +76,13 @@ struct Window::EventHandler mEcoreWindow = wlWindow->GetWlWindow(); } DALI_ASSERT_ALWAYS( mEcoreWindow != 0 && "There is no ecore Wl window"); + + if( mWindow->mEcoreEventHander ) + { + mWindowIconifyStateHandler = ecore_event_handler_add( ECORE_WL_EVENT_WINDOW_ICONIFY_STATE_CHANGE, EcoreEventWindowIconifyStateChanged, this ); + mWindowFocusInHandler = ecore_event_handler_add( ECORE_WL_EVENT_FOCUS_IN, EcoreEventWindowFocusIn, this ); + mWindowFocusOutHandler = ecore_event_handler_add( ECORE_WL_EVENT_FOCUS_OUT, EcoreEventWindowFocusOut, this ); + } } /** @@ -84,9 +94,17 @@ struct Window::EventHandler { ecore_event_handler_del( mWindowPropertyHandler ); } - if ( mClientMessageHandler ) + if ( mWindowIconifyStateHandler ) + { + ecore_event_handler_del( mWindowIconifyStateHandler ); + } + if( mWindowFocusInHandler ) { - ecore_event_handler_del( mClientMessageHandler ); + ecore_event_handler_del( mWindowFocusInHandler ); + } + if( mWindowFocusOutHandler ) + { + ecore_event_handler_del( mWindowFocusOutHandler ); } } @@ -98,20 +116,76 @@ struct Window::EventHandler return EINA_FALSE; } - /// Called when the window properties are changed. - static Eina_Bool EcoreEventClientMessage( void* data, int type, void* event ) + /// Called when the window iconify state is changed. + static Eina_Bool EcoreEventWindowIconifyStateChanged( void* data, int type, void* event ) { - return EINA_FALSE; + Ecore_Wl_Event_Window_Iconify_State_Change* iconifyChangedEvent( static_cast< Ecore_Wl_Event_Window_Iconify_State_Change* >( event ) ); + EventHandler* handler( static_cast< EventHandler* >( data ) ); + Eina_Bool handled( ECORE_CALLBACK_PASS_ON ); + + if ( handler && handler->mWindow ) + { + WindowVisibilityObserver* observer( handler->mWindow->mAdaptor ); + if ( observer && ( iconifyChangedEvent->win == static_cast< unsigned int> ( ecore_wl_window_id_get( handler->mEcoreWindow ) ) ) ) + { + if( iconifyChangedEvent->iconified == EINA_TRUE ) + { + observer->OnWindowHidden(); + DALI_LOG_INFO( gWindowLogFilter, Debug::General, "Window (%d) Iconfied\n", handler->mEcoreWindow ); + } + else + { + observer->OnWindowShown(); + DALI_LOG_INFO( gWindowLogFilter, Debug::General, "Window (%d) Shown\n", handler->mEcoreWindow ); + } + handled = ECORE_CALLBACK_DONE; + } + } + + return handled; + } + + /// Called when the window gains focus + static Eina_Bool EcoreEventWindowFocusIn( void* data, int type, void* event ) + { + Ecore_Wl_Event_Focus_In* focusInEvent( static_cast< Ecore_Wl_Event_Focus_In* >( event ) ); + EventHandler* handler( static_cast< EventHandler* >( data ) ); + + if ( handler && handler->mWindow && focusInEvent->win == static_cast< unsigned int >( ecore_wl_window_id_get( handler->mEcoreWindow ) ) ) + { + DALI_LOG_INFO( gWindowLogFilter, Debug::General, "Window EcoreEventWindowFocusIn\n" ); + + handler->mWindow->mFocusChangedSignal.Emit( true ); + } + + return ECORE_CALLBACK_PASS_ON; + } + + /// Called when the window loses focus + static Eina_Bool EcoreEventWindowFocusOut( void* data, int type, void* event ) + { + Ecore_Wl_Event_Focus_Out* focusOutEvent( static_cast< Ecore_Wl_Event_Focus_Out* >( event ) ); + EventHandler* handler( static_cast< EventHandler* >( data ) ); + + if ( handler && handler->mWindow && focusOutEvent->win == static_cast< unsigned int >(ecore_wl_window_id_get( handler->mEcoreWindow ) ) ) + { + DALI_LOG_INFO( gWindowLogFilter, Debug::General, "Window EcoreEventWindowFocusOut\n" ); + + handler->mWindow->mFocusChangedSignal.Emit( false ); + } + + return ECORE_CALLBACK_PASS_ON; } // Data Window* mWindow; Ecore_Event_Handler* mWindowPropertyHandler; - Ecore_Event_Handler* mClientMessageHandler; + Ecore_Event_Handler* mWindowIconifyStateHandler; + Ecore_Event_Handler* mWindowFocusInHandler; + Ecore_Event_Handler* mWindowFocusOutHandler; Ecore_Wl_Window* mEcoreWindow; }; - Window* Window::New(const PositionSize& posSize, const std::string& name, const std::string& className, bool isTransparent) { Window* window = new Window(); @@ -192,7 +266,7 @@ void Window::ShowIndicator( Dali::Window::IndicatorVisibleMode visibleMode ) DoShowIndicator( mIndicatorOrientation ); } -void Window::RotateIndicator(Dali::Window::WindowOrientation orientation) +void Window::RotateIndicator( Dali::Window::WindowOrientation orientation ) { DALI_LOG_TRACE_METHOD_FMT( gWindowLogFilter, "Orientation: %d\n", orientation ); @@ -226,22 +300,23 @@ void Window::SetClass(std::string name, std::string klass) } Window::Window() -: mSurface(NULL), - mIndicatorVisible(Dali::Window::VISIBLE), - mIndicatorIsShown(false), - mShowRotatedIndicatorOnClose(false), - mStarted(false), - mIsTransparent(false), - mWMRotationAppSet(false), - mEcoreEventHander(true), - mIndicator(NULL), - mIndicatorOrientation(Dali::Window::PORTRAIT), - mNextIndicatorOrientation(Dali::Window::PORTRAIT), - mIndicatorOpacityMode(Dali::Window::OPAQUE), - mOverlay(NULL), - mAdaptor(NULL), - mEventHandler(NULL), - mPreferredOrientation(Dali::Window::PORTRAIT) +: mSurface( NULL ), + mIndicatorVisible( Dali::Window::VISIBLE ), + mIndicatorIsShown( false ), + mShowRotatedIndicatorOnClose( false ), + mStarted( false ), + mIsTransparent( false ), + mWMRotationAppSet( false ), + mEcoreEventHander( true ), + mIsFocusAcceptable( true ), + mIndicator( NULL ), + mIndicatorOrientation( Dali::Window::PORTRAIT ), + mNextIndicatorOrientation( Dali::Window::PORTRAIT ), + mIndicatorOpacityMode( Dali::Window::OPAQUE ), + mOverlay( NULL ), + mAdaptor( NULL ), + mEventHandler( NULL ), + mPreferredOrientation( Dali::Window::PORTRAIT ) { } @@ -560,12 +635,23 @@ Dali::Window::WindowOrientation Window::GetPreferredOrientation() return mPreferredOrientation; } +void Window::SetAcceptFocus( bool accept ) +{ + mIsFocusAcceptable = accept; + + ecore_wl_window_focus_skip_set( mEventHandler->mEcoreWindow, !accept ); +} + +bool Window::IsFocusAcceptable() +{ + return mIsFocusAcceptable; +} + void Window::RotationDone( int orientation, int width, int height ) { ecore_wl_window_rotation_change_done_send( mEventHandler->mEcoreWindow ); } - } // Adaptor } // Internal } // Dali