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 )
71 mWindowPropertyHandler( NULL ),
72 mWindowIconifyStateHandler( NULL ),
73 mWindowVisibilityStateHandler( NULL ),
74 mWindowFocusInHandler( NULL ),
75 mWindowFocusOutHandler( NULL ),
80 mTizenDisplayPolicy( NULL ),
81 mNotificationLevel( -1 ),
82 mNotificationChangeState( 0 ),
83 mNotificationLevelChangeDone( true ),
85 mScreenModeChangeState( 0 ),
86 mScreenModeChangeDone( true ),
88 mBrightnessChangeState( 0 ),
89 mBrightnessChangeDone( true )
91 // store ecore window handle
92 ECore::WindowRenderSurface* wlWindow( dynamic_cast< ECore::WindowRenderSurface * >( mWindow->mSurface ) );
95 mEcoreWindow = wlWindow->GetWlWindow();
97 DALI_ASSERT_ALWAYS( mEcoreWindow != 0 && "There is no ecore Wl window");
99 if( mWindow->mEcoreEventHander )
101 mWindowIconifyStateHandler = ecore_event_handler_add( ECORE_WL_EVENT_WINDOW_ICONIFY_STATE_CHANGE, EcoreEventWindowIconifyStateChanged, this );
102 mWindowVisibilityStateHandler = ecore_event_handler_add( ECORE_WL_EVENT_WINDOW_VISIBILITY_CHANGE, EcoreEventWindowVisibilityChanged, this );
103 mWindowFocusInHandler = ecore_event_handler_add( ECORE_WL_EVENT_FOCUS_IN, EcoreEventWindowFocusIn, this );
104 mWindowFocusOutHandler = ecore_event_handler_add( ECORE_WL_EVENT_FOCUS_OUT, EcoreEventWindowFocusOut, this );
107 mDisplay = ecore_wl_display_get();
111 wl_display* displayWrapper = static_cast< wl_display* >( wl_proxy_create_wrapper( mDisplay ) );
114 mEventQueue = wl_display_create_queue( mDisplay );
117 wl_proxy_set_queue( reinterpret_cast< wl_proxy* >( displayWrapper ), mEventQueue );
119 wl_registry* registry = wl_display_get_registry( displayWrapper );
120 wl_registry_add_listener( registry, &mRegistryListener, this );
123 wl_proxy_wrapper_destroy( displayWrapper );
133 if ( mWindowPropertyHandler )
135 ecore_event_handler_del( mWindowPropertyHandler );
138 if ( mWindowIconifyStateHandler )
140 ecore_event_handler_del( mWindowIconifyStateHandler );
143 if ( mWindowVisibilityStateHandler )
145 ecore_event_handler_del( mWindowVisibilityStateHandler );
148 if( mWindowFocusInHandler )
150 ecore_event_handler_del( mWindowFocusInHandler );
153 if( mWindowFocusOutHandler )
155 ecore_event_handler_del( mWindowFocusOutHandler );
160 wl_event_queue_destroy( mEventQueue );
166 /// Called when the window properties are changed.
167 static Eina_Bool EcoreEventWindowPropertyChanged( void* data, int type, void* event )
172 /// Called when the window iconify state is changed.
173 static Eina_Bool EcoreEventWindowIconifyStateChanged( void* data, int type, void* event )
175 Ecore_Wl_Event_Window_Iconify_State_Change* iconifyChangedEvent( static_cast< Ecore_Wl_Event_Window_Iconify_State_Change* >( event ) );
176 EventHandler* handler( static_cast< EventHandler* >( data ) );
177 Eina_Bool handled( ECORE_CALLBACK_PASS_ON );
179 if ( handler && handler->mWindow )
181 WindowVisibilityObserver* observer( handler->mWindow->mAdaptor );
182 if ( observer && ( iconifyChangedEvent->win == static_cast< unsigned int> ( ecore_wl_window_id_get( handler->mEcoreWindow ) ) ) )
184 if( iconifyChangedEvent->iconified == EINA_TRUE )
186 observer->OnWindowHidden();
187 DALI_LOG_INFO( gWindowLogFilter, Debug::General, "Window (%d) Iconfied\n", handler->mEcoreWindow );
191 observer->OnWindowShown();
192 DALI_LOG_INFO( gWindowLogFilter, Debug::General, "Window (%d) Shown\n", handler->mEcoreWindow );
194 handled = ECORE_CALLBACK_DONE;
201 /// Called when the window visibility is changed.
202 static Eina_Bool EcoreEventWindowVisibilityChanged( void* data, int type, void* event )
204 Ecore_Wl_Event_Window_Visibility_Change* visibilityChangedEvent( static_cast< Ecore_Wl_Event_Window_Visibility_Change* >( event ) );
205 EventHandler* handler( static_cast< EventHandler* >( data ) );
206 Eina_Bool handled( ECORE_CALLBACK_PASS_ON );
208 if ( handler && handler->mWindow )
210 WindowVisibilityObserver* observer( handler->mWindow->mAdaptor );
211 if ( observer && ( visibilityChangedEvent->win == static_cast< unsigned int >( ecore_wl_window_id_get( handler->mEcoreWindow ) ) ) )
213 if( visibilityChangedEvent->fully_obscured == 1 )
215 observer->OnWindowHidden();
216 DALI_LOG_INFO( gWindowLogFilter, Debug::General, "Window (%d) full obscured\n", handler->mEcoreWindow );
220 observer->OnWindowShown();
221 DALI_LOG_INFO( gWindowLogFilter, Debug::General, "Window (%d) Shown\n", handler->mEcoreWindow );
223 handled = ECORE_CALLBACK_DONE;
230 /// Called when the window gains focus
231 static Eina_Bool EcoreEventWindowFocusIn( void* data, int type, void* event )
233 Ecore_Wl_Event_Focus_In* focusInEvent( static_cast< Ecore_Wl_Event_Focus_In* >( event ) );
234 EventHandler* handler( static_cast< EventHandler* >( data ) );
236 if ( handler && handler->mWindow && focusInEvent->win == static_cast< unsigned int >( ecore_wl_window_id_get( handler->mEcoreWindow ) ) )
238 DALI_LOG_INFO( gWindowLogFilter, Debug::General, "Window EcoreEventWindowFocusIn\n" );
240 handler->mWindow->mFocusChangedSignal.Emit( true );
243 return ECORE_CALLBACK_PASS_ON;
246 /// Called when the window loses focus
247 static Eina_Bool EcoreEventWindowFocusOut( void* data, int type, void* event )
249 Ecore_Wl_Event_Focus_Out* focusOutEvent( static_cast< Ecore_Wl_Event_Focus_Out* >( event ) );
250 EventHandler* handler( static_cast< EventHandler* >( data ) );
252 if ( handler && handler->mWindow && focusOutEvent->win == static_cast< unsigned int >(ecore_wl_window_id_get( handler->mEcoreWindow ) ) )
254 DALI_LOG_INFO( gWindowLogFilter, Debug::General, "Window EcoreEventWindowFocusOut\n" );
256 handler->mWindow->mFocusChangedSignal.Emit( false );
259 return ECORE_CALLBACK_PASS_ON;
262 static void RegistryGlobalCallback( void* data, struct wl_registry *registry, uint32_t name, const char* interface, uint32_t version )
264 Window::EventHandler* eventHandler = static_cast< Window::EventHandler* >( data );
266 if( strcmp( interface, tizen_policy_interface.name ) == 0 )
268 eventHandler->mTizenPolicy = static_cast< tizen_policy* >( wl_registry_bind( registry, name, &tizen_policy_interface, version ) );
269 if( !eventHandler->mTizenPolicy )
271 DALI_LOG_INFO( gWindowLogFilter, Debug::General, "Window::EventHandler::RegistryGlobalCallback: wl_registry_bind(tizen_policy_interface) is failed.\n" );
275 tizen_policy_add_listener( eventHandler->mTizenPolicy, &eventHandler->mTizenPolicyListener, data );
277 DALI_LOG_INFO( gWindowLogFilter, Debug::General, "Window::EventHandler::RegistryGlobalCallback: tizen_policy_add_listener is called.\n" );
279 else if( strcmp( interface, tizen_display_policy_interface.name ) == 0 )
281 eventHandler->mTizenDisplayPolicy = static_cast< tizen_display_policy* >( wl_registry_bind( registry, name, &tizen_display_policy_interface, version ) );
282 if( !eventHandler->mTizenDisplayPolicy )
284 DALI_LOG_INFO( gWindowLogFilter, Debug::General, "Window::EventHandler::RegistryGlobalCallback: wl_registry_bind(tizen_display_policy_interface) is failed.\n" );
288 tizen_display_policy_add_listener( eventHandler->mTizenDisplayPolicy, &eventHandler->mTizenDisplayPolicyListener, data );
290 DALI_LOG_INFO( gWindowLogFilter, Debug::General, "Window::EventHandler::RegistryGlobalCallback: tizen_display_policy_add_listener is called.\n" );
294 static void RegistryGlobalCallbackRemove( void* data, struct wl_registry* registry, uint32_t id )
296 Window::EventHandler* eventHandler = static_cast< Window::EventHandler* >( data );
297 eventHandler->mTizenPolicy = NULL;
298 eventHandler->mTizenDisplayPolicy = NULL;
301 static void TizenPolicyNotificationChangeDone(void* data, struct tizen_policy* tizenPolicy, struct wl_surface* surface, int32_t level, uint32_t state )
303 Window::EventHandler* eventHandler = static_cast< Window::EventHandler* >( data );
305 eventHandler->mNotificationLevel = level;
306 eventHandler->mNotificationChangeState = state;
307 eventHandler->mNotificationLevelChangeDone = true;
309 DALI_LOG_INFO( gWindowLogFilter, Debug::General, "Window::EventHandler::TizenPolicyNotificationChangeDone: level = %d, state = %d\n", level, state );
312 static void TizenPolicyScreenModeChangeDone(void* data, struct tizen_policy* tizenPolicy, struct wl_surface* surface, uint32_t mode, uint32_t state )
314 Window::EventHandler* eventHandler = static_cast< Window::EventHandler* >( data );
316 eventHandler->mScreenMode = mode;
317 eventHandler->mScreenModeChangeState = state;
318 eventHandler->mScreenModeChangeDone = true;
320 DALI_LOG_INFO( gWindowLogFilter, Debug::General, "Window::EventHandler::TizenPolicyScreenModeChangeDone: mode = %d, state = %d\n", mode, state );
323 static void DisplayPolicyBrightnessChangeDone(void* data, struct tizen_display_policy *displayPolicy, struct wl_surface* surface, int32_t brightness, uint32_t state )
325 Window::EventHandler* eventHandler = static_cast< Window::EventHandler* >( data );
327 eventHandler->mBrightness = brightness;
328 eventHandler->mBrightnessChangeState = state;
329 eventHandler->mBrightnessChangeDone = true;
331 DALI_LOG_INFO( gWindowLogFilter, Debug::General, "Window::EventHandler::DisplayPolicyBrightnessChangeDone: brightness = %d, state = %d\n", brightness, state );
334 const struct wl_registry_listener mRegistryListener =
336 RegistryGlobalCallback,
337 RegistryGlobalCallbackRemove
340 const struct tizen_policy_listener mTizenPolicyListener =
344 TizenPolicyNotificationChangeDone,
346 TizenPolicyScreenModeChangeDone,
353 const struct tizen_display_policy_listener mTizenDisplayPolicyListener =
355 DisplayPolicyBrightnessChangeDone
360 Ecore_Event_Handler* mWindowPropertyHandler;
361 Ecore_Event_Handler* mWindowIconifyStateHandler;
362 Ecore_Event_Handler* mWindowVisibilityStateHandler;
363 Ecore_Event_Handler* mWindowFocusInHandler;
364 Ecore_Event_Handler* mWindowFocusOutHandler;
365 Ecore_Wl_Window* mEcoreWindow;
367 wl_display* mDisplay;
368 wl_event_queue* mEventQueue;
369 tizen_policy* mTizenPolicy;
370 tizen_display_policy* mTizenDisplayPolicy;
372 int mNotificationLevel;
373 uint32_t mNotificationChangeState;
374 bool mNotificationLevelChangeDone;
377 uint32_t mScreenModeChangeState;
378 bool mScreenModeChangeDone;
381 uint32_t mBrightnessChangeState;
382 bool mBrightnessChangeDone;
385 Window* Window::New(const PositionSize& posSize, const std::string& name, const std::string& className, bool isTransparent)
387 Window* window = new Window();
388 window->mIsTransparent = isTransparent;
389 window->Initialize(posSize, name, className);
393 void Window::SetAdaptor(Dali::Adaptor& adaptor)
395 DALI_ASSERT_ALWAYS( !mStarted && "Adaptor already started" );
398 // Only create one overlay per window
399 Internal::Adaptor::Adaptor& adaptorImpl = Internal::Adaptor::Adaptor::GetImplementation(adaptor);
400 Integration::Core& core = adaptorImpl.GetCore();
401 mOverlay = &core.GetSystemOverlay();
403 Dali::RenderTaskList taskList = mOverlay->GetOverlayRenderTasks();
404 taskList.CreateTask();
406 mAdaptor = &adaptorImpl;
407 mAdaptor->AddObserver( *this );
409 // Can only create the detector when we know the Core has been instantiated.
410 mDragAndDropDetector = DragAndDropDetector::New();
411 mAdaptor->SetDragAndDropDetector( &GetImplementation( mDragAndDropDetector ) );
415 mOrientation->SetAdaptor(adaptor);
418 if( mIndicator != NULL )
420 mIndicator->SetAdaptor(mAdaptor);
424 RenderSurface* Window::GetSurface()
429 void Window::ShowIndicator( Dali::Window::IndicatorVisibleMode visibleMode )
431 DALI_LOG_TRACE_METHOD_FMT( gWindowLogFilter, "visible : %d\n", visibleMode );
432 DALI_ASSERT_DEBUG(mOverlay);
434 ECore::WindowRenderSurface* wlSurface( dynamic_cast< ECore::WindowRenderSurface * >( mSurface ) );
435 DALI_ASSERT_DEBUG(wlSurface);
439 Ecore_Wl_Window* wlWindow = wlSurface->GetWlWindow();
441 mIndicatorVisible = visibleMode;
443 if ( mIndicatorVisible == Dali::Window::VISIBLE )
445 // when the indicator is visible, set proper mode for indicator server according to bg mode
446 if ( mIndicatorOpacityMode == Dali::Window::OPAQUE )
448 ecore_wl_window_indicator_opacity_set(wlWindow, ECORE_WL_INDICATOR_OPAQUE);
450 else if ( mIndicatorOpacityMode == Dali::Window::TRANSLUCENT )
452 ecore_wl_window_indicator_opacity_set(wlWindow, ECORE_WL_INDICATOR_TRANSLUCENT);
454 else if ( mIndicatorOpacityMode == Dali::Window::TRANSPARENT )
456 ecore_wl_window_indicator_opacity_set(wlWindow, ECORE_WL_INDICATOR_OPAQUE);
461 // when the indicator is not visible, set TRANSPARENT mode for indicator server
462 ecore_wl_window_indicator_opacity_set(wlWindow, ECORE_WL_INDICATOR_TRANSPARENT); // it means hidden indicator
466 DoShowIndicator( mIndicatorOrientation );
469 void Window::RotateIndicator( Dali::Window::WindowOrientation orientation )
471 DALI_LOG_TRACE_METHOD_FMT( gWindowLogFilter, "Orientation: %d\n", orientation );
473 DoRotateIndicator( orientation );
476 void Window::SetIndicatorBgOpacity( Dali::Window::IndicatorBgOpacity opacityMode )
478 mIndicatorOpacityMode = opacityMode;
480 if( mIndicator != NULL )
482 mIndicator->SetOpacityMode( opacityMode );
486 void Window::SetClass(std::string name, std::string klass)
488 ECore::WindowRenderSurface* wlSurface( dynamic_cast< ECore::WindowRenderSurface * >( mSurface ) );
492 Ecore_Wl_Window* wlWindow = wlSurface->GetWlWindow();
493 ecore_wl_window_title_set( wlWindow, name.c_str() );
494 ecore_wl_window_class_name_set( wlWindow, klass.c_str() );
498 DALI_LOG_INFO( gWindowLogFilter, Debug::General, "Window has no surface\n" );
504 mIndicatorVisible( Dali::Window::VISIBLE ),
505 mIndicatorIsShown( false ),
506 mShowRotatedIndicatorOnClose( false ),
508 mIsTransparent( false ),
509 mWMRotationAppSet( false ),
510 mEcoreEventHander( true ),
511 mIsFocusAcceptable( true ),
513 mOpaqueState( false ),
515 mIndicatorOrientation( Dali::Window::PORTRAIT ),
516 mNextIndicatorOrientation( Dali::Window::PORTRAIT ),
517 mIndicatorOpacityMode( Dali::Window::OPAQUE ),
520 mType( Dali::DevelWindow::NORMAL ),
521 mEventHandler( NULL ),
522 mPreferredOrientation( Dali::Window::PORTRAIT ),
523 mSupportedAuxiliaryHints(),
525 mIndicatorVisibilityChangedSignal(),
526 mFocusChangedSignal(),
528 mDeleteRequestSignal()
534 delete mEventHandler;
544 mAdaptor->RemoveObserver( *this );
545 mAdaptor->SetDragAndDropDetector( NULL );
551 mSupportedAuxiliaryHints.clear();
552 mAuxiliaryHints.clear();
555 void Window::Initialize(const PositionSize& windowPosition, const std::string& name, const std::string& className)
557 // create an Wayland window by default
559 ECore::WindowRenderSurface* windowSurface = new ECore::WindowRenderSurface( windowPosition, surface, name, mIsTransparent );
561 mSurface = windowSurface;
562 SetClass( name, className );
563 windowSurface->Map();
565 mOrientation = Orientation::New(this);
567 // create event handler for Wayland window
568 mEventHandler = new EventHandler( this );
570 // get auxiliary hint
571 Eina_List* hints = ecore_wl_window_aux_hints_supported_get( mEventHandler->mEcoreWindow );
577 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) ) ) )
579 mSupportedAuxiliaryHints.push_back( hint );
581 DALI_LOG_INFO( gWindowLogFilter, Debug::Verbose, "Window::Initialize: %s\n", hint );
586 void Window::DoShowIndicator( Dali::Window::WindowOrientation lastOrientation )
588 if( mIndicator == NULL )
590 if( mIndicatorVisible != Dali::Window::INVISIBLE )
592 mIndicator = new Indicator( mAdaptor, mIndicatorOrientation, this );
593 mIndicator->SetOpacityMode( mIndicatorOpacityMode );
594 Dali::Actor actor = mIndicator->GetActor();
595 SetIndicatorActorRotation();
596 mOverlay->Add(actor);
598 // else don't create a hidden indicator
600 else // Already have indicator
602 if( mIndicatorVisible == Dali::Window::VISIBLE )
604 // If we are resuming, and rotation has changed,
605 if( mIndicatorIsShown == false && mIndicatorOrientation != mNextIndicatorOrientation )
607 // then close current indicator and open new one
608 mShowRotatedIndicatorOnClose = true;
609 mIndicator->Close(); // May synchronously call IndicatorClosed() callback & 1 level of recursion
610 // Don't show actor - will contain indicator for old orientation.
615 // set indicator visible mode
616 if( mIndicator != NULL )
618 mIndicator->SetVisible( mIndicatorVisible );
621 bool show = (mIndicatorVisible != Dali::Window::INVISIBLE );
622 SetIndicatorProperties( show, lastOrientation );
623 mIndicatorIsShown = show;
626 void Window::DoRotateIndicator( Dali::Window::WindowOrientation orientation )
628 if( mIndicatorIsShown )
630 mShowRotatedIndicatorOnClose = true;
631 mNextIndicatorOrientation = orientation;
632 mIndicator->Close(); // May synchronously call IndicatorClosed() callback
636 // Save orientation for when the indicator is next shown
637 mShowRotatedIndicatorOnClose = false;
638 mNextIndicatorOrientation = orientation;
642 void Window::SetIndicatorProperties( bool isShow, Dali::Window::WindowOrientation lastOrientation )
644 ECore::WindowRenderSurface* wlSurface( dynamic_cast< ECore::WindowRenderSurface * >( mSurface ) );
648 Ecore_Wl_Window* wlWindow = wlSurface->GetWlWindow();
651 ecore_wl_window_indicator_state_set(wlWindow, ECORE_WL_INDICATOR_STATE_ON);
655 ecore_wl_window_indicator_state_set(wlWindow, ECORE_WL_INDICATOR_STATE_OFF);
660 void Window::IndicatorTypeChanged(Indicator::Type type)
662 #if defined(DALI_PROFILE_MOBILE)
663 ECore::WindowRenderSurface* wlSurface( dynamic_cast< ECore::WindowRenderSurface * >( mSurface ) );
667 Ecore_Wl_Window* wlWindow = wlSurface->GetWlWindow();
670 case Indicator::INDICATOR_TYPE_1:
671 ecore_wl_indicator_visible_type_set(wlWindow, ECORE_WL_INDICATOR_VISIBLE_TYPE_SHOWN);
674 case Indicator::INDICATOR_TYPE_2:
675 ecore_wl_indicator_visible_type_set(wlWindow, ECORE_WL_INDICATOR_VISIBLE_TYPE_HIDDEN);
678 case Indicator::INDICATOR_TYPE_UNKNOWN:
686 void Window::IndicatorClosed( IndicatorInterface* indicator )
688 DALI_LOG_TRACE_METHOD( gWindowLogFilter );
690 if( mShowRotatedIndicatorOnClose )
692 Dali::Window::WindowOrientation currentOrientation = mIndicatorOrientation;
693 mIndicator->Open(mNextIndicatorOrientation);
694 mIndicatorOrientation = mNextIndicatorOrientation;
695 SetIndicatorActorRotation();
696 DoShowIndicator(currentOrientation);
700 void Window::IndicatorVisibilityChanged(bool isVisible)
702 mIndicatorVisibilityChangedSignal.Emit(isVisible);
705 void Window::SetIndicatorActorRotation()
707 DALI_LOG_TRACE_METHOD( gWindowLogFilter );
708 DALI_ASSERT_DEBUG( mIndicator != NULL );
710 Dali::Actor actor = mIndicator->GetActor();
711 switch( mIndicatorOrientation )
713 case Dali::Window::PORTRAIT:
714 actor.SetParentOrigin( ParentOrigin::TOP_CENTER );
715 actor.SetAnchorPoint( AnchorPoint::TOP_CENTER );
716 actor.SetOrientation( Degree(0), Vector3::ZAXIS );
718 case Dali::Window::PORTRAIT_INVERSE:
719 actor.SetParentOrigin( ParentOrigin::BOTTOM_CENTER );
720 actor.SetAnchorPoint( AnchorPoint::TOP_CENTER );
721 actor.SetOrientation( Degree(180), Vector3::ZAXIS );
723 case Dali::Window::LANDSCAPE:
724 actor.SetParentOrigin( ParentOrigin::CENTER_LEFT );
725 actor.SetAnchorPoint( AnchorPoint::TOP_CENTER );
726 actor.SetOrientation( Degree(270), Vector3::ZAXIS );
728 case Dali::Window::LANDSCAPE_INVERSE:
729 actor.SetParentOrigin( ParentOrigin::CENTER_RIGHT );
730 actor.SetAnchorPoint( AnchorPoint::TOP_CENTER );
731 actor.SetOrientation( Degree(90), Vector3::ZAXIS );
738 ecore_wl_window_raise( mEventHandler->mEcoreWindow );
743 ecore_wl_window_lower( mEventHandler->mEcoreWindow );
746 void Window::Activate()
748 ecore_wl_window_activate( mEventHandler->mEcoreWindow );
751 Dali::DragAndDropDetector Window::GetDragAndDropDetector() const
753 return mDragAndDropDetector;
756 Dali::Any Window::GetNativeHandle() const
760 return mEventHandler->mEcoreWindow;
768 void Window::OnStart()
770 DoShowIndicator( mIndicatorOrientation );
773 void Window::OnPause()
777 void Window::OnResume()
779 // resume indicator status
780 if( mIndicator != NULL )
782 // Restore own indicator opacity
783 // Send opacity mode to indicator service when app resumed
784 mIndicator->SetOpacityMode( mIndicatorOpacityMode );
788 void Window::OnStop()
799 void Window::OnDestroy()
804 void Window::AddAvailableOrientation(Dali::Window::WindowOrientation orientation)
808 for( std::size_t i=0; i<mAvailableOrientations.size(); i++ )
810 if(mAvailableOrientations[i] == orientation)
819 mAvailableOrientations.push_back(orientation);
820 SetAvailableOrientations( mAvailableOrientations );
824 void Window::RemoveAvailableOrientation(Dali::Window::WindowOrientation orientation)
826 for( std::vector<Dali::Window::WindowOrientation>::iterator iter = mAvailableOrientations.begin();
827 iter != mAvailableOrientations.end(); ++iter )
829 if( *iter == orientation )
831 mAvailableOrientations.erase( iter );
835 SetAvailableOrientations( mAvailableOrientations );
838 void Window::SetAvailableOrientations(const std::vector<Dali::Window::WindowOrientation>& orientations)
841 for( std::size_t i = 0; i < mAvailableOrientations.size(); ++i )
843 rotations[i] = static_cast< int >( mAvailableOrientations[i] );
845 ecore_wl_window_rotation_available_rotations_set( mEventHandler->mEcoreWindow, rotations, mAvailableOrientations.size() );
848 const std::vector<Dali::Window::WindowOrientation>& Window::GetAvailableOrientations()
850 return mAvailableOrientations;
853 void Window::SetPreferredOrientation(Dali::Window::WindowOrientation orientation)
855 mPreferredOrientation = orientation;
857 ecore_wl_window_rotation_preferred_rotation_set( mEventHandler->mEcoreWindow, orientation );
860 Dali::Window::WindowOrientation Window::GetPreferredOrientation()
862 return mPreferredOrientation;
865 void Window::SetAcceptFocus( bool accept )
867 mIsFocusAcceptable = accept;
869 ecore_wl_window_focus_skip_set( mEventHandler->mEcoreWindow, !accept );
872 bool Window::IsFocusAcceptable()
874 return mIsFocusAcceptable;
880 ecore_wl_window_show( mEventHandler->mEcoreWindow );
882 // Need an update request
885 mAdaptor->RequestUpdateOnce();
892 ecore_wl_window_hide( mEventHandler->mEcoreWindow );
895 bool Window::IsVisible() const
900 void Window::RotationDone( int orientation, int width, int height )
902 PositionSize positionSize( 0, 0, width, height );
904 mAdaptor->SurfaceSizeChanged( positionSize );
907 mResizedSignal.Emit( positionSize.width, positionSize.height );
909 Dali::Window::WindowOrientation windowOrientation;
910 switch( orientation )
914 windowOrientation = Dali::Window::PORTRAIT;
919 windowOrientation = Dali::Window::LANDSCAPE;
924 windowOrientation = Dali::Window::PORTRAIT_INVERSE;
929 windowOrientation = Dali::Window::LANDSCAPE_INVERSE;
934 windowOrientation = Dali::Window::PORTRAIT;
939 ECore::WindowRenderSurface* wlSurface( dynamic_cast< ECore::WindowRenderSurface * >( mSurface ) );
940 wlSurface->RequestRotation( windowOrientation, positionSize.width, positionSize.height );
943 unsigned int Window::GetSupportedAuxiliaryHintCount()
945 return mSupportedAuxiliaryHints.size();
948 std::string Window::GetSupportedAuxiliaryHint( unsigned int index )
950 if( index >= GetSupportedAuxiliaryHintCount() )
952 DALI_LOG_INFO( gWindowLogFilter, Debug::Verbose, "Window::GetSupportedAuxiliaryHint: Invalid index! [%d]\n", index );
955 return mSupportedAuxiliaryHints[index];
958 unsigned int Window::AddAuxiliaryHint( const std::string& hint, const std::string& value )
960 bool supported = false;
962 // Check if the hint is suppported
963 for( std::vector< std::string >::iterator iter = mSupportedAuxiliaryHints.begin(); iter != mSupportedAuxiliaryHints.end(); ++iter )
974 DALI_LOG_INFO( gWindowLogFilter, Debug::Concise, "Window::AddAuxiliaryHint: Not supported auxiliary hint [%s]\n", hint.c_str() );
978 // Check if the hint is already added
979 for( unsigned int i = 0; i < mAuxiliaryHints.size(); i++ )
981 if( mAuxiliaryHints[i].first == hint )
983 // Just change the value
984 mAuxiliaryHints[i].second = value;
986 DALI_LOG_INFO( gWindowLogFilter, Debug::Verbose, "Window::AddAuxiliaryHint: Change! hint = %s, value = %s, id = %d\n", hint.c_str(), value.c_str(), i + 1 );
988 return i + 1; // id is index + 1
993 mAuxiliaryHints.push_back( std::pair< std::string, std::string >( hint, value ) );
995 unsigned int id = mAuxiliaryHints.size();
997 ecore_wl_window_aux_hint_add( mEventHandler->mEcoreWindow, static_cast< int >( id ), hint.c_str(), value.c_str() );
999 DALI_LOG_INFO( gWindowLogFilter, Debug::Verbose, "Window::AddAuxiliaryHint: hint = %s, value = %s, id = %d\n", hint.c_str(), value.c_str(), id );
1004 bool Window::RemoveAuxiliaryHint( unsigned int id )
1006 if( id == 0 || id > mAuxiliaryHints.size() )
1008 DALI_LOG_INFO( gWindowLogFilter, Debug::Concise, "Window::RemoveAuxiliaryHint: Invalid id [%d]\n", id );
1012 mAuxiliaryHints[id - 1].second = std::string();
1014 ecore_wl_window_aux_hint_del( mEventHandler->mEcoreWindow, static_cast< int >( id ) );
1016 DALI_LOG_INFO( gWindowLogFilter, Debug::Verbose, "Window::RemoveAuxiliaryHint: id = %d, hint = %s\n", id, mAuxiliaryHints[id - 1].first.c_str() );
1021 bool Window::SetAuxiliaryHintValue( unsigned int id, const std::string& value )
1023 if( id == 0 || id > mAuxiliaryHints.size() )
1025 DALI_LOG_INFO( gWindowLogFilter, Debug::Concise, "Window::SetAuxiliaryHintValue: Invalid id [%d]\n", id );
1029 mAuxiliaryHints[id - 1].second = value;
1031 ecore_wl_window_aux_hint_change( mEventHandler->mEcoreWindow, static_cast< int >( id ), value.c_str() );
1033 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() );
1038 std::string Window::GetAuxiliaryHintValue( unsigned int id ) const
1040 if( id == 0 || id > mAuxiliaryHints.size() )
1042 DALI_LOG_INFO( gWindowLogFilter, Debug::Concise, "Window::GetAuxiliaryHintValue: Invalid id [%d]\n", id );
1043 return std::string();
1046 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() );
1048 return mAuxiliaryHints[id - 1].second;
1051 unsigned int Window::GetAuxiliaryHintId( const std::string& hint ) const
1053 for( unsigned int i = 0; i < mAuxiliaryHints.size(); i++ )
1055 if( mAuxiliaryHints[i].first == hint )
1057 DALI_LOG_INFO( gWindowLogFilter, Debug::Verbose, "Window::GetAuxiliaryHintId: hint = %s, id = %d\n", hint.c_str(), i + 1 );
1062 DALI_LOG_INFO( gWindowLogFilter, Debug::Verbose, "Window::GetAuxiliaryHintId: Invalid hint! [%s]\n", hint.c_str() );
1067 void Window::SetInputRegion( const Rect< int >& inputRegion )
1069 ecore_wl_window_input_region_set( mEventHandler->mEcoreWindow, inputRegion.x, inputRegion.y, inputRegion.width, inputRegion.height );
1071 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 );
1074 void Window::SetType( Dali::DevelWindow::Type type )
1076 Ecore_Wl_Window_Type windowType;
1082 case Dali::DevelWindow::NORMAL:
1084 windowType = ECORE_WL_WINDOW_TYPE_TOPLEVEL;
1087 case Dali::DevelWindow::NOTIFICATION:
1089 windowType = ECORE_WL_WINDOW_TYPE_NOTIFICATION;
1092 case Dali::DevelWindow::UTILITY:
1094 windowType = ECORE_WL_WINDOW_TYPE_UTILITY;
1097 case Dali::DevelWindow::DIALOG:
1099 windowType = ECORE_WL_WINDOW_TYPE_DIALOG;
1104 windowType = ECORE_WL_WINDOW_TYPE_TOPLEVEL;
1109 ecore_wl_window_type_set( mEventHandler->mEcoreWindow, windowType );
1115 Dali::DevelWindow::Type Window::GetType() const
1120 bool Window::SetNotificationLevel( Dali::DevelWindow::NotificationLevel::Type level )
1122 if( mType != Dali::DevelWindow::NOTIFICATION )
1124 DALI_LOG_INFO( gWindowLogFilter, Debug::Verbose, "Window::SetNotificationLevel: Not supported window type [%d]\n", mType );
1128 while( !mEventHandler->mTizenPolicy )
1130 wl_display_dispatch_queue( mEventHandler->mDisplay, mEventHandler->mEventQueue );
1133 int notificationLevel;
1137 case Dali::DevelWindow::NotificationLevel::NONE:
1139 notificationLevel = TIZEN_POLICY_LEVEL_NONE;
1142 case Dali::DevelWindow::NotificationLevel::BASE:
1144 notificationLevel = TIZEN_POLICY_LEVEL_DEFAULT;
1147 case Dali::DevelWindow::NotificationLevel::MEDIUM:
1149 notificationLevel = TIZEN_POLICY_LEVEL_MEDIUM;
1152 case Dali::DevelWindow::NotificationLevel::HIGH:
1154 notificationLevel = TIZEN_POLICY_LEVEL_HIGH;
1157 case Dali::DevelWindow::NotificationLevel::TOP:
1159 notificationLevel = TIZEN_POLICY_LEVEL_TOP;
1164 DALI_LOG_INFO( gWindowLogFilter, Debug::Verbose, "Window::SetNotificationLevel: invalid level [%d]\n", level );
1165 notificationLevel = TIZEN_POLICY_LEVEL_DEFAULT;
1170 mEventHandler->mNotificationLevelChangeDone = false;
1171 mEventHandler->mNotificationChangeState = TIZEN_POLICY_ERROR_STATE_NONE;
1173 tizen_policy_set_notification_level( mEventHandler->mTizenPolicy, ecore_wl_window_surface_get( mEventHandler->mEcoreWindow ), notificationLevel );
1177 while( !mEventHandler->mNotificationLevelChangeDone && count < 3 )
1180 wl_display_dispatch_queue( mEventHandler->mDisplay, mEventHandler->mEventQueue );
1184 if( !mEventHandler->mNotificationLevelChangeDone )
1186 DALI_LOG_INFO( gWindowLogFilter, Debug::Verbose, "Window::SetNotificationLevel: Level change is failed [%d, %d]\n", level, mEventHandler->mNotificationChangeState );
1189 else if( mEventHandler->mNotificationChangeState == TIZEN_POLICY_ERROR_STATE_PERMISSION_DENIED )
1191 DALI_LOG_INFO( gWindowLogFilter, Debug::Verbose, "Window::SetNotificationLevel: Permission denied! [%d]\n", level );
1195 DALI_LOG_INFO( gWindowLogFilter, Debug::Verbose, "Window::SetNotificationLevel: Level is changed [%d]\n", mEventHandler->mNotificationLevel );
1200 Dali::DevelWindow::NotificationLevel::Type Window::GetNotificationLevel()
1202 if( mType != Dali::DevelWindow::NOTIFICATION )
1204 DALI_LOG_INFO( gWindowLogFilter, Debug::Verbose, "Window::GetNotificationLevel: Not supported window type [%d]\n", mType );
1205 return Dali::DevelWindow::NotificationLevel::NONE;
1208 while( !mEventHandler->mTizenPolicy )
1210 wl_display_dispatch_queue( mEventHandler->mDisplay, mEventHandler->mEventQueue );
1215 while( !mEventHandler->mNotificationLevelChangeDone && count < 3 )
1218 wl_display_dispatch_queue( mEventHandler->mDisplay, mEventHandler->mEventQueue );
1222 if( !mEventHandler->mNotificationLevelChangeDone )
1224 DALI_LOG_INFO( gWindowLogFilter, Debug::Verbose, "Window::GetNotificationLevel: Error! [%d]\n", mEventHandler->mNotificationChangeState );
1225 return Dali::DevelWindow::NotificationLevel::NONE;
1228 Dali::DevelWindow::NotificationLevel::Type level;
1230 switch( mEventHandler->mNotificationLevel )
1232 case TIZEN_POLICY_LEVEL_NONE:
1234 level = Dali::DevelWindow::NotificationLevel::NONE;
1237 case TIZEN_POLICY_LEVEL_DEFAULT:
1239 level = Dali::DevelWindow::NotificationLevel::BASE;
1242 case TIZEN_POLICY_LEVEL_MEDIUM:
1244 level = Dali::DevelWindow::NotificationLevel::MEDIUM;
1247 case TIZEN_POLICY_LEVEL_HIGH:
1249 level = Dali::DevelWindow::NotificationLevel::HIGH;
1252 case TIZEN_POLICY_LEVEL_TOP:
1254 level = Dali::DevelWindow::NotificationLevel::TOP;
1259 DALI_LOG_INFO( gWindowLogFilter, Debug::Verbose, "Window::GetNotificationLevel: invalid level [%d]\n", mEventHandler->mNotificationLevel );
1260 level = Dali::DevelWindow::NotificationLevel::NONE;
1265 DALI_LOG_INFO( gWindowLogFilter, Debug::Verbose, "Window::GetNotificationLevel: level [%d]\n", mEventHandler->mNotificationLevel );
1270 void Window::SetOpaqueState( bool opaque )
1272 while( !mEventHandler->mTizenPolicy )
1274 wl_display_dispatch_queue( mEventHandler->mDisplay, mEventHandler->mEventQueue );
1277 tizen_policy_set_opaque_state( mEventHandler->mTizenPolicy, ecore_wl_window_surface_get( mEventHandler->mEcoreWindow ), ( opaque ? 1 : 0 ) );
1279 mOpaqueState = opaque;
1281 DALI_LOG_INFO( gWindowLogFilter, Debug::Verbose, "Window::SetOpaqueState: opaque = %d\n", opaque );
1284 bool Window::IsOpaqueState()
1286 return mOpaqueState;
1289 bool Window::SetScreenMode( Dali::DevelWindow::ScreenMode::Type screenMode )
1291 while( !mEventHandler->mTizenPolicy )
1293 wl_display_dispatch_queue( mEventHandler->mDisplay, mEventHandler->mEventQueue );
1296 mEventHandler->mScreenModeChangeDone = false;
1297 mEventHandler->mScreenModeChangeState = TIZEN_POLICY_ERROR_STATE_NONE;
1299 unsigned int mode = 0;
1301 switch( screenMode )
1303 case Dali::DevelWindow::ScreenMode::DEFAULT:
1308 case Dali::DevelWindow::ScreenMode::ALWAYS_ON:
1315 tizen_policy_set_window_screen_mode( mEventHandler->mTizenPolicy, ecore_wl_window_surface_get( mEventHandler->mEcoreWindow ), mode );
1319 while( !mEventHandler->mScreenModeChangeDone && count < 3 )
1322 wl_display_dispatch_queue( mEventHandler->mDisplay, mEventHandler->mEventQueue );
1326 if( !mEventHandler->mScreenModeChangeDone )
1328 DALI_LOG_INFO( gWindowLogFilter, Debug::Verbose, "Window::SetScreenMode: Screen mode change is failed [%d, %d]\n", screenMode, mEventHandler->mScreenModeChangeState );
1331 else if( mEventHandler->mScreenModeChangeState == TIZEN_POLICY_ERROR_STATE_PERMISSION_DENIED )
1333 DALI_LOG_INFO( gWindowLogFilter, Debug::Verbose, "Window::SetScreenMode: Permission denied! [%d]\n", screenMode );
1337 DALI_LOG_INFO( gWindowLogFilter, Debug::Verbose, "Window::SetScreenMode: Screen mode is changed [%d]\n", mEventHandler->mScreenMode );
1342 Dali::DevelWindow::ScreenMode::Type Window::GetScreenMode()
1344 while( !mEventHandler->mTizenPolicy )
1346 wl_display_dispatch_queue( mEventHandler->mDisplay, mEventHandler->mEventQueue );
1351 while( !mEventHandler->mScreenModeChangeDone && count < 3 )
1354 wl_display_dispatch_queue( mEventHandler->mDisplay, mEventHandler->mEventQueue );
1358 if( !mEventHandler->mScreenModeChangeDone )
1360 DALI_LOG_INFO( gWindowLogFilter, Debug::Verbose, "Window::GetScreenMode: Error! [%d]\n", mEventHandler->mScreenModeChangeState );
1361 return Dali::DevelWindow::ScreenMode::DEFAULT;
1364 Dali::DevelWindow::ScreenMode::Type screenMode = Dali::DevelWindow::ScreenMode::DEFAULT;
1366 switch( mEventHandler->mScreenMode )
1370 screenMode = Dali::DevelWindow::ScreenMode::DEFAULT;
1375 screenMode = Dali::DevelWindow::ScreenMode::ALWAYS_ON;
1380 DALI_LOG_INFO( gWindowLogFilter, Debug::Verbose, "Window::GetScreenMode: screen mode [%d]\n", mEventHandler->mScreenMode );
1385 bool Window::SetBrightness( int brightness )
1387 if( brightness < 0 || brightness > 100 )
1389 DALI_LOG_INFO( gWindowLogFilter, Debug::Verbose, "Window::SetBrightness: Invalid brightness value [%d]\n", brightness );
1393 while( !mEventHandler->mTizenDisplayPolicy )
1395 wl_display_dispatch_queue( mEventHandler->mDisplay, mEventHandler->mEventQueue );
1398 mEventHandler->mBrightnessChangeDone = false;
1399 mEventHandler->mBrightnessChangeState = TIZEN_POLICY_ERROR_STATE_NONE;
1401 tizen_display_policy_set_window_brightness( mEventHandler->mTizenDisplayPolicy, ecore_wl_window_surface_get( mEventHandler->mEcoreWindow ), brightness );
1405 while( !mEventHandler->mBrightnessChangeDone && count < 3 )
1408 wl_display_dispatch_queue( mEventHandler->mDisplay, mEventHandler->mEventQueue );
1412 if( !mEventHandler->mBrightnessChangeDone )
1414 DALI_LOG_INFO( gWindowLogFilter, Debug::Verbose, "Window::SetBrightness: Brightness change is failed [%d, %d]\n", brightness, mEventHandler->mBrightnessChangeState );
1417 else if( mEventHandler->mBrightnessChangeState == TIZEN_POLICY_ERROR_STATE_PERMISSION_DENIED )
1419 DALI_LOG_INFO( gWindowLogFilter, Debug::Verbose, "Window::SetBrightness: Permission denied! [%d]\n", brightness );
1423 DALI_LOG_INFO( gWindowLogFilter, Debug::Verbose, "Window::SetBrightness: Brightness is changed [%d]\n", mEventHandler->mBrightness );
1428 int Window::GetBrightness()
1430 while( !mEventHandler->mTizenDisplayPolicy )
1432 wl_display_dispatch_queue( mEventHandler->mDisplay, mEventHandler->mEventQueue );
1437 while( !mEventHandler->mBrightnessChangeDone && count < 3 )
1440 wl_display_dispatch_queue( mEventHandler->mDisplay, mEventHandler->mEventQueue );
1444 if( !mEventHandler->mBrightnessChangeDone )
1446 DALI_LOG_INFO( gWindowLogFilter, Debug::Verbose, "Window::GetBrightness: Error! [%d]\n", mEventHandler->mBrightnessChangeState );
1450 DALI_LOG_INFO( gWindowLogFilter, Debug::Verbose, "Window::GetBrightness: Brightness [%d]\n", mEventHandler->mBrightness );
1452 return mEventHandler->mBrightness;
1461 #pragma GCC diagnostic pop