[screen-reader] Rebuild context if top window is purged 18/229618/3 submit/tizen/20200405.220557 submit/tizen/20200406.235844 submit/tizen/20200407.212858
authorPrasoon Singh <prasoon.16@samsung.com>
Tue, 31 Mar 2020 06:20:56 +0000 (11:50 +0530)
committerArtur Świgoń <a.swigon@samsung.com>
Thu, 2 Apr 2020 12:19:12 +0000 (14:19 +0200)
In cases, where top window is defunct & then purged before it
can actually removed in activate/visibility change signal, context
is not updated. So, rebuilding context updated for such case.

Change-Id: I793a18a6ccf032c5900e4711888d0fe4b6b544af
Signed-off-by: Prasoon Singh <prasoon.16@samsung.com>
(cherry picked from commit 12041da3ca36119c2fd5cebd416a96051be42c48)

src/window_tracker.c

index 4e4283b786dd84d79fa6ca15bca089aa356ac59b..4d8c076bb81e31d112314b908c117b298346a5c5 100644 (file)
@@ -180,13 +180,41 @@ static void _purge_windows_list()
        DEBUG("purging");
        Window_Info *wi;
        Eina_List *l, *l_prev;
+       Eina_Bool view_change_need = EINA_FALSE;
+       Eina_Bool keyboard_window_is = EINA_FALSE;
+       int removed_index = 0;
        EINA_LIST_REVERSE_FOREACH_SAFE(window_infos, l, l_prev, wi) {
                if (!wi) continue;
                if (_window_need_to_be_purged(wi)) {
+                       if (removed_index == 0 ) {
+                               view_change_need = wi->view_change_need;
+                               keyboard_window_is = wi->keyboard_window_is;
+                       }
                        g_object_unref(wi->window);
                        g_free(wi->rect);
                        g_free(wi);
                        window_infos = eina_list_remove_list(window_infos, l);
+                       removed_index++;
+               }
+       }
+
+       //if purged window is top window rebuild context
+       if (view_change_need && user_cb && !keyboard_window_is) {
+               Window_Info* wi_top = eina_list_last_data_get(window_infos);
+               if (wi_top) {
+                       AtspiAccessible *top_window = wi_top->window;
+                       if (wi_top->keyboard_window_is) {
+                               int count = eina_list_count(window_infos);
+                               wi_top = (count > 1) ? eina_list_nth(window_infos, count - 2) : NULL;
+                               if (wi_top)
+                                       top_window = wi_top->window;
+                               else
+                                       top_window = NULL;
+                       }
+                       if (top_window) {
+                               DEBUG("Rebuild context as top window was purged.");
+                               user_cb(user_data, top_window);
+                       }
                }
        }
 }