[NUI] Block native callback if InputMethodContext is disposed
authorJaehyun Cho <jae_hyun.cho@samsung.com>
Mon, 2 Dec 2024 08:40:10 +0000 (17:40 +0900)
committerdongsug-song <35130733+dongsug-song@users.noreply.github.com>
Mon, 2 Dec 2024 10:18:07 +0000 (19:18 +0900)
Block native callback if InputMethodContext is disposed

src/Tizen.NUI/src/public/Input/InputMethodContext.cs

index c188e3006e55f29ded88963f15ca1dab5bf4807b..e747f301c8d37b7c3643fced1f15dbb57f01abaa 100755 (executable)
@@ -879,11 +879,41 @@ namespace Tizen.NUI
             //You should not access any managed member here except static instance
             //because the execution order of Finalizes is non-deterministic.
 
+            if (activatedEventCallback != null)
+            {
+                ActivatedSignal().Disconnect(activatedEventCallback);
+            }
+
+            if (eventReceivedEventCallback != null)
+            {
+                EventReceivedSignal().Disconnect(eventReceivedEventCallback);
+            }
+
+            if (statusChangedEventCallback != null)
+            {
+                StatusChangedSignal().Disconnect(statusChangedEventCallback);
+            }
+
+            if (resizedEventCallback != null)
+            {
+                ResizedSignal().Disconnect(resizedEventCallback);
+            }
+
+            if (languageChangedEventCallback != null)
+            {
+                LanguageChangedSignal().Disconnect(languageChangedEventCallback);
+            }
+
             if (keyboardTypeChangedEventCallback != null)
             {
                 KeyboardTypeChangedSignal().Disconnect(keyboardTypeChangedEventCallback);
             }
 
+            if (contentReceivedEventCallback != null)
+            {
+                ContentReceivedSignal().Disconnect(contentReceivedEventCallback);
+            }
+
             base.Dispose(type);
         }
 
@@ -896,6 +926,12 @@ namespace Tizen.NUI
 
         private void OnActivated(IntPtr data)
         {
+            if (Disposed || IsDisposeQueued)
+            {
+                // Ignore native callback if InputMethodContext is disposed or queued for disposal.
+                return;
+            }
+
             ActivatedEventArgs e = new ActivatedEventArgs();
 
             if (data != IntPtr.Zero)
@@ -911,6 +947,12 @@ namespace Tizen.NUI
 
         private IntPtr OnEventReceived(IntPtr inputMethodContext, IntPtr eventData)
         {
+            if (Disposed || IsDisposeQueued)
+            {
+                // Ignore native callback if InputMethodContext is disposed or queued for disposal.
+                return IntPtr.Zero;
+            }
+
             CallbackData callbackData = null;
 
             EventReceivedEventArgs e = new EventReceivedEventArgs();
@@ -940,6 +982,12 @@ namespace Tizen.NUI
 
         private void OnStatusChanged(bool statusChanged)
         {
+            if (Disposed || IsDisposeQueued)
+            {
+                // Ignore native callback if InputMethodContext is disposed or queued for disposal.
+                return;
+            }
+
             StatusChangedEventArgs e = new StatusChangedEventArgs();
 
             e.StatusChanged = statusChanged;
@@ -952,6 +1000,12 @@ namespace Tizen.NUI
 
         private void OnResized(int resized)
         {
+            if (Disposed || IsDisposeQueued)
+            {
+                // Ignore native callback if InputMethodContext is disposed or queued for disposal.
+                return;
+            }
+
             ResizedEventArgs e = new ResizedEventArgs();
             e.Resized = resized;
 
@@ -963,6 +1017,12 @@ namespace Tizen.NUI
 
         private void OnLanguageChanged(int languageChanged)
         {
+            if (Disposed || IsDisposeQueued)
+            {
+                // Ignore native callback if InputMethodContext is disposed or queued for disposal.
+                return;
+            }
+
             LanguageChangedEventArgs e = new LanguageChangedEventArgs();
             e.LanguageChanged = languageChanged;
 
@@ -974,6 +1034,12 @@ namespace Tizen.NUI
 
         private void OnKeyboardTypeChanged(KeyboardType type)
         {
+            if (Disposed || IsDisposeQueued)
+            {
+                // Ignore native callback if InputMethodContext is disposed or queued for disposal.
+                return;
+            }
+
             KeyboardTypeChangedEventArgs e = new KeyboardTypeChangedEventArgs();
 
             e.KeyboardType = type;
@@ -986,6 +1052,12 @@ namespace Tizen.NUI
 
         private void OnContentReceived(string content, string description, string mimeType)
         {
+            if (Disposed || IsDisposeQueued)
+            {
+                // Ignore native callback if InputMethodContext is disposed or queued for disposal.
+                return;
+            }
+
             ContentReceivedEventArgs e = new ContentReceivedEventArgs();
             e.Content = content;
             e.Description = description;