Enable popup highlight only if it has 1 additional atspi action
authorAgnieszka Janowicz <a.janowicz@samsung.com>
Tue, 14 Jul 2015 10:42:35 +0000 (12:42 +0200)
committerTomasz Olszak <t.olszak@samsung.com>
Tue, 14 Jul 2015 15:38:11 +0000 (17:38 +0200)
Change-Id: I63a1dfcf0e2fe519f2da54434e98b5fe8534aca2
Signed-off-by: Agnieszka Janowicz <a.janowicz@samsung.com>
src/flat_navi.c
tests/atspi/atspi.c
tests/atspi/atspi.h

index 27185e4..23ca51b 100644 (file)
@@ -163,6 +163,31 @@ _obj_state_visible_and_showing(AtspiAccessible *obj, Eina_Bool for_parent)
 }
 
 static Eina_Bool
+_has_escape_action(AtspiAccessible *obj)
+{
+   Eina_Bool ret = EINA_FALSE;
+
+   AtspiAction *action = NULL;
+
+   action = atspi_accessible_get_action_iface(obj);
+   if(action)
+   {
+      int i = 0;
+      for (; i < atspi_action_get_n_actions(action, NULL); i++)
+        {
+           if (!strcmp(atspi_action_get_action_name(action, i, NULL), "escape"))
+             {
+                ret = EINA_TRUE;
+                break;
+             }
+        }
+      g_object_unref(action);
+   }
+   DEBUG("Obj %s %s escape action",atspi_accessible_get_role_name(obj, NULL), ret ? "has" : "doesn't have");
+   return ret;
+}
+
+static Eina_Bool
 _no_need_for_focusable_state(AtspiAccessible *obj)
 {
    AtspiRole role = atspi_accessible_get_role(obj, NULL);
@@ -192,6 +217,7 @@ _no_need_for_focusable_state(AtspiAccessible *obj)
       case ATSPI_ROLE_PUSH_BUTTON:
          if (_obj_state_visible_and_showing(obj, EINA_FALSE))
             return EINA_TRUE;
+         break;
       case ATSPI_ROLE_POPUP_MENU:
          if (_obj_state_visible_and_showing(obj, EINA_FALSE))
             return EINA_TRUE;
@@ -308,7 +334,9 @@ _filter_ctx_popup_child_cb(const void *container, void *data, void *fdata)
    AtspiRole role = atspi_accessible_get_role(obj, NULL);
 
    AtspiAccessible *first_modal_ancestor = _first_modal_object_in_object_chain(obj);
-   Eina_Bool ret = first_modal_ancestor != NULL || role == ATSPI_ROLE_DIALOG || role == ATSPI_ROLE_POPUP_MENU;
+   Eina_Bool ret = (first_modal_ancestor && first_modal_ancestor != obj)
+                   || (role == ATSPI_ROLE_DIALOG && _has_escape_action(obj))
+                   || role == ATSPI_ROLE_POPUP_MENU;
    if (first_modal_ancestor)
        g_object_unref(first_modal_ancestor);
    return ret;
index 3d7cf77..d9a1a35 100644 (file)
@@ -418,6 +418,21 @@ int atspi_component_get_highlight_index(AtspiComponent *obj, GError **error)
    return 0;
 }
 
+AtspiAction * atspi_accessible_get_action_iface (AtspiAccessible *obj)
+{
+   return NULL;
+}
+
+gint atspi_action_get_n_actions(AtspiAction *obj, GError **error)
+{
+   return 0;
+}
+
+gchar * atspi_action_get_action_name (AtspiAction *obj, gint i, GError **error)
+{
+    return strdup("");
+}
+
 int atspi_exit(void)
 {
    return 1;
index 30a1f12..2374c58 100644 (file)
@@ -42,6 +42,7 @@ typedef struct _AtspiScrollable AtspiScrollable;
 typedef struct _AtspiRect AtspiRect;
 typedef struct _AtspiEditableText AtspiEditableText;
 typedef struct _AtspiRelation AtspiRelation;
+typedef struct _AtspiAction AtspiAction;
 
 typedef struct _AtspiAccessibleClass AtspiAccessibleClass;
 typedef struct _AtspiComponentClass AtspiComponentClass;
@@ -272,6 +273,11 @@ struct _AtspiAccessibleClass
    GObjectClass parent_class;
 };
 
+struct _AtspiAction
+{
+  GTypeInterface parent;
+};
+
 struct _AtspiComponentClass
 {
    GObjectClass parent_class;
@@ -401,6 +407,9 @@ AtspiAccessible * atspi_relation_get_target (AtspiRelation *obj, gint i);
 AtspiAccessible * atspi_accessible_get_parent (AtspiAccessible *obj, GError **error);
 gboolean atspi_component_contains (AtspiComponent *obj, gint x, gint y, AtspiCoordType ctype, GError **error);
 int atspi_component_get_highlight_index(AtspiComponent *obj, GError **error);
+AtspiAction * atspi_accessible_get_action_iface (AtspiAccessible *obj);
+gint atspi_action_get_n_actions (AtspiAction *obj, GError **error);
+gchar * atspi_action_get_action_name (AtspiAction *obj, gint i, GError **error);
 
 int atspi_exit(void);