Mercurial > minori
comparison dep/animone/src/a11y/win32.cc @ 341:052ec053ee37
dep/animone: a11y/win32: fix missing ComInterface definition
author | Paper <paper@paper.us.eu.org> |
---|---|
date | Wed, 19 Jun 2024 23:21:19 -0400 |
parents | 74e2365326c6 |
children | adb79bdde329 |
comparison
equal
deleted
inserted
replaced
340:74e2365326c6 | 341:052ec053ee37 |
---|---|
19 using ValuePattern = IUIAutomationValuePattern; | 19 using ValuePattern = IUIAutomationValuePattern; |
20 | 20 |
21 using element_proc_t = std::function<TreeScope(Element&)>; | 21 using element_proc_t = std::function<TreeScope(Element&)>; |
22 using properties_t = std::vector<std::pair<long, bool>>; | 22 using properties_t = std::vector<std::pair<long, bool>>; |
23 | 23 |
24 /* ------------------------------------------------------------------- */ | |
25 | |
26 template <typename T> | |
27 struct ComInterfaceDeleter { | |
28 static_assert(std::is_base_of<IUnknown, T>::value, "Invalid COM interface"); | |
29 using pointer = T*; | |
30 void operator()(pointer p) const { if (p) p->Release(); } | |
31 }; | |
32 | |
33 template <typename T> | |
34 using ComInterface = std::unique_ptr<T, ComInterfaceDeleter<T>>; | |
35 | |
36 /* ------------------------------------------------------------------- */ | |
37 | |
24 // The main interface that is used throughout this file. Must be initialized | 38 // The main interface that is used throughout this file. Must be initialized |
25 // before it can be used for the first time. | 39 // before it can be used for the first time. |
26 static ComInterface<IUIAutomation> ui_automation; | 40 static ComInterface<IUIAutomation> ui_automation; |
27 | 41 |
28 //////////////////////////////////////////////////////////////////////////////// | 42 /* ------------------------------------------------------------------- */ |
29 | 43 |
30 static bool InitializeUIAutomation() { | 44 static bool InitializeUIAutomation() { |
31 if (ui_automation) | 45 if (ui_automation) |
32 return true; | 46 return true; |
33 | 47 |
42 ui_automation.reset(ui_automation_interface); | 56 ui_automation.reset(ui_automation_interface); |
43 | 57 |
44 return SUCCEEDED(result); | 58 return SUCCEEDED(result); |
45 } | 59 } |
46 | 60 |
47 //////////////////////////////////////////////////////////////////////////////// | 61 /* ------------------------------------------------------------------- */ |
48 | 62 |
49 static Element* GetElementFromHandle(HWND hwnd) { | 63 static Element* GetElementFromHandle(HWND hwnd) { |
50 Element* element = nullptr; | 64 Element* element = nullptr; |
51 ui_automation->ElementFromHandle(static_cast<UIA_HWND>(hwnd), &element); | 65 ui_automation->ElementFromHandle(static_cast<UIA_HWND>(hwnd), &element); |
52 return element; | 66 return element; |
81 } | 95 } |
82 | 96 |
83 return element_value; | 97 return element_value; |
84 } | 98 } |
85 | 99 |
86 //////////////////////////////////////////////////////////////////////////////// | 100 /* ------------------------------------------------------------------- */ |
87 | 101 |
88 static bool VerifyElementProperties(Element& element, const properties_t& properties) { | 102 static bool VerifyElementProperties(Element& element, const properties_t& properties) { |
89 VARIANT v = {}; | 103 VARIANT v = {}; |
90 for (const auto& pair : properties) { | 104 for (const auto& pair : properties) { |
91 if (FAILED(element.GetCurrentPropertyValue(pair.first, &v))) | 105 if (FAILED(element.GetCurrentPropertyValue(pair.first, &v))) |
114 }; | 128 }; |
115 | 129 |
116 return VerifyElementProperties(element, properties); | 130 return VerifyElementProperties(element, properties); |
117 } | 131 } |
118 | 132 |
119 //////////////////////////////////////////////////////////////////////////////// | 133 /* ------------------------------------------------------------------- */ |
120 | 134 |
121 static void WalkElements(TreeWalker& tree_walker, Element& parent, TreeScope scope, | 135 static void WalkElements(TreeWalker& tree_walker, Element& parent, TreeScope scope, |
122 size_t depth, element_proc_t element_proc) { | 136 size_t depth, element_proc_t element_proc) { |
123 constexpr size_t kMaxTreeDepth = 16; // arbitrary value | 137 constexpr size_t kMaxTreeDepth = 16; // arbitrary value |
124 if (depth > kMaxTreeDepth) | 138 if (depth > kMaxTreeDepth) |