X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=adaptors%2Fx11%2Fwindow-impl-x.cpp;h=710d9fbdbedf9f9750d11c1d49cf4b4b8be6ee67;hb=a6b0ac5016d7c6aa09d2e774529faaad10ae0ce3;hp=f5530b6c3aeb06c31ae8bb9693ff3ecb575a0a1a;hpb=ba492405ac8a02caef1fd87f88bf54620a9c7164;p=platform%2Fcore%2Fuifw%2Fdali-adaptor.git diff --git a/adaptors/x11/window-impl-x.cpp b/adaptors/x11/window-impl-x.cpp index f5530b6..710d9fb 100644 --- a/adaptors/x11/window-impl-x.cpp +++ b/adaptors/x11/window-impl-x.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. @@ -19,6 +19,9 @@ #include "window-impl.h" // EXTERNAL HEADERS +// Ecore is littered with C style cast +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wold-style-cast" #include #include @@ -30,7 +33,7 @@ // INTERNAL HEADERS #include #include -#include +#include #include #include #include @@ -63,8 +66,9 @@ struct Window::EventHandler */ EventHandler( Window* window ) : mWindow( window ), - mWindowPropertyHandler( ecore_event_handler_add( ECORE_X_EVENT_WINDOW_PROPERTY, EcoreEventWindowPropertyChanged, this ) ), - mClientMessagehandler( ecore_event_handler_add( ECORE_X_EVENT_CLIENT_MESSAGE, EcoreEventClientMessage, this ) ), + mWindowPropertyHandler( NULL ), + mClientMessagehandler( NULL ), + mWindowDeleteRequestHandler( NULL ), mEcoreWindow( 0 ) { // store ecore window handle @@ -82,6 +86,18 @@ struct Window::EventHandler ECORE_X_ATOM_E_DEICONIFY_APPROVE, &tmp, 1); #endif // DALI_PROFILE_UBUNTU + + if( mWindow->mEcoreEventHander ) + { + ecore_x_input_multi_select( mEcoreWindow ); + + // This ensures that we catch the window close (or delete) request + ecore_x_icccm_protocol_set( mEcoreWindow, ECORE_X_WM_PROTOCOL_DELETE_REQUEST, EINA_TRUE ); + + mWindowPropertyHandler= ecore_event_handler_add( ECORE_X_EVENT_WINDOW_PROPERTY, EcoreEventWindowPropertyChanged, this ); + mClientMessagehandler = ecore_event_handler_add( ECORE_X_EVENT_CLIENT_MESSAGE, EcoreEventClientMessage, this ); + mWindowDeleteRequestHandler = ecore_event_handler_add( ECORE_X_EVENT_WINDOW_DELETE_REQUEST, EcoreEventWindowDeleteRequest, this ); + } } /** @@ -97,6 +113,10 @@ struct Window::EventHandler { ecore_event_handler_del( mClientMessagehandler ); } + if ( mWindowDeleteRequestHandler ) + { + ecore_event_handler_del( mWindowDeleteRequestHandler ); + } } // Static methods @@ -188,19 +208,28 @@ struct Window::EventHandler return handled; } + /// Called when the window receives a delete request + static Eina_Bool EcoreEventWindowDeleteRequest( void* data, int type, void* event ) + { + EventHandler* handler( (EventHandler*)data ); + handler->mWindow->mDeleteRequestSignal.Emit(); + return ECORE_CALLBACK_DONE; + } + // Data Window* mWindow; Ecore_Event_Handler* mWindowPropertyHandler; Ecore_Event_Handler* mClientMessagehandler; + Ecore_Event_Handler* mWindowDeleteRequestHandler; Ecore_X_Window mEcoreWindow; }; -Window* Window::New(const PositionSize& posSize, const std::string& name, bool isTransparent) +Window* Window::New(const PositionSize& posSize, const std::string& name, const std::string& className, bool isTransparent) { Window* window = new Window(); window->mIsTransparent = isTransparent; - window->Initialize(posSize, name); + window->Initialize(posSize, name, className); return window; } @@ -240,11 +269,6 @@ RenderSurface* Window::GetSurface() return mSurface; } -void Window::SetIndicatorStyle( Dali::Window::IndicatorStyle style ) -{ - mIndicatorStyle = style; -} - void Window::ShowIndicator( Dali::Window::IndicatorVisibleMode visibleMode ) { DALI_LOG_TRACE_METHOD_FMT( gWindowLogFilter, "visible : %d\n", visibleMode ); @@ -314,23 +338,40 @@ void Window::SetClass(std::string name, std::string klass) } Window::Window() -: mSurface(NULL), - mIndicatorStyle(Dali::Window::CHANGEABLE_COLOR), - mIndicatorVisible(Dali::Window::INVISIBLE), - mIndicatorIsShown(false), - mShowRotatedIndicatorOnClose(false), - mStarted(false), - mIsTransparent(false), - mWMRotationAppSet(false), - 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::INVISIBLE ), + mIndicatorIsShown( false ), + mShowRotatedIndicatorOnClose( false ), + mStarted( false ), + mIsTransparent( false ), + mWMRotationAppSet( false ), + mEcoreEventHander( true ), + mIsFocusAcceptable( true ), + mVisible( true ), + mOpaqueState( false ), + mIndicator( NULL ), + mIndicatorOrientation( Dali::Window::PORTRAIT ), + mNextIndicatorOrientation( Dali::Window::PORTRAIT ), + mIndicatorOpacityMode( Dali::Window::OPAQUE ), + mOverlay( NULL ), + mAdaptor( NULL ), + mType( Dali::DevelWindow::NORMAL ), + mEventHandler( NULL ), + mPreferredOrientation( Dali::Window::PORTRAIT ), + mSupportedAuxiliaryHints(), + mAuxiliaryHints() +{ + + // Detect if we're not running in a ecore main loop (e.g. libuv). + // Typically ecore_x_init is called by app_efl_main->elm_init + // but if we're not using app_efl_main then we have to call it ourselves + // This is a hack until we create a pure X Window class + if( ecore_x_display_get() == NULL ) + { + mEcoreEventHander = false; + ecore_x_init (NULL); // internally calls _ecore_x_input_init + } + } Window::~Window() @@ -357,12 +398,15 @@ Window::~Window() delete mSurface; } -void Window::Initialize(const PositionSize& windowPosition, const std::string& name) +void Window::Initialize(const PositionSize& windowPosition, const std::string& name, const std::string& className) { // create an X11 window by default Any surface; - Any display; - mSurface = new ECore::WindowRenderSurface( windowPosition, surface, display, name, mIsTransparent ); + ECore::WindowRenderSurface* windowSurface = new ECore::WindowRenderSurface( windowPosition, surface, name, className, mIsTransparent ); + windowSurface->Map(); + + mSurface = windowSurface; + mOrientation = Orientation::New(this); // create event handler for X11 window @@ -375,7 +419,7 @@ void Window::DoShowIndicator( Dali::Window::WindowOrientation lastOrientation ) { if( mIndicatorVisible != Dali::Window::INVISIBLE ) { - mIndicator = new Indicator( mAdaptor, mIndicatorOrientation, mIndicatorStyle, this ); + mIndicator = new Indicator( mAdaptor, mIndicatorOrientation, this ); mIndicator->SetOpacityMode( mIndicatorOpacityMode ); Dali::Actor actor = mIndicator->GetActor(); SetIndicatorActorRotation(); @@ -473,7 +517,7 @@ void Window::IndicatorTypeChanged(Indicator::Type type) } } -void Window::IndicatorClosed( Indicator* indicator ) +void Window::IndicatorClosed( IndicatorInterface* indicator ) { DALI_LOG_TRACE_METHOD( gWindowLogFilter ); @@ -606,11 +650,6 @@ void Window::OnDestroy() mAdaptor = NULL; } -OrientationPtr Window::GetOrientation() -{ - return mOrientation; -} - void Window::AddAvailableOrientation(Dali::Window::WindowOrientation orientation) { bool found = false; @@ -702,6 +741,55 @@ Dali::Window::WindowOrientation Window::GetPreferredOrientation() return mPreferredOrientation; } +void Window::SetAcceptFocus( bool accept ) +{ + mIsFocusAcceptable = accept; +} + +bool Window::IsFocusAcceptable() +{ + return mIsFocusAcceptable; +} + +void Window::Show() +{ + ECore::WindowRenderSurface* x11Window = dynamic_cast< ECore::WindowRenderSurface * >( mSurface ); + if( x11Window ) + { + Ecore_X_Window win = x11Window->GetXWindow(); + ecore_x_window_show( win ); + + // Need an update request + if( mAdaptor ) + { + mAdaptor->RequestUpdateOnce(); + } + } +} + +void Window::Hide() +{ + ECore::WindowRenderSurface* x11Window = dynamic_cast< ECore::WindowRenderSurface * >( mSurface ); + if( x11Window ) + { + Ecore_X_Window win = x11Window->GetXWindow(); + ecore_x_window_hide( win ); + } +} + +bool Window::IsVisible() const +{ + bool visible = false; + + ECore::WindowRenderSurface* x11Window = dynamic_cast< ECore::WindowRenderSurface * >( mSurface ); + if( x11Window ) + { + Ecore_X_Window win = x11Window->GetXWindow(); + visible = static_cast< bool >( ecore_x_window_visible_get( win ) ); + } + return visible; +} + void Window::RotationDone( int orientation, int width, int height ) { // Tell window manager we're done @@ -730,7 +818,99 @@ void Window::RotationDone( int orientation, int width, int height ) } } +unsigned int Window::GetSupportedAuxiliaryHintCount() +{ + return 0; +} + +std::string Window::GetSupportedAuxiliaryHint( unsigned int index ) +{ + return std::string(); +} + +unsigned int Window::AddAuxiliaryHint( const std::string& hint, const std::string& value ) +{ + return -1; +} + +bool Window::RemoveAuxiliaryHint( unsigned int id ) +{ + return false; +} + +bool Window::SetAuxiliaryHintValue( unsigned int id, const std::string& value ) +{ + return false; +} + +std::string Window::GetAuxiliaryHintValue( unsigned int id ) const +{ + return std::string(); +} + +unsigned int Window::GetAuxiliaryHintId( const std::string& hint ) const +{ + return -1; +} + +void Window::SetInputRegion( const Rect< int >& inputRegion ) +{ +} + +void Window::SetType( Dali::DevelWindow::Type type ) +{ + mType = type; +} + +Dali::DevelWindow::Type Window::GetType() const +{ + return mType; +} + +bool Window::SetNotificationLevel( Dali::DevelWindow::NotificationLevel::Type level ) +{ + return false; +} + +Dali::DevelWindow::NotificationLevel::Type Window::GetNotificationLevel() +{ + return Dali::DevelWindow::NotificationLevel::NONE; +} + +void Window::SetOpaqueState( bool opaque ) +{ + mOpaqueState = opaque; +} + +bool Window::IsOpaqueState() +{ + return mOpaqueState; +} + +bool Window::SetScreenMode( Dali::DevelWindow::ScreenMode::Type screenMode ) +{ + return false; +} + +Dali::DevelWindow::ScreenMode::Type Window::GetScreenMode() +{ + return Dali::DevelWindow::ScreenMode::DEFAULT; +} + +bool Window::SetBrightness( int brightness ) +{ + return false; +} + +int Window::GetBrightness() +{ + return 0; +} } // Adaptor + } // Internal + } // Dali + +#pragma GCC diagnostic pop