Prevent to send deactivate after destroy message 33/244933/1
authorJihoon Kim <jihoon48.kim@samsung.com>
Mon, 28 Sep 2020 05:52:33 +0000 (14:52 +0900)
committerJihoon Kim <jihoon48.kim@samsung.com>
Mon, 28 Sep 2020 05:52:33 +0000 (14:52 +0900)
Change-Id: Ia3f87fb6f1e0aac54df82737b61f95619179c33c
Signed-off-by: Jihoon Kim <jihoon48.kim@samsung.com>
src/e_mod_main.c

index 8e092d5..fd1364c 100644 (file)
@@ -86,6 +86,8 @@ struct _E_Input_Method
    E_Input_Method_Context *context;
 };
 
+static struct wl_resource *destroyed_resource = NULL;
+
 struct _E_Input_Method_Context
 {
    struct wl_resource *resource;
@@ -500,7 +502,10 @@ _e_mod_text_input_shutdown_cb_add(void (*func)(void *data), void *data)
 static void
 _e_text_input_method_context_cb_destroy(struct wl_client *client EINA_UNUSED, struct wl_resource *resource)
 {
-   LOGD("resource : %p", resource);
+   E_Input_Method_Context *context = wl_resource_get_user_data(resource);
+
+   LOGD("resource(%p), context(%p), context->input(%p), context->input_method(%p)", resource, context, context->input, context->input_method);
+
    wl_resource_destroy(resource);
 }
 
@@ -1093,7 +1098,6 @@ _e_text_input_method_context_cb_update_ise_geometry(struct wl_client *client EIN
          _e_text_input_send_input_panel_geometry(context->input->resource, x, y, width, height);
          g_updated_geometry = EINA_TRUE;
       }
-
 }
 
 static void
@@ -1154,7 +1158,7 @@ _e_text_input_method_context_cb_resource_destroy(struct wl_resource *resource)
      }
 #endif
 
-   LOGD("resource : %p", resource);
+   LOGD("resource(%p), context(%p)", resource, context);
 
    if ((context->input_method) &&
        (context->input_method->context == context))
@@ -1237,10 +1241,20 @@ _e_text_input_deactivate(E_Text_Input *text_input, E_Input_Method *input_method,
              _e_text_input_method_context_grab_set(input_method->context,
                                                    EINA_FALSE);
 #endif
-             /* TODO: finish the grab of keyboard. */
-             wl_input_method_send_deactivate(input_method->resource,
-                                             input_method->context->resource,
-                                             need_focus_in);
+             if (input_method->resource == destroyed_resource)
+               {
+                  LOGD("deactivate skipped : %p %p", input_method->resource,
+                       input_method->context->resource);
+               }
+             else
+               {
+                  /* TODO: finish the grab of keyboard. */
+                  wl_input_method_send_deactivate(input_method->resource,
+                                                  input_method->context->resource,
+                                                  need_focus_in);
+                  LOGD("wm_map TEXTINPUT deactivate : %p %p", input_method->resource,
+                       input_method->context->resource);
+               }
           }
 
         if (ecore_key_down_handler)
@@ -1249,7 +1263,10 @@ _e_text_input_deactivate(E_Text_Input *text_input, E_Input_Method *input_method,
              ecore_key_down_handler = NULL;
           }
 
-        LOGD("Resetting input_method->input : %p, text_input : %p", input_method->input, text_input);
+        LOGD("Resetting input_method->input : %p, text_input : %p, %p %p",
+                               input_method->input, text_input,
+                               input_method->resource,
+                               (input_method->context ? input_method->context->resource : NULL));
         input_method->input = NULL;
         if (input_method->context) input_method->context->input = NULL;
         input_method->context = NULL;
@@ -1332,7 +1349,11 @@ _e_text_input_cb_activate(struct wl_client *client, struct wl_resource *resource
         input_method->context = context;
 
         if (context->resource)
-          wl_input_method_send_activate(input_method->resource, context->resource, text_input->id, EINA_TRUE);
+          {
+             wl_input_method_send_activate(input_method->resource, context->resource, text_input->id, EINA_TRUE);
+             LOGD("wm_map TEXTINPUT activate : %p %p", input_method->resource,
+                  context->resource);
+          }
         else
           WRN("Failed to send activate due to no resource in context");
      }
@@ -1431,6 +1452,10 @@ _e_text_input_method_create_context(struct wl_client *client, E_Input_Method *in
 
    wl_input_method_send_activate(input_method->resource, context->resource, text_input->id, need_focus_out);
 
+        LOGD("wm_map TEXTINPUT activate : %p %p", input_method->resource,
+                        context->resource);
+        destroyed_resource = NULL;
+
    return EINA_TRUE;
 }
 
@@ -2079,7 +2104,7 @@ _e_text_input_cb_resource_destroy(struct wl_resource *resource)
         return;
      }
 
-  LOGD("resource : %p", resource);
+   LOGD("resource : %p", resource);
 
    if (g_show_text_input == text_input)
      {
@@ -2132,14 +2157,20 @@ _e_text_input_cb_destroy(struct wl_client *client, struct wl_resource *resource)
         return;
      }
 
-   LOGD("text_input : %p, input_method : %p, resource : %p", text_input, input_method, resource);
+   LOGD("text_input(%p), input_method(%p), context(%p), context->resource(%p) resource(%p)", text_input, input_method, input_method->context, (input_method->context ? input_method->context->resource : NULL), resource);
 
    if ((!input_method->context) || (!input_method->context->resource))
      _context_created = _e_text_input_method_create_context(client, input_method, text_input, EINA_FALSE);
 
    if (text_input == g_text_input &&
        input_method->resource && input_method->context && input_method->context->resource)
-     wl_input_method_send_destroy(input_method->resource, input_method->context->resource);
+     {
+        wl_input_method_send_destroy(input_method->resource, input_method->context->resource);
+        LOGD("wm_map TEXTINPUT destroy : %p %p", input_method->resource,
+             input_method->context->resource);
+
+        destroyed_resource = input_method->resource;
+     }
 
    if (_context_created)
      _e_text_input_deactivate(text_input, input_method, EINA_FALSE);