e_keyrouter: Fix key delivery in TOPMOST when focus client doesn't have surface 10/322610/1
authorduna.oh <duna.oh@samsung.com>
Fri, 11 Apr 2025 07:47:50 +0000 (16:47 +0900)
committerTizen Window System <tizen.windowsystem@gmail.com>
Fri, 11 Apr 2025 09:43:18 +0000 (18:43 +0900)
This patch fixes the issue that no keyevent is sent to a app which keygrabs
with TOPMOST mode when a focus client doesn't have a surface.

Consider the following scenario,
Launchscreen client is on display (has focus but doesn't have surface),
At the same time QuickLaunch app is running and uses TOPMOST mode for keygrabbings.
Key events should be sent to QuickLaunch app.

Change-Id: I9cb03484415782fd291fe285c6c341b9fd4042a3

src/bin/inputmgr/e_keyrouter_event.c

index 26c3ac72dddfd92272a83ad90118754a2a4ba818..932171a06f2c7df079a5194d0717e2a53922862a 100644 (file)
@@ -435,8 +435,8 @@ _e_keyrouter_send_key_events_press(int type, Ecore_Event_Key *ev, E_Device *dev)
      }
    g_rec_mutex_unlock(&krt->grab_key_mutex);
 
-   // Top position grab must need a focus surface.
-   if (surface_focus)
+   // Top position grab must need a focus client.
+   if (ec_focus)
      {
         g_rec_mutex_lock(&krt->grab_key_mutex);
         Eina_List *top_ptr_list = e_keyrouter_hardkeys_list_get(krt->HardKeys, keycode, TIZEN_KEYROUTER_MODE_TOPMOST);
@@ -444,12 +444,13 @@ _e_keyrouter_send_key_events_press(int type, Ecore_Event_Key *ev, E_Device *dev)
           {
              if (key_node_data)
                {
-                  if ((EINA_FALSE == krt->isWindowStackChanged) && (surface_focus == key_node_data->surface))
+                  if ((EINA_FALSE == krt->isWindowStackChanged) &&
+                      (surface_focus && surface_focus == key_node_data->surface))
                     {
                        _e_keyrouter_send_key_event(type, key_node_data->surface, NULL, ev, dev, key_node_data->focused,
                                                    TIZEN_KEYROUTER_MODE_TOPMOST);
 
-                       _e_keyrouter_log_key_event(key_event_log_type, "TOPMOST (TOP_POSITION)",
+                       _e_keyrouter_log_key_event(key_event_log_type, "TOPMOST (TOP & FOCUS)",
                                                   ev->keycode,
                                                   key_node_data->focused,
                                                   key_node_data->status,