Fix InputMethodContext to work well in multi-window env
[platform/core/uifw/dali-adaptor.git] / dali / internal / input / windows / input-method-context-impl-win.cpp
index ee3ff2b..5df001d 100755 (executable)
@@ -41,27 +41,13 @@ namespace Internal
 namespace Adaptor\r
 {\r
 \r
-InputMethodContextPtr InputMethodContextWin::New()\r
+InputMethodContextPtr InputMethodContextWin::New( Dali::Actor actor )\r
 {\r
   InputMethodContextPtr manager;\r
 \r
-  if ( Adaptor::IsAvailable() )\r
+  if ( actor && Adaptor::IsAvailable() )\r
   {\r
-    // Create instance and register singleton only if the adaptor is available\r
-    Adaptor& adaptorImpl( Adaptor::GetImplementation( Adaptor::Get() ) );\r
-    Any nativeWindow = adaptorImpl.GetNativeWindowHandle();\r
-\r
-    // The Win_Window_Handle needs to use the InputMethodContext.\r
-    // Only when the render surface is window, we can get the Win_Window_Handle.\r
-    WinWindowHandle winWindow( AnyCast<WinWindowHandle>(nativeWindow) );\r
-    if ( winWindow )\r
-    {\r
-      manager = new InputMethodContextWin( winWindow );\r
-    }\r
-    else\r
-    {\r
-      DALI_LOG_ERROR("Failed to get native window handle\n");\r
-    }\r
+    manager = new InputMethodContextWin( actor );\r
   }\r
 \r
   return manager;\r
@@ -71,13 +57,15 @@ void InputMethodContextWin::Finalize()
 {\r
 }\r
 \r
-InputMethodContextWin::InputMethodContextWin( WinWindowHandle winWindow )\r
-: mWin32Window( winWindow ),\r
+InputMethodContextWin::InputMethodContextWin( Dali::Actor actor )\r
+: mWin32Window( 0 ),\r
   mIMFCursorPosition( 0 ),\r
   mSurroundingText(),\r
   mRestoreAfterFocusLost( false ),\r
   mIdleCallbackConnected( false )\r
 {\r
+\r
+  actor.OnStageSignal().Connect( this, &InputMethodContextWin::OnStaged );\r
 }\r
 \r
 InputMethodContextWin::~InputMethodContextWin()\r
@@ -383,6 +371,20 @@ bool InputMethodContextWin::ProcessEventKeyUp( const KeyEvent& keyEvent )
   return eventHandled;\r
 }\r
 \r
+void InputMethodContextWin::OnStaged( Dali::Actor actor )\r
+{\r
+  WinWindowHandle winWindow( AnyCast< WinWindowHandle >( Dali::Integration::SceneHolder::Get( actor ).GetNativeHandle() ) );\r
+\r
+  if( mWin32Window != winWindow )\r
+  {\r
+    mWin32Window = winWindow;\r
+\r
+    // Reset\r
+    Finalize();\r
+    Initialize();\r
+  }\r
+}\r
+\r
 } // Adaptor\r
 \r
 } // Internal\r