[Tizen][AT-SPI] Unify widget bus names 11/315111/2 tizen_8.0
authorArtur Świgoń <a.swigon@samsung.com>
Fri, 12 Jul 2024 10:09:37 +0000 (12:09 +0200)
committerArtur Świgoń <a.swigon@samsung.com>
Thu, 25 Jul 2024 08:53:49 +0000 (10:53 +0200)
This enables cross-toolkit embedding (e.g. an EFL widget inside NUI app).

Change-Id: If0efe85d37a6da9805819e287d6a8a73e0b76119

dali/devel-api/adaptor-framework/accessibility-bridge.h
dali/internal/accessibility/bridge/bridge-impl.cpp
dali/internal/accessibility/bridge/dummy/dummy-atspi.cpp
dali/internal/accessibility/bridge/dummy/dummy-atspi.h
dali/internal/system/tizen-wayland/widget-controller-tizen.cpp

index 0796fad..0d3fc0a 100644 (file)
@@ -448,17 +448,6 @@ struct DALI_ADAPTOR_API Bridge
   virtual Address EmbedSocket(const Address& plug, const Address& socket) = 0;
 
   /**
-   * @brief Calls socket.Embedded(plug) via D-Bus.
-   *
-   * The "Embedded" D-Bus method is an ATK extension.
-   * See 'impl_Embedded' in AT_SPI2_ATK/atk-adaptor/adaptors/socket-adaptor.c for more information.
-   *
-   * @param[in] plug The plug
-   * @param[in] socket The socket
-   */
-  virtual void EmbedAtkSocket(const Address& plug, const Address& socket) = 0;
-
-  /**
    * @brief Calls socket.Unmbed(plug) via D-Bus.
    *
    * @param[in] plug The plug
@@ -550,11 +539,12 @@ struct DALI_ADAPTOR_API Bridge
    * @brief Encodes a widget ID as a usable bus name.
    *
    * @param widgetInstanceId The instance ID of a widget
+   * @param widgetProcessId The process ID (PID) of the widget
    * @return std::string Encoded bus name
    *
    * @see SetPreferredBusName
    */
-  static std::string MakeBusNameForWidget(std::string_view widgetInstanceId);
+  static std::string MakeBusNameForWidget(std::string_view widgetInstanceId, int widgetProcessId);
 
   static Signal<void()>& EnabledSignal()
   {
index 6896f1f..ac9ad82 100644 (file)
@@ -829,13 +829,6 @@ public:
     return std::get<0>(reply.getValues());
   }
 
-  void EmbedAtkSocket(const Address& plug, const Address& socket) override
-  {
-    auto client = CreateSocketClient(socket);
-
-    client.method<void(std::string)>("Embedded").asyncCall([](DBus::ValueOrError<void>) {}, ATSPI_PREFIX_PATH + plug.GetPath());
-  }
-
   void UnembedSocket(const Address& plug, const Address& socket) override
   {
     auto client = CreateSocketClient(socket);
@@ -1002,12 +995,12 @@ void Bridge::EnableAutoInit()
   }
 }
 
-std::string Bridge::MakeBusNameForWidget(std::string_view widgetInstanceId)
+std::string Bridge::MakeBusNameForWidget(std::string_view widgetInstanceId, int widgetProcessId)
 {
   // The bus name should consist of dot-separated alphanumeric elements, e.g. "com.example.BusName123".
-  // Allowed characters in each element: "[A-Z][a-z][0-9]_", but no element may start with a digit.
+  // Allowed characters in each element: "[A-Z][a-z][0-9]_-", but no element may start with a digit.
 
-  static const char prefix[]   = "com.samsung.dali.widget_";
+  static const char prefix[]   = "elm.atspi.proxy.socket-";
   static const char underscore = '_';
 
   std::stringstream tmp;
@@ -1016,8 +1009,10 @@ std::string Bridge::MakeBusNameForWidget(std::string_view widgetInstanceId)
 
   for(char ch : widgetInstanceId)
   {
-    tmp << (std::isalnum(ch) ? ch : underscore);
+    tmp << (!std::isalnum(ch) && ch != '_' && ch != '-' && ch != '.' ? underscore : ch);
   }
 
+  tmp << '-' << widgetProcessId;
+
   return tmp.str();
 }
index fefc1f2..764a442 100644 (file)
@@ -88,7 +88,7 @@ void Accessibility::Bridge::EnableAutoInit()
 {
 }
 
-std::string MakeBusNameForWidget(std::string_view widgetInstanceId)
+std::string MakeBusNameForWidget(std::string_view widgetInstanceId, int widgetProcessId)
 {
   return std::string{widgetInstanceId};
 }
index 451e797..b2070b8 100644 (file)
@@ -222,10 +222,6 @@ struct DummyBridge : Dali::Accessibility::Bridge
     return {};
   }
 
-  void EmbedAtkSocket(const Address& plug, const Address& socket) override
-  {
-  }
-
   void UnembedSocket(const Address& plug, const Address& socket) override
   {
   }
index 311df34..40d5891 100644 (file)
@@ -21,6 +21,7 @@
 // EXTERNAL INCLUDES
 #include <dali/public-api/actors/layer.h>
 #include <bundle.h>
+#include <unistd.h>
 #include <widget_base.h>
 
 // INTERNAL INCLUDES
@@ -74,7 +75,7 @@ void WidgetImplTizen::SetInformation(Dali::Window window, const std::string& wid
   mWidgetId = widgetId;
 
   auto bridge           = Accessibility::Bridge::GetCurrentBridge();
-  auto preferredBusName = Accessibility::Bridge::MakeBusNameForWidget(widgetId);
+  auto preferredBusName = Accessibility::Bridge::MakeBusNameForWidget(widgetId, getpid());
 
   // Ensure the bridge is at least in an unlocked state. Normal application callbacks that would
   // call Bridge::ApplicationPaused/Resumed() elsewhere are not operational in widget scenarios.