window_tracker: improve code safety 64/324164/1 accepted/tizen_unified accepted/tizen_unified_x tizen accepted/tizen/unified/20250514.114156 accepted/tizen/unified/x/20250515.044723
authorMichal Szczecinski <m.szczecinsk@partner.samsung.com>
Tue, 13 May 2025 13:34:06 +0000 (15:34 +0200)
committerMichal Szczecinski <m.szczecinsk@partner.samsung.com>
Tue, 13 May 2025 13:34:06 +0000 (15:34 +0200)
Change-Id: I1664907750979680ee7480ec4afc8522c25f92ff

src/window_tracker.c

index e52bab76d770910e7a25f73b79d77a170ccde16f..030e0465a25437addf607f3225a6926f35d19f42 100644 (file)
@@ -205,7 +205,7 @@ static uint32_t _window_resource_id_get(AtspiAccessible *window)
        return resource_id;
 }
 
-static void _window_append(WindowTrackerData *wtd, AtspiAccessible *window, Eina_Bool view_change_need,
+static bool _window_append(WindowTrackerData *wtd, AtspiAccessible *window, Eina_Bool view_change_need,
                                                   Eina_Bool keyboard_window_is, WindowActivateInfoType window_activate_info_type, Eina_Bool is_focused)
 {
        // Increase reference count immediately to guard against g_object_unref() in the loop below.
@@ -231,7 +231,7 @@ static void _window_append(WindowTrackerData *wtd, AtspiAccessible *window, Eina
        if (!wi) {
                DEBUG("Memory allocation by g_malloc0 is failed");
                g_object_unref(window);
-               return;
+               return false;
        }
        wi->window = window;
        wi->keyboard_window_is = keyboard_window_is;
@@ -246,6 +246,7 @@ static void _window_append(WindowTrackerData *wtd, AtspiAccessible *window, Eina
        DEBUG("Window appended: %s", id);
        g_free(id);
        _window_stack_print(wtd);
+       return true;
 }
 
 static AtspiAccessible *_top_focused_window_get(WindowTrackerData *wtd, Eina_Bool include_keyboard)
@@ -388,6 +389,7 @@ static void _active_window_set(WindowTrackerData *wtd, AtspiAccessible *window,
 static void _on_atspi_window_cb(AtspiEvent *event, void *user_data)
 {
        WindowTrackerData *wtd = user_data;
+       bool ret = false;
 
        gchar *name = atspi_accessible_get_name(event->source, NULL);
 
@@ -410,8 +412,8 @@ static void _on_atspi_window_cb(AtspiEvent *event, void *user_data)
                        window_tracker_keyboard_window_append(wtd);
                        goto end;
                }
-               _window_append(wtd, event->source, EINA_TRUE, EINA_FALSE, window_activate_info_type, EINA_TRUE);
-               _active_window_set(wtd, event->source, EINA_TRUE);
+               ret = _window_append(wtd, event->source, EINA_TRUE, EINA_FALSE, window_activate_info_type, EINA_TRUE);
+               if (ret == true) _active_window_set(wtd, event->source, EINA_TRUE);
        } else if (!g_strcmp0(event->type, "window:deactivate")) {
                _active_window_set(wtd, event->source, EINA_FALSE);
        } else if (!g_strcmp0(event->type, "window:destroy")) {
@@ -426,8 +428,8 @@ static void _on_atspi_window_cb(AtspiEvent *event, void *user_data)
                if (event->detail1) { /* Visible */
                        if (role == ATSPI_ROLE_WINDOW || keyboard_is) {
                                DEBUG("Append %sWindow", keyboard_is ? "Keyboard " : "");
-                               _window_append(wtd, event->source, !keyboard_is, keyboard_is, ACCESSIBLE_WINDOW_ACTIVATE_INFO_DEFAULT_LABEL_ENABLED, EINA_TRUE);
-                               if (!keyboard_is)
+                               ret = _window_append(wtd, event->source, !keyboard_is, keyboard_is, ACCESSIBLE_WINDOW_ACTIVATE_INFO_DEFAULT_LABEL_ENABLED, EINA_TRUE);
+                               if (!keyboard_is && ret)
                                        _active_window_set(wtd, event->source, EINA_TRUE);
                        }
                } else { /* Invisible */
@@ -441,8 +443,8 @@ static void _on_atspi_window_cb(AtspiEvent *event, void *user_data)
                AtspiRole role = atspi_accessible_get_role(event->source, NULL);
                if (role == ATSPI_ROLE_FRAME) {
                        if (event->detail1) {
-                               _window_append(wtd, event->source, EINA_TRUE, EINA_FALSE, ACCESSIBLE_WINDOW_ACTIVATE_INFO_DEFAULT_LABEL_ENABLED, EINA_TRUE);
-                               _active_window_set(wtd, event->source, EINA_TRUE);
+                               ret = _window_append(wtd, event->source, EINA_TRUE, EINA_FALSE, ACCESSIBLE_WINDOW_ACTIVATE_INFO_DEFAULT_LABEL_ENABLED, EINA_TRUE);
+                               if (ret) _active_window_set(wtd, event->source, EINA_TRUE);
                        } else
                                _window_remove(wtd, event->source);
                }
@@ -656,14 +658,15 @@ AtspiAccessible *window_tracker_top_window_get(WindowTrackerData *wtd, Eina_Bool
 
 void window_tracker_window_append(WindowTrackerData *wtd, AtspiAccessible *window, Eina_Bool is_focused)
 {
+       bool ret = false;
        if (atspi_accessible_is_equal(wtd->keyboard_window, window)) {
                window_tracker_keyboard_window_append(wtd);
                return;
        }
-       _window_append(wtd, window, EINA_TRUE, EINA_FALSE, ACCESSIBLE_WINDOW_ACTIVATE_INFO_DEFAULT_LABEL_ENABLED, is_focused);
+       ret = _window_append(wtd, window, EINA_TRUE, EINA_FALSE, ACCESSIBLE_WINDOW_ACTIVATE_INFO_DEFAULT_LABEL_ENABLED, is_focused);
 
        // is_focused is true when this is called from focus_widget. Hence, we should switch focus to the given window.
-       if (is_focused)
+       if (is_focused && ret)
                _active_window_set(wtd, window, EINA_TRUE);
 }