[AT-SPI] Fix not working screen reader when rerunning it
[platform/core/uifw/dali-adaptor.git] / dali / internal / accessibility / bridge / bridge-object.cpp
index 2a0d03e..34389a7 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2019 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2021 Samsung Electronics Co., Ltd.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
 
 using namespace Dali::Accessibility;
 
+namespace
+{
+inline std::string GetAccessiblePath(Accessible* accessible)
+{
+  auto address = accessible->GetAddress();
+  return address ? ATSPI_PREFIX_PATH + address.GetPath() : ATSPI_NULL_PATH;
+}
+} // namespace
+
 BridgeObject::BridgeObject()
 {
 }
@@ -31,39 +40,32 @@ BridgeObject::BridgeObject()
 void BridgeObject::RegisterInterfaces()
 {
   // DBus::DBusInterfaceDescription desc{ AtspiDbusInterfaceEventObject };
-  // stateChanged = addSignal<std::string, int, int, DBus::EldbusVariant<int>, Accessible*>(desc, "StateChanged");
-  // dbusServer.addInterface("/", desc, true);
+  // mStateChanged = addSignal<std::string, int, int, DBus::EldbusVariant<int>, Accessible*>(desc, "StateChanged");
+  // mDbusServer.addInterface("/", desc, true);
 }
 
-void BridgeObject::EmitActiveDescendantChanged( Accessible* obj, Accessible *child )
+void BridgeObject::EmitActiveDescendantChanged(Accessible* obj, Accessible* child)
 {
-  if (!IsUp()) return;
+  if(!IsUp()) return;
   auto index = child->GetIndexInParent();
 
-  auto addr = obj->GetAddress();
-  const auto prefixPath = "/org/a11y/atspi/accessible/";
-  const auto nullPath = "/org/a11y/atspi/null";
-  std::string p;
-  if( addr )
-    p = prefixPath + addr.GetPath();
-  else
-    p = nullPath;
-  dbusServer.emit2< std::string, int, int, DBus::EldbusVariant< Address >, Address >(
-      p,
-      AtspiDbusInterfaceEventObject,
-      "ActiveDescendantChanged",
-      "",
-      index,
-      0,
-      { child->GetAddress() },
-      {"", "root"} );
+  mDbusServer.emit2<std::string, int, int, DBus::EldbusVariant<Address>, Address>(
+    GetAccessiblePath(obj),
+    AtspiDbusInterfaceEventObject,
+    "ActiveDescendantChanged",
+    "",
+    index,
+    0,
+    {child->GetAddress()},
+    {"", "root"});
 }
 
-void BridgeObject::Emit( Accessible* obj, Dali::Accessibility::ObjectPropertyChangeEvent ev )
+void BridgeObject::Emit(Accessible* obj, Dali::Accessibility::ObjectPropertyChangeEvent event)
 {
-  if (!IsUp()) return;
+  if(!IsUp()) return;
   const char* name = nullptr;
-  switch( ev )
+
+  switch(event)
   {
     case ObjectPropertyChangeEvent::NAME:
     {
@@ -91,31 +93,27 @@ void BridgeObject::Emit( Accessible* obj, Dali::Accessibility::ObjectPropertyCha
       break;
     }
   }
-  if( name )
+
+  if(name)
   {
-    auto addr = obj->GetAddress();
-    std::string p;
-    if( addr )
-      p = ATSPI_PREFIX_PATH + addr.GetPath();
-    else
-      p = ATSPI_NULL_PATH;
-    dbusServer.emit2< std::string, int, int, DBus::EldbusVariant< int >, Address >(
-        p,
-        AtspiDbusInterfaceEventObject,
-        "PropertyChange",
-        name,
-        0,
-        0,
-        {0},
-        {"", "root"} );
+    mDbusServer.emit2<std::string, int, int, DBus::EldbusVariant<int>, Address>(
+      GetAccessiblePath(obj),
+      AtspiDbusInterfaceEventObject,
+      "PropertyChange",
+      name,
+      0,
+      0,
+      {0},
+      {"", "root"});
   }
 }
 
-void BridgeObject::Emit( Accessible* obj, WindowEvent we, unsigned int detail1 )
+void BridgeObject::Emit(Accessible* obj, WindowEvent event, unsigned int detail)
 {
-  if (!IsUp()) return;
+  if(!IsUp()) return;
   const char* name = nullptr;
-  switch( we )
+
+  switch(event)
   {
     case WindowEvent::PROPERTY_CHANGE:
     {
@@ -213,31 +211,27 @@ void BridgeObject::Emit( Accessible* obj, WindowEvent we, unsigned int detail1 )
       break;
     }
   }
-  if( name )
+
+  if(name)
   {
-    auto addr = obj->GetAddress();
-    std::string p;
-    if( addr )
-      p = ATSPI_PREFIX_PATH + addr.GetPath();
-    else
-      p = ATSPI_NULL_PATH;
-    dbusServer.emit2< std::string, int, int, DBus::EldbusVariant< int >, Address >(
-        p,
-        AtspiDbusInterfaceEventWindow,
-        name,
-        "",
-        detail1,
-        0,
-        {0},
-        {"", "root"} );
+    mDbusServer.emit2<std::string, int, int, DBus::EldbusVariant<int>, Address>(
+      GetAccessiblePath(obj),
+      AtspiDbusInterfaceEventWindow,
+      name,
+      "",
+      detail,
+      0,
+      {0},
+      {"", "root"});
   }
 }
 
-void BridgeObject::EmitStateChanged( Accessible* obj, State state, int newValue1, int newValue2 )
+void BridgeObject::EmitStateChanged(Accessible* obj, State state, int newValue, int reserved)
 {
-  if (!IsUp()) return;
+  if(!IsUp()) return;
   const char* stateName = nullptr;
-  switch( state )
+
+  switch(state)
   {
     case State::INVALID:
     {
@@ -474,70 +468,58 @@ void BridgeObject::EmitStateChanged( Accessible* obj, State state, int newValue1
       break;
     }
   }
-  if( stateName )
+
+  if(stateName)
   {
-    auto addr = obj->GetAddress();
-    std::string p;
-    if( addr )
-      p = ATSPI_PREFIX_PATH + addr.GetPath();
-    else
-      p = ATSPI_NULL_PATH;
-    dbusServer.emit2< std::string, int, int, DBus::EldbusVariant< int >, Address >(
-        p,
-        AtspiDbusInterfaceEventObject,
-        "StateChanged",
-        stateName,
-        newValue1,
-        newValue2,
-        {0},
-        {"", "root"} );
+    mDbusServer.emit2<std::string, int, int, DBus::EldbusVariant<int>, Address>(
+      GetAccessiblePath(obj),
+      AtspiDbusInterfaceEventObject,
+      "StateChanged",
+      stateName,
+      newValue,
+      reserved,
+      {0},
+      {"", "root"});
   }
 }
 
-void BridgeObject::EmitBoundsChanged( Accessible* obj, Dali::Rect<> rect )
+void BridgeObject::EmitBoundsChanged(Accessible* obj, Dali::Rect<> rect)
 {
-  auto addr = obj->GetAddress();
-  const auto prefixPath = "/org/a11y/atspi/accessible/";
-  const auto nullPath = "/org/a11y/atspi/null";
-  std::string p;
-  if( addr )
-    p = prefixPath + addr.GetPath();
-  else
-    p = nullPath;
-  DBus::EldbusVariant< std::tuple<int32_t, int32_t, int32_t, int32_t> > tmp {
-    std::tuple<int32_t, int32_t, int32_t, int32_t>{ rect.x, rect.y, rect.width, rect.height } };
-  addFilteredEvent(FilteredEvents::boundsChanged, obj, 1.0f, [=]() {
-    dbusServer.emit2< std::string, int, int, DBus::EldbusVariant< std::tuple<int32_t, int32_t, int32_t, int32_t> >, Address >(
-      p,
+  if(!IsBoundsChangedEventAllowed) return;
+
+  DBus::EldbusVariant<std::tuple<int32_t, int32_t, int32_t, int32_t> > tmp{
+    std::tuple<int32_t, int32_t, int32_t, int32_t>{rect.x, rect.y, rect.width, rect.height}};
+
+  AddFilteredEvent(FilteredEvents::BOUNDS_CHANGED, obj, 1.0f, [=]() {
+    mDbusServer.emit2<std::string, int, int, DBus::EldbusVariant<std::tuple<int32_t, int32_t, int32_t, int32_t> >, Address>(
+      GetAccessiblePath(obj),
       AtspiDbusInterfaceEventObject,
       "BoundsChanged",
       "",
       0,
       0,
       tmp,
-      {"", "root"} );
+      {"", "root"});
   });
 }
 
-void BridgeObject::EmitCaretMoved( Accessible* obj, unsigned int cursorPosition )
+void BridgeObject::EmitCursorMoved(Accessible* obj, unsigned int cursorPosition)
 {
-  auto addr = obj->GetAddress();
-  std::string p = addr ? ATSPI_PREFIX_PATH + addr.GetPath() : ATSPI_NULL_PATH;
-  dbusServer.emit2< std::string, int, int, DBus::EldbusVariant< int >, Address >(
-    p,
+  mDbusServer.emit2<std::string, int, int, DBus::EldbusVariant<int>, Address>(
+    GetAccessiblePath(obj),
     AtspiDbusInterfaceEventObject,
     "TextCaretMoved",
     "",
     cursorPosition,
     0,
     {0},
-    {"", "root"} );
+    {"", "root"});
 }
 
-void BridgeObject::EmitTextChanged( Accessible* obj, TextChangedState state, unsigned int position, unsigned int length, const std::string &content )
+void BridgeObject::EmitTextChanged(Accessible* obj, TextChangedState state, unsigned int position, unsigned int length, const std::string& content)
 {
   const char* stateName = nullptr;
-  switch( state )
+  switch(state)
   {
     case TextChangedState::INSERTED:
     {
@@ -554,18 +536,30 @@ void BridgeObject::EmitTextChanged( Accessible* obj, TextChangedState state, uns
       break;
     }
   }
-  if( stateName )
+
+  if(stateName)
   {
-    auto addr = obj->GetAddress();
-    std::string p = addr ? ATSPI_PREFIX_PATH + addr.GetPath() : ATSPI_NULL_PATH;
-    dbusServer.emit2< std::string, int, int, DBus::EldbusVariant< std::string >, Address >(
-        p,
-        AtspiDbusInterfaceEventObject,
-        "TextChanged",
-        stateName,
-        position,
-        length,
-        {content},
-        {"", "root"} );
+    mDbusServer.emit2<std::string, int, int, DBus::EldbusVariant<std::string>, Address>(
+      GetAccessiblePath(obj),
+      AtspiDbusInterfaceEventObject,
+      "TextChanged",
+      stateName,
+      position,
+      length,
+      {content},
+      {"", "root"});
   }
 }
+
+void BridgeObject::EmitMovedOutOfScreen(Accessible* obj, ScreenRelativeMoveType type)
+{
+  mDbusServer.emit2<std::string, int, int, DBus::EldbusVariant<int>, Address>(
+    GetAccessiblePath(obj),
+    AtspiDbusInterfaceEventObject,
+    "MoveOuted",
+    "",
+    static_cast<int>(type),
+    0,
+    {0},
+    {"", "root"});
+}