static void _window_append(WindowTrackerData *wtd, AtspiAccessible *window, Eina_Bool view_change_need,
Eina_Bool keyboard_window_is, WindowActivateInfoType window_activate_info_type)
{
+ // Increase reference count immediately to guard against g_object_unref() in the loop below.
+ // This is a danger only if 'window == wi->window', which is a stricter condition than
+ // atspi_accessible_is_equal(window, wi->window), which can be true even if 'window != wi->window'.
+ g_object_ref(window);
+
_purge_windows_list(wtd);
/* Remove window first if it exists already */
WindowInfo *wi;
wi = g_malloc0(sizeof(WindowInfo));
if (!wi) {
DEBUG("Memory allocation by g_malloc0 is failed");
+ g_object_unref(window);
return;
}
- wi->window = g_object_ref(window);
+ wi->window = window;
wi->keyboard_window_is = keyboard_window_is;
wi->view_change_need = view_change_need;
wi->window_activate_info_type = window_activate_info_type;
gchar *id = atspi_accessible_get_unique_id(wi->window, NULL);
DEBUG("Check upper window: %s, keyboard window: %d", id, wi->keyboard_window_is);
g_free(id);
- if (wi->keyboard_window_is)
+ if (wi->keyboard_window_is) {
wtd->window_infos = eina_list_remove(wtd->window_infos, wi);
+ g_object_unref(wi->window);
+ g_free(wi);
+ }
} else
DEBUG("Current window info list is emtpy");
}
g_free(bus_name);
}
- EINA_LIST_FOREACH(window_list, l, window) {
+ EINA_LIST_FREE(window_list, window) {
_window_remove(wtd, window);
g_object_unref(window);
}