2 * Copyright (c) 2021 Samsung Electronics Co., Ltd.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
21 #include <dali/internal/accessibility/bridge/accessibility-common.h>
22 #include <third-party/libunibreak/linebreak.h>
23 #include <third-party/libunibreak/wordbreak.h>
25 using namespace Dali::Accessibility;
27 std::vector<std::string> Accessible::GetInterfaces()
29 std::vector<std::string> tmp;
30 tmp.push_back(AtspiDbusInterfaceAccessible);
31 if(dynamic_cast<Collection*>(this))
33 tmp.push_back(AtspiDbusInterfaceCollection);
35 if(dynamic_cast<Text*>(this))
37 tmp.push_back(AtspiDbusInterfaceText);
39 if(dynamic_cast<EditableText*>(this))
41 tmp.push_back(AtspiDbusInterfaceEditableText);
43 if(dynamic_cast<Value*>(this))
45 tmp.push_back(AtspiDbusInterfaceValue);
47 if(dynamic_cast<Component*>(this))
49 tmp.push_back(AtspiDbusInterfaceComponent);
51 if(auto d = dynamic_cast<Action*>(this))
53 if(d->GetActionCount() > 0)
55 tmp.push_back(AtspiDbusInterfaceAction);
58 if(dynamic_cast<Selection*>(this))
60 tmp.push_back(AtspiDbusInterfaceSelection);
65 Accessible::Accessible()
69 Accessible::~Accessible()
71 auto b = bridgeData.lock();
73 b->knownObjects.erase(this);
76 void Accessible::EmitActiveDescendantChanged(Accessible* obj, Accessible* child)
78 if(auto b = GetBridgeData())
80 b->bridge->EmitActiveDescendantChanged(obj, child);
84 void Accessible::EmitStateChanged(State state, int newValue1, int newValue2)
86 if(auto b = GetBridgeData())
88 b->bridge->EmitStateChanged(this, state, newValue1, newValue2);
92 void Accessible::EmitShowing(bool showing)
94 if(auto b = GetBridgeData())
96 b->bridge->EmitStateChanged(this, State::SHOWING, showing ? 1 : 0, 0);
100 void Accessible::EmitVisible(bool visible)
102 if(auto b = GetBridgeData())
104 b->bridge->EmitStateChanged(this, State::VISIBLE, visible ? 1 : 0, 0);
108 void Accessible::EmitHighlighted(bool set)
110 if(auto b = GetBridgeData())
112 b->bridge->EmitStateChanged(this, State::HIGHLIGHTED, set ? 1 : 0, 0);
116 void Accessible::EmitFocused(bool set)
118 if(auto b = GetBridgeData())
120 b->bridge->EmitStateChanged(this, State::FOCUSED, set ? 1 : 0, 0);
123 void Accessible::EmitTextInserted(unsigned int position, unsigned int length, const std::string& content)
125 if(auto b = GetBridgeData())
127 b->bridge->EmitTextChanged(this, TextChangedState::INSERTED, position, length, content);
130 void Accessible::EmitTextDeleted(unsigned int position, unsigned int length, const std::string& content)
132 if(auto b = GetBridgeData())
134 b->bridge->EmitTextChanged(this, TextChangedState::DELETED, position, length, content);
137 void Accessible::EmitTextCaretMoved(unsigned int cursorPosition)
139 if(auto b = GetBridgeData())
141 b->bridge->EmitCaretMoved(this, cursorPosition);
144 void Accessible::Emit(WindowEvent we, unsigned int detail1)
146 if(auto b = GetBridgeData())
148 b->bridge->Emit(this, we, detail1);
151 void Accessible::Emit(ObjectPropertyChangeEvent ev)
153 if(auto b = GetBridgeData())
155 b->bridge->Emit(this, ev);
159 void Accessible::EmitBoundsChanged(Rect<> rect)
161 if(auto b = GetBridgeData())
163 b->bridge->EmitBoundsChanged(this, rect);
167 std::vector<Accessible*> Accessible::GetChildren()
169 std::vector<Accessible*> tmp(GetChildCount());
170 for(auto i = 0u; i < tmp.size(); ++i)
172 tmp[i] = GetChildAtIndex(i);
177 std::shared_ptr<Bridge::Data> Accessible::GetBridgeData()
179 auto b = bridgeData.lock();
182 auto p = Bridge::GetCurrentBridge();
188 Address Accessible::GetAddress()
190 auto b = bridgeData.lock();
195 b->bridge->RegisterOnBridge(this);
197 std::ostringstream tmp;
199 return {b ? b->busName : "", tmp.str()};
202 void Bridge::RegisterOnBridge(Accessible* obj)
204 assert(!obj->bridgeData.lock() || obj->bridgeData.lock() == data);
205 if(!obj->bridgeData.lock())
208 data->knownObjects.insert(obj);
209 obj->bridgeData = data;
213 bool Accessible::IsProxy()
218 Accessible* Accessible::GetDefaultLabel()
223 void Accessible::NotifyAccessibilityStateChange(Dali::Accessibility::States states, bool doRecursive)
225 if(auto b = GetBridgeData())
227 auto s = GetStates() & states;
228 for(auto i = 0u; i < s.size(); i++)
230 auto index = static_cast<Dali::Accessibility::State>(i);
232 b->bridge->EmitStateChanged(this, index, 1, 0);
236 auto children = GetChildren();
237 for(auto c : children)
238 c->NotifyAccessibilityStateChange(states, doRecursive);
243 void Accessible::FindWordSeparationsUtf8(const utf8_t* s, size_t length, const char* language, char* breaks)
245 set_wordbreaks_utf8(s, length, language, breaks);
248 void Accessible::FindLineSeparationsUtf8(const utf8_t* s, size_t length, const char* language, char* breaks)
250 set_linebreaks_utf8(s, length, language, breaks);