Add focus_event flags to identify the request after the focus_out is called 71/110571/2
authorInHong Han <inhong1.han@samsung.com>
Thu, 12 Jan 2017 08:16:45 +0000 (17:16 +0900)
committerInHong Han <inhong1.han@samsung.com>
Tue, 17 Jan 2017 05:37:24 +0000 (14:37 +0900)
Unnecessary focus event occurred when calling the hide_input_panel() after
the focus_out event is called.
Change-Id: If10d0cfdcc05ffbd489e40bf97e83030abb86366

src/e_mod_main.c

index 473fe39..81e35a7 100644 (file)
@@ -129,8 +129,8 @@ static struct _E_Input_Method_Keymap_Info g_keymap_info[] = {
    {"ru_RU", "evdev", "pc105", "ru"},
 };
 
-static void _e_text_input_deactivate(E_Text_Input *text_input, E_Input_Method *input_method);
-static Eina_Bool _e_text_input_method_create_context(struct wl_client *client, E_Input_Method *input_method, E_Text_Input *text_input);
+static void _e_text_input_deactivate(E_Text_Input *text_input, E_Input_Method *input_method, Eina_Bool need_focus_in);
+static Eina_Bool _e_text_input_method_create_context(struct wl_client *client, E_Input_Method *input_method, E_Text_Input *text_input, Eina_Bool need_focus_out);
 
 static void
 _e_text_input_log_show(struct wl_resource *resource, uint32_t code, const char *msg, const char *warning_msg)
@@ -244,14 +244,15 @@ _input_panel_hide(struct wl_client *client, struct wl_resource *resource, Eina_B
       Because input_panel_hide event can be called after focus_out(deactivate) by application.
       And Input Method(IME) should know the state of their own input_panel to manage their resource when the input_panel is hidden.
     */
-   if (input_method && (!input_method->context || !input_method->context->resource))
-     _context_created = _e_text_input_method_create_context(client, input_method, text_input);
+   if (input_method && 
+       ((!input_method->context) || (!input_method->context->resource)))
+     _context_created = _e_text_input_method_create_context(client, input_method, text_input, EINA_FALSE);
 
    if (input_method && input_method->resource && input_method->context && input_method->context->resource)
      wl_input_method_send_hide_input_panel(input_method->resource, input_method->context->resource);
 
    if (_context_created)
-     _e_text_input_deactivate(text_input, input_method);
+     _e_text_input_deactivate(text_input, input_method, EINA_FALSE);
 
    e_input_panel_wait_update_set(EINA_FALSE);
 }
@@ -991,7 +992,7 @@ _e_mod_ecore_key_down_cb(void *data, int type, void *event)
 }
 
 static void
-_e_text_input_deactivate(E_Text_Input *text_input, E_Input_Method *input_method)
+_e_text_input_deactivate(E_Text_Input *text_input, E_Input_Method *input_method, Eina_Bool need_focus_in)
 {
    if (input_method->model == text_input)
      {
@@ -1003,7 +1004,8 @@ _e_text_input_deactivate(E_Text_Input *text_input, E_Input_Method *input_method)
 #endif
              /* TODO: finish the grab of keyboard. */
              wl_input_method_send_deactivate(input_method->resource,
-                                             input_method->context->resource);
+                                             input_method->context->resource,
+                                             need_focus_in);
           }
 
         if (ecore_key_down_handler)
@@ -1062,7 +1064,7 @@ _e_text_input_cb_activate(struct wl_client *client, struct wl_resource *resource
      return;
 
    if (old)
-     _e_text_input_deactivate(old, input_method);
+     _e_text_input_deactivate(old, input_method, EINA_TRUE);
 
    input_method->model = text_input;
    text_input->input_methods = eina_list_append(text_input->input_methods, input_method);
@@ -1096,7 +1098,7 @@ _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);
+          wl_input_method_send_activate(input_method->resource, context->resource, text_input->id, EINA_TRUE);
      }
 
 #ifdef _TV
@@ -1152,11 +1154,11 @@ _e_text_input_cb_deactivate(struct wl_client *client EINA_UNUSED, struct wl_reso
         return;
      }
 
-   _e_text_input_deactivate(text_input, input_method);
+   _e_text_input_deactivate(text_input, input_method, EINA_TRUE);
 }
 
 static Eina_Bool
-_e_text_input_method_create_context(struct wl_client *client, E_Input_Method *input_method, E_Text_Input *text_input)
+_e_text_input_method_create_context(struct wl_client *client, E_Input_Method *input_method, E_Text_Input *text_input, Eina_Bool need_focus_out)
 {
    E_Input_Method_Context *context = NULL;
 
@@ -1189,7 +1191,7 @@ _e_text_input_method_create_context(struct wl_client *client, E_Input_Method *in
    context->input_method = input_method;
    input_method->context = context;
 
-   wl_input_method_send_activate(input_method->resource, context->resource, text_input->id);
+   wl_input_method_send_activate(input_method->resource, context->resource, text_input->id, need_focus_out);
 
    return EINA_TRUE;
 }
@@ -1219,7 +1221,7 @@ _e_text_input_cb_input_panel_show(struct wl_client *client, struct wl_resource *
     * Because input_panel_show event can be called before focus_in(activate) by application.
     * And Input Method(IME) should know the state of their own input_panel to manage their resource when the input_panel is shown. */
    if (input_method && (!input_method->context || !input_method->context->resource))
-     _e_text_input_method_create_context(client, input_method, text_input);
+     _e_text_input_method_create_context(client, input_method, text_input, EINA_TRUE);
 
    if (input_method && input_method->resource && input_method->context && input_method->context->resource)
      {
@@ -1695,7 +1697,7 @@ _e_text_input_cb_resource_destroy(struct wl_resource *resource)
 
    EINA_LIST_FREE(text_input->input_methods, input_method)
      {
-        _e_text_input_deactivate(text_input, input_method);
+        _e_text_input_deactivate(text_input, input_method, EINA_TRUE);
      }
 
    free(text_input);
@@ -1804,7 +1806,7 @@ _e_text_input_method_cb_unbind(struct wl_resource *resource)
    if (input_method->resource != resource) return;
 
    if (input_method->model)
-     _e_text_input_deactivate(input_method->model, input_method);
+     _e_text_input_deactivate(input_method->model, input_method, EINA_TRUE);
 
    input_method->resource = NULL;
    input_method->context = NULL;