Fix issue floating mode does not set when no focus 43/306443/1
authorInhong Han <inhong1.han@samsung.com>
Wed, 21 Feb 2024 01:05:59 +0000 (10:05 +0900)
committerInhong Han <inhong1.han@samsung.com>
Wed, 21 Feb 2024 10:32:10 +0000 (19:32 +0900)
Change-Id: Ie8c95bc2a704b457dc7baa118815073921f898d8

src/e_mod_input_panel.c
src/e_mod_main.c
src/e_mod_main.h

index 95f5b2d..2d79a5a 100644 (file)
@@ -89,6 +89,12 @@ struct _E_Input_Panel_Floating_Info
         int landscape_x;
         int landscape_y;
      } start_position;
+
+   struct
+     {
+        int x;
+        int y;
+     } pending_position;
 };
 
 static E_Input_Panel *g_input_panel = NULL;
@@ -575,6 +581,7 @@ _e_input_panel_position_set(E_Client *ec, int w, int h)
         _e_input_panel_convert_floating_position(ec, sx, sy, &nx, &ny, E_INPUT_PANEL_COORDINATE_TYPE_LOGICAL);
      }
 
+   LOGI("nx : %d, ny : %d", nx, ny);
    e_client_util_move_without_frame(ec, nx, ny);
 }
 
@@ -1517,7 +1524,16 @@ e_input_panel_floating_position_set(int x, int y)
           }
      }
 
-   if (!floating_ec || !floating_ips || !g_floating_info) return;
+   if (!floating_ec || !floating_ips)
+     {
+        LOGE("Failed to get floating client");
+        if (g_floating_info && e_text_input_activation_state_get())
+          {
+             g_floating_info->pending_position.x = x;
+             g_floating_info->pending_position.y = y;
+          }
+        return;
+     }
 
    if (floating_ips->showing)
      cur_angle = floating_ec->e.state.rot.ang.curr;
@@ -1618,9 +1634,22 @@ void e_input_panel_floating_panel_set(Eina_Bool state)
              if (ips->ec->vkbd.floating == state) continue;
              ips->ec->vkbd.floating = state;
              if (ips->ec->vkbd.floating)
-               e_policy_conformant_part_del(ips->ec);
+               {
+                  e_policy_conformant_part_del(ips->ec);
+
+                  if (e_text_input_activation_state_get() && g_floating_info &&
+                      g_floating_info->pending_position.x >= 0 && g_floating_info->pending_position.y >= 0)
+                    {
+                       e_input_panel_floating_position_set(g_floating_info->pending_position.x, g_floating_info->pending_position.y);
+                    }
+
+                  e_input_panel_pending_position_reset();
+               }
              else
-               e_policy_conformant_part_add(ips->ec);
+               {
+                  e_policy_conformant_part_add(ips->ec);
+                  e_input_panel_pending_position_reset();
+               }
           }
      }
 }
@@ -1649,3 +1678,12 @@ Eina_Bool e_input_panel_floating_mode_get()
 
    return ret;
 }
+
+void e_input_panel_pending_position_reset(void)
+{
+   if (g_floating_info)
+     {
+        g_floating_info->pending_position.x = -1;
+        g_floating_info->pending_position.y = -1;
+     }
+}
\ No newline at end of file
index d655d35..01c2f97 100644 (file)
@@ -1271,6 +1271,8 @@ _e_text_input_cb_activate(struct wl_client *client, struct wl_resource *resource
    if (old)
      _e_text_input_deactivate(old, input_method, EINA_TRUE);
 
+   e_input_panel_pending_position_reset();
+
    input_method->input = text_input;
    text_input->input_methods = eina_list_append(text_input->input_methods, input_method);
 
index 2bc59c3..fe651e8 100644 (file)
@@ -29,6 +29,7 @@ void        e_input_panel_floating_panel_set(Eina_Bool state);
 void        e_input_panel_floating_drag_enabled(Eina_Bool enabled);
 Eina_Bool   e_input_panel_floating_mode_get(void);
 Eina_Bool   e_text_input_activation_state_get(void);
+void        e_input_panel_pending_position_reset(void);
 
 typedef enum {
    TIZEN_PROFILE_UNKNOWN = 0,