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 mScreenModeChangeState( 0 ),
82 mScreenModeChangeDone( 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 ECore::WindowRenderSurface* wlSurface( dynamic_cast< ECore::WindowRenderSurface * >( handler->mWindow->mSurface ) );
216 wlSurface->OutputTransformed();
220 return ECORE_CALLBACK_PASS_ON;
223 /// Called when the output transform should be ignored
224 static Eina_Bool EcoreEventIgnoreOutputTransform( void* data, int type, void* event )
226 Ecore_Wl_Event_Ignore_Output_Transform* ignoreTransformEvent( static_cast< Ecore_Wl_Event_Ignore_Output_Transform* >( event ) );
227 EventHandler* handler( static_cast< EventHandler* >( data ) );
229 if ( handler && handler->mWindow && ignoreTransformEvent->win == handler->mEcoreWindow )
231 ECore::WindowRenderSurface* wlSurface( dynamic_cast< ECore::WindowRenderSurface * >( handler->mWindow->mSurface ) );
234 wlSurface->OutputTransformed();
238 return ECORE_CALLBACK_PASS_ON;
241 static void RegistryGlobalCallback( void* data, struct wl_registry *registry, uint32_t name, const char* interface, uint32_t version )
243 Window::EventHandler* eventHandler = static_cast< Window::EventHandler* >( data );
245 if( strcmp( interface, tizen_policy_interface.name ) == 0 )
247 eventHandler->mTizenPolicy = static_cast< tizen_policy* >( wl_registry_bind( registry, name, &tizen_policy_interface, version ) );
248 if( !eventHandler->mTizenPolicy )
250 DALI_LOG_INFO( gWindowLogFilter, Debug::General, "Window::EventHandler::RegistryGlobalCallback: wl_registry_bind(tizen_policy_interface) is failed.\n" );
254 tizen_policy_add_listener( eventHandler->mTizenPolicy, &eventHandler->mTizenPolicyListener, data );
256 DALI_LOG_INFO( gWindowLogFilter, Debug::General, "Window::EventHandler::RegistryGlobalCallback: tizen_policy_add_listener is called.\n" );
258 else if( strcmp( interface, tizen_display_policy_interface.name ) == 0 )
260 eventHandler->mTizenDisplayPolicy = static_cast< tizen_display_policy* >( wl_registry_bind( registry, name, &tizen_display_policy_interface, version ) );
261 if( !eventHandler->mTizenDisplayPolicy )
263 DALI_LOG_INFO( gWindowLogFilter, Debug::General, "Window::EventHandler::RegistryGlobalCallback: wl_registry_bind(tizen_display_policy_interface) is failed.\n" );
267 tizen_display_policy_add_listener( eventHandler->mTizenDisplayPolicy, &eventHandler->mTizenDisplayPolicyListener, data );
269 DALI_LOG_INFO( gWindowLogFilter, Debug::General, "Window::EventHandler::RegistryGlobalCallback: tizen_display_policy_add_listener is called.\n" );
273 static void RegistryGlobalCallbackRemove( void* data, struct wl_registry* registry, uint32_t id )
275 Window::EventHandler* eventHandler = static_cast< Window::EventHandler* >( data );
276 eventHandler->mTizenPolicy = NULL;
277 eventHandler->mTizenDisplayPolicy = NULL;
280 static void TizenPolicyNotificationChangeDone(void* data, struct tizen_policy* tizenPolicy, struct wl_surface* surface, int32_t level, uint32_t state )
282 Window::EventHandler* eventHandler = static_cast< Window::EventHandler* >( data );
284 eventHandler->mNotificationLevel = level;
285 eventHandler->mNotificationChangeState = state;
286 eventHandler->mNotificationLevelChangeDone = true;
288 DALI_LOG_INFO( gWindowLogFilter, Debug::General, "Window::EventHandler::TizenPolicyNotificationChangeDone: level = %d, state = %d\n", level, state );
291 static void TizenPolicyScreenModeChangeDone(void* data, struct tizen_policy* tizenPolicy, struct wl_surface* surface, uint32_t mode, uint32_t state )
293 Window::EventHandler* eventHandler = static_cast< Window::EventHandler* >( data );
295 eventHandler->mScreenMode = mode;
296 eventHandler->mScreenModeChangeState = state;
297 eventHandler->mScreenModeChangeDone = true;
299 DALI_LOG_INFO( gWindowLogFilter, Debug::General, "Window::EventHandler::TizenPolicyScreenModeChangeDone: mode = %d, state = %d\n", mode, state );
302 static void DisplayPolicyBrightnessChangeDone(void* data, struct tizen_display_policy *displayPolicy, struct wl_surface* surface, int32_t brightness, uint32_t state )
304 Window::EventHandler* eventHandler = static_cast< Window::EventHandler* >( data );
306 eventHandler->mBrightness = brightness;
307 eventHandler->mBrightnessChangeState = state;
308 eventHandler->mBrightnessChangeDone = true;
310 DALI_LOG_INFO( gWindowLogFilter, Debug::General, "Window::EventHandler::DisplayPolicyBrightnessChangeDone: brightness = %d, state = %d\n", brightness, state );
313 const struct wl_registry_listener mRegistryListener =
315 RegistryGlobalCallback,
316 RegistryGlobalCallbackRemove
319 const struct tizen_policy_listener mTizenPolicyListener =
323 TizenPolicyNotificationChangeDone,
325 TizenPolicyScreenModeChangeDone,
332 const struct tizen_display_policy_listener mTizenDisplayPolicyListener =
334 DisplayPolicyBrightnessChangeDone
339 Dali::Vector< Ecore_Event_Handler* > mEcoreEventHandler;
340 Ecore_Wl_Window* mEcoreWindow;
342 wl_display* mDisplay;
343 wl_event_queue* mEventQueue;
344 tizen_policy* mTizenPolicy;
345 tizen_display_policy* mTizenDisplayPolicy;
347 int mNotificationLevel;
348 uint32_t mNotificationChangeState;
349 bool mNotificationLevelChangeDone;
352 uint32_t mScreenModeChangeState;
353 bool mScreenModeChangeDone;
356 uint32_t mBrightnessChangeState;
357 bool mBrightnessChangeDone;
360 Window* Window::New( const PositionSize& positionSize, const std::string& name, const std::string& className, bool isTransparent )
362 Window* window = new Window();
363 window->mIsTransparent = isTransparent;
364 window->Initialize( positionSize, name, className );
368 void Window::SetAdaptor(Dali::Adaptor& adaptor)
370 DALI_ASSERT_ALWAYS( !mStarted && "Adaptor already started" );
373 // Only create one overlay per window
374 Internal::Adaptor::Adaptor& adaptorImpl = Internal::Adaptor::Adaptor::GetImplementation(adaptor);
375 Integration::Core& core = adaptorImpl.GetCore();
376 mOverlay = &core.GetSystemOverlay();
378 Dali::RenderTaskList taskList = mOverlay->GetOverlayRenderTasks();
379 taskList.CreateTask();
381 mAdaptor = &adaptorImpl;
382 mAdaptor->AddObserver( *this );
384 // Can only create the detector when we know the Core has been instantiated.
385 mDragAndDropDetector = DragAndDropDetector::New();
386 mAdaptor->SetDragAndDropDetector( &GetImplementation( mDragAndDropDetector ) );
390 mOrientation->SetAdaptor(adaptor);
393 if( mIndicator != NULL )
395 mIndicator->SetAdaptor(mAdaptor);
399 RenderSurface* Window::GetSurface()
404 void Window::ShowIndicator( Dali::Window::IndicatorVisibleMode visibleMode )
406 DALI_LOG_TRACE_METHOD_FMT( gWindowLogFilter, "visible : %d\n", visibleMode );
407 DALI_ASSERT_DEBUG(mOverlay);
409 ECore::WindowRenderSurface* wlSurface( dynamic_cast< ECore::WindowRenderSurface * >( mSurface ) );
410 DALI_ASSERT_DEBUG(wlSurface);
414 Ecore_Wl_Window* wlWindow = wlSurface->GetWlWindow();
416 mIndicatorVisible = visibleMode;
418 if ( mIndicatorVisible == Dali::Window::VISIBLE )
420 // when the indicator is visible, set proper mode for indicator server according to bg mode
421 if ( mIndicatorOpacityMode == Dali::Window::OPAQUE )
423 ecore_wl_window_indicator_opacity_set(wlWindow, ECORE_WL_INDICATOR_OPAQUE);
425 else if ( mIndicatorOpacityMode == Dali::Window::TRANSLUCENT )
427 ecore_wl_window_indicator_opacity_set(wlWindow, ECORE_WL_INDICATOR_TRANSLUCENT);
429 else if ( mIndicatorOpacityMode == Dali::Window::TRANSPARENT )
431 ecore_wl_window_indicator_opacity_set(wlWindow, ECORE_WL_INDICATOR_OPAQUE);
436 // when the indicator is not visible, set TRANSPARENT mode for indicator server
437 ecore_wl_window_indicator_opacity_set(wlWindow, ECORE_WL_INDICATOR_TRANSPARENT); // it means hidden indicator
441 DoShowIndicator( mIndicatorOrientation );
444 void Window::RotateIndicator( Dali::Window::WindowOrientation orientation )
446 DALI_LOG_TRACE_METHOD_FMT( gWindowLogFilter, "Orientation: %d\n", orientation );
448 DoRotateIndicator( orientation );
451 void Window::SetIndicatorBgOpacity( Dali::Window::IndicatorBgOpacity opacityMode )
453 mIndicatorOpacityMode = opacityMode;
455 if( mIndicator != NULL )
457 mIndicator->SetOpacityMode( opacityMode );
461 void Window::SetClass(std::string name, std::string klass)
463 ECore::WindowRenderSurface* wlSurface( dynamic_cast< ECore::WindowRenderSurface * >( mSurface ) );
467 Ecore_Wl_Window* wlWindow = wlSurface->GetWlWindow();
468 ecore_wl_window_title_set( wlWindow, name.c_str() );
469 ecore_wl_window_class_name_set( wlWindow, klass.c_str() );
473 DALI_LOG_INFO( gWindowLogFilter, Debug::General, "Window has no surface\n" );
479 mIndicatorVisible( Dali::Window::VISIBLE ),
480 mIndicatorIsShown( false ),
481 mShowRotatedIndicatorOnClose( false ),
483 mIsTransparent( false ),
484 mWMRotationAppSet( false ),
485 mEcoreEventHander( true ),
486 mIsFocusAcceptable( true ),
488 mOpaqueState( false ),
489 mResizeEnabled( false ),
491 mIndicatorOrientation( Dali::Window::PORTRAIT ),
492 mNextIndicatorOrientation( Dali::Window::PORTRAIT ),
493 mIndicatorOpacityMode( Dali::Window::OPAQUE ),
496 mType( Dali::DevelWindow::NORMAL ),
497 mEventHandler( NULL ),
498 mPreferredOrientation( Dali::Window::PORTRAIT ),
499 mSupportedAuxiliaryHints(),
501 mIndicatorVisibilityChangedSignal(),
502 mFocusChangedSignal(),
504 mDeleteRequestSignal()
510 delete mEventHandler;
520 mAdaptor->RemoveObserver( *this );
521 mAdaptor->SetDragAndDropDetector( NULL );
527 mSupportedAuxiliaryHints.clear();
528 mAuxiliaryHints.clear();
531 void Window::Initialize(const PositionSize& positionSize, const std::string& name, const std::string& className)
533 // create an Wayland window by default
535 ECore::WindowRenderSurface* windowSurface = new ECore::WindowRenderSurface( positionSize, surface, name, mIsTransparent );
537 mSurface = windowSurface;
539 // create event handler for Wayland window
540 mEventHandler = new EventHandler( this );
542 // get auxiliary hint
543 Eina_List* hints = ecore_wl_window_aux_hints_supported_get( mEventHandler->mEcoreWindow );
549 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) ) ) )
551 mSupportedAuxiliaryHints.push_back( hint );
553 DALI_LOG_INFO( gWindowLogFilter, Debug::Verbose, "Window::Initialize: %s\n", hint );
557 if( !positionSize.IsEmpty() )
559 AddAuxiliaryHint( "wm.policy.win.user.geometry", "1" );
560 mResizeEnabled = true;
563 SetClass( name, className );
564 windowSurface->Map();
566 mOrientation = Orientation::New(this);
569 void Window::DoShowIndicator( Dali::Window::WindowOrientation lastOrientation )
571 if( mIndicator == NULL )
573 if( mIndicatorVisible != Dali::Window::INVISIBLE )
575 mIndicator = new Indicator( mAdaptor, mIndicatorOrientation, this );
576 mIndicator->SetOpacityMode( mIndicatorOpacityMode );
577 Dali::Actor actor = mIndicator->GetActor();
578 SetIndicatorActorRotation();
579 mOverlay->Add(actor);
581 // else don't create a hidden indicator
583 else // Already have indicator
585 if( mIndicatorVisible == Dali::Window::VISIBLE )
587 // If we are resuming, and rotation has changed,
588 if( mIndicatorIsShown == false && mIndicatorOrientation != mNextIndicatorOrientation )
590 // then close current indicator and open new one
591 mShowRotatedIndicatorOnClose = true;
592 mIndicator->Close(); // May synchronously call IndicatorClosed() callback & 1 level of recursion
593 // Don't show actor - will contain indicator for old orientation.
598 // set indicator visible mode
599 if( mIndicator != NULL )
601 mIndicator->SetVisible( mIndicatorVisible );
604 bool show = (mIndicatorVisible != Dali::Window::INVISIBLE );
605 SetIndicatorProperties( show, lastOrientation );
606 mIndicatorIsShown = show;
609 void Window::DoRotateIndicator( Dali::Window::WindowOrientation orientation )
611 if( mIndicatorIsShown )
613 mShowRotatedIndicatorOnClose = true;
614 mNextIndicatorOrientation = orientation;
615 mIndicator->Close(); // May synchronously call IndicatorClosed() callback
619 // Save orientation for when the indicator is next shown
620 mShowRotatedIndicatorOnClose = false;
621 mNextIndicatorOrientation = orientation;
625 void Window::SetIndicatorProperties( bool isShow, Dali::Window::WindowOrientation lastOrientation )
627 ECore::WindowRenderSurface* wlSurface( dynamic_cast< ECore::WindowRenderSurface * >( mSurface ) );
631 Ecore_Wl_Window* wlWindow = wlSurface->GetWlWindow();
634 ecore_wl_window_indicator_state_set(wlWindow, ECORE_WL_INDICATOR_STATE_ON);
638 ecore_wl_window_indicator_state_set(wlWindow, ECORE_WL_INDICATOR_STATE_OFF);
643 void Window::IndicatorTypeChanged(Indicator::Type type)
645 #if defined(DALI_PROFILE_MOBILE)
646 ECore::WindowRenderSurface* wlSurface( dynamic_cast< ECore::WindowRenderSurface * >( mSurface ) );
650 Ecore_Wl_Window* wlWindow = wlSurface->GetWlWindow();
653 case Indicator::INDICATOR_TYPE_1:
654 ecore_wl_indicator_visible_type_set(wlWindow, ECORE_WL_INDICATOR_VISIBLE_TYPE_SHOWN);
657 case Indicator::INDICATOR_TYPE_2:
658 ecore_wl_indicator_visible_type_set(wlWindow, ECORE_WL_INDICATOR_VISIBLE_TYPE_HIDDEN);
661 case Indicator::INDICATOR_TYPE_UNKNOWN:
669 void Window::IndicatorClosed( IndicatorInterface* indicator )
671 DALI_LOG_TRACE_METHOD( gWindowLogFilter );
673 if( mShowRotatedIndicatorOnClose )
675 Dali::Window::WindowOrientation currentOrientation = mIndicatorOrientation;
676 mIndicator->Open(mNextIndicatorOrientation);
677 mIndicatorOrientation = mNextIndicatorOrientation;
678 SetIndicatorActorRotation();
679 DoShowIndicator(currentOrientation);
683 void Window::IndicatorVisibilityChanged(bool isVisible)
685 mIndicatorVisibilityChangedSignal.Emit(isVisible);
688 void Window::SetIndicatorActorRotation()
690 DALI_LOG_TRACE_METHOD( gWindowLogFilter );
691 DALI_ASSERT_DEBUG( mIndicator != NULL );
693 Dali::Actor actor = mIndicator->GetActor();
694 switch( mIndicatorOrientation )
696 case Dali::Window::PORTRAIT:
697 actor.SetParentOrigin( ParentOrigin::TOP_CENTER );
698 actor.SetAnchorPoint( AnchorPoint::TOP_CENTER );
699 actor.SetOrientation( Degree(0), Vector3::ZAXIS );
701 case Dali::Window::PORTRAIT_INVERSE:
702 actor.SetParentOrigin( ParentOrigin::BOTTOM_CENTER );
703 actor.SetAnchorPoint( AnchorPoint::TOP_CENTER );
704 actor.SetOrientation( Degree(180), Vector3::ZAXIS );
706 case Dali::Window::LANDSCAPE:
707 actor.SetParentOrigin( ParentOrigin::CENTER_LEFT );
708 actor.SetAnchorPoint( AnchorPoint::TOP_CENTER );
709 actor.SetOrientation( Degree(270), Vector3::ZAXIS );
711 case Dali::Window::LANDSCAPE_INVERSE:
712 actor.SetParentOrigin( ParentOrigin::CENTER_RIGHT );
713 actor.SetAnchorPoint( AnchorPoint::TOP_CENTER );
714 actor.SetOrientation( Degree(90), Vector3::ZAXIS );
721 ecore_wl_window_raise( mEventHandler->mEcoreWindow );
726 ecore_wl_window_lower( mEventHandler->mEcoreWindow );
729 void Window::Activate()
731 ecore_wl_window_activate( mEventHandler->mEcoreWindow );
734 Dali::DragAndDropDetector Window::GetDragAndDropDetector() const
736 return mDragAndDropDetector;
739 Dali::Any Window::GetNativeHandle() const
743 return mEventHandler->mEcoreWindow;
751 void Window::OnStart()
753 DoShowIndicator( mIndicatorOrientation );
756 void Window::OnPause()
760 void Window::OnResume()
762 // resume indicator status
763 if( mIndicator != NULL )
765 // Restore own indicator opacity
766 // Send opacity mode to indicator service when app resumed
767 mIndicator->SetOpacityMode( mIndicatorOpacityMode );
771 void Window::OnStop()
782 void Window::OnDestroy()
787 void Window::AddAvailableOrientation(Dali::Window::WindowOrientation orientation)
791 for( std::size_t i=0; i<mAvailableOrientations.size(); i++ )
793 if(mAvailableOrientations[i] == orientation)
802 mAvailableOrientations.push_back(orientation);
803 SetAvailableOrientations( mAvailableOrientations );
807 void Window::RemoveAvailableOrientation(Dali::Window::WindowOrientation orientation)
809 for( std::vector<Dali::Window::WindowOrientation>::iterator iter = mAvailableOrientations.begin();
810 iter != mAvailableOrientations.end(); ++iter )
812 if( *iter == orientation )
814 mAvailableOrientations.erase( iter );
818 SetAvailableOrientations( mAvailableOrientations );
821 void Window::SetAvailableOrientations(const std::vector<Dali::Window::WindowOrientation>& orientations)
824 for( std::size_t i = 0; i < mAvailableOrientations.size(); ++i )
826 rotations[i] = static_cast< int >( mAvailableOrientations[i] );
828 ecore_wl_window_rotation_available_rotations_set( mEventHandler->mEcoreWindow, rotations, mAvailableOrientations.size() );
831 const std::vector<Dali::Window::WindowOrientation>& Window::GetAvailableOrientations()
833 return mAvailableOrientations;
836 void Window::SetPreferredOrientation(Dali::Window::WindowOrientation orientation)
838 mPreferredOrientation = orientation;
840 ecore_wl_window_rotation_preferred_rotation_set( mEventHandler->mEcoreWindow, orientation );
843 Dali::Window::WindowOrientation Window::GetPreferredOrientation()
845 return mPreferredOrientation;
848 void Window::SetAcceptFocus( bool accept )
850 mIsFocusAcceptable = accept;
852 ecore_wl_window_focus_skip_set( mEventHandler->mEcoreWindow, !accept );
855 bool Window::IsFocusAcceptable()
857 return mIsFocusAcceptable;
863 ecore_wl_window_show( mEventHandler->mEcoreWindow );
865 // Need an update request
868 mAdaptor->RequestUpdateOnce();
875 ecore_wl_window_hide( mEventHandler->mEcoreWindow );
878 bool Window::IsVisible() const
883 void Window::RotationDone( int orientation, int width, int height )
885 ECore::WindowRenderSurface* wlSurface( dynamic_cast< ECore::WindowRenderSurface * >( mSurface ) );
888 wlSurface->RequestRotation( orientation, width, height );
891 mAdaptor->SurfaceResizePrepare( Dali::Adaptor::SurfaceSize( width, height ) );
894 mResizedSignal.Emit( Dali::DevelWindow::WindowSize( width, height ) );
896 mAdaptor->SurfaceResizeComplete( Dali::Adaptor::SurfaceSize( width, height ) );
899 unsigned int Window::GetSupportedAuxiliaryHintCount()
901 return mSupportedAuxiliaryHints.size();
904 std::string Window::GetSupportedAuxiliaryHint( unsigned int index )
906 if( index >= GetSupportedAuxiliaryHintCount() )
908 DALI_LOG_INFO( gWindowLogFilter, Debug::Verbose, "Window::GetSupportedAuxiliaryHint: Invalid index! [%d]\n", index );
911 return mSupportedAuxiliaryHints[index];
914 unsigned int Window::AddAuxiliaryHint( const std::string& hint, const std::string& value )
916 bool supported = false;
918 // Check if the hint is suppported
919 for( std::vector< std::string >::iterator iter = mSupportedAuxiliaryHints.begin(); iter != mSupportedAuxiliaryHints.end(); ++iter )
930 DALI_LOG_INFO( gWindowLogFilter, Debug::Concise, "Window::AddAuxiliaryHint: Not supported auxiliary hint [%s]\n", hint.c_str() );
934 // Check if the hint is already added
935 for( unsigned int i = 0; i < mAuxiliaryHints.size(); i++ )
937 if( mAuxiliaryHints[i].first == hint )
939 // Just change the value
940 mAuxiliaryHints[i].second = value;
942 DALI_LOG_INFO( gWindowLogFilter, Debug::Verbose, "Window::AddAuxiliaryHint: Change! hint = %s, value = %s, id = %d\n", hint.c_str(), value.c_str(), i + 1 );
944 return i + 1; // id is index + 1
949 mAuxiliaryHints.push_back( std::pair< std::string, std::string >( hint, value ) );
951 unsigned int id = mAuxiliaryHints.size();
953 ecore_wl_window_aux_hint_add( mEventHandler->mEcoreWindow, static_cast< int >( id ), hint.c_str(), value.c_str() );
955 DALI_LOG_INFO( gWindowLogFilter, Debug::Verbose, "Window::AddAuxiliaryHint: hint = %s, value = %s, id = %d\n", hint.c_str(), value.c_str(), id );
960 bool Window::RemoveAuxiliaryHint( unsigned int id )
962 if( id == 0 || id > mAuxiliaryHints.size() )
964 DALI_LOG_INFO( gWindowLogFilter, Debug::Concise, "Window::RemoveAuxiliaryHint: Invalid id [%d]\n", id );
968 mAuxiliaryHints[id - 1].second = std::string();
970 ecore_wl_window_aux_hint_del( mEventHandler->mEcoreWindow, static_cast< int >( id ) );
972 DALI_LOG_INFO( gWindowLogFilter, Debug::Verbose, "Window::RemoveAuxiliaryHint: id = %d, hint = %s\n", id, mAuxiliaryHints[id - 1].first.c_str() );
977 bool Window::SetAuxiliaryHintValue( unsigned int id, const std::string& value )
979 if( id == 0 || id > mAuxiliaryHints.size() )
981 DALI_LOG_INFO( gWindowLogFilter, Debug::Concise, "Window::SetAuxiliaryHintValue: Invalid id [%d]\n", id );
985 mAuxiliaryHints[id - 1].second = value;
987 ecore_wl_window_aux_hint_change( mEventHandler->mEcoreWindow, static_cast< int >( id ), value.c_str() );
989 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() );
994 std::string Window::GetAuxiliaryHintValue( unsigned int id ) const
996 if( id == 0 || id > mAuxiliaryHints.size() )
998 DALI_LOG_INFO( gWindowLogFilter, Debug::Concise, "Window::GetAuxiliaryHintValue: Invalid id [%d]\n", id );
999 return std::string();
1002 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() );
1004 return mAuxiliaryHints[id - 1].second;
1007 unsigned int Window::GetAuxiliaryHintId( const std::string& hint ) const
1009 for( unsigned int i = 0; i < mAuxiliaryHints.size(); i++ )
1011 if( mAuxiliaryHints[i].first == hint )
1013 DALI_LOG_INFO( gWindowLogFilter, Debug::Verbose, "Window::GetAuxiliaryHintId: hint = %s, id = %d\n", hint.c_str(), i + 1 );
1018 DALI_LOG_INFO( gWindowLogFilter, Debug::Verbose, "Window::GetAuxiliaryHintId: Invalid hint! [%s]\n", hint.c_str() );
1023 void Window::SetInputRegion( const Rect< int >& inputRegion )
1025 ecore_wl_window_input_region_set( mEventHandler->mEcoreWindow, inputRegion.x, inputRegion.y, inputRegion.width, inputRegion.height );
1027 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 );
1030 void Window::SetType( Dali::DevelWindow::Type type )
1032 Ecore_Wl_Window_Type windowType;
1038 case Dali::DevelWindow::NORMAL:
1040 windowType = ECORE_WL_WINDOW_TYPE_TOPLEVEL;
1043 case Dali::DevelWindow::NOTIFICATION:
1045 windowType = ECORE_WL_WINDOW_TYPE_NOTIFICATION;
1048 case Dali::DevelWindow::UTILITY:
1050 windowType = ECORE_WL_WINDOW_TYPE_UTILITY;
1053 case Dali::DevelWindow::DIALOG:
1055 windowType = ECORE_WL_WINDOW_TYPE_DIALOG;
1060 windowType = ECORE_WL_WINDOW_TYPE_TOPLEVEL;
1065 ecore_wl_window_type_set( mEventHandler->mEcoreWindow, windowType );
1071 Dali::DevelWindow::Type Window::GetType() const
1076 bool Window::SetNotificationLevel( Dali::DevelWindow::NotificationLevel::Type level )
1078 if( mType != Dali::DevelWindow::NOTIFICATION )
1080 DALI_LOG_INFO( gWindowLogFilter, Debug::Verbose, "Window::SetNotificationLevel: Not supported window type [%d]\n", mType );
1084 while( !mEventHandler->mTizenPolicy )
1086 wl_display_dispatch_queue( mEventHandler->mDisplay, mEventHandler->mEventQueue );
1089 int notificationLevel;
1093 case Dali::DevelWindow::NotificationLevel::NONE:
1095 notificationLevel = TIZEN_POLICY_LEVEL_NONE;
1098 case Dali::DevelWindow::NotificationLevel::BASE:
1100 notificationLevel = TIZEN_POLICY_LEVEL_DEFAULT;
1103 case Dali::DevelWindow::NotificationLevel::MEDIUM:
1105 notificationLevel = TIZEN_POLICY_LEVEL_MEDIUM;
1108 case Dali::DevelWindow::NotificationLevel::HIGH:
1110 notificationLevel = TIZEN_POLICY_LEVEL_HIGH;
1113 case Dali::DevelWindow::NotificationLevel::TOP:
1115 notificationLevel = TIZEN_POLICY_LEVEL_TOP;
1120 DALI_LOG_INFO( gWindowLogFilter, Debug::Verbose, "Window::SetNotificationLevel: invalid level [%d]\n", level );
1121 notificationLevel = TIZEN_POLICY_LEVEL_DEFAULT;
1126 mEventHandler->mNotificationLevelChangeDone = false;
1127 mEventHandler->mNotificationChangeState = TIZEN_POLICY_ERROR_STATE_NONE;
1129 tizen_policy_set_notification_level( mEventHandler->mTizenPolicy, ecore_wl_window_surface_get( mEventHandler->mEcoreWindow ), notificationLevel );
1133 while( !mEventHandler->mNotificationLevelChangeDone && count < 3 )
1136 wl_display_dispatch_queue( mEventHandler->mDisplay, mEventHandler->mEventQueue );
1140 if( !mEventHandler->mNotificationLevelChangeDone )
1142 DALI_LOG_INFO( gWindowLogFilter, Debug::Verbose, "Window::SetNotificationLevel: Level change is failed [%d, %d]\n", level, mEventHandler->mNotificationChangeState );
1145 else if( mEventHandler->mNotificationChangeState == TIZEN_POLICY_ERROR_STATE_PERMISSION_DENIED )
1147 DALI_LOG_INFO( gWindowLogFilter, Debug::Verbose, "Window::SetNotificationLevel: Permission denied! [%d]\n", level );
1151 DALI_LOG_INFO( gWindowLogFilter, Debug::Verbose, "Window::SetNotificationLevel: Level is changed [%d]\n", mEventHandler->mNotificationLevel );
1156 Dali::DevelWindow::NotificationLevel::Type Window::GetNotificationLevel()
1158 if( mType != Dali::DevelWindow::NOTIFICATION )
1160 DALI_LOG_INFO( gWindowLogFilter, Debug::Verbose, "Window::GetNotificationLevel: Not supported window type [%d]\n", mType );
1161 return Dali::DevelWindow::NotificationLevel::NONE;
1164 while( !mEventHandler->mTizenPolicy )
1166 wl_display_dispatch_queue( mEventHandler->mDisplay, mEventHandler->mEventQueue );
1171 while( !mEventHandler->mNotificationLevelChangeDone && count < 3 )
1174 wl_display_dispatch_queue( mEventHandler->mDisplay, mEventHandler->mEventQueue );
1178 if( !mEventHandler->mNotificationLevelChangeDone )
1180 DALI_LOG_INFO( gWindowLogFilter, Debug::Verbose, "Window::GetNotificationLevel: Error! [%d]\n", mEventHandler->mNotificationChangeState );
1181 return Dali::DevelWindow::NotificationLevel::NONE;
1184 Dali::DevelWindow::NotificationLevel::Type level;
1186 switch( mEventHandler->mNotificationLevel )
1188 case TIZEN_POLICY_LEVEL_NONE:
1190 level = Dali::DevelWindow::NotificationLevel::NONE;
1193 case TIZEN_POLICY_LEVEL_DEFAULT:
1195 level = Dali::DevelWindow::NotificationLevel::BASE;
1198 case TIZEN_POLICY_LEVEL_MEDIUM:
1200 level = Dali::DevelWindow::NotificationLevel::MEDIUM;
1203 case TIZEN_POLICY_LEVEL_HIGH:
1205 level = Dali::DevelWindow::NotificationLevel::HIGH;
1208 case TIZEN_POLICY_LEVEL_TOP:
1210 level = Dali::DevelWindow::NotificationLevel::TOP;
1215 DALI_LOG_INFO( gWindowLogFilter, Debug::Verbose, "Window::GetNotificationLevel: invalid level [%d]\n", mEventHandler->mNotificationLevel );
1216 level = Dali::DevelWindow::NotificationLevel::NONE;
1221 DALI_LOG_INFO( gWindowLogFilter, Debug::Verbose, "Window::GetNotificationLevel: level [%d]\n", mEventHandler->mNotificationLevel );
1226 void Window::SetOpaqueState( bool opaque )
1228 while( !mEventHandler->mTizenPolicy )
1230 wl_display_dispatch_queue( mEventHandler->mDisplay, mEventHandler->mEventQueue );
1233 tizen_policy_set_opaque_state( mEventHandler->mTizenPolicy, ecore_wl_window_surface_get( mEventHandler->mEcoreWindow ), ( opaque ? 1 : 0 ) );
1235 mOpaqueState = opaque;
1237 DALI_LOG_INFO( gWindowLogFilter, Debug::Verbose, "Window::SetOpaqueState: opaque = %d\n", opaque );
1240 bool Window::IsOpaqueState()
1242 return mOpaqueState;
1245 bool Window::SetScreenMode( Dali::DevelWindow::ScreenMode::Type screenMode )
1247 while( !mEventHandler->mTizenPolicy )
1249 wl_display_dispatch_queue( mEventHandler->mDisplay, mEventHandler->mEventQueue );
1252 mEventHandler->mScreenModeChangeDone = false;
1253 mEventHandler->mScreenModeChangeState = TIZEN_POLICY_ERROR_STATE_NONE;
1255 unsigned int mode = 0;
1257 switch( screenMode )
1259 case Dali::DevelWindow::ScreenMode::DEFAULT:
1264 case Dali::DevelWindow::ScreenMode::ALWAYS_ON:
1271 tizen_policy_set_window_screen_mode( mEventHandler->mTizenPolicy, ecore_wl_window_surface_get( mEventHandler->mEcoreWindow ), mode );
1275 while( !mEventHandler->mScreenModeChangeDone && count < 3 )
1278 wl_display_dispatch_queue( mEventHandler->mDisplay, mEventHandler->mEventQueue );
1282 if( !mEventHandler->mScreenModeChangeDone )
1284 DALI_LOG_INFO( gWindowLogFilter, Debug::Verbose, "Window::SetScreenMode: Screen mode change is failed [%d, %d]\n", screenMode, mEventHandler->mScreenModeChangeState );
1287 else if( mEventHandler->mScreenModeChangeState == TIZEN_POLICY_ERROR_STATE_PERMISSION_DENIED )
1289 DALI_LOG_INFO( gWindowLogFilter, Debug::Verbose, "Window::SetScreenMode: Permission denied! [%d]\n", screenMode );
1293 DALI_LOG_INFO( gWindowLogFilter, Debug::Verbose, "Window::SetScreenMode: Screen mode is changed [%d]\n", mEventHandler->mScreenMode );
1298 Dali::DevelWindow::ScreenMode::Type Window::GetScreenMode()
1300 while( !mEventHandler->mTizenPolicy )
1302 wl_display_dispatch_queue( mEventHandler->mDisplay, mEventHandler->mEventQueue );
1307 while( !mEventHandler->mScreenModeChangeDone && count < 3 )
1310 wl_display_dispatch_queue( mEventHandler->mDisplay, mEventHandler->mEventQueue );
1314 if( !mEventHandler->mScreenModeChangeDone )
1316 DALI_LOG_INFO( gWindowLogFilter, Debug::Verbose, "Window::GetScreenMode: Error! [%d]\n", mEventHandler->mScreenModeChangeState );
1317 return Dali::DevelWindow::ScreenMode::DEFAULT;
1320 Dali::DevelWindow::ScreenMode::Type screenMode = Dali::DevelWindow::ScreenMode::DEFAULT;
1322 switch( mEventHandler->mScreenMode )
1326 screenMode = Dali::DevelWindow::ScreenMode::DEFAULT;
1331 screenMode = Dali::DevelWindow::ScreenMode::ALWAYS_ON;
1336 DALI_LOG_INFO( gWindowLogFilter, Debug::Verbose, "Window::GetScreenMode: screen mode [%d]\n", mEventHandler->mScreenMode );
1341 bool Window::SetBrightness( int brightness )
1343 if( brightness < 0 || brightness > 100 )
1345 DALI_LOG_INFO( gWindowLogFilter, Debug::Verbose, "Window::SetBrightness: Invalid brightness value [%d]\n", brightness );
1349 while( !mEventHandler->mTizenDisplayPolicy )
1351 wl_display_dispatch_queue( mEventHandler->mDisplay, mEventHandler->mEventQueue );
1354 mEventHandler->mBrightnessChangeDone = false;
1355 mEventHandler->mBrightnessChangeState = TIZEN_POLICY_ERROR_STATE_NONE;
1357 tizen_display_policy_set_window_brightness( mEventHandler->mTizenDisplayPolicy, ecore_wl_window_surface_get( mEventHandler->mEcoreWindow ), brightness );
1361 while( !mEventHandler->mBrightnessChangeDone && count < 3 )
1364 wl_display_dispatch_queue( mEventHandler->mDisplay, mEventHandler->mEventQueue );
1368 if( !mEventHandler->mBrightnessChangeDone )
1370 DALI_LOG_INFO( gWindowLogFilter, Debug::Verbose, "Window::SetBrightness: Brightness change is failed [%d, %d]\n", brightness, mEventHandler->mBrightnessChangeState );
1373 else if( mEventHandler->mBrightnessChangeState == TIZEN_POLICY_ERROR_STATE_PERMISSION_DENIED )
1375 DALI_LOG_INFO( gWindowLogFilter, Debug::Verbose, "Window::SetBrightness: Permission denied! [%d]\n", brightness );
1379 DALI_LOG_INFO( gWindowLogFilter, Debug::Verbose, "Window::SetBrightness: Brightness is changed [%d]\n", mEventHandler->mBrightness );
1384 int Window::GetBrightness()
1386 while( !mEventHandler->mTizenDisplayPolicy )
1388 wl_display_dispatch_queue( mEventHandler->mDisplay, mEventHandler->mEventQueue );
1393 while( !mEventHandler->mBrightnessChangeDone && count < 3 )
1396 wl_display_dispatch_queue( mEventHandler->mDisplay, mEventHandler->mEventQueue );
1400 if( !mEventHandler->mBrightnessChangeDone )
1402 DALI_LOG_INFO( gWindowLogFilter, Debug::Verbose, "Window::GetBrightness: Error! [%d]\n", mEventHandler->mBrightnessChangeState );
1406 DALI_LOG_INFO( gWindowLogFilter, Debug::Verbose, "Window::GetBrightness: Brightness [%d]\n", mEventHandler->mBrightness );
1408 return mEventHandler->mBrightness;
1411 void Window::SetSize( Dali::DevelWindow::WindowSize size )
1413 if( !mResizeEnabled )
1415 AddAuxiliaryHint( "wm.policy.win.user.geometry", "1" );
1416 mResizeEnabled = true;
1419 PositionSize positionSize = mSurface->GetPositionSize();
1421 if( positionSize.width != size.GetWidth() || positionSize.height != size.GetHeight() )
1423 positionSize.width = size.GetWidth();
1424 positionSize.height = size.GetHeight();
1426 mSurface->MoveResize( positionSize );
1428 mAdaptor->SurfaceResizePrepare( Dali::Adaptor::SurfaceSize( positionSize.width, positionSize.height ) );
1431 mResizedSignal.Emit( Dali::DevelWindow::WindowSize( positionSize.width, positionSize.height ) );
1433 mAdaptor->SurfaceResizeComplete( Dali::Adaptor::SurfaceSize( positionSize.width, positionSize.height ) );
1437 Dali::DevelWindow::WindowSize Window::GetSize()
1439 PositionSize positionSize = mSurface->GetPositionSize();
1441 return Dali::DevelWindow::WindowSize( positionSize.width, positionSize.height );
1444 void Window::SetPosition( Dali::DevelWindow::WindowPosition position )
1446 if( !mResizeEnabled )
1448 AddAuxiliaryHint( "wm.policy.win.user.geometry", "1" );
1449 mResizeEnabled = true;
1452 PositionSize positionSize = mSurface->GetPositionSize();
1454 if( positionSize.x != position.GetX() || positionSize.y != position.GetY() )
1456 positionSize.x = position.GetX();
1457 positionSize.y = position.GetY();
1459 mSurface->MoveResize( positionSize );
1463 Dali::DevelWindow::WindowPosition Window::GetPosition()
1465 PositionSize positionSize = mSurface->GetPositionSize();
1467 return Dali::DevelWindow::WindowPosition( positionSize.x, positionSize.y );
1470 void Window::SetTransparency( bool transparent )
1472 ECore::WindowRenderSurface* wlSurface( dynamic_cast< ECore::WindowRenderSurface * >( mSurface ) );
1475 wlSurface->SetTransparency( transparent );
1485 #pragma GCC diagnostic pop