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& positionSize, const std::string& name, const std::string& className, bool isTransparent )
387 Window* window = new Window();
388 window->mIsTransparent = isTransparent;
389 window->Initialize( positionSize, 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 ),
514 mResizeEnabled( false ),
516 mIndicatorOrientation( Dali::Window::PORTRAIT ),
517 mNextIndicatorOrientation( Dali::Window::PORTRAIT ),
518 mIndicatorOpacityMode( Dali::Window::OPAQUE ),
521 mType( Dali::DevelWindow::NORMAL ),
522 mEventHandler( NULL ),
523 mPreferredOrientation( Dali::Window::PORTRAIT ),
524 mSupportedAuxiliaryHints(),
526 mIndicatorVisibilityChangedSignal(),
527 mFocusChangedSignal(),
529 mDeleteRequestSignal()
535 delete mEventHandler;
545 mAdaptor->RemoveObserver( *this );
546 mAdaptor->SetDragAndDropDetector( NULL );
552 mSupportedAuxiliaryHints.clear();
553 mAuxiliaryHints.clear();
556 void Window::Initialize(const PositionSize& positionSize, const std::string& name, const std::string& className)
558 // create an Wayland window by default
560 ECore::WindowRenderSurface* windowSurface = new ECore::WindowRenderSurface( positionSize, surface, name, mIsTransparent );
562 mSurface = windowSurface;
564 // create event handler for Wayland window
565 mEventHandler = new EventHandler( this );
567 // get auxiliary hint
568 Eina_List* hints = ecore_wl_window_aux_hints_supported_get( mEventHandler->mEcoreWindow );
574 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) ) ) )
576 mSupportedAuxiliaryHints.push_back( hint );
578 DALI_LOG_INFO( gWindowLogFilter, Debug::Verbose, "Window::Initialize: %s\n", hint );
582 if( !positionSize.IsEmpty() )
584 AddAuxiliaryHint( "wm.policy.win.user.geometry", "1" );
585 mResizeEnabled = true;
588 SetClass( name, className );
589 windowSurface->Map();
591 mOrientation = Orientation::New(this);
594 void Window::DoShowIndicator( Dali::Window::WindowOrientation lastOrientation )
596 if( mIndicator == NULL )
598 if( mIndicatorVisible != Dali::Window::INVISIBLE )
600 mIndicator = new Indicator( mAdaptor, mIndicatorOrientation, this );
601 mIndicator->SetOpacityMode( mIndicatorOpacityMode );
602 Dali::Actor actor = mIndicator->GetActor();
603 SetIndicatorActorRotation();
604 mOverlay->Add(actor);
606 // else don't create a hidden indicator
608 else // Already have indicator
610 if( mIndicatorVisible == Dali::Window::VISIBLE )
612 // If we are resuming, and rotation has changed,
613 if( mIndicatorIsShown == false && mIndicatorOrientation != mNextIndicatorOrientation )
615 // then close current indicator and open new one
616 mShowRotatedIndicatorOnClose = true;
617 mIndicator->Close(); // May synchronously call IndicatorClosed() callback & 1 level of recursion
618 // Don't show actor - will contain indicator for old orientation.
623 // set indicator visible mode
624 if( mIndicator != NULL )
626 mIndicator->SetVisible( mIndicatorVisible );
629 bool show = (mIndicatorVisible != Dali::Window::INVISIBLE );
630 SetIndicatorProperties( show, lastOrientation );
631 mIndicatorIsShown = show;
634 void Window::DoRotateIndicator( Dali::Window::WindowOrientation orientation )
636 if( mIndicatorIsShown )
638 mShowRotatedIndicatorOnClose = true;
639 mNextIndicatorOrientation = orientation;
640 mIndicator->Close(); // May synchronously call IndicatorClosed() callback
644 // Save orientation for when the indicator is next shown
645 mShowRotatedIndicatorOnClose = false;
646 mNextIndicatorOrientation = orientation;
650 void Window::SetIndicatorProperties( bool isShow, Dali::Window::WindowOrientation lastOrientation )
652 ECore::WindowRenderSurface* wlSurface( dynamic_cast< ECore::WindowRenderSurface * >( mSurface ) );
656 Ecore_Wl_Window* wlWindow = wlSurface->GetWlWindow();
659 ecore_wl_window_indicator_state_set(wlWindow, ECORE_WL_INDICATOR_STATE_ON);
663 ecore_wl_window_indicator_state_set(wlWindow, ECORE_WL_INDICATOR_STATE_OFF);
668 void Window::IndicatorTypeChanged(Indicator::Type type)
670 #if defined(DALI_PROFILE_MOBILE)
671 ECore::WindowRenderSurface* wlSurface( dynamic_cast< ECore::WindowRenderSurface * >( mSurface ) );
675 Ecore_Wl_Window* wlWindow = wlSurface->GetWlWindow();
678 case Indicator::INDICATOR_TYPE_1:
679 ecore_wl_indicator_visible_type_set(wlWindow, ECORE_WL_INDICATOR_VISIBLE_TYPE_SHOWN);
682 case Indicator::INDICATOR_TYPE_2:
683 ecore_wl_indicator_visible_type_set(wlWindow, ECORE_WL_INDICATOR_VISIBLE_TYPE_HIDDEN);
686 case Indicator::INDICATOR_TYPE_UNKNOWN:
694 void Window::IndicatorClosed( IndicatorInterface* indicator )
696 DALI_LOG_TRACE_METHOD( gWindowLogFilter );
698 if( mShowRotatedIndicatorOnClose )
700 Dali::Window::WindowOrientation currentOrientation = mIndicatorOrientation;
701 mIndicator->Open(mNextIndicatorOrientation);
702 mIndicatorOrientation = mNextIndicatorOrientation;
703 SetIndicatorActorRotation();
704 DoShowIndicator(currentOrientation);
708 void Window::IndicatorVisibilityChanged(bool isVisible)
710 mIndicatorVisibilityChangedSignal.Emit(isVisible);
713 void Window::SetIndicatorActorRotation()
715 DALI_LOG_TRACE_METHOD( gWindowLogFilter );
716 DALI_ASSERT_DEBUG( mIndicator != NULL );
718 Dali::Actor actor = mIndicator->GetActor();
719 switch( mIndicatorOrientation )
721 case Dali::Window::PORTRAIT:
722 actor.SetParentOrigin( ParentOrigin::TOP_CENTER );
723 actor.SetAnchorPoint( AnchorPoint::TOP_CENTER );
724 actor.SetOrientation( Degree(0), Vector3::ZAXIS );
726 case Dali::Window::PORTRAIT_INVERSE:
727 actor.SetParentOrigin( ParentOrigin::BOTTOM_CENTER );
728 actor.SetAnchorPoint( AnchorPoint::TOP_CENTER );
729 actor.SetOrientation( Degree(180), Vector3::ZAXIS );
731 case Dali::Window::LANDSCAPE:
732 actor.SetParentOrigin( ParentOrigin::CENTER_LEFT );
733 actor.SetAnchorPoint( AnchorPoint::TOP_CENTER );
734 actor.SetOrientation( Degree(270), Vector3::ZAXIS );
736 case Dali::Window::LANDSCAPE_INVERSE:
737 actor.SetParentOrigin( ParentOrigin::CENTER_RIGHT );
738 actor.SetAnchorPoint( AnchorPoint::TOP_CENTER );
739 actor.SetOrientation( Degree(90), Vector3::ZAXIS );
746 ecore_wl_window_raise( mEventHandler->mEcoreWindow );
751 ecore_wl_window_lower( mEventHandler->mEcoreWindow );
754 void Window::Activate()
756 ecore_wl_window_activate( mEventHandler->mEcoreWindow );
759 Dali::DragAndDropDetector Window::GetDragAndDropDetector() const
761 return mDragAndDropDetector;
764 Dali::Any Window::GetNativeHandle() const
768 return mEventHandler->mEcoreWindow;
776 void Window::OnStart()
778 DoShowIndicator( mIndicatorOrientation );
781 void Window::OnPause()
785 void Window::OnResume()
787 // resume indicator status
788 if( mIndicator != NULL )
790 // Restore own indicator opacity
791 // Send opacity mode to indicator service when app resumed
792 mIndicator->SetOpacityMode( mIndicatorOpacityMode );
796 void Window::OnStop()
807 void Window::OnDestroy()
812 void Window::AddAvailableOrientation(Dali::Window::WindowOrientation orientation)
816 for( std::size_t i=0; i<mAvailableOrientations.size(); i++ )
818 if(mAvailableOrientations[i] == orientation)
827 mAvailableOrientations.push_back(orientation);
828 SetAvailableOrientations( mAvailableOrientations );
832 void Window::RemoveAvailableOrientation(Dali::Window::WindowOrientation orientation)
834 for( std::vector<Dali::Window::WindowOrientation>::iterator iter = mAvailableOrientations.begin();
835 iter != mAvailableOrientations.end(); ++iter )
837 if( *iter == orientation )
839 mAvailableOrientations.erase( iter );
843 SetAvailableOrientations( mAvailableOrientations );
846 void Window::SetAvailableOrientations(const std::vector<Dali::Window::WindowOrientation>& orientations)
849 for( std::size_t i = 0; i < mAvailableOrientations.size(); ++i )
851 rotations[i] = static_cast< int >( mAvailableOrientations[i] );
853 ecore_wl_window_rotation_available_rotations_set( mEventHandler->mEcoreWindow, rotations, mAvailableOrientations.size() );
856 const std::vector<Dali::Window::WindowOrientation>& Window::GetAvailableOrientations()
858 return mAvailableOrientations;
861 void Window::SetPreferredOrientation(Dali::Window::WindowOrientation orientation)
863 mPreferredOrientation = orientation;
865 ecore_wl_window_rotation_preferred_rotation_set( mEventHandler->mEcoreWindow, orientation );
868 Dali::Window::WindowOrientation Window::GetPreferredOrientation()
870 return mPreferredOrientation;
873 void Window::SetAcceptFocus( bool accept )
875 mIsFocusAcceptable = accept;
877 ecore_wl_window_focus_skip_set( mEventHandler->mEcoreWindow, !accept );
880 bool Window::IsFocusAcceptable()
882 return mIsFocusAcceptable;
888 ecore_wl_window_show( mEventHandler->mEcoreWindow );
890 // Need an update request
893 mAdaptor->RequestUpdateOnce();
900 ecore_wl_window_hide( mEventHandler->mEcoreWindow );
903 bool Window::IsVisible() const
908 void Window::RotationDone( int orientation, int width, int height )
910 mAdaptor->SurfaceSizeChanged( Dali::Adaptor::SurfaceSize( width, height ) );
913 mResizedSignal.Emit( Dali::DevelWindow::WindowSize( width, height ) );
915 Dali::Window::WindowOrientation windowOrientation;
916 switch( orientation )
920 windowOrientation = Dali::Window::PORTRAIT;
925 windowOrientation = Dali::Window::LANDSCAPE;
930 windowOrientation = Dali::Window::PORTRAIT_INVERSE;
935 windowOrientation = Dali::Window::LANDSCAPE_INVERSE;
940 windowOrientation = Dali::Window::PORTRAIT;
945 ECore::WindowRenderSurface* wlSurface( dynamic_cast< ECore::WindowRenderSurface * >( mSurface ) );
946 wlSurface->RequestRotation( windowOrientation, width, height );
949 unsigned int Window::GetSupportedAuxiliaryHintCount()
951 return mSupportedAuxiliaryHints.size();
954 std::string Window::GetSupportedAuxiliaryHint( unsigned int index )
956 if( index >= GetSupportedAuxiliaryHintCount() )
958 DALI_LOG_INFO( gWindowLogFilter, Debug::Verbose, "Window::GetSupportedAuxiliaryHint: Invalid index! [%d]\n", index );
961 return mSupportedAuxiliaryHints[index];
964 unsigned int Window::AddAuxiliaryHint( const std::string& hint, const std::string& value )
966 bool supported = false;
968 // Check if the hint is suppported
969 for( std::vector< std::string >::iterator iter = mSupportedAuxiliaryHints.begin(); iter != mSupportedAuxiliaryHints.end(); ++iter )
980 DALI_LOG_INFO( gWindowLogFilter, Debug::Concise, "Window::AddAuxiliaryHint: Not supported auxiliary hint [%s]\n", hint.c_str() );
984 // Check if the hint is already added
985 for( unsigned int i = 0; i < mAuxiliaryHints.size(); i++ )
987 if( mAuxiliaryHints[i].first == hint )
989 // Just change the value
990 mAuxiliaryHints[i].second = value;
992 DALI_LOG_INFO( gWindowLogFilter, Debug::Verbose, "Window::AddAuxiliaryHint: Change! hint = %s, value = %s, id = %d\n", hint.c_str(), value.c_str(), i + 1 );
994 return i + 1; // id is index + 1
999 mAuxiliaryHints.push_back( std::pair< std::string, std::string >( hint, value ) );
1001 unsigned int id = mAuxiliaryHints.size();
1003 ecore_wl_window_aux_hint_add( mEventHandler->mEcoreWindow, static_cast< int >( id ), hint.c_str(), value.c_str() );
1005 DALI_LOG_INFO( gWindowLogFilter, Debug::Verbose, "Window::AddAuxiliaryHint: hint = %s, value = %s, id = %d\n", hint.c_str(), value.c_str(), id );
1010 bool Window::RemoveAuxiliaryHint( unsigned int id )
1012 if( id == 0 || id > mAuxiliaryHints.size() )
1014 DALI_LOG_INFO( gWindowLogFilter, Debug::Concise, "Window::RemoveAuxiliaryHint: Invalid id [%d]\n", id );
1018 mAuxiliaryHints[id - 1].second = std::string();
1020 ecore_wl_window_aux_hint_del( mEventHandler->mEcoreWindow, static_cast< int >( id ) );
1022 DALI_LOG_INFO( gWindowLogFilter, Debug::Verbose, "Window::RemoveAuxiliaryHint: id = %d, hint = %s\n", id, mAuxiliaryHints[id - 1].first.c_str() );
1027 bool Window::SetAuxiliaryHintValue( unsigned int id, const std::string& value )
1029 if( id == 0 || id > mAuxiliaryHints.size() )
1031 DALI_LOG_INFO( gWindowLogFilter, Debug::Concise, "Window::SetAuxiliaryHintValue: Invalid id [%d]\n", id );
1035 mAuxiliaryHints[id - 1].second = value;
1037 ecore_wl_window_aux_hint_change( mEventHandler->mEcoreWindow, static_cast< int >( id ), value.c_str() );
1039 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() );
1044 std::string Window::GetAuxiliaryHintValue( unsigned int id ) const
1046 if( id == 0 || id > mAuxiliaryHints.size() )
1048 DALI_LOG_INFO( gWindowLogFilter, Debug::Concise, "Window::GetAuxiliaryHintValue: Invalid id [%d]\n", id );
1049 return std::string();
1052 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() );
1054 return mAuxiliaryHints[id - 1].second;
1057 unsigned int Window::GetAuxiliaryHintId( const std::string& hint ) const
1059 for( unsigned int i = 0; i < mAuxiliaryHints.size(); i++ )
1061 if( mAuxiliaryHints[i].first == hint )
1063 DALI_LOG_INFO( gWindowLogFilter, Debug::Verbose, "Window::GetAuxiliaryHintId: hint = %s, id = %d\n", hint.c_str(), i + 1 );
1068 DALI_LOG_INFO( gWindowLogFilter, Debug::Verbose, "Window::GetAuxiliaryHintId: Invalid hint! [%s]\n", hint.c_str() );
1073 void Window::SetInputRegion( const Rect< int >& inputRegion )
1075 ecore_wl_window_input_region_set( mEventHandler->mEcoreWindow, inputRegion.x, inputRegion.y, inputRegion.width, inputRegion.height );
1077 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 );
1080 void Window::SetType( Dali::DevelWindow::Type type )
1082 Ecore_Wl_Window_Type windowType;
1088 case Dali::DevelWindow::NORMAL:
1090 windowType = ECORE_WL_WINDOW_TYPE_TOPLEVEL;
1093 case Dali::DevelWindow::NOTIFICATION:
1095 windowType = ECORE_WL_WINDOW_TYPE_NOTIFICATION;
1098 case Dali::DevelWindow::UTILITY:
1100 windowType = ECORE_WL_WINDOW_TYPE_UTILITY;
1103 case Dali::DevelWindow::DIALOG:
1105 windowType = ECORE_WL_WINDOW_TYPE_DIALOG;
1110 windowType = ECORE_WL_WINDOW_TYPE_TOPLEVEL;
1115 ecore_wl_window_type_set( mEventHandler->mEcoreWindow, windowType );
1121 Dali::DevelWindow::Type Window::GetType() const
1126 bool Window::SetNotificationLevel( Dali::DevelWindow::NotificationLevel::Type level )
1128 if( mType != Dali::DevelWindow::NOTIFICATION )
1130 DALI_LOG_INFO( gWindowLogFilter, Debug::Verbose, "Window::SetNotificationLevel: Not supported window type [%d]\n", mType );
1134 while( !mEventHandler->mTizenPolicy )
1136 wl_display_dispatch_queue( mEventHandler->mDisplay, mEventHandler->mEventQueue );
1139 int notificationLevel;
1143 case Dali::DevelWindow::NotificationLevel::NONE:
1145 notificationLevel = TIZEN_POLICY_LEVEL_NONE;
1148 case Dali::DevelWindow::NotificationLevel::BASE:
1150 notificationLevel = TIZEN_POLICY_LEVEL_DEFAULT;
1153 case Dali::DevelWindow::NotificationLevel::MEDIUM:
1155 notificationLevel = TIZEN_POLICY_LEVEL_MEDIUM;
1158 case Dali::DevelWindow::NotificationLevel::HIGH:
1160 notificationLevel = TIZEN_POLICY_LEVEL_HIGH;
1163 case Dali::DevelWindow::NotificationLevel::TOP:
1165 notificationLevel = TIZEN_POLICY_LEVEL_TOP;
1170 DALI_LOG_INFO( gWindowLogFilter, Debug::Verbose, "Window::SetNotificationLevel: invalid level [%d]\n", level );
1171 notificationLevel = TIZEN_POLICY_LEVEL_DEFAULT;
1176 mEventHandler->mNotificationLevelChangeDone = false;
1177 mEventHandler->mNotificationChangeState = TIZEN_POLICY_ERROR_STATE_NONE;
1179 tizen_policy_set_notification_level( mEventHandler->mTizenPolicy, ecore_wl_window_surface_get( mEventHandler->mEcoreWindow ), notificationLevel );
1183 while( !mEventHandler->mNotificationLevelChangeDone && count < 3 )
1186 wl_display_dispatch_queue( mEventHandler->mDisplay, mEventHandler->mEventQueue );
1190 if( !mEventHandler->mNotificationLevelChangeDone )
1192 DALI_LOG_INFO( gWindowLogFilter, Debug::Verbose, "Window::SetNotificationLevel: Level change is failed [%d, %d]\n", level, mEventHandler->mNotificationChangeState );
1195 else if( mEventHandler->mNotificationChangeState == TIZEN_POLICY_ERROR_STATE_PERMISSION_DENIED )
1197 DALI_LOG_INFO( gWindowLogFilter, Debug::Verbose, "Window::SetNotificationLevel: Permission denied! [%d]\n", level );
1201 DALI_LOG_INFO( gWindowLogFilter, Debug::Verbose, "Window::SetNotificationLevel: Level is changed [%d]\n", mEventHandler->mNotificationLevel );
1206 Dali::DevelWindow::NotificationLevel::Type Window::GetNotificationLevel()
1208 if( mType != Dali::DevelWindow::NOTIFICATION )
1210 DALI_LOG_INFO( gWindowLogFilter, Debug::Verbose, "Window::GetNotificationLevel: Not supported window type [%d]\n", mType );
1211 return Dali::DevelWindow::NotificationLevel::NONE;
1214 while( !mEventHandler->mTizenPolicy )
1216 wl_display_dispatch_queue( mEventHandler->mDisplay, mEventHandler->mEventQueue );
1221 while( !mEventHandler->mNotificationLevelChangeDone && count < 3 )
1224 wl_display_dispatch_queue( mEventHandler->mDisplay, mEventHandler->mEventQueue );
1228 if( !mEventHandler->mNotificationLevelChangeDone )
1230 DALI_LOG_INFO( gWindowLogFilter, Debug::Verbose, "Window::GetNotificationLevel: Error! [%d]\n", mEventHandler->mNotificationChangeState );
1231 return Dali::DevelWindow::NotificationLevel::NONE;
1234 Dali::DevelWindow::NotificationLevel::Type level;
1236 switch( mEventHandler->mNotificationLevel )
1238 case TIZEN_POLICY_LEVEL_NONE:
1240 level = Dali::DevelWindow::NotificationLevel::NONE;
1243 case TIZEN_POLICY_LEVEL_DEFAULT:
1245 level = Dali::DevelWindow::NotificationLevel::BASE;
1248 case TIZEN_POLICY_LEVEL_MEDIUM:
1250 level = Dali::DevelWindow::NotificationLevel::MEDIUM;
1253 case TIZEN_POLICY_LEVEL_HIGH:
1255 level = Dali::DevelWindow::NotificationLevel::HIGH;
1258 case TIZEN_POLICY_LEVEL_TOP:
1260 level = Dali::DevelWindow::NotificationLevel::TOP;
1265 DALI_LOG_INFO( gWindowLogFilter, Debug::Verbose, "Window::GetNotificationLevel: invalid level [%d]\n", mEventHandler->mNotificationLevel );
1266 level = Dali::DevelWindow::NotificationLevel::NONE;
1271 DALI_LOG_INFO( gWindowLogFilter, Debug::Verbose, "Window::GetNotificationLevel: level [%d]\n", mEventHandler->mNotificationLevel );
1276 void Window::SetOpaqueState( bool opaque )
1278 while( !mEventHandler->mTizenPolicy )
1280 wl_display_dispatch_queue( mEventHandler->mDisplay, mEventHandler->mEventQueue );
1283 tizen_policy_set_opaque_state( mEventHandler->mTizenPolicy, ecore_wl_window_surface_get( mEventHandler->mEcoreWindow ), ( opaque ? 1 : 0 ) );
1285 mOpaqueState = opaque;
1287 DALI_LOG_INFO( gWindowLogFilter, Debug::Verbose, "Window::SetOpaqueState: opaque = %d\n", opaque );
1290 bool Window::IsOpaqueState()
1292 return mOpaqueState;
1295 bool Window::SetScreenMode( Dali::DevelWindow::ScreenMode::Type screenMode )
1297 while( !mEventHandler->mTizenPolicy )
1299 wl_display_dispatch_queue( mEventHandler->mDisplay, mEventHandler->mEventQueue );
1302 mEventHandler->mScreenModeChangeDone = false;
1303 mEventHandler->mScreenModeChangeState = TIZEN_POLICY_ERROR_STATE_NONE;
1305 unsigned int mode = 0;
1307 switch( screenMode )
1309 case Dali::DevelWindow::ScreenMode::DEFAULT:
1314 case Dali::DevelWindow::ScreenMode::ALWAYS_ON:
1321 tizen_policy_set_window_screen_mode( mEventHandler->mTizenPolicy, ecore_wl_window_surface_get( mEventHandler->mEcoreWindow ), mode );
1325 while( !mEventHandler->mScreenModeChangeDone && count < 3 )
1328 wl_display_dispatch_queue( mEventHandler->mDisplay, mEventHandler->mEventQueue );
1332 if( !mEventHandler->mScreenModeChangeDone )
1334 DALI_LOG_INFO( gWindowLogFilter, Debug::Verbose, "Window::SetScreenMode: Screen mode change is failed [%d, %d]\n", screenMode, mEventHandler->mScreenModeChangeState );
1337 else if( mEventHandler->mScreenModeChangeState == TIZEN_POLICY_ERROR_STATE_PERMISSION_DENIED )
1339 DALI_LOG_INFO( gWindowLogFilter, Debug::Verbose, "Window::SetScreenMode: Permission denied! [%d]\n", screenMode );
1343 DALI_LOG_INFO( gWindowLogFilter, Debug::Verbose, "Window::SetScreenMode: Screen mode is changed [%d]\n", mEventHandler->mScreenMode );
1348 Dali::DevelWindow::ScreenMode::Type Window::GetScreenMode()
1350 while( !mEventHandler->mTizenPolicy )
1352 wl_display_dispatch_queue( mEventHandler->mDisplay, mEventHandler->mEventQueue );
1357 while( !mEventHandler->mScreenModeChangeDone && count < 3 )
1360 wl_display_dispatch_queue( mEventHandler->mDisplay, mEventHandler->mEventQueue );
1364 if( !mEventHandler->mScreenModeChangeDone )
1366 DALI_LOG_INFO( gWindowLogFilter, Debug::Verbose, "Window::GetScreenMode: Error! [%d]\n", mEventHandler->mScreenModeChangeState );
1367 return Dali::DevelWindow::ScreenMode::DEFAULT;
1370 Dali::DevelWindow::ScreenMode::Type screenMode = Dali::DevelWindow::ScreenMode::DEFAULT;
1372 switch( mEventHandler->mScreenMode )
1376 screenMode = Dali::DevelWindow::ScreenMode::DEFAULT;
1381 screenMode = Dali::DevelWindow::ScreenMode::ALWAYS_ON;
1386 DALI_LOG_INFO( gWindowLogFilter, Debug::Verbose, "Window::GetScreenMode: screen mode [%d]\n", mEventHandler->mScreenMode );
1391 bool Window::SetBrightness( int brightness )
1393 if( brightness < 0 || brightness > 100 )
1395 DALI_LOG_INFO( gWindowLogFilter, Debug::Verbose, "Window::SetBrightness: Invalid brightness value [%d]\n", brightness );
1399 while( !mEventHandler->mTizenDisplayPolicy )
1401 wl_display_dispatch_queue( mEventHandler->mDisplay, mEventHandler->mEventQueue );
1404 mEventHandler->mBrightnessChangeDone = false;
1405 mEventHandler->mBrightnessChangeState = TIZEN_POLICY_ERROR_STATE_NONE;
1407 tizen_display_policy_set_window_brightness( mEventHandler->mTizenDisplayPolicy, ecore_wl_window_surface_get( mEventHandler->mEcoreWindow ), brightness );
1411 while( !mEventHandler->mBrightnessChangeDone && count < 3 )
1414 wl_display_dispatch_queue( mEventHandler->mDisplay, mEventHandler->mEventQueue );
1418 if( !mEventHandler->mBrightnessChangeDone )
1420 DALI_LOG_INFO( gWindowLogFilter, Debug::Verbose, "Window::SetBrightness: Brightness change is failed [%d, %d]\n", brightness, mEventHandler->mBrightnessChangeState );
1423 else if( mEventHandler->mBrightnessChangeState == TIZEN_POLICY_ERROR_STATE_PERMISSION_DENIED )
1425 DALI_LOG_INFO( gWindowLogFilter, Debug::Verbose, "Window::SetBrightness: Permission denied! [%d]\n", brightness );
1429 DALI_LOG_INFO( gWindowLogFilter, Debug::Verbose, "Window::SetBrightness: Brightness is changed [%d]\n", mEventHandler->mBrightness );
1434 int Window::GetBrightness()
1436 while( !mEventHandler->mTizenDisplayPolicy )
1438 wl_display_dispatch_queue( mEventHandler->mDisplay, mEventHandler->mEventQueue );
1443 while( !mEventHandler->mBrightnessChangeDone && count < 3 )
1446 wl_display_dispatch_queue( mEventHandler->mDisplay, mEventHandler->mEventQueue );
1450 if( !mEventHandler->mBrightnessChangeDone )
1452 DALI_LOG_INFO( gWindowLogFilter, Debug::Verbose, "Window::GetBrightness: Error! [%d]\n", mEventHandler->mBrightnessChangeState );
1456 DALI_LOG_INFO( gWindowLogFilter, Debug::Verbose, "Window::GetBrightness: Brightness [%d]\n", mEventHandler->mBrightness );
1458 return mEventHandler->mBrightness;
1461 void Window::SetSize( Dali::DevelWindow::WindowSize size )
1463 if( !mResizeEnabled )
1465 AddAuxiliaryHint( "wm.policy.win.user.geometry", "1" );
1466 mResizeEnabled = true;
1469 PositionSize positionSize = mSurface->GetPositionSize();
1471 if( positionSize.width != size.GetWidth() || positionSize.height != size.GetHeight() )
1473 positionSize.width = size.GetWidth();
1474 positionSize.height = size.GetHeight();
1476 mSurface->MoveResize( positionSize );
1478 mAdaptor->SurfaceSizeChanged( Dali::Adaptor::SurfaceSize( positionSize.width, positionSize.height ) );
1481 mResizedSignal.Emit( Dali::DevelWindow::WindowSize( positionSize.width, positionSize.height ) );
1485 Dali::DevelWindow::WindowSize Window::GetSize()
1487 PositionSize positionSize = mSurface->GetPositionSize();
1489 return Dali::DevelWindow::WindowSize( positionSize.width, positionSize.height );
1492 void Window::SetPosition( Dali::DevelWindow::WindowPosition position )
1494 if( !mResizeEnabled )
1496 AddAuxiliaryHint( "wm.policy.win.user.geometry", "1" );
1497 mResizeEnabled = true;
1500 PositionSize positionSize = mSurface->GetPositionSize();
1502 if( positionSize.x != position.GetX() || positionSize.y != position.GetY() )
1504 positionSize.x = position.GetX();
1505 positionSize.y = position.GetY();
1507 mSurface->MoveResize( positionSize );
1511 Dali::DevelWindow::WindowPosition Window::GetPosition()
1513 PositionSize positionSize = mSurface->GetPositionSize();
1515 return Dali::DevelWindow::WindowPosition( positionSize.x, positionSize.y );
1524 #pragma GCC diagnostic pop