Revert "[Tizen] Add GlWindow"
[platform/core/uifw/dali-adaptor.git] / dali / internal / window-system / common / window-impl.cpp
1 /*
2  * Copyright (c) 2020 Samsung Electronics Co., Ltd.
3  *
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
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
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.
15  *
16  */
17
18 // CLASS HEADER
19 #include <dali/internal/window-system/common/window-impl.h>
20
21 // EXTERNAL HEADERS
22 #include <thread>
23 #include <dali/integration-api/core.h>
24 #include <dali/public-api/actors/actor.h>
25 #include <dali/public-api/actors/layer.h>
26 #include <dali/public-api/actors/camera-actor.h>
27 #include <dali/public-api/render-tasks/render-task.h>
28 #include <dali/public-api/render-tasks/render-task-list.h>
29 #include <dali/public-api/rendering/frame-buffer.h>
30 #include <dali/devel-api/adaptor-framework/orientation.h>
31 #include <dali/integration-api/events/touch-event-integ.h>
32
33 // INTERNAL HEADERS
34 #include <dali/integration-api/adaptor-framework/render-surface-interface.h>
35 #include <dali/internal/graphics/gles/egl-graphics.h>
36 #include <dali/internal/window-system/common/event-handler.h>
37 #include <dali/internal/window-system/common/orientation-impl.h>
38 #include <dali/internal/window-system/common/render-surface-factory.h>
39 #include <dali/internal/window-system/common/window-factory.h>
40 #include <dali/internal/window-system/common/window-base.h>
41 #include <dali/internal/window-system/common/window-system.h>
42 #include <dali/internal/window-system/common/window-render-surface.h>
43 #include <dali/internal/window-system/common/window-visibility-observer.h>
44
45 namespace Dali
46 {
47 namespace Internal
48 {
49 namespace Adaptor
50 {
51
52 namespace
53 {
54
55 #if defined(DEBUG_ENABLED)
56 Debug::Filter* gWindowLogFilter = Debug::Filter::New( Debug::NoLogging, false, "LOG_WINDOW" );
57 #endif
58
59 } // unnamed namespace
60
61 Window* Window::New(const PositionSize& positionSize, const std::string& name, const std::string& className, bool isTransparent)
62 {
63   Any surface;
64   return Window::New(surface, positionSize, name, className, isTransparent);
65 }
66
67 Window* Window::New(Any surface, const PositionSize& positionSize, const std::string& name, const std::string& className, bool isTransparent)
68 {
69   Window* window = new Window();
70   window->mIsTransparent = isTransparent;
71   window->Initialize(surface, positionSize, name, className);
72   return window;
73 }
74
75 Window::Window()
76 : mWindowSurface( nullptr ),
77   mWindowBase(),
78   mIsTransparent( false ),
79   mIsFocusAcceptable( true ),
80   mIconified( false ),
81   mOpaqueState( false ),
82   mResizeEnabled( false ),
83   mType( Dali::Window::NORMAL ),
84   mParentWindow( NULL ),
85   mPreferredAngle( Dali::Window::NO_ORIENTATION_PREFERENCE ),
86   mRotationAngle( -1 ),
87   mWindowWidth( 0 ),
88   mWindowHeight( 0 ),
89   mOrientationMode( Internal::Adaptor::Window::OrientationMode::PORTRAIT ),
90   mNativeWindowId( -1 ),
91   mResizedSignal(),
92   mDeleteRequestSignal(),
93   mFocusChangeSignal(),
94   mResizeSignal(),
95   mVisibilityChangedSignal(),
96   mTransitionEffectEventSignal(),
97   mKeyboardRepeatSettingsChangedSignal()
98 {
99 }
100
101 Window::~Window()
102 {
103   if ( mEventHandler )
104   {
105     mEventHandler->RemoveObserver( *this );
106   }
107 }
108
109 void Window::Initialize(Any surface, const PositionSize& positionSize, const std::string& name, const std::string& className)
110 {
111   // Create a window render surface
112   auto renderSurfaceFactory = Dali::Internal::Adaptor::GetRenderSurfaceFactory();
113   mSurface = renderSurfaceFactory->CreateWindowRenderSurface( positionSize, surface, mIsTransparent );
114   mWindowSurface = static_cast<WindowRenderSurface*>( mSurface.get() );
115
116   // Get a window base
117   mWindowBase = mWindowSurface->GetWindowBase();
118
119   // Connect signals
120   mWindowBase->IconifyChangedSignal().Connect( this, &Window::OnIconifyChanged );
121   mWindowBase->FocusChangedSignal().Connect( this, &Window::OnFocusChanged );
122   mWindowBase->DeleteRequestSignal().Connect( this, &Window::OnDeleteRequest );
123   mWindowBase->TransitionEffectEventSignal().Connect( this, &Window::OnTransitionEffectEvent );
124   mWindowBase->KeyboardRepeatSettingsChangedSignal().Connect( this, &Window::OnKeyboardRepeatSettingsChanged );
125
126   mWindowSurface->OutputTransformedSignal().Connect( this, &Window::OnOutputTransformed );
127
128   if( !positionSize.IsEmpty() )
129   {
130     AddAuxiliaryHint( "wm.policy.win.user.geometry", "1" );
131     mResizeEnabled = true;
132   }
133
134   SetClass( name, className );
135
136   mWindowSurface->Map();
137
138   mOrientation = Orientation::New( this );
139
140   // Get OrientationMode
141   int screenWidth, screenHeight;
142   WindowSystem::GetScreenSize( screenWidth, screenHeight );
143   if( screenWidth > screenHeight )
144   {
145     mOrientationMode = Internal::Adaptor::Window::OrientationMode::LANDSCAPE;
146   }
147   else
148   {
149     mOrientationMode = Internal::Adaptor::Window::OrientationMode::PORTRAIT;
150   }
151   // For Debugging
152   mNativeWindowId = mWindowBase->GetNativeWindowId();
153 }
154
155 void Window::OnAdaptorSet(Dali::Adaptor& adaptor)
156 {
157   mEventHandler = EventHandlerPtr(new EventHandler( mWindowSurface, *mAdaptor ) );
158   mEventHandler->AddObserver( *this );
159 }
160
161 void Window::OnSurfaceSet( Dali::RenderSurfaceInterface* surface )
162 {
163   mWindowSurface = static_cast<WindowRenderSurface*>( surface );
164 }
165
166 void Window::SetClass( std::string name, std::string className )
167 {
168   mName = name;
169   mClassName = className;
170   mWindowBase->SetClass( name, className );
171 }
172
173 std::string Window::GetClassName() const
174 {
175   return mClassName;
176 }
177
178 void Window::Raise()
179 {
180   mWindowBase->Raise();
181
182   GraphicsInterface& graphics = mAdaptor->GetGraphicsInterface();
183   EglGraphics* eglGraphics = static_cast<EglGraphics*>(&graphics);
184   if (eglGraphics)
185   {
186     eglGraphics->SetFullSwapNextFrame();
187   }
188
189   DALI_LOG_RELEASE_INFO( "Window (%p), WinId (%d), Raise() \n", this, mNativeWindowId );
190 }
191
192 void Window::Lower()
193 {
194   mWindowBase->Lower();
195
196   GraphicsInterface& graphics = mAdaptor->GetGraphicsInterface();
197   EglGraphics* eglGraphics = static_cast<EglGraphics*>(&graphics);
198   if (eglGraphics)
199   {
200     eglGraphics->SetFullSwapNextFrame();
201   }
202
203   DALI_LOG_RELEASE_INFO( "Window (%p), WinId (%d), Lower() \n", this, mNativeWindowId );
204 }
205
206 void Window::Activate()
207 {
208   mWindowBase->Activate();
209
210   GraphicsInterface& graphics = mAdaptor->GetGraphicsInterface();
211   EglGraphics* eglGraphics = static_cast<EglGraphics*>(&graphics);
212   if (eglGraphics)
213   {
214     eglGraphics->SetFullSwapNextFrame();
215   }
216
217   DALI_LOG_RELEASE_INFO( "Window (%p), WinId (%d), Activate() \n", this, mNativeWindowId );
218 }
219
220 uint32_t Window::GetLayerCount() const
221 {
222   return mScene.GetLayerCount();
223 }
224
225 Dali::Layer Window::GetLayer( uint32_t depth ) const
226 {
227   return mScene.GetLayer( depth );
228 }
229
230 Dali::RenderTaskList Window::GetRenderTaskList() const
231 {
232   return mScene.GetRenderTaskList();
233 }
234
235 void Window::AddAvailableOrientation( Dali::Window::WindowOrientation orientation )
236 {
237   if( IsOrientationAvailable( orientation ) == false )
238   {
239     return;
240   }
241
242   bool found = false;
243   int convertedAngle = ConvertToAngle( orientation );
244   DALI_LOG_RELEASE_INFO( "Window (%p), WinId (%d), AddAvailableOrientation: %d\n", this, mNativeWindowId, convertedAngle );
245   for( std::size_t i = 0; i < mAvailableAngles.size(); i++ )
246   {
247     if( mAvailableAngles[i] == convertedAngle )
248     {
249       found = true;
250       break;
251     }
252   }
253
254   if( !found )
255   {
256     mAvailableAngles.push_back( convertedAngle );
257     SetAvailableAnlges( mAvailableAngles );
258   }
259 }
260
261 void Window::RemoveAvailableOrientation( Dali::Window::WindowOrientation orientation )
262 {
263   if( IsOrientationAvailable( orientation ) == false )
264   {
265     return;
266   }
267
268   int convertedAngle = ConvertToAngle( orientation );
269   DALI_LOG_RELEASE_INFO( "Window (%p), WinId (%d), RemoveAvailableOrientation: %d\n", this, mNativeWindowId, convertedAngle );
270   for( std::vector< int >::iterator iter = mAvailableAngles.begin();
271        iter != mAvailableAngles.end(); ++iter )
272   {
273     if( *iter == convertedAngle )
274     {
275       mAvailableAngles.erase( iter );
276       break;
277     }
278   }
279
280   SetAvailableAnlges( mAvailableAngles );
281 }
282
283 void Window::SetPreferredOrientation( Dali::Window::WindowOrientation orientation )
284 {
285   if( orientation < Dali::Window::NO_ORIENTATION_PREFERENCE || orientation > Dali::Window::LANDSCAPE_INVERSE )
286   {
287     DALI_LOG_INFO( gWindowLogFilter, Debug::Verbose, "Window::CheckOrientation: Invalid input orientation [%d]\n", orientation );
288     return;
289   }
290   mPreferredAngle = ConvertToAngle( orientation );
291   DALI_LOG_RELEASE_INFO( "Window (%p), WinId (%d), SetPreferredOrientation: %d\n", this, mNativeWindowId, mPreferredAngle );
292   mWindowBase->SetPreferredAngle( mPreferredAngle );
293 }
294
295 Dali::Window::WindowOrientation Window::GetPreferredOrientation()
296 {
297   DALI_LOG_RELEASE_INFO( "Window (%p), WinId (%d), GetPreferredOrientation: %d\n", this, mNativeWindowId, mPreferredAngle );
298   Dali::Window::WindowOrientation preferredOrientation = ConvertToOrientation( mPreferredAngle );
299   return preferredOrientation;
300 }
301
302 void Window::SetAvailableAnlges( const std::vector< int >& angles )
303 {
304   if( angles.size() > 4 )
305   {
306     DALI_LOG_INFO( gWindowLogFilter, Debug::Verbose, "Window::SetAvailableAnlges: Invalid vector size! [%d]\n", angles.size() );
307     return;
308   }
309
310   mWindowBase->SetAvailableAnlges( angles );
311 }
312
313 int Window::ConvertToAngle( Dali::Window::WindowOrientation orientation )
314 {
315   int convertAngle = static_cast< int >( orientation );
316   if( mOrientationMode == Internal::Adaptor::Window::OrientationMode::LANDSCAPE )
317   {
318     switch( orientation )
319     {
320       case Dali::Window::LANDSCAPE:
321       {
322         convertAngle = 0;
323         break;
324       }
325       case Dali::Window::PORTRAIT:
326       {
327         convertAngle = 90;
328         break;
329       }
330       case Dali::Window::LANDSCAPE_INVERSE:
331       {
332         convertAngle = 180;
333         break;
334       }
335       case Dali::Window::PORTRAIT_INVERSE:
336       {
337         convertAngle = 270;
338         break;
339       }
340       case Dali::Window::NO_ORIENTATION_PREFERENCE:
341       {
342         convertAngle = -1;
343         break;
344       }
345     }
346   }
347   return convertAngle;
348 }
349
350 Dali::Window::WindowOrientation Window::ConvertToOrientation( int angle ) const
351 {
352   Dali::Window::WindowOrientation orientation = static_cast< Dali::Window::WindowOrientation >( angle );
353   if( mOrientationMode == Internal::Adaptor::Window::OrientationMode::LANDSCAPE )
354   {
355     switch( angle )
356     {
357       case 0:
358       {
359         orientation = Dali::Window::LANDSCAPE;
360         break;
361       }
362       case 90:
363       {
364         orientation = Dali::Window::PORTRAIT;
365         break;
366       }
367       case 180:
368       {
369         orientation = Dali::Window::LANDSCAPE_INVERSE;
370         break;
371       }
372       case 270:
373       {
374         orientation = Dali::Window::PORTRAIT_INVERSE;
375         break;
376       }
377       case -1:
378       {
379         orientation = Dali::Window::NO_ORIENTATION_PREFERENCE;
380         break;
381       }
382     }
383   }
384   return orientation;
385 }
386
387 bool Window::IsOrientationAvailable( Dali::Window::WindowOrientation orientation ) const
388 {
389   if( orientation <= Dali::Window::NO_ORIENTATION_PREFERENCE || orientation > Dali::Window::LANDSCAPE_INVERSE )
390   {
391     DALI_LOG_INFO( gWindowLogFilter, Debug::Verbose, "Window::IsOrientationAvailable: Invalid input orientation [%d]\n", orientation );
392     return false;
393   }
394   return true;
395 }
396
397 Dali::Any Window::GetNativeHandle() const
398 {
399   return mWindowSurface->GetNativeWindow();
400 }
401
402 void Window::SetAcceptFocus( bool accept )
403 {
404   mIsFocusAcceptable = accept;
405
406   mWindowBase->SetAcceptFocus( accept );
407 }
408
409 bool Window::IsFocusAcceptable() const
410 {
411   return mIsFocusAcceptable;
412 }
413
414 void Window::Show()
415 {
416   mVisible = true;
417
418   mWindowBase->Show();
419
420   if( !mIconified )
421   {
422     WindowVisibilityObserver* observer( mAdaptor );
423     observer->OnWindowShown();
424
425     Dali::Window handle( this );
426     mVisibilityChangedSignal.Emit( handle, true );
427   }
428
429   GraphicsInterface& graphics = mAdaptor->GetGraphicsInterface();
430   EglGraphics* eglGraphics = static_cast<EglGraphics*>(&graphics);
431   if (eglGraphics)
432   {
433     eglGraphics->SetFullSwapNextFrame();
434   }
435
436   DALI_LOG_RELEASE_INFO( "Window (%p), WinId (%d), Show(): iconified = %d, visible = %d\n", this, mNativeWindowId, mIconified, mVisible );
437 }
438
439 void Window::Hide()
440 {
441   mVisible = false;
442
443   mWindowBase->Hide();
444
445   if( !mIconified )
446   {
447     WindowVisibilityObserver* observer( mAdaptor );
448     observer->OnWindowHidden();
449
450     Dali::Window handle( this );
451     mVisibilityChangedSignal.Emit( handle, false );
452   }
453
454
455   GraphicsInterface& graphics = mAdaptor->GetGraphicsInterface();
456   EglGraphics* eglGraphics = static_cast<EglGraphics*>(&graphics);
457   if (eglGraphics)
458   {
459     eglGraphics->SetFullSwapNextFrame();
460   }
461
462   DALI_LOG_RELEASE_INFO( "Window (%p), WinId (%d), Hide(): iconified = %d, visible = %d\n", this, mNativeWindowId, mIconified, mVisible );
463 }
464
465 bool Window::IsVisible() const
466 {
467   DALI_LOG_RELEASE_INFO( "Window (%p), WinId (%d), IsVisible(): iconified = %d, visible = %d\n", this, mNativeWindowId, mIconified, mVisible );
468   return mVisible && !mIconified;
469 }
470
471 unsigned int Window::GetSupportedAuxiliaryHintCount() const
472 {
473   return mWindowBase->GetSupportedAuxiliaryHintCount();
474 }
475
476 std::string Window::GetSupportedAuxiliaryHint( unsigned int index ) const
477 {
478   return mWindowBase->GetSupportedAuxiliaryHint( index );
479 }
480
481 unsigned int Window::AddAuxiliaryHint( const std::string& hint, const std::string& value )
482 {
483   return mWindowBase->AddAuxiliaryHint( hint, value );
484 }
485
486 bool Window::RemoveAuxiliaryHint( unsigned int id )
487 {
488   return mWindowBase->RemoveAuxiliaryHint( id );
489 }
490
491 bool Window::SetAuxiliaryHintValue( unsigned int id, const std::string& value )
492 {
493   return mWindowBase->SetAuxiliaryHintValue( id, value );
494 }
495
496 std::string Window::GetAuxiliaryHintValue( unsigned int id ) const
497 {
498   return mWindowBase->GetAuxiliaryHintValue( id );
499 }
500
501 unsigned int Window::GetAuxiliaryHintId( const std::string& hint ) const
502 {
503   return mWindowBase->GetAuxiliaryHintId( hint );
504 }
505
506 void Window::SetInputRegion( const Rect< int >& inputRegion )
507 {
508   mWindowBase->SetInputRegion( inputRegion );
509
510   GraphicsInterface& graphics = mAdaptor->GetGraphicsInterface();
511   EglGraphics* eglGraphics = static_cast<EglGraphics*>(&graphics);
512   if (eglGraphics)
513   {
514     eglGraphics->SetFullSwapNextFrame();
515   }
516
517   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 );
518 }
519
520 void Window::SetType( Dali::Window::Type type )
521 {
522   if( type != mType )
523   {
524     mWindowBase->SetType( type );
525
526     mType = type;
527   }
528 }
529
530 Dali::Window::Type Window::GetType() const
531 {
532   return mType;
533 }
534
535 bool Window::SetNotificationLevel( Dali::Window::NotificationLevel::Type level )
536 {
537   if( mType != Dali::Window::NOTIFICATION )
538   {
539     DALI_LOG_INFO( gWindowLogFilter, Debug::Verbose, "Window::SetNotificationLevel: Not supported window type [%d]\n", mType );
540     return false;
541   }
542
543   return mWindowBase->SetNotificationLevel( level );
544 }
545
546 Dali::Window::NotificationLevel::Type Window::GetNotificationLevel() const
547 {
548   if( mType != Dali::Window::NOTIFICATION )
549   {
550     DALI_LOG_INFO( gWindowLogFilter, Debug::Verbose, "Window::GetNotificationLevel: Not supported window type [%d]\n", mType );
551     return Dali::Window::NotificationLevel::NONE;
552   }
553
554   return mWindowBase->GetNotificationLevel();
555 }
556
557 void Window::SetOpaqueState( bool opaque )
558 {
559   mOpaqueState = opaque;
560
561   mWindowBase->SetOpaqueState( opaque );
562
563   DALI_LOG_INFO( gWindowLogFilter, Debug::Verbose, "Window::SetOpaqueState: opaque = %d\n", opaque );
564 }
565
566 bool Window::IsOpaqueState() const
567 {
568   return mOpaqueState;
569 }
570
571 bool Window::SetScreenOffMode(Dali::Window::ScreenOffMode::Type screenOffMode)
572 {
573   return mWindowBase->SetScreenOffMode( screenOffMode );
574 }
575
576 Dali::Window::ScreenOffMode::Type Window::GetScreenOffMode() const
577 {
578   return mWindowBase->GetScreenOffMode();
579 }
580
581 bool Window::SetBrightness( int brightness )
582 {
583   if( brightness < 0 || brightness > 100 )
584   {
585     DALI_LOG_INFO( gWindowLogFilter, Debug::Verbose, "Window::SetBrightness: Invalid brightness value [%d]\n", brightness );
586     return false;
587   }
588
589   return mWindowBase->SetBrightness( brightness );
590 }
591
592 int Window::GetBrightness() const
593 {
594   return mWindowBase->GetBrightness();
595 }
596
597 void Window::SetSize( Dali::Window::WindowSize size )
598 {
599   if( !mResizeEnabled )
600   {
601     AddAuxiliaryHint( "wm.policy.win.user.geometry", "1" );
602     mResizeEnabled = true;
603   }
604
605   PositionSize oldRect = mSurface->GetPositionSize();
606
607   mWindowSurface->MoveResize( PositionSize( oldRect.x, oldRect.y, size.GetWidth(), size.GetHeight() ) );
608
609   PositionSize newRect = mSurface->GetPositionSize();
610
611   // When surface size is updated, inform adaptor of resizing and emit ResizeSignal
612   if( ( oldRect.width != newRect.width ) || ( oldRect.height != newRect.height ) )
613   {
614     Uint16Pair newSize( newRect.width, newRect.height );
615
616     bool forceUpdate = false;
617     if( mWindowBase->IsEglWindowRotationSupported() )
618     {
619       forceUpdate = true;
620     }
621
622     SurfaceResized( forceUpdate );
623
624     mAdaptor->SurfaceResizePrepare( mSurface.get(), newSize );
625
626     DALI_LOG_RELEASE_INFO( "Window (%p), WinId (%d), SetSize(): resize signal [%d x %d]\n", this, mNativeWindowId, newRect.width, newRect.height );
627
628     Dali::Window handle( this );
629     mResizedSignal.Emit( newSize );
630     mResizeSignal.Emit( handle, newSize );
631
632     mAdaptor->SurfaceResizeComplete( mSurface.get(), newSize );
633   }
634
635   GraphicsInterface& graphics = mAdaptor->GetGraphicsInterface();
636   EglGraphics* eglGraphics = static_cast<EglGraphics*>(&graphics);
637   if (eglGraphics)
638   {
639     eglGraphics->SetFullSwapNextFrame();
640   }
641 }
642
643 Dali::Window::WindowSize Window::GetSize() const
644 {
645   PositionSize positionSize = mSurface->GetPositionSize();
646
647   return Dali::Window::WindowSize( positionSize.width, positionSize.height );
648 }
649
650 void Window::SetPosition( Dali::Window::WindowPosition position )
651 {
652   if( !mResizeEnabled )
653   {
654     AddAuxiliaryHint( "wm.policy.win.user.geometry", "1" );
655     mResizeEnabled = true;
656   }
657
658   PositionSize oldRect = mSurface->GetPositionSize();
659
660   mWindowSurface->MoveResize( PositionSize( position.GetX(), position.GetY(), oldRect.width, oldRect.height ) );
661
662   GraphicsInterface& graphics = mAdaptor->GetGraphicsInterface();
663   EglGraphics* eglGraphics = static_cast<EglGraphics*>(&graphics);
664   if (eglGraphics)
665   {
666     eglGraphics->SetFullSwapNextFrame();
667   }
668 }
669
670 Dali::Window::WindowPosition Window::GetPosition() const
671 {
672   PositionSize positionSize = mSurface->GetPositionSize();
673
674   return Dali::Window::WindowPosition( positionSize.x, positionSize.y );
675 }
676
677 void Window::SetPositionSize( PositionSize positionSize )
678 {
679   if( !mResizeEnabled )
680   {
681     AddAuxiliaryHint( "wm.policy.win.user.geometry", "1" );
682     mResizeEnabled = true;
683   }
684
685   PositionSize oldRect = mSurface->GetPositionSize();
686
687   mWindowSurface->MoveResize( positionSize );
688
689   PositionSize newRect = mSurface->GetPositionSize();
690
691   // When surface size is updated, inform adaptor of resizing and emit ResizeSignal
692   if( ( oldRect.width != newRect.width ) || ( oldRect.height != newRect.height ) )
693   {
694     Uint16Pair newSize( newRect.width, newRect.height );
695
696     bool forceUpdate = false;
697     if( mWindowBase->IsEglWindowRotationSupported() )
698     {
699       forceUpdate = true;
700     }
701
702     SurfaceResized( forceUpdate );
703
704     mAdaptor->SurfaceResizePrepare( mSurface.get(), newSize );
705
706     DALI_LOG_RELEASE_INFO( "Window (%p), WinId (%d), SetPositionSize():resize signal [%d x %d]\n", this, mNativeWindowId, newRect.width, newRect.height );
707     Dali::Window handle( this );
708     mResizedSignal.Emit( newSize );
709     mResizeSignal.Emit( handle, newSize );
710     mAdaptor->SurfaceResizeComplete( mSurface.get(), newSize );
711   }
712
713   GraphicsInterface& graphics = mAdaptor->GetGraphicsInterface();
714   EglGraphics* eglGraphics = static_cast<EglGraphics*>(&graphics);
715   if (eglGraphics)
716   {
717     eglGraphics->SetFullSwapNextFrame();
718   }
719 }
720
721 Dali::Layer Window::GetRootLayer() const
722 {
723   return mScene.GetRootLayer();
724 }
725
726 void Window::SetTransparency( bool transparent )
727 {
728   mWindowSurface->SetTransparency( transparent );
729 }
730
731 bool Window::GrabKey( Dali::KEY key, KeyGrab::KeyGrabMode grabMode )
732 {
733   return mWindowBase->GrabKey( key, grabMode );
734 }
735
736 bool Window::UngrabKey( Dali::KEY key )
737 {
738   return mWindowBase->UngrabKey( key );
739 }
740
741 bool Window::GrabKeyList( const Dali::Vector< Dali::KEY >& key, const Dali::Vector< KeyGrab::KeyGrabMode >& grabMode, Dali::Vector< bool >& result )
742 {
743   return mWindowBase->GrabKeyList( key, grabMode, result );
744 }
745
746 bool Window::UngrabKeyList( const Dali::Vector< Dali::KEY >& key, Dali::Vector< bool >& result )
747 {
748   return mWindowBase->UngrabKeyList( key, result );
749 }
750
751 void Window::OnIconifyChanged( bool iconified )
752 {
753   if( iconified )
754   {
755     mIconified = true;
756
757     if( mVisible )
758     {
759       WindowVisibilityObserver* observer( mAdaptor );
760       observer->OnWindowHidden();
761
762       Dali::Window handle( this );
763       mVisibilityChangedSignal.Emit( handle, false );
764     }
765
766     DALI_LOG_RELEASE_INFO( "Window (%p), WinId (%d), Iconified: visible = %d\n", this, mNativeWindowId, mVisible );
767   }
768   else
769   {
770     mIconified = false;
771
772     if( mVisible )
773     {
774       WindowVisibilityObserver* observer( mAdaptor );
775       observer->OnWindowShown();
776
777       Dali::Window handle( this );
778       mVisibilityChangedSignal.Emit( handle, true );
779     }
780
781     DALI_LOG_RELEASE_INFO( "Window (%p), WinId (%d), Deiconified: visible = %d\n", this, mNativeWindowId, mVisible );
782   }
783
784   GraphicsInterface& graphics = mAdaptor->GetGraphicsInterface();
785   EglGraphics* eglGraphics = static_cast<EglGraphics*>(&graphics);
786   if (eglGraphics)
787   {
788     eglGraphics->SetFullSwapNextFrame();
789   }
790 }
791
792 void Window::OnFocusChanged( bool focusIn )
793 {
794   Dali::Window handle( this );
795   mFocusChangeSignal.Emit( handle, focusIn );
796
797   GraphicsInterface& graphics = mAdaptor->GetGraphicsInterface();
798   EglGraphics* eglGraphics = static_cast<EglGraphics*>(&graphics);
799   if (eglGraphics)
800   {
801     eglGraphics->SetFullSwapNextFrame();
802   }
803 }
804
805 void Window::OnOutputTransformed()
806 {
807   bool forceUpdate = false;
808   if( mWindowBase->IsEglWindowRotationSupported() )
809   {
810     forceUpdate = true;
811   }
812   DALI_LOG_RELEASE_INFO( "Window (%p), WinId (%d), OnOutputTransformed()\n", this, mNativeWindowId );
813   SurfaceResized( forceUpdate );
814
815   PositionSize positionSize = mSurface->GetPositionSize();
816   mAdaptor->SurfaceResizePrepare( mSurface.get(), Adaptor::SurfaceSize( positionSize.width, positionSize.height ) );
817   mAdaptor->SurfaceResizeComplete( mSurface.get(), Adaptor::SurfaceSize( positionSize.width, positionSize.height ) );
818 }
819
820 void Window::OnDeleteRequest()
821 {
822   mDeleteRequestSignal.Emit();
823 }
824
825 void Window::OnTransitionEffectEvent( DevelWindow::EffectState state, DevelWindow::EffectType type )
826 {
827   Dali::Window handle( this );
828   mTransitionEffectEventSignal.Emit( handle, state, type );
829 }
830
831 void Window::OnKeyboardRepeatSettingsChanged()
832 {
833   Dali::Window handle( this );
834   mKeyboardRepeatSettingsChangedSignal.Emit();
835 }
836
837 void Window::OnTouchPoint( Dali::Integration::Point& point, int timeStamp )
838 {
839   FeedTouchPoint( point, timeStamp );
840 }
841
842 void Window::OnWheelEvent( Dali::Integration::WheelEvent& wheelEvent )
843 {
844   FeedWheelEvent( wheelEvent );
845 }
846
847 void Window::OnKeyEvent( Dali::Integration::KeyEvent& keyEvent )
848 {
849   FeedKeyEvent( keyEvent );
850 }
851
852 void Window::OnRotation( const RotationEvent& rotation )
853 {
854   mRotationAngle = rotation.angle;
855   mWindowWidth = rotation.width;
856   mWindowHeight = rotation.height;
857
858   // Notify that the orientation is changed
859   mOrientation->OnOrientationChange( rotation );
860
861   mWindowSurface->RequestRotation( mRotationAngle, mWindowWidth, mWindowHeight );
862
863   bool forceUpdate = false;
864   if( mWindowBase->IsEglWindowRotationSupported() )
865   {
866     forceUpdate = true;
867   }
868
869   SurfaceResized( forceUpdate );
870
871   mAdaptor->SurfaceResizePrepare( mSurface.get(), Adaptor::SurfaceSize( mWindowWidth, mWindowHeight ) );
872
873   DALI_LOG_RELEASE_INFO( "Window (%p), WinId (%d), OnRotation(): resize signal emit [%d x %d]\n", this, mNativeWindowId, mWindowWidth, mWindowHeight );
874   // Emit signal
875   Dali::Window handle( this );
876   mResizedSignal.Emit( Dali::Window::WindowSize( mWindowWidth, mWindowHeight ) );
877   mResizeSignal.Emit( handle, Dali::Window::WindowSize( mWindowWidth, mWindowHeight ) );
878
879   mAdaptor->SurfaceResizeComplete( mSurface.get(), Adaptor::SurfaceSize( mWindowWidth, mWindowHeight ) );
880 }
881
882 void Window::OnPause()
883 {
884   if( mEventHandler )
885   {
886     mEventHandler->Pause();
887   }
888
889   GraphicsInterface& graphics = mAdaptor->GetGraphicsInterface();
890   EglGraphics* eglGraphics = static_cast<EglGraphics*>(&graphics);
891   if (eglGraphics)
892   {
893     eglGraphics->SetFullSwapNextFrame();
894   }
895 }
896
897 void Window::OnResume()
898 {
899   if( mEventHandler )
900   {
901     mEventHandler->Resume();
902   }
903
904   GraphicsInterface& graphics = mAdaptor->GetGraphicsInterface();
905   EglGraphics* eglGraphics = static_cast<EglGraphics*>(&graphics);
906   if (eglGraphics)
907   {
908     eglGraphics->SetFullSwapNextFrame();
909   }
910 }
911
912 void Window::RecalculateTouchPosition( Integration::Point& point )
913 {
914   Vector2 position = point.GetScreenPosition();
915   Vector2 convertedPosition;
916
917   switch( mRotationAngle )
918   {
919     case 90:
920     {
921       convertedPosition.x = static_cast<float>( mWindowWidth ) - position.y;
922       convertedPosition.y = position.x;
923       break;
924     }
925     case 180:
926     {
927       convertedPosition.x = static_cast<float>( mWindowWidth ) - position.x;
928       convertedPosition.y = static_cast<float>( mWindowHeight ) - position.y;
929       break;
930     }
931     case 270:
932     {
933       convertedPosition.x = position.y;
934       convertedPosition.y = static_cast<float>( mWindowHeight ) - position.x;
935       break;
936     }
937     default:
938     {
939       convertedPosition = position;
940       break;
941     }
942   }
943
944   point.SetScreenPosition( convertedPosition );
945 }
946
947 Dali::Window Window::Get( Dali::Actor actor )
948 {
949   Internal::Adaptor::Window* windowImpl = nullptr;
950
951   if ( Internal::Adaptor::Adaptor::IsAvailable() )
952   {
953     Dali::Internal::Adaptor::Adaptor& adaptor = Internal::Adaptor::Adaptor::GetImplementation( Internal::Adaptor::Adaptor::Get() );
954     windowImpl = dynamic_cast<Internal::Adaptor::Window*>( adaptor.GetWindow( actor ) );
955     if( windowImpl )
956     {
957       return Dali::Window( windowImpl );
958     }
959   }
960
961   return Dali::Window();
962 }
963
964 void Window::SetParent( Dali::Window& parent )
965 {
966   if ( DALI_UNLIKELY( parent ) )
967   {
968     mParentWindow = parent;
969     Dali::Window self = Dali::Window( this );
970     // check circular parent window setting
971     if ( Dali::DevelWindow::GetParent( parent ) == self )
972     {
973       Dali::DevelWindow::Unparent( parent );
974     }
975     mWindowBase->SetParent( GetImplementation( mParentWindow ).mWindowBase );
976   }
977 }
978
979 void Window::Unparent()
980 {
981   mWindowBase->SetParent( nullptr );
982   mParentWindow.Reset();
983 }
984
985 Dali::Window Window::GetParent()
986 {
987   return mParentWindow;
988 }
989
990 Dali::Window::WindowOrientation Window::GetCurrentOrientation() const
991 {
992   DALI_LOG_RELEASE_INFO( "Window (%p), WinId (%d), GetCurrentOrientation(): %d\n", this, mNativeWindowId, mRotationAngle );
993   return ConvertToOrientation( mRotationAngle );
994 }
995
996 void Window::SetAvailableOrientations( const Dali::Vector<Dali::Window::WindowOrientation>& orientations )
997 {
998   Dali::Vector<float>::SizeType count = orientations.Count();
999   for( Dali::Vector<float>::SizeType index = 0; index < count; ++index )
1000   {
1001     if( IsOrientationAvailable( orientations[index] ) == false )
1002     {
1003       DALI_LOG_ERROR("Window::SetAvailableOrientations, invalid orientation: %d\n", orientations[index]);
1004       continue;
1005     }
1006
1007     bool found = false;
1008     int convertedAngle = ConvertToAngle( orientations[index] );
1009
1010     for( std::size_t i = 0; i < mAvailableAngles.size(); i++ )
1011     {
1012       if( mAvailableAngles[i] == convertedAngle )
1013       {
1014         found = true;
1015         break;
1016       }
1017     }
1018
1019     if( !found )
1020     {
1021       DALI_LOG_RELEASE_INFO( "Window (%p), WinId (%d), SetAvailableOrientations: %d\n", this, mNativeWindowId, convertedAngle );
1022       mAvailableAngles.push_back( convertedAngle );
1023     }
1024   }
1025   SetAvailableAnlges( mAvailableAngles );
1026 }
1027
1028 int32_t Window::GetNativeId() const
1029 {
1030   return mWindowBase->GetNativeWindowId();
1031 }
1032
1033 void Window::SetDamagedAreas(std::vector<Dali::Rect<int>>& areas)
1034 {
1035   GraphicsInterface& graphics = mAdaptor->GetGraphicsInterface();
1036   EglGraphics* eglGraphics = static_cast<EglGraphics*>(&graphics);
1037   if (eglGraphics)
1038   {
1039     eglGraphics->SetDamagedAreas(areas);
1040   }
1041 }
1042
1043 } // Adaptor
1044
1045 } // Internal
1046
1047 } // Dali