**/
static Bridge* GetCurrentBridge();
+ /**
+ * @brief Blocks auto-initialization of AT-SPI bridge
+ *
+ * Use this only if your application starts before DBus does, and call it early in main()
+ * (before GetCurrentBridge() is called by anyone). GetCurrentBridge() will then return an
+ * instance of DummyBridge.
+ *
+ * When DBus is ready, call EnableAutoInit(). Please note that GetCurrentBridge() may still
+ * return an instance of DummyBridge if AT-SPI was disabled at compile time or using an
+ * environment variable, or if creating the real bridge failed.
+ *
+ * @see Dali::Accessibility::DummyBridge
+ * @see Dali::Accessibility::Bridge::EnableAutoInit
+ */
+ static void DisableAutoInit();
+
+ /**
+ * @brief Re-enables auto-initialization of AT-SPI bridge
+ *
+ * @param topLevelWindow Accessible object for Scene::GetRootLayer()
+ * @param applicationName Application name
+ *
+ * Normal applications do not have to call this function. GetCurrentBridge() tries to
+ * initialize the AT-SPI bridge when it is called for the first time.
+ *
+ * @see Dali::Accessibility::Bridge::DisableAutoInit
+ * @see Dali::Accessibility::Bridge::AddTopLevelWindow
+ * @see Dali::Accessibility::Bridge::SetApplicationName
+ */
+ static void EnableAutoInit(Accessible* topLevelWindow, const std::string& applicationName);
+
protected:
struct Data
{
std::shared_ptr<Data> data;
friend class Accessible;
+ enum class AutoInitState
+ {
+ DISABLED,
+ ENABLED
+ };
+ inline static AutoInitState autoInitState = AutoInitState::ENABLED;
+
/**
* @brief Registers accessible object to be known in bridge object
*
}
};
+static bool bridgeInitialized;
+
static Bridge* CreateBridge()
{
+ bridgeInitialized = true;
+
try
{
/* check environment variable first */
Bridge* Bridge::GetCurrentBridge()
{
- static Bridge* bridge = CreateBridge();
- return bridge;
+ static Bridge* bridge;
+
+ if (bridge)
+ {
+ return bridge;
+ }
+ else if (autoInitState == AutoInitState::ENABLED)
+ {
+ bridge = CreateBridge();
+ return bridge;
+ }
+
+ return Dali::Accessibility::DummyBridge::GetInstance();
+}
+
+void Bridge::DisableAutoInit()
+{
+ if (bridgeInitialized)
+ {
+ DALI_LOG_ERROR("Bridge::DisableAutoInit() called after bridge auto-initialization");
+ }
+
+ autoInitState = AutoInitState::DISABLED;
+}
+
+void Bridge::EnableAutoInit(Accessible* topLevelWindow, const std::string& applicationName)
+{
+ autoInitState = AutoInitState::ENABLED;
+
+ if (bridgeInitialized)
+ {
+ return;
+ }
+
+ auto* bridge = Bridge::GetCurrentBridge();
+ bridge->AddTopLevelWindow(topLevelWindow);
+ bridge->SetApplicationName(applicationName);
+ bridge->Initialize();
}
return Accessibility::DummyBridge::GetInstance();
}
+void Accessibility::Bridge::DisableAutoInit()
+{
+}
+
+void Accessibility::Bridge::EnableAutoInit(Accessible*, const std::string&)
+{
+}
+
void Accessibility::Accessible::EmitStateChanged(Accessibility::State state, int newValue1, int newValue2)
{
}