Support for popups
authorPatryk Kaczmarek <patryk.k@samsung.com>
Tue, 7 Jul 2015 14:53:13 +0000 (16:53 +0200)
committerAgnieszka Janowicz <a.janowicz@samsung.com>
Sun, 12 Jul 2015 11:26:59 +0000 (13:26 +0200)
Change-Id: Ib8f9f6f292a1372edea99b4ff28a21120f272411
Signed-off-by: Patryk Kaczmarek <patryk.k@samsung.com>
res/po/en_US.po
src/app_tracker.c
src/flat_navi.c
src/navigator.c

index 443c516..80050aa 100644 (file)
@@ -37,6 +37,15 @@ msgstr "Tab %1$d of %2$d"
 msgid "IDS_TRAIT_TEXT_EDIT"
 msgstr "Double tap to edit"
 
+msgid "IDS_TRAIT_SHOWING"
+msgstr "Showing"
+
+msgid "IDS_TRAIT_ITEMS"
+msgstr "Items"
+
+msgid "IDS_TRAIT_POPUP_CLOSE"
+msgstr "double tap to close it"
+
 msgid "IDS_TRAIT_TEXT_EDIT_FOCUSED"
 msgstr "Editing, flick up and down to adjust position."
 
index a460cdd..88a3cd2 100644 (file)
@@ -78,8 +78,7 @@ _on_atspi_event_cb(const AtspiEvent *event)
          return;
       }
 
-   if ((atspi_accessible_get_role(event->source, NULL) == ATSPI_ROLE_DESKTOP_FRAME) ||
-         !strcmp(event->type, "object:children-changed"))
+   if ((atspi_accessible_get_role(event->source, NULL) == ATSPI_ROLE_DESKTOP_FRAME))
       {
          return;
       }
index 4c63216..e4a39ef 100644 (file)
@@ -42,6 +42,7 @@ static const AtspiRole interesting_roles[] =
    ATSPI_ROLE_PANEL,
    ATSPI_ROLE_PARAGRAPH,
    ATSPI_ROLE_PASSWORD_TEXT,
+   ATSPI_ROLE_POPUP_MENU,
    ATSPI_ROLE_PUSH_BUTTON,
    ATSPI_ROLE_PROGRESS_BAR,
    ATSPI_ROLE_RADIO_BUTTON,
@@ -171,6 +172,10 @@ _no_need_for_focusable_state(AtspiAccessible *obj)
          if (_obj_state_visible_and_showing(obj, EINA_TRUE))
             return EINA_TRUE;
          break;
+      case ATSPI_ROLE_MENU_ITEM:
+         if (_obj_state_visible_and_showing(obj, EINA_TRUE))
+            return EINA_TRUE;
+         break;
       case ATSPI_ROLE_PROGRESS_BAR:
          if (_obj_state_visible_and_showing(obj, EINA_FALSE))
             return EINA_TRUE;
@@ -186,6 +191,9 @@ _no_need_for_focusable_state(AtspiAccessible *obj)
       case ATSPI_ROLE_PUSH_BUTTON:
          if (_obj_state_visible_and_showing(obj, EINA_FALSE))
             return EINA_TRUE;
+      case ATSPI_ROLE_POPUP_MENU:
+         if (_obj_state_visible_and_showing(obj, EINA_FALSE))
+            return EINA_TRUE;
          break;
       default:
          return EINA_FALSE;
@@ -259,6 +267,48 @@ _filter_viewport_cb(const void *container, void *data, void *fdata)
    return EINA_TRUE;
 }
 
+static Eina_Bool
+_check_if_object_has_modal_parent(AtspiAccessible *obj)
+{
+   DEBUG("START");
+
+   AtspiAccessible *parent = atspi_accessible_get_parent(obj, NULL);
+
+   if (!parent)
+      return EINA_FALSE;
+
+   AtspiStateSet *ss = atspi_accessible_get_state_set(parent);
+
+   if (atspi_state_set_contains(ss, ATSPI_STATE_MODAL))
+      {
+         g_object_unref(ss);
+         return EINA_TRUE;
+      }
+   else if (_check_if_object_has_modal_parent(parent))
+      return EINA_TRUE;
+   else
+      return EINA_FALSE;
+}
+
+static Eina_Bool
+_filter_ctx_popup_child_cb(const void *container, void *data, void *fdata)
+{
+   DEBUG("START");
+   AtspiAccessible *obj = fdata;
+   AtspiRole role = atspi_accessible_get_role(obj, NULL);
+
+   if (role == ATSPI_ROLE_NOTIFICATION)
+      return EINA_TRUE;
+
+   if (role == ATSPI_ROLE_POPUP_MENU)
+      return EINA_TRUE;
+
+   if (_check_if_object_has_modal_parent(obj))
+      return EINA_TRUE;
+
+   return EINA_FALSE;
+}
+
 static Eina_List*
 _flat_review_candidates_get(AtspiAccessible *root)
 {
@@ -271,6 +321,9 @@ _flat_review_candidates_get(AtspiAccessible *root)
    Eina_List *l, *ln;
    AtspiAccessible *obj;
 
+   AtspiRole role;
+   gboolean with_ctx_popup = EINA_FALSE;
+
    // remove object that are not in root's viewport
 
    const ObjectCache *oc = object_cache_get(root);
@@ -298,7 +351,18 @@ _flat_review_candidates_get(AtspiAccessible *root)
    EINA_LIST_FOREACH_SAFE(ret, l, ln, obj)
    {
       DEBUG("Name:[%s] Role:[%s]", atspi_accessible_get_name(obj, NULL), atspi_accessible_get_role_name(obj, NULL));
+      role = atspi_accessible_get_role(obj, NULL);
+
+      if (role == ATSPI_ROLE_POPUP_MENU)
+         with_ctx_popup = EINA_TRUE;
    }
+   if (with_ctx_popup)
+      {
+         with_ctx_popup = EINA_FALSE;
+         FilterResult fr3 = _accessible_list_split_with_filter(ret, _filter_ctx_popup_child_cb, NULL);
+         ret = fr3.success;
+         _accessible_list_free(fr3.failure);
+      }
 
    return ret;
 }
index ee3e60a..5e6cf10 100644 (file)
 
 #define DISTANCE_NB 8
 #define MENU_ITEM_TAB_INDEX_SIZE 16
-#define HOVERSEL_TRAIT_SIZE 70
+#define HOVERSEL_TRAIT_SIZE 200
 #define TTS_MAX_TEXT_SIZE  2000
 #define GESTURE_LIMIT 10
 
+
 //Timeout in ms which will be used as interval for handling ongoing
 //hoved gesture updates. It is introduced to improve performance.
 //Even if user makes many mouse move events within hover gesture
@@ -185,6 +186,8 @@ display_info_about_object(AtspiAccessible *obj)
    GArray *states = atspi_state_set_get_states (st);
    AtspiComponent *comp = atspi_accessible_get_component_iface(obj);
    AtspiValue *value = atspi_accessible_get_value_iface(obj);
+   AtspiRect *rect_screen = atspi_component_get_extents(comp, ATSPI_COORD_TYPE_SCREEN, NULL);
+   AtspiRect *rect_win = atspi_component_get_extents(comp, ATSPI_COORD_TYPE_WINDOW, NULL);
 
    DEBUG("NAME:%s", name);
    DEBUG("ROLE:%s", role)
@@ -208,6 +211,10 @@ display_info_about_object(AtspiAccessible *obj)
          free(state_name);
       }
    DEBUG("LOCALE:%s", atspi_accessible_get_object_locale(obj, NULL));
+   DEBUG("SIZE ON SCREEN, width:%d, height:%d",rect_screen->width, rect_screen->height);
+   DEBUG("POSITION ON SCREEN: x:%d y:%d", rect_screen->x, rect_screen->y);
+   DEBUG("SIZE ON WIN, width:%d, height:%d",rect_win->width, rect_win->height);
+   DEBUG("POSITION ON WIN: x:%d y:%d", rect_win->x, rect_win->y);
    DEBUG("------------------------");
    DEBUG("END");
 }
@@ -216,19 +223,30 @@ char *
 generate_description_for_subtrees(AtspiAccessible *obj)
 {
    DEBUG("START");
-   if (!obj)
-      return strdup("");
-   int child_count = atspi_accessible_get_child_count(obj, NULL);
-
-   DEBUG("There is %d children inside this filler", child_count);
-   if (!child_count)
-      return strdup("");
 
+   AtspiRole role;
+   int child_count;
    int i;
    char *name = NULL;
    char *below = NULL;
    char ret[TTS_MAX_TEXT_SIZE] = "\0";
    AtspiAccessible *child = NULL;
+
+   if (!obj)
+      return strdup("");
+
+   role = atspi_accessible_get_role(obj, NULL);
+
+   // Do not generate that for popups
+   if (role == ATSPI_ROLE_POPUP_MENU)
+      return strdup("");
+
+   child_count = atspi_accessible_get_child_count(obj, NULL);
+
+   DEBUG("There is %d children inside this object", child_count);
+   if (!child_count)
+      return strdup("");
+
    for (i=0; i < child_count; i++)
       {
          child = atspi_accessible_get_child_at_index(obj, i, NULL);
@@ -282,6 +300,30 @@ generate_trait(AtspiAccessible *obj)
          snprintf(tab_index, MENU_ITEM_TAB_INDEX_SIZE, _("IDS_TRAIT_MENU_ITEM_TAB_INDEX"), index+1, children_count);
          strncat(ret, tab_index, sizeof(ret) - strlen(ret) - 1);
       }
+   else if (role == ATSPI_ROLE_POPUP_MENU)
+      {
+         char *role_name = atspi_accessible_get_localized_role_name(obj, NULL);
+         strncat(ret, role_name, sizeof(ret) - strlen(ret) - 1);
+         strncat(ret, ", ", sizeof(ret) - strlen(ret) - 1);
+
+         int children_count = atspi_accessible_get_child_count(obj, NULL);
+         char trait[HOVERSEL_TRAIT_SIZE];
+
+         snprintf(trait, HOVERSEL_TRAIT_SIZE, _("IDS_TRAIT_SHOWING"));
+         strncat(ret, trait, sizeof(ret) - strlen(ret) - 1);
+         strncat(ret, " ", sizeof(ret) - strlen(ret) - 1);
+
+         snprintf(trait, HOVERSEL_TRAIT_SIZE, "%d", children_count);
+         strncat(ret, trait, sizeof(ret) - strlen(ret) - 1);
+         strncat(ret, " ", sizeof(ret) - strlen(ret) - 1);
+
+         snprintf(trait, HOVERSEL_TRAIT_SIZE, _("IDS_TRAIT_ITEMS"));
+         strncat(ret, trait, sizeof(ret) - strlen(ret) - 1);
+         strncat(ret, ", ", sizeof(ret) - strlen(ret) - 1);
+
+         snprintf(trait, HOVERSEL_TRAIT_SIZE, _("IDS_TRAIT_POPUP_CLOSE"));
+         strncat(ret, trait, sizeof(ret) - strlen(ret) - 1);
+      }
    else if (role == ATSPI_ROLE_GLASS_PANE)
       {
          AtspiAccessible *parent = atspi_accessible_get_parent(obj, NULL);