Fix for highlight staying outside of the view port in case of scrolling fast 28/261528/5
authorLukasz Oleksak <l.oleksak@samsung.com>
Tue, 20 Jul 2021 15:47:18 +0000 (17:47 +0200)
committerLukasz Oleksak <l.oleksak@samsung.com>
Wed, 21 Jul 2021 09:43:25 +0000 (09:43 +0000)
This patch allows to continue finding the next/prev visible object in case
when after small delay the previously highlighted object has became not visible.

Change-Id: Ic69157cba16da93f78435f0b26a3c511d69431c8

src/navigator.c

index 2086da9ef24692e3fcd9f7b5cd221ade520be699..3e04d0fb7ccdda41496b3bbda084602b2f2b57cd 100644 (file)
@@ -100,6 +100,8 @@ struct _NavigatorData {
 
        following line could be removed when DALi atspi is working */
        unsigned char quickpanel_info;
+       Ecore_Timer *move_outed_timer;
+       AtspiMoveOutedType move_outed_type;
 };
 
 char *state_to_char(AtspiStateType state)
@@ -637,6 +639,26 @@ TIZEN_PROD_STATIC void _focus_next(NavigatorData *nd)
        DEBUG("END");
 }
 
+static Eina_Bool _check_context_valid_again(void *user_data)
+{
+       NavigatorData *nd = (NavigatorData *) user_data;
+       AppTrackerContextValidility val = app_tracker_context_valid_check(nd->app_tracker_data);
+       if (val == APP_TRACKER_CONTEXT_VALID) {
+               if (nd->move_outed_timer) {
+                       ecore_timer_del(nd->move_outed_timer);
+                       nd->move_outed_timer = NULL;
+                       nd->move_outed_type = ATSPI_MOVE_OUTED_NULL;
+               }
+               return ECORE_CALLBACK_CANCEL;
+       }
+       if (nd->move_outed_type == ATSPI_MOVE_OUTED_TOP_LEFT) {
+               navigator_focus_next_visible(nd);
+       } else if (nd->move_outed_type == ATSPI_MOVE_OUTED_BOTTOM_RIGHT) {
+               navigator_focus_prev_visible(nd);
+       }
+       return ECORE_CALLBACK_RENEW;
+}
+
 void navigator_focus_next_visible(NavigatorData *nd)
 {
        DEBUG("START");
@@ -654,6 +676,10 @@ void navigator_focus_next_visible(NavigatorData *nd)
                if (val == APP_TRACKER_CONTEXT_VALID) {
                        DEBUG("END - found");
                        _current_highlight_object_set(nd, obj, HIGHLIGHT_FIRST);
+                       if (!nd->move_outed_timer) {
+                               nd->move_outed_type = ATSPI_MOVE_OUTED_TOP_LEFT;
+                               nd->move_outed_timer = ecore_timer_add(0.2, _check_context_valid_again, nd);
+                       }
                        break;
                }
                if (val != APP_TRACKER_CONTEXT_CURRENT_NOT_VISIBLE) {
@@ -680,6 +706,10 @@ void navigator_focus_prev_visible(NavigatorData *nd)
                if (val == APP_TRACKER_CONTEXT_VALID) {
                        DEBUG("END - found");
                        _current_highlight_object_set(nd, obj, HIGHLIGHT_FIRST);
+                       if (!nd->move_outed_timer) {
+                               nd->move_outed_type = ATSPI_MOVE_OUTED_BOTTOM_RIGHT;
+                               nd->move_outed_timer = ecore_timer_add(0.2, _check_context_valid_again, nd);
+                       }
                        break;
                }
                if (val != APP_TRACKER_CONTEXT_CURRENT_NOT_VISIBLE) {
@@ -2675,7 +2705,7 @@ NavigatorData *navigator_init(void)
                ERROR("calloc(1,%zu) failed", sizeof(NavigatorData));
                return NULL;
        }
-
+       nd->move_outed_type = ATSPI_MOVE_OUTED_NULL;
        nd->gesture_start_p = (point_t) { .x = -1, .y = -1};
        nd->last_focus = (point_t) { .x = -1, .y = -1};
        nd->last_pos = (point_t) { .x = -1, .y = -1};
@@ -2726,6 +2756,11 @@ void navigator_shutdown(NavigatorData *nd)
                }
        }
 
+       if (nd->move_outed_timer) {
+               ecore_timer_del(nd->move_outed_timer);
+               nd->move_outed_timer = NULL;
+       }
+
        keyboard_tracker_unregister_top_window_info_get(nd->keyboard_tracker_data);
        keyboard_tracker_shutdown(nd->keyboard_tracker_data);
        nd->keyboard_tracker_data = NULL;