2 * Copyright (c) 2017 Samsung Electronics Co., Ltd.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
19 #include <window-impl.h>
22 // Ecore is littered with C style cast
23 #pragma GCC diagnostic push
24 #pragma GCC diagnostic ignored "-Wold-style-cast"
26 #include <Ecore_Wayland.h>
27 #include <tizen-extension-client-protocol.h>
29 #include <dali/integration-api/core.h>
30 #include <dali/integration-api/system-overlay.h>
31 #include <dali/public-api/render-tasks/render-task.h>
32 #include <dali/public-api/render-tasks/render-task-list.h>
33 #include <orientation.h>
36 #include <window-render-surface.h>
37 #include <drag-and-drop-detector-impl.h>
38 #include <ecore-indicator-impl.h>
39 #include <window-visibility-observer.h>
40 #include <orientation-impl.h>
44 const float INDICATOR_ANIMATION_DURATION( 0.18f ); // 180 milli seconds
45 const float INDICATOR_SHOW_Y_POSITION( 0.0f );
46 const float INDICATOR_HIDE_Y_POSITION( -52.0f );
56 #if defined(DEBUG_ENABLED)
57 Debug::Filter* gWindowLogFilter = Debug::Filter::New(Debug::NoLogging, false, "LOG_WINDOW");
61 * TODO: Abstract Window class out and move this into a window implementation for Ecore
63 struct Window::EventHandler
67 * @param[in] window A pointer to the window class.
69 EventHandler( Window* window )
76 mTizenDisplayPolicy( NULL ),
77 mNotificationLevel( -1 ),
78 mNotificationChangeState( 0 ),
79 mNotificationLevelChangeDone( true ),
81 mScreenOffModeChangeState( 0 ),
82 mScreenOffModeChangeDone( true ),
84 mBrightnessChangeState( 0 ),
85 mBrightnessChangeDone( true )
87 // store ecore window handle
88 ECore::WindowRenderSurface* wlWindow( dynamic_cast< ECore::WindowRenderSurface * >( mWindow->mSurface ) );
91 mEcoreWindow = wlWindow->GetWlWindow();
93 DALI_ASSERT_ALWAYS( mEcoreWindow != 0 && "There is no ecore Wl window");
95 if( mWindow->mEcoreEventHander )
97 mEcoreEventHandler.PushBack( ecore_event_handler_add( ECORE_WL_EVENT_WINDOW_ICONIFY_STATE_CHANGE, EcoreEventWindowIconifyStateChanged, this ) );
98 mEcoreEventHandler.PushBack( ecore_event_handler_add( ECORE_WL_EVENT_FOCUS_IN, EcoreEventWindowFocusIn, this ) );
99 mEcoreEventHandler.PushBack( ecore_event_handler_add( ECORE_WL_EVENT_FOCUS_OUT, EcoreEventWindowFocusOut, this ) );
100 mEcoreEventHandler.PushBack( ecore_event_handler_add( ECORE_WL_EVENT_OUTPUT_TRANSFORM, EcoreEventOutputTransform, this) );
101 mEcoreEventHandler.PushBack( ecore_event_handler_add( ECORE_WL_EVENT_IGNORE_OUTPUT_TRANSFORM, EcoreEventIgnoreOutputTransform, this) );
104 mDisplay = ecore_wl_display_get();
108 wl_display* displayWrapper = static_cast< wl_display* >( wl_proxy_create_wrapper( mDisplay ) );
111 mEventQueue = wl_display_create_queue( mDisplay );
114 wl_proxy_set_queue( reinterpret_cast< wl_proxy* >( displayWrapper ), mEventQueue );
116 wl_registry* registry = wl_display_get_registry( displayWrapper );
117 wl_registry_add_listener( registry, &mRegistryListener, this );
120 wl_proxy_wrapper_destroy( displayWrapper );
130 for( Dali::Vector< Ecore_Event_Handler* >::Iterator iter = mEcoreEventHandler.Begin(), endIter = mEcoreEventHandler.End(); iter != endIter; ++iter )
132 ecore_event_handler_del( *iter );
134 mEcoreEventHandler.Clear();
138 wl_event_queue_destroy( mEventQueue );
144 /// Called when the window iconify state is changed.
145 static Eina_Bool EcoreEventWindowIconifyStateChanged( void* data, int type, void* event )
147 Ecore_Wl_Event_Window_Iconify_State_Change* iconifyChangedEvent( static_cast< Ecore_Wl_Event_Window_Iconify_State_Change* >( event ) );
148 EventHandler* handler( static_cast< EventHandler* >( data ) );
149 Eina_Bool handled( ECORE_CALLBACK_PASS_ON );
151 if ( handler && handler->mWindow )
153 WindowVisibilityObserver* observer( handler->mWindow->mAdaptor );
154 if ( observer && ( iconifyChangedEvent->win == static_cast< unsigned int> ( ecore_wl_window_id_get( handler->mEcoreWindow ) ) ) )
156 if( iconifyChangedEvent->iconified == EINA_TRUE )
158 handler->mWindow->mIconified = true;
159 if( handler->mWindow->mVisible )
161 observer->OnWindowHidden();
163 DALI_LOG_INFO( gWindowLogFilter, Debug::General, "Window (%d) Iconfied\n", handler->mEcoreWindow );
167 handler->mWindow->mIconified = false;
168 if( handler->mWindow->mVisible )
170 observer->OnWindowShown();
172 DALI_LOG_INFO( gWindowLogFilter, Debug::General, "Window (%d) Shown\n", handler->mEcoreWindow );
174 handled = ECORE_CALLBACK_DONE;
181 /// Called when the window gains focus
182 static Eina_Bool EcoreEventWindowFocusIn( void* data, int type, void* event )
184 Ecore_Wl_Event_Focus_In* focusInEvent( static_cast< Ecore_Wl_Event_Focus_In* >( event ) );
185 EventHandler* handler( static_cast< EventHandler* >( data ) );
187 if ( handler && handler->mWindow && focusInEvent->win == static_cast< unsigned int >( ecore_wl_window_id_get( handler->mEcoreWindow ) ) )
189 DALI_LOG_INFO( gWindowLogFilter, Debug::General, "Window EcoreEventWindowFocusIn\n" );
191 handler->mWindow->mFocusChangedSignal.Emit( true );
194 return ECORE_CALLBACK_PASS_ON;
197 /// Called when the window loses focus
198 static Eina_Bool EcoreEventWindowFocusOut( void* data, int type, void* event )
200 Ecore_Wl_Event_Focus_Out* focusOutEvent( static_cast< Ecore_Wl_Event_Focus_Out* >( event ) );
201 EventHandler* handler( static_cast< EventHandler* >( data ) );
203 if ( handler && handler->mWindow && focusOutEvent->win == static_cast< unsigned int >(ecore_wl_window_id_get( handler->mEcoreWindow ) ) )
205 DALI_LOG_INFO( gWindowLogFilter, Debug::General, "Window EcoreEventWindowFocusOut\n" );
207 handler->mWindow->mFocusChangedSignal.Emit( false );
210 return ECORE_CALLBACK_PASS_ON;
213 /// Called when the output is transformed
214 static Eina_Bool EcoreEventOutputTransform( void* data, int type, void* event )
216 Ecore_Wl_Event_Output_Transform* transformEvent( static_cast< Ecore_Wl_Event_Output_Transform* >( event ) );
217 EventHandler* handler( static_cast< EventHandler* >( data ) );
219 if ( handler && handler->mWindow && transformEvent->output == ecore_wl_window_output_find( handler->mEcoreWindow ) )
221 DALI_LOG_INFO( gWindowLogFilter, Debug::General, "Window (%d) EcoreEventOutputTransform\n", handler->mEcoreWindow );
223 ECore::WindowRenderSurface* wlSurface( dynamic_cast< ECore::WindowRenderSurface * >( handler->mWindow->mSurface ) );
226 wlSurface->OutputTransformed();
228 PositionSize positionSize = wlSurface->GetPositionSize();
229 handler->mWindow->mAdaptor->SurfaceResizePrepare( Adaptor::SurfaceSize( positionSize.width, positionSize.height ) );
230 handler->mWindow->mAdaptor->SurfaceResizeComplete( Adaptor::SurfaceSize( positionSize.width, positionSize.height ) );
234 return ECORE_CALLBACK_PASS_ON;
237 /// Called when the output transform should be ignored
238 static Eina_Bool EcoreEventIgnoreOutputTransform( void* data, int type, void* event )
240 Ecore_Wl_Event_Ignore_Output_Transform* ignoreTransformEvent( static_cast< Ecore_Wl_Event_Ignore_Output_Transform* >( event ) );
241 EventHandler* handler( static_cast< EventHandler* >( data ) );
243 if ( handler && handler->mWindow && ignoreTransformEvent->win == handler->mEcoreWindow )
245 DALI_LOG_INFO( gWindowLogFilter, Debug::General, "Window (%d) EcoreEventIgnoreOutputTransform\n", handler->mEcoreWindow );
247 ECore::WindowRenderSurface* wlSurface( dynamic_cast< ECore::WindowRenderSurface * >( handler->mWindow->mSurface ) );
250 wlSurface->OutputTransformed();
252 PositionSize positionSize = wlSurface->GetPositionSize();
253 handler->mWindow->mAdaptor->SurfaceResizePrepare( Adaptor::SurfaceSize( positionSize.width, positionSize.height ) );
254 handler->mWindow->mAdaptor->SurfaceResizeComplete( Adaptor::SurfaceSize( positionSize.width, positionSize.height ) );
258 return ECORE_CALLBACK_PASS_ON;
261 static void RegistryGlobalCallback( void* data, struct wl_registry *registry, uint32_t name, const char* interface, uint32_t version )
263 Window::EventHandler* eventHandler = static_cast< Window::EventHandler* >( data );
265 if( strcmp( interface, tizen_policy_interface.name ) == 0 )
267 uint32_t client_version = 0;
271 client_version = version;
273 eventHandler->mTizenPolicy = static_cast< tizen_policy* >( wl_registry_bind( registry, name, &tizen_policy_interface, client_version ) );
274 if( !eventHandler->mTizenPolicy )
276 DALI_LOG_INFO( gWindowLogFilter, Debug::General, "Window::EventHandler::RegistryGlobalCallback: wl_registry_bind(tizen_policy_interface) is failed.\n" );
280 tizen_policy_add_listener( eventHandler->mTizenPolicy, &eventHandler->mTizenPolicyListener, data );
282 DALI_LOG_INFO( gWindowLogFilter, Debug::General, "Window::EventHandler::RegistryGlobalCallback: tizen_policy_add_listener is called.\n" );
284 else if( strcmp( interface, tizen_display_policy_interface.name ) == 0 )
286 eventHandler->mTizenDisplayPolicy = static_cast< tizen_display_policy* >( wl_registry_bind( registry, name, &tizen_display_policy_interface, version ) );
287 if( !eventHandler->mTizenDisplayPolicy )
289 DALI_LOG_INFO( gWindowLogFilter, Debug::General, "Window::EventHandler::RegistryGlobalCallback: wl_registry_bind(tizen_display_policy_interface) is failed.\n" );
293 tizen_display_policy_add_listener( eventHandler->mTizenDisplayPolicy, &eventHandler->mTizenDisplayPolicyListener, data );
295 DALI_LOG_INFO( gWindowLogFilter, Debug::General, "Window::EventHandler::RegistryGlobalCallback: tizen_display_policy_add_listener is called.\n" );
299 static void RegistryGlobalCallbackRemove( void* data, struct wl_registry* registry, uint32_t id )
301 Window::EventHandler* eventHandler = static_cast< Window::EventHandler* >( data );
302 eventHandler->mTizenPolicy = NULL;
303 eventHandler->mTizenDisplayPolicy = NULL;
306 static void TizenPolicyConformant( void *data, struct tizen_policy *tizen_policy,struct wl_surface *surface, uint32_t is_conformant )
310 static void TizenPolicyConformantArea( void *data, struct tizen_policy *tizen_policy, struct wl_surface *surface, uint32_t conformant_part, uint32_t state, int32_t x, int32_t y, int32_t w, int32_t h )
314 static void TizenPolicyNotificationChangeDone(void* data, struct tizen_policy* tizenPolicy, struct wl_surface* surface, int32_t level, uint32_t state )
316 Window::EventHandler* eventHandler = static_cast< Window::EventHandler* >( data );
318 eventHandler->mNotificationLevel = level;
319 eventHandler->mNotificationChangeState = state;
320 eventHandler->mNotificationLevelChangeDone = true;
322 DALI_LOG_INFO( gWindowLogFilter, Debug::General, "Window::EventHandler::TizenPolicyNotificationChangeDone: level = %d, state = %d\n", level, state );
325 static void TizenPolicyTransientForDone( void *data, struct tizen_policy *tizen_policy, uint32_t child_id )
329 static void TizenPolicyScreenModeChangeDone(void* data, struct tizen_policy* tizenPolicy, struct wl_surface* surface, uint32_t mode, uint32_t state )
331 Window::EventHandler* eventHandler = static_cast< Window::EventHandler* >( data );
333 eventHandler->mScreenOffMode = mode;
334 eventHandler->mScreenOffModeChangeState = state;
335 eventHandler->mScreenOffModeChangeDone = true;
337 DALI_LOG_INFO( gWindowLogFilter, Debug::General, "Window::EventHandler::TizenPolicyScreenModeChangeDone: mode = %d, state = %d\n", mode, state );
340 static void TizenPolicyIconifyStateChanged( void *data, struct tizen_policy *tizen_policy, struct wl_surface *surface_resource, uint32_t iconified, uint32_t force )
344 static void TizenPolicySupportedAuxHints( void *data, struct tizen_policy *tizen_policy, struct wl_surface *surface_resource, struct wl_array *hints, uint32_t num_hints )
348 static void TizenPolicyAllowedAuxHint( void *data, struct tizen_policy *tizen_policy, struct wl_surface *surface_resource, int id )
352 static void TizenPolicyAuxMessage( void *data, struct tizen_policy *tizen_policy, struct wl_surface *surface_resource, const char *key, const char *val, struct wl_array *options )
356 static void TizenPolicyConformantRegion( void *data, struct tizen_policy *tizen_policy, struct wl_surface *surface, uint32_t conformant_part, uint32_t state, int32_t x, int32_t y, int32_t w, int32_t h, uint32_t serial )
360 static void DisplayPolicyBrightnessChangeDone(void* data, struct tizen_display_policy *displayPolicy, struct wl_surface* surface, int32_t brightness, uint32_t state )
362 Window::EventHandler* eventHandler = static_cast< Window::EventHandler* >( data );
364 eventHandler->mBrightness = brightness;
365 eventHandler->mBrightnessChangeState = state;
366 eventHandler->mBrightnessChangeDone = true;
368 DALI_LOG_INFO( gWindowLogFilter, Debug::General, "Window::EventHandler::DisplayPolicyBrightnessChangeDone: brightness = %d, state = %d\n", brightness, state );
371 const struct wl_registry_listener mRegistryListener =
373 RegistryGlobalCallback,
374 RegistryGlobalCallbackRemove
377 const struct tizen_policy_listener mTizenPolicyListener =
379 TizenPolicyConformant,
380 TizenPolicyConformantArea,
381 TizenPolicyNotificationChangeDone,
382 TizenPolicyTransientForDone,
383 TizenPolicyScreenModeChangeDone,
384 TizenPolicyIconifyStateChanged,
385 TizenPolicySupportedAuxHints,
386 TizenPolicyAllowedAuxHint,
387 TizenPolicyAuxMessage,
388 TizenPolicyConformantRegion
391 const struct tizen_display_policy_listener mTizenDisplayPolicyListener =
393 DisplayPolicyBrightnessChangeDone
398 Dali::Vector< Ecore_Event_Handler* > mEcoreEventHandler;
399 Ecore_Wl_Window* mEcoreWindow;
401 wl_display* mDisplay;
402 wl_event_queue* mEventQueue;
403 tizen_policy* mTizenPolicy;
404 tizen_display_policy* mTizenDisplayPolicy;
406 int mNotificationLevel;
407 uint32_t mNotificationChangeState;
408 bool mNotificationLevelChangeDone;
411 uint32_t mScreenOffModeChangeState;
412 bool mScreenOffModeChangeDone;
415 uint32_t mBrightnessChangeState;
416 bool mBrightnessChangeDone;
419 Window* Window::New( const PositionSize& positionSize, const std::string& name, const std::string& className, bool isTransparent )
421 Window* window = new Window();
422 window->mIsTransparent = isTransparent;
423 window->Initialize( positionSize, name, className );
427 void Window::SetAdaptor(Dali::Adaptor& adaptor)
429 DALI_ASSERT_ALWAYS( !mStarted && "Adaptor already started" );
432 // Only create one overlay per window
433 Internal::Adaptor::Adaptor& adaptorImpl = Internal::Adaptor::Adaptor::GetImplementation(adaptor);
434 Integration::Core& core = adaptorImpl.GetCore();
435 mOverlay = &core.GetSystemOverlay();
437 Dali::RenderTaskList taskList = mOverlay->GetOverlayRenderTasks();
438 taskList.CreateTask();
440 mAdaptor = &adaptorImpl;
441 mAdaptor->AddObserver( *this );
443 // Can only create the detector when we know the Core has been instantiated.
444 mDragAndDropDetector = DragAndDropDetector::New();
445 mAdaptor->SetDragAndDropDetector( &GetImplementation( mDragAndDropDetector ) );
449 mOrientation->SetAdaptor(adaptor);
452 if( mIndicator != NULL )
454 mIndicator->SetAdaptor(mAdaptor);
458 RenderSurface* Window::GetSurface()
463 void Window::ShowIndicator( Dali::Window::IndicatorVisibleMode visibleMode )
465 DALI_LOG_TRACE_METHOD_FMT( gWindowLogFilter, "visible : %d\n", visibleMode );
466 DALI_ASSERT_DEBUG(mOverlay);
468 ECore::WindowRenderSurface* wlSurface( dynamic_cast< ECore::WindowRenderSurface * >( mSurface ) );
469 DALI_ASSERT_DEBUG(wlSurface);
473 Ecore_Wl_Window* wlWindow = wlSurface->GetWlWindow();
475 mIndicatorVisible = visibleMode;
477 if ( mIndicatorVisible == Dali::Window::VISIBLE )
479 // when the indicator is visible, set proper mode for indicator server according to bg mode
480 if ( mIndicatorOpacityMode == Dali::Window::OPAQUE )
482 ecore_wl_window_indicator_opacity_set(wlWindow, ECORE_WL_INDICATOR_OPAQUE);
484 else if ( mIndicatorOpacityMode == Dali::Window::TRANSLUCENT )
486 ecore_wl_window_indicator_opacity_set(wlWindow, ECORE_WL_INDICATOR_TRANSLUCENT);
488 else if ( mIndicatorOpacityMode == Dali::Window::TRANSPARENT )
490 ecore_wl_window_indicator_opacity_set(wlWindow, ECORE_WL_INDICATOR_OPAQUE);
495 // when the indicator is not visible, set TRANSPARENT mode for indicator server
496 ecore_wl_window_indicator_opacity_set(wlWindow, ECORE_WL_INDICATOR_TRANSPARENT); // it means hidden indicator
500 DoShowIndicator( mIndicatorOrientation );
503 void Window::RotateIndicator( Dali::Window::WindowOrientation orientation )
505 DALI_LOG_TRACE_METHOD_FMT( gWindowLogFilter, "Orientation: %d\n", orientation );
507 DoRotateIndicator( orientation );
510 void Window::SetIndicatorBgOpacity( Dali::Window::IndicatorBgOpacity opacityMode )
512 mIndicatorOpacityMode = opacityMode;
514 if( mIndicator != NULL )
516 mIndicator->SetOpacityMode( opacityMode );
520 void Window::SetClass(std::string name, std::string klass)
522 ECore::WindowRenderSurface* wlSurface( dynamic_cast< ECore::WindowRenderSurface * >( mSurface ) );
526 Ecore_Wl_Window* wlWindow = wlSurface->GetWlWindow();
527 ecore_wl_window_title_set( wlWindow, name.c_str() );
528 ecore_wl_window_class_name_set( wlWindow, klass.c_str() );
532 DALI_LOG_INFO( gWindowLogFilter, Debug::General, "Window has no surface\n" );
538 mIndicatorVisible( Dali::Window::VISIBLE ),
539 mIndicatorIsShown( false ),
540 mShowRotatedIndicatorOnClose( false ),
542 mIsTransparent( false ),
543 mWMRotationAppSet( false ),
544 mEcoreEventHander( true ),
545 mIsFocusAcceptable( true ),
548 mOpaqueState( false ),
549 mResizeEnabled( false ),
551 mIndicatorOrientation( Dali::Window::PORTRAIT ),
552 mNextIndicatorOrientation( Dali::Window::PORTRAIT ),
553 mIndicatorOpacityMode( Dali::Window::OPAQUE ),
556 mType( Dali::Window::NORMAL ),
557 mEventHandler( NULL ),
558 mPreferredOrientation( Dali::Window::PORTRAIT ),
559 mSupportedAuxiliaryHints(),
561 mIndicatorVisibilityChangedSignal(),
562 mFocusChangedSignal(),
564 mDeleteRequestSignal()
570 delete mEventHandler;
580 mAdaptor->RemoveObserver( *this );
581 mAdaptor->SetDragAndDropDetector( NULL );
587 mSupportedAuxiliaryHints.clear();
588 mAuxiliaryHints.clear();
591 void Window::Initialize(const PositionSize& positionSize, const std::string& name, const std::string& className)
593 // create an Wayland window by default
595 ECore::WindowRenderSurface* windowSurface = new ECore::WindowRenderSurface( positionSize, surface, name, mIsTransparent );
597 mSurface = windowSurface;
599 // create event handler for Wayland window
600 mEventHandler = new EventHandler( this );
602 // get auxiliary hint
603 Eina_List* hints = ecore_wl_window_aux_hints_supported_get( mEventHandler->mEcoreWindow );
609 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) ) ) )
611 mSupportedAuxiliaryHints.push_back( hint );
613 DALI_LOG_INFO( gWindowLogFilter, Debug::Verbose, "Window::Initialize: %s\n", hint );
617 if( !positionSize.IsEmpty() )
619 AddAuxiliaryHint( "wm.policy.win.user.geometry", "1" );
620 mResizeEnabled = true;
623 SetClass( name, className );
624 windowSurface->Map();
626 mOrientation = Orientation::New(this);
629 void Window::DoShowIndicator( Dali::Window::WindowOrientation lastOrientation )
631 if( mIndicator == NULL )
633 if( mIndicatorVisible != Dali::Window::INVISIBLE )
635 mIndicator = new Indicator( mAdaptor, mIndicatorOrientation, this );
636 mIndicator->SetOpacityMode( mIndicatorOpacityMode );
637 Dali::Actor actor = mIndicator->GetActor();
638 SetIndicatorActorRotation();
639 mOverlay->Add(actor);
641 // else don't create a hidden indicator
643 else // Already have indicator
645 if( mIndicatorVisible == Dali::Window::VISIBLE )
647 // If we are resuming, and rotation has changed,
648 if( mIndicatorIsShown == false && mIndicatorOrientation != mNextIndicatorOrientation )
650 // then close current indicator and open new one
651 mShowRotatedIndicatorOnClose = true;
652 mIndicator->Close(); // May synchronously call IndicatorClosed() callback & 1 level of recursion
653 // Don't show actor - will contain indicator for old orientation.
658 // set indicator visible mode
659 if( mIndicator != NULL )
661 mIndicator->SetVisible( mIndicatorVisible );
664 bool show = (mIndicatorVisible != Dali::Window::INVISIBLE );
665 SetIndicatorProperties( show, lastOrientation );
666 mIndicatorIsShown = show;
669 void Window::DoRotateIndicator( Dali::Window::WindowOrientation orientation )
671 if( mIndicatorIsShown )
673 mShowRotatedIndicatorOnClose = true;
674 mNextIndicatorOrientation = orientation;
675 mIndicator->Close(); // May synchronously call IndicatorClosed() callback
679 // Save orientation for when the indicator is next shown
680 mShowRotatedIndicatorOnClose = false;
681 mNextIndicatorOrientation = orientation;
685 void Window::SetIndicatorProperties( bool isShow, Dali::Window::WindowOrientation lastOrientation )
687 ECore::WindowRenderSurface* wlSurface( dynamic_cast< ECore::WindowRenderSurface * >( mSurface ) );
691 Ecore_Wl_Window* wlWindow = wlSurface->GetWlWindow();
694 ecore_wl_window_indicator_state_set(wlWindow, ECORE_WL_INDICATOR_STATE_ON);
698 ecore_wl_window_indicator_state_set(wlWindow, ECORE_WL_INDICATOR_STATE_OFF);
703 void Window::IndicatorTypeChanged(Indicator::Type type)
705 #if defined(DALI_PROFILE_MOBILE)
706 ECore::WindowRenderSurface* wlSurface( dynamic_cast< ECore::WindowRenderSurface * >( mSurface ) );
710 Ecore_Wl_Window* wlWindow = wlSurface->GetWlWindow();
713 case Indicator::INDICATOR_TYPE_1:
714 ecore_wl_indicator_visible_type_set(wlWindow, ECORE_WL_INDICATOR_VISIBLE_TYPE_SHOWN);
717 case Indicator::INDICATOR_TYPE_2:
718 ecore_wl_indicator_visible_type_set(wlWindow, ECORE_WL_INDICATOR_VISIBLE_TYPE_HIDDEN);
721 case Indicator::INDICATOR_TYPE_UNKNOWN:
729 void Window::IndicatorClosed( IndicatorInterface* indicator )
731 DALI_LOG_TRACE_METHOD( gWindowLogFilter );
733 if( mShowRotatedIndicatorOnClose )
735 Dali::Window::WindowOrientation currentOrientation = mIndicatorOrientation;
736 mIndicator->Open(mNextIndicatorOrientation);
737 mIndicatorOrientation = mNextIndicatorOrientation;
738 SetIndicatorActorRotation();
739 DoShowIndicator(currentOrientation);
743 void Window::IndicatorVisibilityChanged(bool isVisible)
745 mIndicatorVisibilityChangedSignal.Emit(isVisible);
748 void Window::SetIndicatorActorRotation()
750 DALI_LOG_TRACE_METHOD( gWindowLogFilter );
751 DALI_ASSERT_DEBUG( mIndicator != NULL );
753 Dali::Actor actor = mIndicator->GetActor();
754 switch( mIndicatorOrientation )
756 case Dali::Window::PORTRAIT:
757 actor.SetParentOrigin( ParentOrigin::TOP_CENTER );
758 actor.SetAnchorPoint( AnchorPoint::TOP_CENTER );
759 actor.SetOrientation( Degree(0), Vector3::ZAXIS );
761 case Dali::Window::PORTRAIT_INVERSE:
762 actor.SetParentOrigin( ParentOrigin::BOTTOM_CENTER );
763 actor.SetAnchorPoint( AnchorPoint::TOP_CENTER );
764 actor.SetOrientation( Degree(180), Vector3::ZAXIS );
766 case Dali::Window::LANDSCAPE:
767 actor.SetParentOrigin( ParentOrigin::CENTER_LEFT );
768 actor.SetAnchorPoint( AnchorPoint::TOP_CENTER );
769 actor.SetOrientation( Degree(270), Vector3::ZAXIS );
771 case Dali::Window::LANDSCAPE_INVERSE:
772 actor.SetParentOrigin( ParentOrigin::CENTER_RIGHT );
773 actor.SetAnchorPoint( AnchorPoint::TOP_CENTER );
774 actor.SetOrientation( Degree(90), Vector3::ZAXIS );
781 // Use ecore_wl_window_activate to prevent the window shown without rendering
782 ecore_wl_window_activate( mEventHandler->mEcoreWindow );
787 ecore_wl_window_lower( mEventHandler->mEcoreWindow );
790 void Window::Activate()
792 ecore_wl_window_activate( mEventHandler->mEcoreWindow );
795 Dali::DragAndDropDetector Window::GetDragAndDropDetector() const
797 return mDragAndDropDetector;
800 Dali::Any Window::GetNativeHandle() const
804 return mEventHandler->mEcoreWindow;
812 void Window::OnStart()
814 DoShowIndicator( mIndicatorOrientation );
817 void Window::OnPause()
821 void Window::OnResume()
823 // resume indicator status
824 if( mIndicator != NULL )
826 // Restore own indicator opacity
827 // Send opacity mode to indicator service when app resumed
828 mIndicator->SetOpacityMode( mIndicatorOpacityMode );
832 void Window::OnStop()
843 void Window::OnDestroy()
848 void Window::AddAvailableOrientation(Dali::Window::WindowOrientation orientation)
852 for( std::size_t i=0; i<mAvailableOrientations.size(); i++ )
854 if(mAvailableOrientations[i] == orientation)
863 mAvailableOrientations.push_back(orientation);
864 SetAvailableOrientations( mAvailableOrientations );
868 void Window::RemoveAvailableOrientation(Dali::Window::WindowOrientation orientation)
870 for( std::vector<Dali::Window::WindowOrientation>::iterator iter = mAvailableOrientations.begin();
871 iter != mAvailableOrientations.end(); ++iter )
873 if( *iter == orientation )
875 mAvailableOrientations.erase( iter );
879 SetAvailableOrientations( mAvailableOrientations );
882 void Window::SetAvailableOrientations(const std::vector<Dali::Window::WindowOrientation>& orientations)
885 for( std::size_t i = 0; i < mAvailableOrientations.size(); ++i )
887 rotations[i] = static_cast< int >( mAvailableOrientations[i] );
889 ecore_wl_window_rotation_available_rotations_set( mEventHandler->mEcoreWindow, rotations, mAvailableOrientations.size() );
892 const std::vector<Dali::Window::WindowOrientation>& Window::GetAvailableOrientations()
894 return mAvailableOrientations;
897 void Window::SetPreferredOrientation(Dali::Window::WindowOrientation orientation)
899 mPreferredOrientation = orientation;
901 ecore_wl_window_rotation_preferred_rotation_set( mEventHandler->mEcoreWindow, orientation );
904 Dali::Window::WindowOrientation Window::GetPreferredOrientation()
906 return mPreferredOrientation;
909 void Window::SetAcceptFocus( bool accept )
911 mIsFocusAcceptable = accept;
913 ecore_wl_window_focus_skip_set( mEventHandler->mEcoreWindow, !accept );
916 bool Window::IsFocusAcceptable() const
918 return mIsFocusAcceptable;
924 ecore_wl_window_show( mEventHandler->mEcoreWindow );
930 WindowVisibilityObserver* observer( mAdaptor );
931 observer->OnWindowShown();
939 ecore_wl_window_hide( mEventHandler->mEcoreWindow );
945 WindowVisibilityObserver* observer( mAdaptor );
946 observer->OnWindowHidden();
951 bool Window::IsVisible() const
956 void Window::RotationDone( int orientation, int width, int height )
958 ECore::WindowRenderSurface* wlSurface( dynamic_cast< ECore::WindowRenderSurface * >( mSurface ) );
961 wlSurface->RequestRotation( orientation, width, height );
964 mAdaptor->SurfaceResizePrepare( Adaptor::SurfaceSize( width, height ) );
967 mResizedSignal.Emit( Dali::Window::WindowSize( width, height ) );
969 mAdaptor->SurfaceResizeComplete( Adaptor::SurfaceSize( width, height ) );
972 void Window::SetIndicatorVisibleMode( Dali::Window::IndicatorVisibleMode mode )
974 mIndicatorVisible = mode;
977 unsigned int Window::GetSupportedAuxiliaryHintCount() const
979 return mSupportedAuxiliaryHints.size();
982 std::string Window::GetSupportedAuxiliaryHint( unsigned int index ) const
984 if( index >= GetSupportedAuxiliaryHintCount() )
986 DALI_LOG_INFO( gWindowLogFilter, Debug::Verbose, "Window::GetSupportedAuxiliaryHint: Invalid index! [%d]\n", index );
989 return mSupportedAuxiliaryHints[index];
992 unsigned int Window::AddAuxiliaryHint( const std::string& hint, const std::string& value )
994 bool supported = false;
996 // Check if the hint is suppported
997 for( std::vector< std::string >::iterator iter = mSupportedAuxiliaryHints.begin(); iter != mSupportedAuxiliaryHints.end(); ++iter )
1008 DALI_LOG_INFO( gWindowLogFilter, Debug::Concise, "Window::AddAuxiliaryHint: Not supported auxiliary hint [%s]\n", hint.c_str() );
1012 // Check if the hint is already added
1013 for( unsigned int i = 0; i < mAuxiliaryHints.size(); i++ )
1015 if( mAuxiliaryHints[i].first == hint )
1017 // Just change the value
1018 mAuxiliaryHints[i].second = value;
1020 DALI_LOG_INFO( gWindowLogFilter, Debug::Verbose, "Window::AddAuxiliaryHint: Change! hint = %s, value = %s, id = %d\n", hint.c_str(), value.c_str(), i + 1 );
1022 return i + 1; // id is index + 1
1027 mAuxiliaryHints.push_back( std::pair< std::string, std::string >( hint, value ) );
1029 unsigned int id = mAuxiliaryHints.size();
1031 ecore_wl_window_aux_hint_add( mEventHandler->mEcoreWindow, static_cast< int >( id ), hint.c_str(), value.c_str() );
1033 DALI_LOG_INFO( gWindowLogFilter, Debug::Verbose, "Window::AddAuxiliaryHint: hint = %s, value = %s, id = %d\n", hint.c_str(), value.c_str(), id );
1038 bool Window::RemoveAuxiliaryHint( unsigned int id )
1040 if( id == 0 || id > mAuxiliaryHints.size() )
1042 DALI_LOG_INFO( gWindowLogFilter, Debug::Concise, "Window::RemoveAuxiliaryHint: Invalid id [%d]\n", id );
1046 mAuxiliaryHints[id - 1].second = std::string();
1048 ecore_wl_window_aux_hint_del( mEventHandler->mEcoreWindow, static_cast< int >( id ) );
1050 DALI_LOG_INFO( gWindowLogFilter, Debug::Verbose, "Window::RemoveAuxiliaryHint: id = %d, hint = %s\n", id, mAuxiliaryHints[id - 1].first.c_str() );
1055 bool Window::SetAuxiliaryHintValue( unsigned int id, const std::string& value )
1057 if( id == 0 || id > mAuxiliaryHints.size() )
1059 DALI_LOG_INFO( gWindowLogFilter, Debug::Concise, "Window::SetAuxiliaryHintValue: Invalid id [%d]\n", id );
1063 mAuxiliaryHints[id - 1].second = value;
1065 ecore_wl_window_aux_hint_change( mEventHandler->mEcoreWindow, static_cast< int >( id ), value.c_str() );
1067 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() );
1072 std::string Window::GetAuxiliaryHintValue( unsigned int id ) const
1074 if( id == 0 || id > mAuxiliaryHints.size() )
1076 DALI_LOG_INFO( gWindowLogFilter, Debug::Concise, "Window::GetAuxiliaryHintValue: Invalid id [%d]\n", id );
1077 return std::string();
1080 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() );
1082 return mAuxiliaryHints[id - 1].second;
1085 unsigned int Window::GetAuxiliaryHintId( const std::string& hint ) const
1087 for( unsigned int i = 0; i < mAuxiliaryHints.size(); i++ )
1089 if( mAuxiliaryHints[i].first == hint )
1091 DALI_LOG_INFO( gWindowLogFilter, Debug::Verbose, "Window::GetAuxiliaryHintId: hint = %s, id = %d\n", hint.c_str(), i + 1 );
1096 DALI_LOG_INFO( gWindowLogFilter, Debug::Verbose, "Window::GetAuxiliaryHintId: Invalid hint! [%s]\n", hint.c_str() );
1101 void Window::SetInputRegion( const Rect< int >& inputRegion )
1103 ecore_wl_window_input_region_set( mEventHandler->mEcoreWindow, inputRegion.x, inputRegion.y, inputRegion.width, inputRegion.height );
1105 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 );
1108 void Window::SetType( Dali::Window::Type type )
1110 Ecore_Wl_Window_Type windowType;
1116 case Dali::Window::NORMAL:
1118 windowType = ECORE_WL_WINDOW_TYPE_TOPLEVEL;
1121 case Dali::Window::NOTIFICATION:
1123 windowType = ECORE_WL_WINDOW_TYPE_NOTIFICATION;
1126 case Dali::Window::UTILITY:
1128 windowType = ECORE_WL_WINDOW_TYPE_UTILITY;
1131 case Dali::Window::DIALOG:
1133 windowType = ECORE_WL_WINDOW_TYPE_DIALOG;
1138 windowType = ECORE_WL_WINDOW_TYPE_TOPLEVEL;
1143 ecore_wl_window_type_set( mEventHandler->mEcoreWindow, windowType );
1149 Dali::Window::Type Window::GetType() const
1154 bool Window::SetNotificationLevel( Dali::Window::NotificationLevel::Type level )
1156 if( mType != Dali::Window::NOTIFICATION )
1158 DALI_LOG_INFO( gWindowLogFilter, Debug::Verbose, "Window::SetNotificationLevel: Not supported window type [%d]\n", mType );
1162 while( !mEventHandler->mTizenPolicy )
1164 wl_display_dispatch_queue( mEventHandler->mDisplay, mEventHandler->mEventQueue );
1167 int notificationLevel;
1171 case Dali::Window::NotificationLevel::NONE:
1173 notificationLevel = TIZEN_POLICY_LEVEL_NONE;
1176 case Dali::Window::NotificationLevel::BASE:
1178 notificationLevel = TIZEN_POLICY_LEVEL_DEFAULT;
1181 case Dali::Window::NotificationLevel::MEDIUM:
1183 notificationLevel = TIZEN_POLICY_LEVEL_MEDIUM;
1186 case Dali::Window::NotificationLevel::HIGH:
1188 notificationLevel = TIZEN_POLICY_LEVEL_HIGH;
1191 case Dali::Window::NotificationLevel::TOP:
1193 notificationLevel = TIZEN_POLICY_LEVEL_TOP;
1198 DALI_LOG_INFO( gWindowLogFilter, Debug::Verbose, "Window::SetNotificationLevel: invalid level [%d]\n", level );
1199 notificationLevel = TIZEN_POLICY_LEVEL_DEFAULT;
1204 mEventHandler->mNotificationLevelChangeDone = false;
1205 mEventHandler->mNotificationChangeState = TIZEN_POLICY_ERROR_STATE_NONE;
1207 tizen_policy_set_notification_level( mEventHandler->mTizenPolicy, ecore_wl_window_surface_get( mEventHandler->mEcoreWindow ), notificationLevel );
1211 while( !mEventHandler->mNotificationLevelChangeDone && count < 3 )
1214 wl_display_dispatch_queue( mEventHandler->mDisplay, mEventHandler->mEventQueue );
1218 if( !mEventHandler->mNotificationLevelChangeDone )
1220 DALI_LOG_INFO( gWindowLogFilter, Debug::Verbose, "Window::SetNotificationLevel: Level change is failed [%d, %d]\n", level, mEventHandler->mNotificationChangeState );
1223 else if( mEventHandler->mNotificationChangeState == TIZEN_POLICY_ERROR_STATE_PERMISSION_DENIED )
1225 DALI_LOG_INFO( gWindowLogFilter, Debug::Verbose, "Window::SetNotificationLevel: Permission denied! [%d]\n", level );
1229 DALI_LOG_INFO( gWindowLogFilter, Debug::Verbose, "Window::SetNotificationLevel: Level is changed [%d]\n", mEventHandler->mNotificationLevel );
1234 Dali::Window::NotificationLevel::Type Window::GetNotificationLevel() const
1236 if( mType != Dali::Window::NOTIFICATION )
1238 DALI_LOG_INFO( gWindowLogFilter, Debug::Verbose, "Window::GetNotificationLevel: Not supported window type [%d]\n", mType );
1239 return Dali::Window::NotificationLevel::NONE;
1242 while( !mEventHandler->mTizenPolicy )
1244 wl_display_dispatch_queue( mEventHandler->mDisplay, mEventHandler->mEventQueue );
1249 while( !mEventHandler->mNotificationLevelChangeDone && count < 3 )
1252 wl_display_dispatch_queue( mEventHandler->mDisplay, mEventHandler->mEventQueue );
1256 if( !mEventHandler->mNotificationLevelChangeDone )
1258 DALI_LOG_INFO( gWindowLogFilter, Debug::Verbose, "Window::GetNotificationLevel: Error! [%d]\n", mEventHandler->mNotificationChangeState );
1259 return Dali::Window::NotificationLevel::NONE;
1262 Dali::Window::NotificationLevel::Type level;
1264 switch( mEventHandler->mNotificationLevel )
1266 case TIZEN_POLICY_LEVEL_NONE:
1268 level = Dali::Window::NotificationLevel::NONE;
1271 case TIZEN_POLICY_LEVEL_DEFAULT:
1273 level = Dali::Window::NotificationLevel::BASE;
1276 case TIZEN_POLICY_LEVEL_MEDIUM:
1278 level = Dali::Window::NotificationLevel::MEDIUM;
1281 case TIZEN_POLICY_LEVEL_HIGH:
1283 level = Dali::Window::NotificationLevel::HIGH;
1286 case TIZEN_POLICY_LEVEL_TOP:
1288 level = Dali::Window::NotificationLevel::TOP;
1293 DALI_LOG_INFO( gWindowLogFilter, Debug::Verbose, "Window::GetNotificationLevel: invalid level [%d]\n", mEventHandler->mNotificationLevel );
1294 level = Dali::Window::NotificationLevel::NONE;
1299 DALI_LOG_INFO( gWindowLogFilter, Debug::Verbose, "Window::GetNotificationLevel: level [%d]\n", mEventHandler->mNotificationLevel );
1304 void Window::SetOpaqueState( bool opaque )
1306 while( !mEventHandler->mTizenPolicy )
1308 wl_display_dispatch_queue( mEventHandler->mDisplay, mEventHandler->mEventQueue );
1311 tizen_policy_set_opaque_state( mEventHandler->mTizenPolicy, ecore_wl_window_surface_get( mEventHandler->mEcoreWindow ), ( opaque ? 1 : 0 ) );
1313 mOpaqueState = opaque;
1315 DALI_LOG_INFO( gWindowLogFilter, Debug::Verbose, "Window::SetOpaqueState: opaque = %d\n", opaque );
1318 bool Window::IsOpaqueState() const
1320 return mOpaqueState;
1323 bool Window::SetScreenOffMode(Dali::Window::ScreenOffMode::Type screenOffMode)
1325 while( !mEventHandler->mTizenPolicy )
1327 wl_display_dispatch_queue( mEventHandler->mDisplay, mEventHandler->mEventQueue );
1330 mEventHandler->mScreenOffModeChangeDone = false;
1331 mEventHandler->mScreenOffModeChangeState = TIZEN_POLICY_ERROR_STATE_NONE;
1333 unsigned int mode = 0;
1335 switch( screenOffMode )
1337 case Dali::Window::ScreenOffMode::TIMEOUT:
1342 case Dali::Window::ScreenOffMode::NEVER:
1349 tizen_policy_set_window_screen_mode( mEventHandler->mTizenPolicy, ecore_wl_window_surface_get( mEventHandler->mEcoreWindow ), mode );
1353 while( !mEventHandler->mScreenOffModeChangeDone && count < 3 )
1356 wl_display_dispatch_queue( mEventHandler->mDisplay, mEventHandler->mEventQueue );
1360 if( !mEventHandler->mScreenOffModeChangeDone )
1362 DALI_LOG_INFO( gWindowLogFilter, Debug::Verbose, "Window::SetScreenOffMode: Screen mode change is failed [%d, %d]\n", screenOffMode, mEventHandler->mScreenOffModeChangeState );
1365 else if( mEventHandler->mScreenOffModeChangeState == TIZEN_POLICY_ERROR_STATE_PERMISSION_DENIED )
1367 DALI_LOG_INFO( gWindowLogFilter, Debug::Verbose, "Window::SetScreenOffMode: Permission denied! [%d]\n", screenOffMode );
1371 DALI_LOG_INFO( gWindowLogFilter, Debug::Verbose, "Window::SetScreenOffMode: Screen mode is changed [%d]\n", mEventHandler->mScreenOffMode );
1376 Dali::Window::ScreenOffMode::Type Window::GetScreenOffMode() const
1378 while( !mEventHandler->mTizenPolicy )
1380 wl_display_dispatch_queue( mEventHandler->mDisplay, mEventHandler->mEventQueue );
1385 while( !mEventHandler->mScreenOffModeChangeDone && count < 3 )
1388 wl_display_dispatch_queue( mEventHandler->mDisplay, mEventHandler->mEventQueue );
1392 if( !mEventHandler->mScreenOffModeChangeDone )
1394 DALI_LOG_INFO( gWindowLogFilter, Debug::Verbose, "Window::GetScreenOffMode: Error! [%d]\n", mEventHandler->mScreenOffModeChangeState );
1395 return Dali::Window::ScreenOffMode::TIMEOUT;
1398 Dali::Window::ScreenOffMode::Type screenMode = Dali::Window::ScreenOffMode::TIMEOUT;
1400 switch( mEventHandler->mScreenOffMode )
1404 screenMode = Dali::Window::ScreenOffMode::TIMEOUT;
1409 screenMode = Dali::Window::ScreenOffMode::NEVER;
1414 DALI_LOG_INFO( gWindowLogFilter, Debug::Verbose, "Window::GetScreenOffMode: screen mode [%d]\n", mEventHandler->mScreenOffMode );
1419 bool Window::SetBrightness( int brightness )
1421 if( brightness < 0 || brightness > 100 )
1423 DALI_LOG_INFO( gWindowLogFilter, Debug::Verbose, "Window::SetBrightness: Invalid brightness value [%d]\n", brightness );
1427 while( !mEventHandler->mTizenDisplayPolicy )
1429 wl_display_dispatch_queue( mEventHandler->mDisplay, mEventHandler->mEventQueue );
1432 mEventHandler->mBrightnessChangeDone = false;
1433 mEventHandler->mBrightnessChangeState = TIZEN_POLICY_ERROR_STATE_NONE;
1435 tizen_display_policy_set_window_brightness( mEventHandler->mTizenDisplayPolicy, ecore_wl_window_surface_get( mEventHandler->mEcoreWindow ), brightness );
1439 while( !mEventHandler->mBrightnessChangeDone && count < 3 )
1442 wl_display_dispatch_queue( mEventHandler->mDisplay, mEventHandler->mEventQueue );
1446 if( !mEventHandler->mBrightnessChangeDone )
1448 DALI_LOG_INFO( gWindowLogFilter, Debug::Verbose, "Window::SetBrightness: Brightness change is failed [%d, %d]\n", brightness, mEventHandler->mBrightnessChangeState );
1451 else if( mEventHandler->mBrightnessChangeState == TIZEN_POLICY_ERROR_STATE_PERMISSION_DENIED )
1453 DALI_LOG_INFO( gWindowLogFilter, Debug::Verbose, "Window::SetBrightness: Permission denied! [%d]\n", brightness );
1457 DALI_LOG_INFO( gWindowLogFilter, Debug::Verbose, "Window::SetBrightness: Brightness is changed [%d]\n", mEventHandler->mBrightness );
1462 int Window::GetBrightness() const
1464 while( !mEventHandler->mTizenDisplayPolicy )
1466 wl_display_dispatch_queue( mEventHandler->mDisplay, mEventHandler->mEventQueue );
1471 while( !mEventHandler->mBrightnessChangeDone && count < 3 )
1474 wl_display_dispatch_queue( mEventHandler->mDisplay, mEventHandler->mEventQueue );
1478 if( !mEventHandler->mBrightnessChangeDone )
1480 DALI_LOG_INFO( gWindowLogFilter, Debug::Verbose, "Window::GetBrightness: Error! [%d]\n", mEventHandler->mBrightnessChangeState );
1484 DALI_LOG_INFO( gWindowLogFilter, Debug::Verbose, "Window::GetBrightness: Brightness [%d]\n", mEventHandler->mBrightness );
1486 return mEventHandler->mBrightness;
1489 void Window::SetSize( Dali::Window::WindowSize size )
1491 if( !mResizeEnabled )
1493 AddAuxiliaryHint( "wm.policy.win.user.geometry", "1" );
1494 mResizeEnabled = true;
1497 PositionSize positionSize = mSurface->GetPositionSize();
1499 if( positionSize.width != size.GetWidth() || positionSize.height != size.GetHeight() )
1501 positionSize.width = size.GetWidth();
1502 positionSize.height = size.GetHeight();
1504 mSurface->MoveResize( positionSize );
1506 mAdaptor->SurfaceResizePrepare( Adaptor::SurfaceSize( positionSize.width, positionSize.height ) );
1509 mResizedSignal.Emit( Dali::Window::WindowSize( positionSize.width, positionSize.height ) );
1511 mAdaptor->SurfaceResizeComplete( Adaptor::SurfaceSize( positionSize.width, positionSize.height ) );
1515 Dali::Window::WindowSize Window::GetSize() const
1517 PositionSize positionSize = mSurface->GetPositionSize();
1519 return Dali::Window::WindowSize( positionSize.width, positionSize.height );
1522 void Window::SetPosition( Dali::Window::WindowPosition position )
1524 if( !mResizeEnabled )
1526 AddAuxiliaryHint( "wm.policy.win.user.geometry", "1" );
1527 mResizeEnabled = true;
1530 PositionSize positionSize = mSurface->GetPositionSize();
1532 if( positionSize.x != position.GetX() || positionSize.y != position.GetY() )
1534 positionSize.x = position.GetX();
1535 positionSize.y = position.GetY();
1537 mSurface->MoveResize( positionSize );
1541 Dali::Window::WindowPosition Window::GetPosition() const
1543 PositionSize positionSize = mSurface->GetPositionSize();
1545 return Dali::Window::WindowPosition( positionSize.x, positionSize.y );
1548 void Window::SetTransparency( bool transparent )
1550 ECore::WindowRenderSurface* wlSurface( dynamic_cast< ECore::WindowRenderSurface * >( mSurface ) );
1553 wlSurface->SetTransparency( transparent );
1563 #pragma GCC diagnostic pop