2 * Copyright (c) 2017 Samsung Electronics Co., Ltd.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
19 #include <window-impl.h>
22 // Ecore is littered with C style cast
23 #pragma GCC diagnostic push
24 #pragma GCC diagnostic ignored "-Wold-style-cast"
26 #include <Ecore_Wayland.h>
27 #include <tizen-extension-client-protocol.h>
29 #include <dali/integration-api/core.h>
30 #include <dali/integration-api/system-overlay.h>
31 #include <dali/public-api/render-tasks/render-task.h>
32 #include <dali/public-api/render-tasks/render-task-list.h>
33 #include <orientation.h>
36 #include <window-render-surface.h>
37 #include <drag-and-drop-detector-impl.h>
38 #include <ecore-indicator-impl.h>
39 #include <window-visibility-observer.h>
40 #include <orientation-impl.h>
44 const float INDICATOR_ANIMATION_DURATION( 0.18f ); // 180 milli seconds
45 const float INDICATOR_SHOW_Y_POSITION( 0.0f );
46 const float INDICATOR_HIDE_Y_POSITION( -52.0f );
56 #if defined(DEBUG_ENABLED)
57 Debug::Filter* gWindowLogFilter = Debug::Filter::New(Debug::NoLogging, false, "LOG_WINDOW");
61 * TODO: Abstract Window class out and move this into a window implementation for Ecore
63 struct Window::EventHandler
67 * @param[in] window A pointer to the window class.
69 EventHandler( Window* window )
76 mTizenDisplayPolicy( NULL ),
77 mNotificationLevel( -1 ),
78 mNotificationChangeState( 0 ),
79 mNotificationLevelChangeDone( true ),
81 mScreenOffModeChangeState( 0 ),
82 mScreenOffModeChangeDone( true ),
84 mBrightnessChangeState( 0 ),
85 mBrightnessChangeDone( true )
87 // store ecore window handle
88 ECore::WindowRenderSurface* wlWindow( dynamic_cast< ECore::WindowRenderSurface * >( mWindow->mSurface ) );
91 mEcoreWindow = wlWindow->GetWlWindow();
93 DALI_ASSERT_ALWAYS( mEcoreWindow != 0 && "There is no ecore Wl window");
95 if( mWindow->mEcoreEventHander )
97 mEcoreEventHandler.PushBack( ecore_event_handler_add( ECORE_WL_EVENT_WINDOW_ICONIFY_STATE_CHANGE, EcoreEventWindowIconifyStateChanged, this ) );
98 mEcoreEventHandler.PushBack( ecore_event_handler_add( ECORE_WL_EVENT_FOCUS_IN, EcoreEventWindowFocusIn, this ) );
99 mEcoreEventHandler.PushBack( ecore_event_handler_add( ECORE_WL_EVENT_FOCUS_OUT, EcoreEventWindowFocusOut, this ) );
100 mEcoreEventHandler.PushBack( ecore_event_handler_add( ECORE_WL_EVENT_OUTPUT_TRANSFORM, EcoreEventOutputTransform, this) );
101 mEcoreEventHandler.PushBack( ecore_event_handler_add( ECORE_WL_EVENT_IGNORE_OUTPUT_TRANSFORM, EcoreEventIgnoreOutputTransform, this) );
104 mDisplay = ecore_wl_display_get();
108 wl_display* displayWrapper = static_cast< wl_display* >( wl_proxy_create_wrapper( mDisplay ) );
111 mEventQueue = wl_display_create_queue( mDisplay );
114 wl_proxy_set_queue( reinterpret_cast< wl_proxy* >( displayWrapper ), mEventQueue );
116 wl_registry* registry = wl_display_get_registry( displayWrapper );
117 wl_registry_add_listener( registry, &mRegistryListener, this );
120 wl_proxy_wrapper_destroy( displayWrapper );
130 for( Dali::Vector< Ecore_Event_Handler* >::Iterator iter = mEcoreEventHandler.Begin(), endIter = mEcoreEventHandler.End(); iter != endIter; ++iter )
132 ecore_event_handler_del( *iter );
134 mEcoreEventHandler.Clear();
138 wl_event_queue_destroy( mEventQueue );
144 /// Called when the window iconify state is changed.
145 static Eina_Bool EcoreEventWindowIconifyStateChanged( void* data, int type, void* event )
147 Ecore_Wl_Event_Window_Iconify_State_Change* iconifyChangedEvent( static_cast< Ecore_Wl_Event_Window_Iconify_State_Change* >( event ) );
148 EventHandler* handler( static_cast< EventHandler* >( data ) );
149 Eina_Bool handled( ECORE_CALLBACK_PASS_ON );
151 if ( handler && handler->mWindow )
153 WindowVisibilityObserver* observer( handler->mWindow->mAdaptor );
154 if ( observer && ( iconifyChangedEvent->win == static_cast< unsigned int> ( ecore_wl_window_id_get( handler->mEcoreWindow ) ) ) )
156 if( iconifyChangedEvent->iconified == EINA_TRUE )
158 observer->OnWindowHidden();
159 DALI_LOG_INFO( gWindowLogFilter, Debug::General, "Window (%d) Iconfied\n", handler->mEcoreWindow );
163 observer->OnWindowShown();
164 DALI_LOG_INFO( gWindowLogFilter, Debug::General, "Window (%d) Shown\n", handler->mEcoreWindow );
166 handled = ECORE_CALLBACK_DONE;
173 /// Called when the window gains focus
174 static Eina_Bool EcoreEventWindowFocusIn( void* data, int type, void* event )
176 Ecore_Wl_Event_Focus_In* focusInEvent( static_cast< Ecore_Wl_Event_Focus_In* >( event ) );
177 EventHandler* handler( static_cast< EventHandler* >( data ) );
179 if ( handler && handler->mWindow && focusInEvent->win == static_cast< unsigned int >( ecore_wl_window_id_get( handler->mEcoreWindow ) ) )
181 DALI_LOG_INFO( gWindowLogFilter, Debug::General, "Window EcoreEventWindowFocusIn\n" );
183 handler->mWindow->mFocusChangedSignal.Emit( true );
186 return ECORE_CALLBACK_PASS_ON;
189 /// Called when the window loses focus
190 static Eina_Bool EcoreEventWindowFocusOut( void* data, int type, void* event )
192 Ecore_Wl_Event_Focus_Out* focusOutEvent( static_cast< Ecore_Wl_Event_Focus_Out* >( event ) );
193 EventHandler* handler( static_cast< EventHandler* >( data ) );
195 if ( handler && handler->mWindow && focusOutEvent->win == static_cast< unsigned int >(ecore_wl_window_id_get( handler->mEcoreWindow ) ) )
197 DALI_LOG_INFO( gWindowLogFilter, Debug::General, "Window EcoreEventWindowFocusOut\n" );
199 handler->mWindow->mFocusChangedSignal.Emit( false );
202 return ECORE_CALLBACK_PASS_ON;
205 /// Called when the output is transformed
206 static Eina_Bool EcoreEventOutputTransform( void* data, int type, void* event )
208 Ecore_Wl_Event_Output_Transform* transformEvent( static_cast< Ecore_Wl_Event_Output_Transform* >( event ) );
209 EventHandler* handler( static_cast< EventHandler* >( data ) );
211 if ( handler && handler->mWindow && transformEvent->output == ecore_wl_window_output_find( handler->mEcoreWindow ) )
213 DALI_LOG_INFO( gWindowLogFilter, Debug::General, "Window (%d) EcoreEventOutputTransform\n", handler->mEcoreWindow );
215 ECore::WindowRenderSurface* wlSurface( dynamic_cast< ECore::WindowRenderSurface * >( handler->mWindow->mSurface ) );
218 wlSurface->OutputTransformed();
220 PositionSize positionSize = wlSurface->GetPositionSize();
221 handler->mWindow->mAdaptor->SurfaceResizePrepare( Adaptor::SurfaceSize( positionSize.width, positionSize.height ) );
222 handler->mWindow->mAdaptor->SurfaceResizeComplete( Adaptor::SurfaceSize( positionSize.width, positionSize.height ) );
226 return ECORE_CALLBACK_PASS_ON;
229 /// Called when the output transform should be ignored
230 static Eina_Bool EcoreEventIgnoreOutputTransform( void* data, int type, void* event )
232 Ecore_Wl_Event_Ignore_Output_Transform* ignoreTransformEvent( static_cast< Ecore_Wl_Event_Ignore_Output_Transform* >( event ) );
233 EventHandler* handler( static_cast< EventHandler* >( data ) );
235 if ( handler && handler->mWindow && ignoreTransformEvent->win == handler->mEcoreWindow )
237 DALI_LOG_INFO( gWindowLogFilter, Debug::General, "Window (%d) EcoreEventIgnoreOutputTransform\n", handler->mEcoreWindow );
239 ECore::WindowRenderSurface* wlSurface( dynamic_cast< ECore::WindowRenderSurface * >( handler->mWindow->mSurface ) );
242 wlSurface->OutputTransformed();
244 PositionSize positionSize = wlSurface->GetPositionSize();
245 handler->mWindow->mAdaptor->SurfaceResizePrepare( Adaptor::SurfaceSize( positionSize.width, positionSize.height ) );
246 handler->mWindow->mAdaptor->SurfaceResizeComplete( Adaptor::SurfaceSize( positionSize.width, positionSize.height ) );
250 return ECORE_CALLBACK_PASS_ON;
253 static void RegistryGlobalCallback( void* data, struct wl_registry *registry, uint32_t name, const char* interface, uint32_t version )
255 Window::EventHandler* eventHandler = static_cast< Window::EventHandler* >( data );
257 if( strcmp( interface, tizen_policy_interface.name ) == 0 )
259 eventHandler->mTizenPolicy = static_cast< tizen_policy* >( wl_registry_bind( registry, name, &tizen_policy_interface, version ) );
260 if( !eventHandler->mTizenPolicy )
262 DALI_LOG_INFO( gWindowLogFilter, Debug::General, "Window::EventHandler::RegistryGlobalCallback: wl_registry_bind(tizen_policy_interface) is failed.\n" );
266 tizen_policy_add_listener( eventHandler->mTizenPolicy, &eventHandler->mTizenPolicyListener, data );
268 DALI_LOG_INFO( gWindowLogFilter, Debug::General, "Window::EventHandler::RegistryGlobalCallback: tizen_policy_add_listener is called.\n" );
270 else if( strcmp( interface, tizen_display_policy_interface.name ) == 0 )
272 eventHandler->mTizenDisplayPolicy = static_cast< tizen_display_policy* >( wl_registry_bind( registry, name, &tizen_display_policy_interface, version ) );
273 if( !eventHandler->mTizenDisplayPolicy )
275 DALI_LOG_INFO( gWindowLogFilter, Debug::General, "Window::EventHandler::RegistryGlobalCallback: wl_registry_bind(tizen_display_policy_interface) is failed.\n" );
279 tizen_display_policy_add_listener( eventHandler->mTizenDisplayPolicy, &eventHandler->mTizenDisplayPolicyListener, data );
281 DALI_LOG_INFO( gWindowLogFilter, Debug::General, "Window::EventHandler::RegistryGlobalCallback: tizen_display_policy_add_listener is called.\n" );
285 static void RegistryGlobalCallbackRemove( void* data, struct wl_registry* registry, uint32_t id )
287 Window::EventHandler* eventHandler = static_cast< Window::EventHandler* >( data );
288 eventHandler->mTizenPolicy = NULL;
289 eventHandler->mTizenDisplayPolicy = NULL;
292 static void TizenPolicyNotificationChangeDone(void* data, struct tizen_policy* tizenPolicy, struct wl_surface* surface, int32_t level, uint32_t state )
294 Window::EventHandler* eventHandler = static_cast< Window::EventHandler* >( data );
296 eventHandler->mNotificationLevel = level;
297 eventHandler->mNotificationChangeState = state;
298 eventHandler->mNotificationLevelChangeDone = true;
300 DALI_LOG_INFO( gWindowLogFilter, Debug::General, "Window::EventHandler::TizenPolicyNotificationChangeDone: level = %d, state = %d\n", level, state );
303 static void TizenPolicyScreenModeChangeDone(void* data, struct tizen_policy* tizenPolicy, struct wl_surface* surface, uint32_t mode, uint32_t state )
305 Window::EventHandler* eventHandler = static_cast< Window::EventHandler* >( data );
307 eventHandler->mScreenOffMode = mode;
308 eventHandler->mScreenOffModeChangeState = state;
309 eventHandler->mScreenOffModeChangeDone = true;
311 DALI_LOG_INFO( gWindowLogFilter, Debug::General, "Window::EventHandler::TizenPolicyScreenModeChangeDone: mode = %d, state = %d\n", mode, state );
314 static void DisplayPolicyBrightnessChangeDone(void* data, struct tizen_display_policy *displayPolicy, struct wl_surface* surface, int32_t brightness, uint32_t state )
316 Window::EventHandler* eventHandler = static_cast< Window::EventHandler* >( data );
318 eventHandler->mBrightness = brightness;
319 eventHandler->mBrightnessChangeState = state;
320 eventHandler->mBrightnessChangeDone = true;
322 DALI_LOG_INFO( gWindowLogFilter, Debug::General, "Window::EventHandler::DisplayPolicyBrightnessChangeDone: brightness = %d, state = %d\n", brightness, state );
325 const struct wl_registry_listener mRegistryListener =
327 RegistryGlobalCallback,
328 RegistryGlobalCallbackRemove
331 const struct tizen_policy_listener mTizenPolicyListener =
335 TizenPolicyNotificationChangeDone,
337 TizenPolicyScreenModeChangeDone,
344 const struct tizen_display_policy_listener mTizenDisplayPolicyListener =
346 DisplayPolicyBrightnessChangeDone
351 Dali::Vector< Ecore_Event_Handler* > mEcoreEventHandler;
352 Ecore_Wl_Window* mEcoreWindow;
354 wl_display* mDisplay;
355 wl_event_queue* mEventQueue;
356 tizen_policy* mTizenPolicy;
357 tizen_display_policy* mTizenDisplayPolicy;
359 int mNotificationLevel;
360 uint32_t mNotificationChangeState;
361 bool mNotificationLevelChangeDone;
364 uint32_t mScreenOffModeChangeState;
365 bool mScreenOffModeChangeDone;
368 uint32_t mBrightnessChangeState;
369 bool mBrightnessChangeDone;
372 Window* Window::New( const PositionSize& positionSize, const std::string& name, const std::string& className, bool isTransparent )
374 Window* window = new Window();
375 window->mIsTransparent = isTransparent;
376 window->Initialize( positionSize, name, className );
380 void Window::SetAdaptor(Dali::Adaptor& adaptor)
382 DALI_ASSERT_ALWAYS( !mStarted && "Adaptor already started" );
385 // Only create one overlay per window
386 Internal::Adaptor::Adaptor& adaptorImpl = Internal::Adaptor::Adaptor::GetImplementation(adaptor);
387 Integration::Core& core = adaptorImpl.GetCore();
388 mOverlay = &core.GetSystemOverlay();
390 Dali::RenderTaskList taskList = mOverlay->GetOverlayRenderTasks();
391 taskList.CreateTask();
393 mAdaptor = &adaptorImpl;
394 mAdaptor->AddObserver( *this );
396 // Can only create the detector when we know the Core has been instantiated.
397 mDragAndDropDetector = DragAndDropDetector::New();
398 mAdaptor->SetDragAndDropDetector( &GetImplementation( mDragAndDropDetector ) );
402 mOrientation->SetAdaptor(adaptor);
405 if( mIndicator != NULL )
407 mIndicator->SetAdaptor(mAdaptor);
411 RenderSurface* Window::GetSurface()
416 void Window::ShowIndicator( Dali::Window::IndicatorVisibleMode visibleMode )
418 DALI_LOG_TRACE_METHOD_FMT( gWindowLogFilter, "visible : %d\n", visibleMode );
419 DALI_ASSERT_DEBUG(mOverlay);
421 ECore::WindowRenderSurface* wlSurface( dynamic_cast< ECore::WindowRenderSurface * >( mSurface ) );
422 DALI_ASSERT_DEBUG(wlSurface);
426 Ecore_Wl_Window* wlWindow = wlSurface->GetWlWindow();
428 mIndicatorVisible = visibleMode;
430 if ( mIndicatorVisible == Dali::Window::VISIBLE )
432 // when the indicator is visible, set proper mode for indicator server according to bg mode
433 if ( mIndicatorOpacityMode == Dali::Window::OPAQUE )
435 ecore_wl_window_indicator_opacity_set(wlWindow, ECORE_WL_INDICATOR_OPAQUE);
437 else if ( mIndicatorOpacityMode == Dali::Window::TRANSLUCENT )
439 ecore_wl_window_indicator_opacity_set(wlWindow, ECORE_WL_INDICATOR_TRANSLUCENT);
441 else if ( mIndicatorOpacityMode == Dali::Window::TRANSPARENT )
443 ecore_wl_window_indicator_opacity_set(wlWindow, ECORE_WL_INDICATOR_OPAQUE);
448 // when the indicator is not visible, set TRANSPARENT mode for indicator server
449 ecore_wl_window_indicator_opacity_set(wlWindow, ECORE_WL_INDICATOR_TRANSPARENT); // it means hidden indicator
453 DoShowIndicator( mIndicatorOrientation );
456 void Window::RotateIndicator( Dali::Window::WindowOrientation orientation )
458 DALI_LOG_TRACE_METHOD_FMT( gWindowLogFilter, "Orientation: %d\n", orientation );
460 DoRotateIndicator( orientation );
463 void Window::SetIndicatorBgOpacity( Dali::Window::IndicatorBgOpacity opacityMode )
465 mIndicatorOpacityMode = opacityMode;
467 if( mIndicator != NULL )
469 mIndicator->SetOpacityMode( opacityMode );
473 void Window::SetClass(std::string name, std::string klass)
475 ECore::WindowRenderSurface* wlSurface( dynamic_cast< ECore::WindowRenderSurface * >( mSurface ) );
479 Ecore_Wl_Window* wlWindow = wlSurface->GetWlWindow();
480 ecore_wl_window_title_set( wlWindow, name.c_str() );
481 ecore_wl_window_class_name_set( wlWindow, klass.c_str() );
485 DALI_LOG_INFO( gWindowLogFilter, Debug::General, "Window has no surface\n" );
491 mIndicatorVisible( Dali::Window::VISIBLE ),
492 mIndicatorIsShown( false ),
493 mShowRotatedIndicatorOnClose( false ),
495 mIsTransparent( false ),
496 mWMRotationAppSet( false ),
497 mEcoreEventHander( true ),
498 mIsFocusAcceptable( true ),
500 mOpaqueState( false ),
501 mResizeEnabled( false ),
503 mIndicatorOrientation( Dali::Window::PORTRAIT ),
504 mNextIndicatorOrientation( Dali::Window::PORTRAIT ),
505 mIndicatorOpacityMode( Dali::Window::OPAQUE ),
508 mType( Dali::Window::NORMAL ),
509 mEventHandler( NULL ),
510 mPreferredOrientation( Dali::Window::PORTRAIT ),
511 mSupportedAuxiliaryHints(),
513 mIndicatorVisibilityChangedSignal(),
514 mFocusChangedSignal(),
516 mDeleteRequestSignal()
522 delete mEventHandler;
532 mAdaptor->RemoveObserver( *this );
533 mAdaptor->SetDragAndDropDetector( NULL );
539 mSupportedAuxiliaryHints.clear();
540 mAuxiliaryHints.clear();
543 void Window::Initialize(const PositionSize& positionSize, const std::string& name, const std::string& className)
545 // create an Wayland window by default
547 ECore::WindowRenderSurface* windowSurface = new ECore::WindowRenderSurface( positionSize, surface, name, mIsTransparent );
549 mSurface = windowSurface;
551 // create event handler for Wayland window
552 mEventHandler = new EventHandler( this );
554 // get auxiliary hint
555 Eina_List* hints = ecore_wl_window_aux_hints_supported_get( mEventHandler->mEcoreWindow );
561 for( l = hints, ( hint = static_cast< char* >( eina_list_data_get(l) ) ); l; l = eina_list_next(l), ( hint = static_cast< char* >( eina_list_data_get(l) ) ) )
563 mSupportedAuxiliaryHints.push_back( hint );
565 DALI_LOG_INFO( gWindowLogFilter, Debug::Verbose, "Window::Initialize: %s\n", hint );
569 if( !positionSize.IsEmpty() )
571 AddAuxiliaryHint( "wm.policy.win.user.geometry", "1" );
572 mResizeEnabled = true;
575 SetClass( name, className );
576 windowSurface->Map();
578 mOrientation = Orientation::New(this);
581 void Window::DoShowIndicator( Dali::Window::WindowOrientation lastOrientation )
583 if( mIndicator == NULL )
585 if( mIndicatorVisible != Dali::Window::INVISIBLE )
587 mIndicator = new Indicator( mAdaptor, mIndicatorOrientation, this );
588 mIndicator->SetOpacityMode( mIndicatorOpacityMode );
589 Dali::Actor actor = mIndicator->GetActor();
590 SetIndicatorActorRotation();
591 mOverlay->Add(actor);
593 // else don't create a hidden indicator
595 else // Already have indicator
597 if( mIndicatorVisible == Dali::Window::VISIBLE )
599 // If we are resuming, and rotation has changed,
600 if( mIndicatorIsShown == false && mIndicatorOrientation != mNextIndicatorOrientation )
602 // then close current indicator and open new one
603 mShowRotatedIndicatorOnClose = true;
604 mIndicator->Close(); // May synchronously call IndicatorClosed() callback & 1 level of recursion
605 // Don't show actor - will contain indicator for old orientation.
610 // set indicator visible mode
611 if( mIndicator != NULL )
613 mIndicator->SetVisible( mIndicatorVisible );
616 bool show = (mIndicatorVisible != Dali::Window::INVISIBLE );
617 SetIndicatorProperties( show, lastOrientation );
618 mIndicatorIsShown = show;
621 void Window::DoRotateIndicator( Dali::Window::WindowOrientation orientation )
623 if( mIndicatorIsShown )
625 mShowRotatedIndicatorOnClose = true;
626 mNextIndicatorOrientation = orientation;
627 mIndicator->Close(); // May synchronously call IndicatorClosed() callback
631 // Save orientation for when the indicator is next shown
632 mShowRotatedIndicatorOnClose = false;
633 mNextIndicatorOrientation = orientation;
637 void Window::SetIndicatorProperties( bool isShow, Dali::Window::WindowOrientation lastOrientation )
639 ECore::WindowRenderSurface* wlSurface( dynamic_cast< ECore::WindowRenderSurface * >( mSurface ) );
643 Ecore_Wl_Window* wlWindow = wlSurface->GetWlWindow();
646 ecore_wl_window_indicator_state_set(wlWindow, ECORE_WL_INDICATOR_STATE_ON);
650 ecore_wl_window_indicator_state_set(wlWindow, ECORE_WL_INDICATOR_STATE_OFF);
655 void Window::IndicatorTypeChanged(Indicator::Type type)
657 #if defined(DALI_PROFILE_MOBILE)
658 ECore::WindowRenderSurface* wlSurface( dynamic_cast< ECore::WindowRenderSurface * >( mSurface ) );
662 Ecore_Wl_Window* wlWindow = wlSurface->GetWlWindow();
665 case Indicator::INDICATOR_TYPE_1:
666 ecore_wl_indicator_visible_type_set(wlWindow, ECORE_WL_INDICATOR_VISIBLE_TYPE_SHOWN);
669 case Indicator::INDICATOR_TYPE_2:
670 ecore_wl_indicator_visible_type_set(wlWindow, ECORE_WL_INDICATOR_VISIBLE_TYPE_HIDDEN);
673 case Indicator::INDICATOR_TYPE_UNKNOWN:
681 void Window::IndicatorClosed( IndicatorInterface* indicator )
683 DALI_LOG_TRACE_METHOD( gWindowLogFilter );
685 if( mShowRotatedIndicatorOnClose )
687 Dali::Window::WindowOrientation currentOrientation = mIndicatorOrientation;
688 mIndicator->Open(mNextIndicatorOrientation);
689 mIndicatorOrientation = mNextIndicatorOrientation;
690 SetIndicatorActorRotation();
691 DoShowIndicator(currentOrientation);
695 void Window::IndicatorVisibilityChanged(bool isVisible)
697 mIndicatorVisibilityChangedSignal.Emit(isVisible);
700 void Window::SetIndicatorActorRotation()
702 DALI_LOG_TRACE_METHOD( gWindowLogFilter );
703 DALI_ASSERT_DEBUG( mIndicator != NULL );
705 Dali::Actor actor = mIndicator->GetActor();
706 switch( mIndicatorOrientation )
708 case Dali::Window::PORTRAIT:
709 actor.SetParentOrigin( ParentOrigin::TOP_CENTER );
710 actor.SetAnchorPoint( AnchorPoint::TOP_CENTER );
711 actor.SetOrientation( Degree(0), Vector3::ZAXIS );
713 case Dali::Window::PORTRAIT_INVERSE:
714 actor.SetParentOrigin( ParentOrigin::BOTTOM_CENTER );
715 actor.SetAnchorPoint( AnchorPoint::TOP_CENTER );
716 actor.SetOrientation( Degree(180), Vector3::ZAXIS );
718 case Dali::Window::LANDSCAPE:
719 actor.SetParentOrigin( ParentOrigin::CENTER_LEFT );
720 actor.SetAnchorPoint( AnchorPoint::TOP_CENTER );
721 actor.SetOrientation( Degree(270), Vector3::ZAXIS );
723 case Dali::Window::LANDSCAPE_INVERSE:
724 actor.SetParentOrigin( ParentOrigin::CENTER_RIGHT );
725 actor.SetAnchorPoint( AnchorPoint::TOP_CENTER );
726 actor.SetOrientation( Degree(90), Vector3::ZAXIS );
733 ecore_wl_window_raise( mEventHandler->mEcoreWindow );
738 ecore_wl_window_lower( mEventHandler->mEcoreWindow );
741 void Window::Activate()
743 ecore_wl_window_activate( mEventHandler->mEcoreWindow );
746 Dali::DragAndDropDetector Window::GetDragAndDropDetector() const
748 return mDragAndDropDetector;
751 Dali::Any Window::GetNativeHandle() const
755 return mEventHandler->mEcoreWindow;
763 void Window::OnStart()
765 DoShowIndicator( mIndicatorOrientation );
768 void Window::OnPause()
772 void Window::OnResume()
774 // resume indicator status
775 if( mIndicator != NULL )
777 // Restore own indicator opacity
778 // Send opacity mode to indicator service when app resumed
779 mIndicator->SetOpacityMode( mIndicatorOpacityMode );
783 void Window::OnStop()
794 void Window::OnDestroy()
799 void Window::AddAvailableOrientation(Dali::Window::WindowOrientation orientation)
803 for( std::size_t i=0; i<mAvailableOrientations.size(); i++ )
805 if(mAvailableOrientations[i] == orientation)
814 mAvailableOrientations.push_back(orientation);
815 SetAvailableOrientations( mAvailableOrientations );
819 void Window::RemoveAvailableOrientation(Dali::Window::WindowOrientation orientation)
821 for( std::vector<Dali::Window::WindowOrientation>::iterator iter = mAvailableOrientations.begin();
822 iter != mAvailableOrientations.end(); ++iter )
824 if( *iter == orientation )
826 mAvailableOrientations.erase( iter );
830 SetAvailableOrientations( mAvailableOrientations );
833 void Window::SetAvailableOrientations(const std::vector<Dali::Window::WindowOrientation>& orientations)
836 for( std::size_t i = 0; i < mAvailableOrientations.size(); ++i )
838 rotations[i] = static_cast< int >( mAvailableOrientations[i] );
840 ecore_wl_window_rotation_available_rotations_set( mEventHandler->mEcoreWindow, rotations, mAvailableOrientations.size() );
843 const std::vector<Dali::Window::WindowOrientation>& Window::GetAvailableOrientations()
845 return mAvailableOrientations;
848 void Window::SetPreferredOrientation(Dali::Window::WindowOrientation orientation)
850 mPreferredOrientation = orientation;
852 ecore_wl_window_rotation_preferred_rotation_set( mEventHandler->mEcoreWindow, orientation );
855 Dali::Window::WindowOrientation Window::GetPreferredOrientation()
857 return mPreferredOrientation;
860 void Window::SetAcceptFocus( bool accept )
862 mIsFocusAcceptable = accept;
864 ecore_wl_window_focus_skip_set( mEventHandler->mEcoreWindow, !accept );
867 bool Window::IsFocusAcceptable() const
869 return mIsFocusAcceptable;
875 ecore_wl_window_show( mEventHandler->mEcoreWindow );
877 // Need an update request
880 mAdaptor->RequestUpdateOnce();
887 ecore_wl_window_hide( mEventHandler->mEcoreWindow );
890 bool Window::IsVisible() const
895 void Window::RotationDone( int orientation, int width, int height )
897 ECore::WindowRenderSurface* wlSurface( dynamic_cast< ECore::WindowRenderSurface * >( mSurface ) );
900 wlSurface->RequestRotation( orientation, width, height );
903 mAdaptor->SurfaceResizePrepare( Adaptor::SurfaceSize( width, height ) );
906 mResizedSignal.Emit( Dali::Window::WindowSize( width, height ) );
908 mAdaptor->SurfaceResizeComplete( Adaptor::SurfaceSize( width, height ) );
911 void Window::SetIndicatorVisibleMode( Dali::Window::IndicatorVisibleMode mode )
913 mIndicatorVisible = mode;
916 unsigned int Window::GetSupportedAuxiliaryHintCount() const
918 return mSupportedAuxiliaryHints.size();
921 std::string Window::GetSupportedAuxiliaryHint( unsigned int index ) const
923 if( index >= GetSupportedAuxiliaryHintCount() )
925 DALI_LOG_INFO( gWindowLogFilter, Debug::Verbose, "Window::GetSupportedAuxiliaryHint: Invalid index! [%d]\n", index );
928 return mSupportedAuxiliaryHints[index];
931 unsigned int Window::AddAuxiliaryHint( const std::string& hint, const std::string& value )
933 bool supported = false;
935 // Check if the hint is suppported
936 for( std::vector< std::string >::iterator iter = mSupportedAuxiliaryHints.begin(); iter != mSupportedAuxiliaryHints.end(); ++iter )
947 DALI_LOG_INFO( gWindowLogFilter, Debug::Concise, "Window::AddAuxiliaryHint: Not supported auxiliary hint [%s]\n", hint.c_str() );
951 // Check if the hint is already added
952 for( unsigned int i = 0; i < mAuxiliaryHints.size(); i++ )
954 if( mAuxiliaryHints[i].first == hint )
956 // Just change the value
957 mAuxiliaryHints[i].second = value;
959 DALI_LOG_INFO( gWindowLogFilter, Debug::Verbose, "Window::AddAuxiliaryHint: Change! hint = %s, value = %s, id = %d\n", hint.c_str(), value.c_str(), i + 1 );
961 return i + 1; // id is index + 1
966 mAuxiliaryHints.push_back( std::pair< std::string, std::string >( hint, value ) );
968 unsigned int id = mAuxiliaryHints.size();
970 ecore_wl_window_aux_hint_add( mEventHandler->mEcoreWindow, static_cast< int >( id ), hint.c_str(), value.c_str() );
972 DALI_LOG_INFO( gWindowLogFilter, Debug::Verbose, "Window::AddAuxiliaryHint: hint = %s, value = %s, id = %d\n", hint.c_str(), value.c_str(), id );
977 bool Window::RemoveAuxiliaryHint( unsigned int id )
979 if( id == 0 || id > mAuxiliaryHints.size() )
981 DALI_LOG_INFO( gWindowLogFilter, Debug::Concise, "Window::RemoveAuxiliaryHint: Invalid id [%d]\n", id );
985 mAuxiliaryHints[id - 1].second = std::string();
987 ecore_wl_window_aux_hint_del( mEventHandler->mEcoreWindow, static_cast< int >( id ) );
989 DALI_LOG_INFO( gWindowLogFilter, Debug::Verbose, "Window::RemoveAuxiliaryHint: id = %d, hint = %s\n", id, mAuxiliaryHints[id - 1].first.c_str() );
994 bool Window::SetAuxiliaryHintValue( unsigned int id, const std::string& value )
996 if( id == 0 || id > mAuxiliaryHints.size() )
998 DALI_LOG_INFO( gWindowLogFilter, Debug::Concise, "Window::SetAuxiliaryHintValue: Invalid id [%d]\n", id );
1002 mAuxiliaryHints[id - 1].second = value;
1004 ecore_wl_window_aux_hint_change( mEventHandler->mEcoreWindow, static_cast< int >( id ), value.c_str() );
1006 DALI_LOG_INFO( gWindowLogFilter, Debug::Verbose, "Window::SetAuxiliaryHintValue: id = %d, hint = %s, value = %s\n", id, mAuxiliaryHints[id - 1].first.c_str(), mAuxiliaryHints[id - 1].second.c_str() );
1011 std::string Window::GetAuxiliaryHintValue( unsigned int id ) const
1013 if( id == 0 || id > mAuxiliaryHints.size() )
1015 DALI_LOG_INFO( gWindowLogFilter, Debug::Concise, "Window::GetAuxiliaryHintValue: Invalid id [%d]\n", id );
1016 return std::string();
1019 DALI_LOG_INFO( gWindowLogFilter, Debug::Verbose, "Window::GetAuxiliaryHintValue: id = %d, hint = %s, value = %s\n", id, mAuxiliaryHints[id - 1].first.c_str(), mAuxiliaryHints[id - 1].second.c_str() );
1021 return mAuxiliaryHints[id - 1].second;
1024 unsigned int Window::GetAuxiliaryHintId( const std::string& hint ) const
1026 for( unsigned int i = 0; i < mAuxiliaryHints.size(); i++ )
1028 if( mAuxiliaryHints[i].first == hint )
1030 DALI_LOG_INFO( gWindowLogFilter, Debug::Verbose, "Window::GetAuxiliaryHintId: hint = %s, id = %d\n", hint.c_str(), i + 1 );
1035 DALI_LOG_INFO( gWindowLogFilter, Debug::Verbose, "Window::GetAuxiliaryHintId: Invalid hint! [%s]\n", hint.c_str() );
1040 void Window::SetInputRegion( const Rect< int >& inputRegion )
1042 ecore_wl_window_input_region_set( mEventHandler->mEcoreWindow, inputRegion.x, inputRegion.y, inputRegion.width, inputRegion.height );
1044 DALI_LOG_INFO( gWindowLogFilter, Debug::Verbose, "Window::SetInputRegion: x = %d, y = %d, w = %d, h = %d\n", inputRegion.x, inputRegion.y, inputRegion.width, inputRegion.height );
1047 void Window::SetType( Dali::Window::Type type )
1049 Ecore_Wl_Window_Type windowType;
1055 case Dali::Window::NORMAL:
1057 windowType = ECORE_WL_WINDOW_TYPE_TOPLEVEL;
1060 case Dali::Window::NOTIFICATION:
1062 windowType = ECORE_WL_WINDOW_TYPE_NOTIFICATION;
1065 case Dali::Window::UTILITY:
1067 windowType = ECORE_WL_WINDOW_TYPE_UTILITY;
1070 case Dali::Window::DIALOG:
1072 windowType = ECORE_WL_WINDOW_TYPE_DIALOG;
1077 windowType = ECORE_WL_WINDOW_TYPE_TOPLEVEL;
1082 ecore_wl_window_type_set( mEventHandler->mEcoreWindow, windowType );
1088 Dali::Window::Type Window::GetType() const
1093 bool Window::SetNotificationLevel( Dali::Window::NotificationLevel::Type level )
1095 if( mType != Dali::Window::NOTIFICATION )
1097 DALI_LOG_INFO( gWindowLogFilter, Debug::Verbose, "Window::SetNotificationLevel: Not supported window type [%d]\n", mType );
1101 while( !mEventHandler->mTizenPolicy )
1103 wl_display_dispatch_queue( mEventHandler->mDisplay, mEventHandler->mEventQueue );
1106 int notificationLevel;
1110 case Dali::Window::NotificationLevel::NONE:
1112 notificationLevel = TIZEN_POLICY_LEVEL_NONE;
1115 case Dali::Window::NotificationLevel::BASE:
1117 notificationLevel = TIZEN_POLICY_LEVEL_DEFAULT;
1120 case Dali::Window::NotificationLevel::MEDIUM:
1122 notificationLevel = TIZEN_POLICY_LEVEL_MEDIUM;
1125 case Dali::Window::NotificationLevel::HIGH:
1127 notificationLevel = TIZEN_POLICY_LEVEL_HIGH;
1130 case Dali::Window::NotificationLevel::TOP:
1132 notificationLevel = TIZEN_POLICY_LEVEL_TOP;
1137 DALI_LOG_INFO( gWindowLogFilter, Debug::Verbose, "Window::SetNotificationLevel: invalid level [%d]\n", level );
1138 notificationLevel = TIZEN_POLICY_LEVEL_DEFAULT;
1143 mEventHandler->mNotificationLevelChangeDone = false;
1144 mEventHandler->mNotificationChangeState = TIZEN_POLICY_ERROR_STATE_NONE;
1146 tizen_policy_set_notification_level( mEventHandler->mTizenPolicy, ecore_wl_window_surface_get( mEventHandler->mEcoreWindow ), notificationLevel );
1150 while( !mEventHandler->mNotificationLevelChangeDone && count < 3 )
1153 wl_display_dispatch_queue( mEventHandler->mDisplay, mEventHandler->mEventQueue );
1157 if( !mEventHandler->mNotificationLevelChangeDone )
1159 DALI_LOG_INFO( gWindowLogFilter, Debug::Verbose, "Window::SetNotificationLevel: Level change is failed [%d, %d]\n", level, mEventHandler->mNotificationChangeState );
1162 else if( mEventHandler->mNotificationChangeState == TIZEN_POLICY_ERROR_STATE_PERMISSION_DENIED )
1164 DALI_LOG_INFO( gWindowLogFilter, Debug::Verbose, "Window::SetNotificationLevel: Permission denied! [%d]\n", level );
1168 DALI_LOG_INFO( gWindowLogFilter, Debug::Verbose, "Window::SetNotificationLevel: Level is changed [%d]\n", mEventHandler->mNotificationLevel );
1173 Dali::Window::NotificationLevel::Type Window::GetNotificationLevel() const
1175 if( mType != Dali::Window::NOTIFICATION )
1177 DALI_LOG_INFO( gWindowLogFilter, Debug::Verbose, "Window::GetNotificationLevel: Not supported window type [%d]\n", mType );
1178 return Dali::Window::NotificationLevel::NONE;
1181 while( !mEventHandler->mTizenPolicy )
1183 wl_display_dispatch_queue( mEventHandler->mDisplay, mEventHandler->mEventQueue );
1188 while( !mEventHandler->mNotificationLevelChangeDone && count < 3 )
1191 wl_display_dispatch_queue( mEventHandler->mDisplay, mEventHandler->mEventQueue );
1195 if( !mEventHandler->mNotificationLevelChangeDone )
1197 DALI_LOG_INFO( gWindowLogFilter, Debug::Verbose, "Window::GetNotificationLevel: Error! [%d]\n", mEventHandler->mNotificationChangeState );
1198 return Dali::Window::NotificationLevel::NONE;
1201 Dali::Window::NotificationLevel::Type level;
1203 switch( mEventHandler->mNotificationLevel )
1205 case TIZEN_POLICY_LEVEL_NONE:
1207 level = Dali::Window::NotificationLevel::NONE;
1210 case TIZEN_POLICY_LEVEL_DEFAULT:
1212 level = Dali::Window::NotificationLevel::BASE;
1215 case TIZEN_POLICY_LEVEL_MEDIUM:
1217 level = Dali::Window::NotificationLevel::MEDIUM;
1220 case TIZEN_POLICY_LEVEL_HIGH:
1222 level = Dali::Window::NotificationLevel::HIGH;
1225 case TIZEN_POLICY_LEVEL_TOP:
1227 level = Dali::Window::NotificationLevel::TOP;
1232 DALI_LOG_INFO( gWindowLogFilter, Debug::Verbose, "Window::GetNotificationLevel: invalid level [%d]\n", mEventHandler->mNotificationLevel );
1233 level = Dali::Window::NotificationLevel::NONE;
1238 DALI_LOG_INFO( gWindowLogFilter, Debug::Verbose, "Window::GetNotificationLevel: level [%d]\n", mEventHandler->mNotificationLevel );
1243 void Window::SetOpaqueState( bool opaque )
1245 while( !mEventHandler->mTizenPolicy )
1247 wl_display_dispatch_queue( mEventHandler->mDisplay, mEventHandler->mEventQueue );
1250 tizen_policy_set_opaque_state( mEventHandler->mTizenPolicy, ecore_wl_window_surface_get( mEventHandler->mEcoreWindow ), ( opaque ? 1 : 0 ) );
1252 mOpaqueState = opaque;
1254 DALI_LOG_INFO( gWindowLogFilter, Debug::Verbose, "Window::SetOpaqueState: opaque = %d\n", opaque );
1257 bool Window::IsOpaqueState() const
1259 return mOpaqueState;
1262 bool Window::SetScreenOffMode(Dali::Window::ScreenOffMode::Type screenOffMode)
1264 while( !mEventHandler->mTizenPolicy )
1266 wl_display_dispatch_queue( mEventHandler->mDisplay, mEventHandler->mEventQueue );
1269 mEventHandler->mScreenOffModeChangeDone = false;
1270 mEventHandler->mScreenOffModeChangeState = TIZEN_POLICY_ERROR_STATE_NONE;
1272 unsigned int mode = 0;
1274 switch( screenOffMode )
1276 case Dali::Window::ScreenOffMode::TIMEOUT:
1281 case Dali::Window::ScreenOffMode::NEVER:
1288 tizen_policy_set_window_screen_mode( mEventHandler->mTizenPolicy, ecore_wl_window_surface_get( mEventHandler->mEcoreWindow ), mode );
1292 while( !mEventHandler->mScreenOffModeChangeDone && count < 3 )
1295 wl_display_dispatch_queue( mEventHandler->mDisplay, mEventHandler->mEventQueue );
1299 if( !mEventHandler->mScreenOffModeChangeDone )
1301 DALI_LOG_INFO( gWindowLogFilter, Debug::Verbose, "Window::SetScreenOffMode: Screen mode change is failed [%d, %d]\n", screenOffMode, mEventHandler->mScreenOffModeChangeState );
1304 else if( mEventHandler->mScreenOffModeChangeState == TIZEN_POLICY_ERROR_STATE_PERMISSION_DENIED )
1306 DALI_LOG_INFO( gWindowLogFilter, Debug::Verbose, "Window::SetScreenOffMode: Permission denied! [%d]\n", screenOffMode );
1310 DALI_LOG_INFO( gWindowLogFilter, Debug::Verbose, "Window::SetScreenOffMode: Screen mode is changed [%d]\n", mEventHandler->mScreenOffMode );
1315 Dali::Window::ScreenOffMode::Type Window::GetScreenOffMode() const
1317 while( !mEventHandler->mTizenPolicy )
1319 wl_display_dispatch_queue( mEventHandler->mDisplay, mEventHandler->mEventQueue );
1324 while( !mEventHandler->mScreenOffModeChangeDone && count < 3 )
1327 wl_display_dispatch_queue( mEventHandler->mDisplay, mEventHandler->mEventQueue );
1331 if( !mEventHandler->mScreenOffModeChangeDone )
1333 DALI_LOG_INFO( gWindowLogFilter, Debug::Verbose, "Window::GetScreenOffMode: Error! [%d]\n", mEventHandler->mScreenOffModeChangeState );
1334 return Dali::Window::ScreenOffMode::TIMEOUT;
1337 Dali::Window::ScreenOffMode::Type screenMode = Dali::Window::ScreenOffMode::TIMEOUT;
1339 switch( mEventHandler->mScreenOffMode )
1343 screenMode = Dali::Window::ScreenOffMode::TIMEOUT;
1348 screenMode = Dali::Window::ScreenOffMode::NEVER;
1353 DALI_LOG_INFO( gWindowLogFilter, Debug::Verbose, "Window::GetScreenOffMode: screen mode [%d]\n", mEventHandler->mScreenOffMode );
1358 bool Window::SetBrightness( int brightness )
1360 if( brightness < 0 || brightness > 100 )
1362 DALI_LOG_INFO( gWindowLogFilter, Debug::Verbose, "Window::SetBrightness: Invalid brightness value [%d]\n", brightness );
1366 while( !mEventHandler->mTizenDisplayPolicy )
1368 wl_display_dispatch_queue( mEventHandler->mDisplay, mEventHandler->mEventQueue );
1371 mEventHandler->mBrightnessChangeDone = false;
1372 mEventHandler->mBrightnessChangeState = TIZEN_POLICY_ERROR_STATE_NONE;
1374 tizen_display_policy_set_window_brightness( mEventHandler->mTizenDisplayPolicy, ecore_wl_window_surface_get( mEventHandler->mEcoreWindow ), brightness );
1378 while( !mEventHandler->mBrightnessChangeDone && count < 3 )
1381 wl_display_dispatch_queue( mEventHandler->mDisplay, mEventHandler->mEventQueue );
1385 if( !mEventHandler->mBrightnessChangeDone )
1387 DALI_LOG_INFO( gWindowLogFilter, Debug::Verbose, "Window::SetBrightness: Brightness change is failed [%d, %d]\n", brightness, mEventHandler->mBrightnessChangeState );
1390 else if( mEventHandler->mBrightnessChangeState == TIZEN_POLICY_ERROR_STATE_PERMISSION_DENIED )
1392 DALI_LOG_INFO( gWindowLogFilter, Debug::Verbose, "Window::SetBrightness: Permission denied! [%d]\n", brightness );
1396 DALI_LOG_INFO( gWindowLogFilter, Debug::Verbose, "Window::SetBrightness: Brightness is changed [%d]\n", mEventHandler->mBrightness );
1401 int Window::GetBrightness() const
1403 while( !mEventHandler->mTizenDisplayPolicy )
1405 wl_display_dispatch_queue( mEventHandler->mDisplay, mEventHandler->mEventQueue );
1410 while( !mEventHandler->mBrightnessChangeDone && count < 3 )
1413 wl_display_dispatch_queue( mEventHandler->mDisplay, mEventHandler->mEventQueue );
1417 if( !mEventHandler->mBrightnessChangeDone )
1419 DALI_LOG_INFO( gWindowLogFilter, Debug::Verbose, "Window::GetBrightness: Error! [%d]\n", mEventHandler->mBrightnessChangeState );
1423 DALI_LOG_INFO( gWindowLogFilter, Debug::Verbose, "Window::GetBrightness: Brightness [%d]\n", mEventHandler->mBrightness );
1425 return mEventHandler->mBrightness;
1428 void Window::SetSize( Dali::Window::WindowSize size )
1430 if( !mResizeEnabled )
1432 AddAuxiliaryHint( "wm.policy.win.user.geometry", "1" );
1433 mResizeEnabled = true;
1436 PositionSize positionSize = mSurface->GetPositionSize();
1438 if( positionSize.width != size.GetWidth() || positionSize.height != size.GetHeight() )
1440 positionSize.width = size.GetWidth();
1441 positionSize.height = size.GetHeight();
1443 mSurface->MoveResize( positionSize );
1445 mAdaptor->SurfaceResizePrepare( Adaptor::SurfaceSize( positionSize.width, positionSize.height ) );
1448 mResizedSignal.Emit( Dali::Window::WindowSize( positionSize.width, positionSize.height ) );
1450 mAdaptor->SurfaceResizeComplete( Adaptor::SurfaceSize( positionSize.width, positionSize.height ) );
1454 Dali::Window::WindowSize Window::GetSize() const
1456 PositionSize positionSize = mSurface->GetPositionSize();
1458 return Dali::Window::WindowSize( positionSize.width, positionSize.height );
1461 void Window::SetPosition( Dali::Window::WindowPosition position )
1463 if( !mResizeEnabled )
1465 AddAuxiliaryHint( "wm.policy.win.user.geometry", "1" );
1466 mResizeEnabled = true;
1469 PositionSize positionSize = mSurface->GetPositionSize();
1471 if( positionSize.x != position.GetX() || positionSize.y != position.GetY() )
1473 positionSize.x = position.GetX();
1474 positionSize.y = position.GetY();
1476 mSurface->MoveResize( positionSize );
1480 Dali::Window::WindowPosition Window::GetPosition() const
1482 PositionSize positionSize = mSurface->GetPositionSize();
1484 return Dali::Window::WindowPosition( positionSize.x, positionSize.y );
1487 void Window::SetTransparency( bool transparent )
1489 ECore::WindowRenderSurface* wlSurface( dynamic_cast< ECore::WindowRenderSurface * >( mSurface ) );
1492 wlSurface->SetTransparency( transparent );
1502 #pragma GCC diagnostic pop