Wine-Devel
By thread
wine-devel@list.winehq.org
By month
Messages by month
- ----- 2026 -----
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2025 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2010 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2009 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2008 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2007 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2006 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2005 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2004 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2003 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2002 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2001 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
June 2022
- 68 participants
- 3274 messages
Questions about the GitLab patch review process
by Alex Henrie
Dear developers,
I have a couple of questions about how patch reviews on GitLab are
intended to work:
* Can I request a review from anyone?
* Does requesting a review improve the patch's chances of being accepted?
Thanks for your help.
-Alex
June 10, 2022
[PATCH] WWN 420.
by Cressida Silver
---
news/en/2022061002.xml | 13 +
wwn/en/wn20220610_420.xml | 690 ++++++++++++++++++++++++++++++++++++++
2 files changed, 703 insertions(+)
create mode 100644 news/en/2022061002.xml
create mode 100644 wwn/en/wn20220610_420.xml
diff --git a/news/en/2022061002.xml b/news/en/2022061002.xml
new file mode 100644
index 00000000..505c529f
--- /dev/null
+++ b/news/en/2022061002.xml
@@ -0,0 +1,13 @@
+<news>
+ <date>June 10, 2022</date>
+ <title>World Wine News Issue 420</title>
+ <body>
+ <a href="{$root}/wwn/ISS">WWN Issue 420</a> was released today.
+ <p>
+ <ul>
+ <li><a href="{$root}/wwn/420#Wine 7.10" class="">Wine 7.10</a></li>
+ <li><a href="{$root}/wwn/420#A Bug's Life" class="">A Bug's Life</a></li>
+ </ul>
+ </p>
+ </body>
+</news>
diff --git a/wwn/en/wn20220610_420.xml b/wwn/en/wn20220610_420.xml
new file mode 100644
index 00000000..8e285745
--- /dev/null
+++ b/wwn/en/wn20220610_420.xml
@@ -0,0 +1,690 @@
+<kc>
+ <title>Wine Traffic</title>
+ <author contact="mailto:wwn(a)winehq.org">Cressida Silver</author>
+ <issue num="420" date="06/10/2022"/>
+ <intro>
+ <p>
+ This is the 420th issue of the World Wine News publication. Its main goal is to inform you of what's going on around Wine.
+ Wine is an open-source implementation of the Windows API on top of X and Unix. Think of it as a Windows compatibility layer.
+ Wine does not require Microsoft Windows, as it is a completely alternative implementation consisting of 100% Microsoft-free code.
+ </p>
+ </intro>
+
+ <section title="Wine 7.10">
+ <p>
+ Wine 7.10 is here and brings the following:
+ </p>
+
+ <p>
+ <ul>
+ <li>Converted macOS driver to PE.</li>
+ <li>Mono engine updated to version 7.3.0.</li>
+ <li>Windows-compatible Unicode collation.</li>
+ <li>Wow64 support in SECUR32.</li>
+ </ul>
+ </p>
+
+ <p>
+ Bugs closed with this release are listed below.
+ </p>
+ </section>
+
+ <section title="A Bug's Life">
+ <p>
+ <center>
+ <table border="2">
+ <tr>
+ <td width="100" align="center">
+ <b>Bug ID</b>
+ </td>
+ <td width="100" align="center">
+ <b>Open Date</b>
+ </td>
+ <td width="100" align="center">
+ <b>Days Open</b>
+ </td>
+ <td width="100" align="center">
+ <b>Weeks Open</b>
+ </td>
+ <td width="100" align="center">
+ <b>Months Open</b>
+ </td>
+ <td width="100" align="center">
+ <b>Years Open</b>
+ </td>
+ <td width="850" align="center">
+ <b>Bug Summary</b>
+ </td>
+ </tr>
+ <tr>
+ <td align="center">
+ <a href ="https://bugs.winehq.org/show_bug.cgi?id=3599">3599</a>
+ </td>
+ <td align="center">10/15/05</td>
+ <td align="center">DDD</td>
+ <td align="center">WWW</td>
+ <td align="center">MMM</td>
+ <td align="center">YYY</td>
+ <td>SUMMARY</td>
+ </tr>
+ <tr>
+ <td align="center">
+ <a href ="https://bugs.winehq.org/show_bug.cgi?id=3599">3599</a>
+ </td>
+ <td align="center">10/15/05</td>
+ <td align="center">6,075</td>
+ <td align="center">868</td>
+ <td align="center">199</td>
+ <td align="center">17</td>
+ <td>Corel Draw 9 printing Issue</td>
+ </tr>
+ <tr>
+ <td align="center">
+ <a href ="https://bugs.winehq.org/show_bug.cgi?id=5163">5163</a>
+ </td>
+ <td align="center">4/30/06</td>
+ <td align="center">5,878</td>
+ <td align="center">840</td>
+ <td align="center">193</td>
+ <td align="center">16</td>
+ <td>Microsoft Office XP 2002 installer reports error 25003 (installation source corrupted), custom action 'CADpc' returns 1603</td>
+ </tr>
+ <tr>
+ <td align="center">
+ <a href ="https://bugs.winehq.org/show_bug.cgi?id=5989">5989</a>
+ </td>
+ <td align="center">8/17/06</td>
+ <td align="center">5,769</td>
+ <td align="center">824</td>
+ <td align="center">189</td>
+ <td align="center">16</td>
+ <td>Cannot run uninstall for IE6</td>
+ </tr>
+ <tr>
+ <td align="center">
+ <a href ="https://bugs.winehq.org/show_bug.cgi?id=9583">9583</a>
+ </td>
+ <td align="center">9/4/07</td>
+ <td align="center">5,386</td>
+ <td align="center">769</td>
+ <td align="center">176</td>
+ <td align="center">15</td>
+ <td>CompareStringW gives incorrect result for some wide strings</td>
+ </tr>
+ <tr>
+ <td align="center">
+ <a href ="https://bugs.winehq.org/show_bug.cgi?id=10767">10767</a>
+ </td>
+ <td align="center">12/13/07</td>
+ <td align="center">5,286</td>
+ <td align="center">755</td>
+ <td align="center">173</td>
+ <td align="center">14</td>
+ <td>lstrcmp and others do not compare punctuation characters correctly</td>
+ </tr>
+ <tr>
+ <td align="center">
+ <a href ="https://bugs.winehq.org/show_bug.cgi?id=16142">16142</a>
+ </td>
+ <td align="center">11/20/08</td>
+ <td align="center">4,943</td>
+ <td align="center">706</td>
+ <td align="center">162</td>
+ <td align="center">14</td>
+ <td>Adobe Reader 9.0 outputs error after install, that multiple instances are running</td>
+ </tr>
+ <tr>
+ <td align="center">
+ <a href ="https://bugs.winehq.org/show_bug.cgi?id=19743">19743</a>
+ </td>
+ <td align="center">8/15/09</td>
+ <td align="center">4,675</td>
+ <td align="center">668</td>
+ <td align="center">153</td>
+ <td align="center">13</td>
+ <td>Acrobat Reader 5 crashes on startup (InterTrust 'docbox.api' plugin incompatible with Windows 7+)</td>
+ </tr>
+ <tr>
+ <td align="center">
+ <a href ="https://bugs.winehq.org/show_bug.cgi?id=22603">22603</a>
+ </td>
+ <td align="center">5/6/10</td>
+ <td align="center">4,411</td>
+ <td align="center">630</td>
+ <td align="center">144</td>
+ <td align="center">12</td>
+ <td>Can't print page in IE6</td>
+ </tr>
+ <tr>
+ <td align="center">
+ <a href ="https://bugs.winehq.org/show_bug.cgi?id=25280">25280</a>
+ </td>
+ <td align="center">11/24/10</td>
+ <td align="center">4,209</td>
+ <td align="center">601</td>
+ <td align="center">138</td>
+ <td align="center">12</td>
+ <td>Singularity: no sound in game without Hardware Acceleration = emulation</td>
+ </tr>
+ <tr>
+ <td align="center">
+ <a href ="https://bugs.winehq.org/show_bug.cgi?id=26909">26909</a>
+ </td>
+ <td align="center">4/23/11</td>
+ <td align="center">4,059</td>
+ <td align="center">580</td>
+ <td align="center">133</td>
+ <td align="center">11</td>
+ <td>HaoZip: Cannot navigate to drive_c</td>
+ </tr>
+ <tr>
+ <td align="center">
+ <a href ="https://bugs.winehq.org/show_bug.cgi?id=28437">28437</a>
+ </td>
+ <td align="center">9/18/11</td>
+ <td align="center">3,911</td>
+ <td align="center">559</td>
+ <td align="center">128</td>
+ <td align="center">11</td>
+ <td>Panzer Corps: no intro video (requires WMV1 codec)</td>
+ </tr>
+ <tr>
+ <td align="center">
+ <a href ="https://bugs.winehq.org/show_bug.cgi?id=30503">30503</a>
+ </td>
+ <td align="center">4/22/12</td>
+ <td align="center">3,694</td>
+ <td align="center">528</td>
+ <td align="center">121</td>
+ <td align="center">10</td>
+ <td>Echo: Secrets of the Lost Cavern upside down on BACKBUFFER</td>
+ </tr>
+ <tr>
+ <td align="center">
+ <a href ="https://bugs.winehq.org/show_bug.cgi?id=33209">33209</a>
+ </td>
+ <td align="center">3/14/13</td>
+ <td align="center">3,368</td>
+ <td align="center">481</td>
+ <td align="center">110</td>
+ <td align="center">9</td>
+ <td>Tribes: Ascend cannot authenticate user</td>
+ </tr>
+ <tr>
+ <td align="center">
+ <a href ="https://bugs.winehq.org/show_bug.cgi?id=34025">34025</a>
+ </td>
+ <td align="center">7/12/13</td>
+ <td align="center">3,248</td>
+ <td align="center">464</td>
+ <td align="center">106</td>
+ <td align="center">9</td>
+ <td>IE8 help exits silently</td>
+ </tr>
+ <tr>
+ <td align="center">
+ <a href ="https://bugs.winehq.org/show_bug.cgi?id=34026">34026</a>
+ </td>
+ <td align="center">7/12/13</td>
+ <td align="center">3,248</td>
+ <td align="center">464</td>
+ <td align="center">106</td>
+ <td align="center">9</td>
+ <td>IE8 help pages are blank</td>
+ </tr>
+ <tr>
+ <td align="center">
+ <a href ="https://bugs.winehq.org/show_bug.cgi?id=37614">37614</a>
+ </td>
+ <td align="center">11/22/14</td>
+ <td align="center">2,750</td>
+ <td align="center">393</td>
+ <td align="center">90</td>
+ <td align="center">8</td>
+ <td>Applications do not always start inside a configured virtual desktop</td>
+ </tr>
+ <tr>
+ <td align="center">
+ <a href ="https://bugs.winehq.org/show_bug.cgi?id=37877">37877</a>
+ </td>
+ <td align="center">1/10/15</td>
+ <td align="center">2,701</td>
+ <td align="center">386</td>
+ <td align="center">88</td>
+ <td align="center">7</td>
+ <td>boincmgr crashes with wxWidgets error with WinVer > Win81</td>
+ </tr>
+ <tr>
+ <td align="center">
+ <a href ="https://bugs.winehq.org/show_bug.cgi?id=38929">38929</a>
+ </td>
+ <td align="center">7/16/15</td>
+ <td align="center">2,514</td>
+ <td align="center">359</td>
+ <td align="center">82</td>
+ <td align="center">7</td>
+ <td>Betfair Poker setup fails to connect to the server</td>
+ </tr>
+ <tr>
+ <td align="center">
+ <a href ="https://bugs.winehq.org/show_bug.cgi?id=38931">38931</a>
+ </td>
+ <td align="center">7/16/15</td>
+ <td align="center">2,514</td>
+ <td align="center">359</td>
+ <td align="center">82</td>
+ <td align="center">7</td>
+ <td>Betfair Poker log-in stops</td>
+ </tr>
+ <tr>
+ <td align="center">
+ <a href ="https://bugs.winehq.org/show_bug.cgi?id=46155">46155</a>
+ </td>
+ <td align="center">11/16/18</td>
+ <td align="center">1,295</td>
+ <td align="center">185</td>
+ <td align="center">42</td>
+ <td align="center">4</td>
+ <td>Multiple applications need KERNEL32.dll.RaiseFailFastException (RoyalTS v5, Windows PowerShell Core 6.1 for ARM64)</td>
+ </tr>
+ <tr>
+ <td align="center">
+ <a href ="https://bugs.winehq.org/show_bug.cgi?id=46775">46775</a>
+ </td>
+ <td align="center">3/4/19</td>
+ <td align="center">1,187</td>
+ <td align="center">170</td>
+ <td align="center">38</td>
+ <td align="center">3</td>
+ <td>Steam crashes when attempting to access controller settings for desktop or general</td>
+ </tr>
+ <tr>
+ <td align="center">
+ <a href ="https://bugs.winehq.org/show_bug.cgi?id=46857">46857</a>
+ </td>
+ <td align="center">3/17/19</td>
+ <td align="center">1,174</td>
+ <td align="center">168</td>
+ <td align="center">38</td>
+ <td align="center">3</td>
+ <td>Steam menus are hidden by macOS native window decoration</td>
+ </tr>
+ <tr>
+ <td align="center">
+ <a href ="https://bugs.winehq.org/show_bug.cgi?id=48011">48011</a>
+ </td>
+ <td align="center">10/30/19</td>
+ <td align="center">947</td>
+ <td align="center">135</td>
+ <td align="center">31</td>
+ <td align="center">3</td>
+ <td>Rebelbetting: unhandled exception on exit</td>
+ </tr>
+ <tr>
+ <td align="center">
+ <a href ="https://bugs.winehq.org/show_bug.cgi?id=48025">48025</a>
+ </td>
+ <td align="center">11/1/19</td>
+ <td align="center">945</td>
+ <td align="center">135</td>
+ <td align="center">31</td>
+ <td align="center">3</td>
+ <td>Betfair Poker crashes</td>
+ </tr>
+ <tr>
+ <td align="center">
+ <a href ="https://bugs.winehq.org/show_bug.cgi?id=48270">48270</a>
+ </td>
+ <td align="center">11/12/19</td>
+ <td align="center">934</td>
+ <td align="center">133</td>
+ <td align="center">30</td>
+ <td align="center">3</td>
+ <td>Rebelbetting sometimes returns insanely high numbers</td>
+ </tr>
+ <tr>
+ <td align="center">
+ <a href ="https://bugs.winehq.org/show_bug.cgi?id=48718">48718</a>
+ </td>
+ <td align="center">3/5/20</td>
+ <td align="center">820</td>
+ <td align="center">117</td>
+ <td align="center">26</td>
+ <td align="center">2</td>
+ <td>unimplemented function KERNEL32.dll.RaiseFailFastException</td>
+ </tr>
+ <tr>
+ <td align="center">
+ <a href ="https://bugs.winehq.org/show_bug.cgi?id=49052">49052</a>
+ </td>
+ <td align="center">4/29/20</td>
+ <td align="center">765</td>
+ <td align="center">109</td>
+ <td align="center">25</td>
+ <td align="center">2</td>
+ <td>Japanese Visual Novel "Natural Vacation" doesn't start (ENIGMA 5.X protected)</td>
+ </tr>
+ <tr>
+ <td align="center">
+ <a href ="https://bugs.winehq.org/show_bug.cgi?id=51572">51572</a>
+ </td>
+ <td align="center">8/7/21</td>
+ <td align="center">300</td>
+ <td align="center">43</td>
+ <td align="center">9</td>
+ <td align="center">1</td>
+ <td>Crash when opening notes panel in Logos Bible Software</td>
+ </tr>
+ <tr>
+ <td align="center">
+ <a href ="https://bugs.winehq.org/show_bug.cgi?id=51665">51665</a>
+ </td>
+ <td align="center">8/23/21</td>
+ <td align="center">284</td>
+ <td align="center">41</td>
+ <td align="center">9</td>
+ <td align="center">1</td>
+ <td>Multiple applications need IDXGIAdapter3::RegisterVideoMemoryBudgetChangeNotificationEvent() (HITMAN 2 (2018), FAR mod for Nier: Automata)</td>
+ </tr>
+ <tr>
+ <td align="center">
+ <a href ="https://bugs.winehq.org/show_bug.cgi?id=51788">51788</a>
+ </td>
+ <td align="center">9/23/21</td>
+ <td align="center">253</td>
+ <td align="center">36</td>
+ <td align="center">8</td>
+ <td align="center">1</td>
+ <td>windowscodecs:wmpformat test_decode() fails randomly</td>
+ </tr>
+ <tr>
+ <td align="center">
+ <a href ="https://bugs.winehq.org/show_bug.cgi?id=51936">51936</a>
+ </td>
+ <td align="center">10/28/21</td>
+ <td align="center">218</td>
+ <td align="center">31</td>
+ <td align="center">7</td>
+ <td align="center">1</td>
+ <td>Honeygain forgets user details</td>
+ </tr>
+ <tr>
+ <td align="center">
+ <a href ="https://bugs.winehq.org/show_bug.cgi?id=52032">52032</a>
+ </td>
+ <td align="center">11/12/21</td>
+ <td align="center">203</td>
+ <td align="center">29</td>
+ <td align="center">6</td>
+ <td align="center">1</td>
+ <td>Bad Mouse Pointer under 32bits app (Poser)</td>
+ </tr>
+ <tr>
+ <td align="center">
+ <a href ="https://bugs.winehq.org/show_bug.cgi?id=52127">52127</a>
+ </td>
+ <td align="center">11/27/21</td>
+ <td align="center">188</td>
+ <td align="center">27</td>
+ <td align="center">6</td>
+ <td align="center">1</td>
+ <td>SlingPlayer 2 crashes on load</td>
+ </tr>
+ <tr>
+ <td align="center">
+ <a href ="https://bugs.winehq.org/show_bug.cgi?id=52218">52218</a>
+ </td>
+ <td align="center">12/14/21</td>
+ <td align="center">171</td>
+ <td align="center">24</td>
+ <td align="center">5</td>
+ <td align="center">0</td>
+ <td>Honeygain exits silently</td>
+ </tr>
+ <tr>
+ <td align="center">
+ <a href ="https://bugs.winehq.org/show_bug.cgi?id=52458">52458</a>
+ </td>
+ <td align="center">1/26/22</td>
+ <td align="center">128</td>
+ <td align="center">18</td>
+ <td align="center">4</td>
+ <td align="center">0</td>
+ <td>Lazarus can't start program for debugging</td>
+ </tr>
+ <tr>
+ <td align="center">
+ <a href ="https://bugs.winehq.org/show_bug.cgi?id=52513">52513</a>
+ </td>
+ <td align="center">2/3/22</td>
+ <td align="center">120</td>
+ <td align="center">17</td>
+ <td align="center">4</td>
+ <td align="center">0</td>
+ <td>CEF does not work with sandbox</td>
+ </tr>
+ <tr>
+ <td align="center">
+ <a href ="https://bugs.winehq.org/show_bug.cgi?id=52747">52747</a>
+ </td>
+ <td align="center">3/29/22</td>
+ <td align="center">66</td>
+ <td align="center">9</td>
+ <td align="center">2</td>
+ <td align="center">0</td>
+ <td>Notepad crashes on a StaticColor X display</td>
+ </tr>
+ <tr>
+ <td align="center">
+ <a href ="https://bugs.winehq.org/show_bug.cgi?id=52863">52863</a>
+ </td>
+ <td align="center">4/22/22</td>
+ <td align="center">42</td>
+ <td align="center">6</td>
+ <td align="center">1</td>
+ <td align="center">0</td>
+ <td>kernel32:actctx fails on Windows 10 1909</td>
+ </tr>
+ <tr>
+ <td align="center">
+ <a href ="https://bugs.winehq.org/show_bug.cgi?id=52870">52870</a>
+ </td>
+ <td align="center">4/23/22</td>
+ <td align="center">41</td>
+ <td align="center">6</td>
+ <td align="center">1</td>
+ <td align="center">0</td>
+ <td>shlwapi:url - The UrlGetPartA() tests fails with a UTF-8 code page</td>
+ </tr>
+ <tr>
+ <td align="center">
+ <a href ="https://bugs.winehq.org/show_bug.cgi?id=52882">52882</a>
+ </td>
+ <td align="center">4/24/22</td>
+ <td align="center">40</td>
+ <td align="center">6</td>
+ <td align="center">1</td>
+ <td align="center">0</td>
+ <td>GPU Caps Viewer 1.54 crashes on start</td>
+ </tr>
+ <tr>
+ <td align="center">
+ <a href ="https://bugs.winehq.org/show_bug.cgi?id=52918">52918</a>
+ </td>
+ <td align="center">4/27/22</td>
+ <td align="center">37</td>
+ <td align="center">5</td>
+ <td align="center">1</td>
+ <td align="center">0</td>
+ <td>Corrupted textures in Visual Studio 2010 using native WPF interfaces.</td>
+ </tr>
+ <tr>
+ <td align="center">
+ <a href ="https://bugs.winehq.org/show_bug.cgi?id=52956">52956</a>
+ </td>
+ <td align="center">5/4/22</td>
+ <td align="center">30</td>
+ <td align="center">4</td>
+ <td align="center">0</td>
+ <td align="center">0</td>
+ <td>Star Citizen crashes on unimplemented function kernel32.dll.SetThreadInformation</td>
+ </tr>
+ <tr>
+ <td align="center">
+ <a href ="https://bugs.winehq.org/show_bug.cgi?id=52972">52972</a>
+ </td>
+ <td align="center">5/7/22</td>
+ <td align="center">27</td>
+ <td align="center">4</td>
+ <td align="center">0</td>
+ <td align="center">0</td>
+ <td>wineusb.sys: add_usb_device erroneously releases critical section on failure path</td>
+ </tr>
+ <tr>
+ <td align="center">
+ <a href ="https://bugs.winehq.org/show_bug.cgi?id=52973">52973</a>
+ </td>
+ <td align="center">5/7/22</td>
+ <td align="center">27</td>
+ <td align="center">4</td>
+ <td align="center">0</td>
+ <td align="center">0</td>
+ <td>A file containing special characters in its name is unreadable/unusable</td>
+ </tr>
+ <tr>
+ <td align="center">
+ <a href ="https://bugs.winehq.org/show_bug.cgi?id=53003">53003</a>
+ </td>
+ <td align="center">5/14/22</td>
+ <td align="center">20</td>
+ <td align="center">3</td>
+ <td align="center">0</td>
+ <td align="center">0</td>
+ <td>XM6 TypeG: some MIDI note-on messages aren't sent to MIDI devices (MIDI running status isn't supported in the MIDI mapper)</td>
+ </tr>
+ <tr>
+ <td align="center">
+ <a href ="https://bugs.winehq.org/show_bug.cgi?id=53005">53005</a>
+ </td>
+ <td align="center">5/14/22</td>
+ <td align="center">20</td>
+ <td align="center">3</td>
+ <td align="center">0</td>
+ <td align="center">0</td>
+ <td>quartz:systemclock Fails after timeGetTime() wraps</td>
+ </tr>
+ <tr>
+ <td align="center">
+ <a href ="https://bugs.winehq.org/show_bug.cgi?id=53010">53010</a>
+ </td>
+ <td align="center">5/16/22</td>
+ <td align="center">18</td>
+ <td align="center">3</td>
+ <td align="center">0</td>
+ <td align="center">0</td>
+ <td>Split/Second crashes on launch</td>
+ </tr>
+ <tr>
+ <td align="center">
+ <a href ="https://bugs.winehq.org/show_bug.cgi?id=53016">53016</a>
+ </td>
+ <td align="center">5/18/22</td>
+ <td align="center">16</td>
+ <td align="center">2</td>
+ <td align="center">0</td>
+ <td align="center">0</td>
+ <td>Steam fails to load pages</td>
+ </tr>
+ <tr>
+ <td align="center">
+ <a href ="https://bugs.winehq.org/show_bug.cgi?id=53020">53020</a>
+ </td>
+ <td align="center">5/19/22</td>
+ <td align="center">15</td>
+ <td align="center">2</td>
+ <td align="center">0</td>
+ <td align="center">0</td>
+ <td>EA Origin is unable to download games</td>
+ </tr>
+ <tr>
+ <td align="center">
+ <a href ="https://bugs.winehq.org/show_bug.cgi?id=53022">53022</a>
+ </td>
+ <td align="center">5/20/22</td>
+ <td align="center">14</td>
+ <td align="center">2</td>
+ <td align="center">0</td>
+ <td align="center">0</td>
+ <td>Hitomi downloader (Technical Preview) crashes at start</td>
+ </tr>
+ <tr>
+ <td align="center">
+ <a href ="https://bugs.winehq.org/show_bug.cgi?id=53027">53027</a>
+ </td>
+ <td align="center">5/21/22</td>
+ <td align="center">13</td>
+ <td align="center">2</td>
+ <td align="center">0</td>
+ <td align="center">0</td>
+ <td>Port Royale 4 crashes with wined3d_texture*</td>
+ </tr>
+ <tr>
+ <td align="center">
+ <a href ="https://bugs.winehq.org/show_bug.cgi?id=53034">53034</a>
+ </td>
+ <td align="center">5/22/22</td>
+ <td align="center">12</td>
+ <td align="center">2</td>
+ <td align="center">0</td>
+ <td align="center">0</td>
+ <td>Lazarus: menu text disappears under mouse if light theme is enabled</td>
+ </tr>
+ <tr>
+ <td align="center">
+ <a href ="https://bugs.winehq.org/show_bug.cgi?id=53051">53051</a>
+ </td>
+ <td align="center">5/26/22</td>
+ <td align="center">8</td>
+ <td align="center">1</td>
+ <td align="center">0</td>
+ <td align="center">0</td>
+ <td>Kvaser software crashes on unimplemented function ntoskrnl.exe.ExNotifyCallback</td>
+ </tr>
+ <tr>
+ <td align="center">
+ <a href ="https://bugs.winehq.org/show_bug.cgi?id=53061">53061</a>
+ </td>
+ <td align="center">5/28/22</td>
+ <td align="center">6</td>
+ <td align="center">1</td>
+ <td align="center">0</td>
+ <td align="center">0</td>
+ <td>Alcoma ASD Client 11.1 fails to start due to missing unicode exports in tapi32</td>
+ </tr>
+ <tr>
+ <td align="center">
+ <a href ="https://bugs.winehq.org/show_bug.cgi?id=53079">53079</a>
+ </td>
+ <td align="center">5/31/22</td>
+ <td align="center">3</td>
+ <td align="center">0</td>
+ <td align="center">0</td>
+ <td align="center">0</td>
+ <td>Linker error during build. winegstreamer:wg_transform.c:526: undefined reference to `gst_sample_set_info'</td>
+ </tr>
+ <tr>
+ <td align="center">
+ <a href ="https://bugs.winehq.org/show_bug.cgi?id=53080">53080</a>
+ </td>
+ <td align="center">6/1/22</td>
+ <td align="center">2</td>
+ <td align="center">0</td>
+ <td align="center">0</td>
+ <td align="center">0</td>
+ <td>Powershell Core crash in FindNLSStringEx</td>
+ </tr>
+ </table>
+ </center>
+ </p>
+ </section>
+</kc>
--
2.25.1
June 10, 2022
Re: [PATCH v3 0/3] MR216: uiautomationcore: More UiaProviderFromIAccessible work. - approved
by Huw Davies (@huw)
This merge request was approved by Huw Davies.
--
https://gitlab.winehq.org/wine/wine/-/merge_requests/216
June 10, 2022
[PATCH v2 2/2] win32u: Return FALSE from ReplyMessage if it was replied already.
by Gabriel Ivăncescu
Signed-off-by: Gabriel Ivăncescu <gabrielopcode(a)gmail.com>
---
dlls/user32/tests/msg.c | 2 --
dlls/win32u/message.c | 13 ++++++++-----
2 files changed, 8 insertions(+), 7 deletions(-)
diff --git a/dlls/user32/tests/msg.c b/dlls/user32/tests/msg.c
index ce931d2..1ae6073 100644
--- a/dlls/user32/tests/msg.c
+++ b/dlls/user32/tests/msg.c
@@ -18574,7 +18574,6 @@ static LRESULT CALLBACK insendmessage_wnd_proc( HWND hwnd, UINT msg, WPARAM wp,
flags = InSendMessageEx( NULL );
ok( flags == (ISMEX_SEND | ISMEX_REPLIED) || broken(flags == (ISMEX_NOTIFY | ISMEX_REPLIED)), "wrong flags %lx\n", flags );
ret = ReplyMessage( msg );
- todo_wine
ok( !ret, "ReplyMessage returned %u\n", ret );
flags = InSendMessageEx( NULL );
ok( flags == (ISMEX_SEND | ISMEX_REPLIED) || broken(flags == (ISMEX_NOTIFY | ISMEX_REPLIED)), "wrong flags %lx\n", flags );
@@ -18600,7 +18599,6 @@ static LRESULT CALLBACK insendmessage_wnd_proc( HWND hwnd, UINT msg, WPARAM wp,
ok( flags == (ISMEX_CALLBACK | ISMEX_REPLIED) || flags == ISMEX_SEND, "wrong flags %lx\n", flags );
ok( InSendMessage(), "InSendMessage returned false\n" );
ret = ReplyMessage( msg );
- todo_wine
ok( !ret, "ReplyMessage returned %u\n", ret );
flags = InSendMessageEx( NULL );
ok( flags == (ISMEX_CALLBACK | ISMEX_REPLIED) || flags == ISMEX_SEND, "wrong flags %lx\n", flags );
diff --git a/dlls/win32u/message.c b/dlls/win32u/message.c
index b41d252..d717dfb 100644
--- a/dlls/win32u/message.c
+++ b/dlls/win32u/message.c
@@ -1032,14 +1032,14 @@ static void unpack_reply( HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam,
*
* Send a reply to a sent message.
*/
-static void reply_message( struct received_message_info *info, LRESULT result, MSG *msg )
+static BOOL reply_message( struct received_message_info *info, LRESULT result, MSG *msg )
{
struct packed_message data;
int i, replied = info->flags & ISMEX_REPLIED;
BOOL remove = msg != NULL;
- if (info->flags & ISMEX_NOTIFY) return; /* notify messages don't get replies */
- if (!remove && replied) return; /* replied already */
+ if (info->flags & ISMEX_NOTIFY) return TRUE; /* notify messages don't get replies */
+ if (!remove && replied) return FALSE; /* replied already */
memset( &data, 0, sizeof(data) );
info->flags |= ISMEX_REPLIED;
@@ -1058,6 +1058,8 @@ static void reply_message( struct received_message_info *info, LRESULT result, M
wine_server_call( req );
}
SERVER_END_REQ;
+
+ return TRUE;
}
/***********************************************************************
@@ -1068,11 +1070,12 @@ static void reply_message( struct received_message_info *info, LRESULT result, M
BOOL reply_message_result( LRESULT result, MSG *msg )
{
struct received_message_info *info = get_user_thread_info()->receive_info;
+ BOOL ret;
if (!info) return FALSE;
- reply_message( info, result, msg );
+ ret = reply_message( info, result, msg );
if (msg) get_user_thread_info()->receive_info = info->prev;
- return TRUE;
+ return ret;
}
/***********************************************************************
--
2.34.1
June 10, 2022
[PATCH v2 1/2] user32/tests: Test intra-thread SendMessage and ReplyMessage behavior.
by Gabriel Ivăncescu
Signed-off-by: Gabriel Ivăncescu <gabrielopcode(a)gmail.com>
---
v2: Add broken() check to fix w10pro64_ar testbot results.
dlls/user32/tests/msg.c | 90 +++++++++++++++++++++++++++++++++++++++++
1 file changed, 90 insertions(+)
diff --git a/dlls/user32/tests/msg.c b/dlls/user32/tests/msg.c
index 2705914..ce931d2 100644
--- a/dlls/user32/tests/msg.c
+++ b/dlls/user32/tests/msg.c
@@ -18521,6 +18521,12 @@ static void test_SendMessage_other_thread(int thread_n)
CloseHandle(wnd_event.stop_event);
}
+static void CALLBACK msg_callback_nested( HWND hwnd, UINT msg, ULONG_PTR arg, LRESULT result )
+{
+ ok( msg == WM_USER + 10, "wrong msg %x\n", msg );
+ ok( result == 0, "wrong result %Ix\n", result );
+}
+
static LRESULT CALLBACK insendmessage_wnd_proc( HWND hwnd, UINT msg, WPARAM wp, LPARAM lp )
{
DWORD flags = InSendMessageEx( NULL );
@@ -18561,6 +18567,80 @@ static LRESULT CALLBACK insendmessage_wnd_proc( HWND hwnd, UINT msg, WPARAM wp,
ret = ReplyMessage( msg );
ok( !ret, "ReplyMessage succeeded\n" );
break;
+ case WM_USER + 4:
+ ok( flags == ISMEX_SEND, "wrong flags %lx\n", flags );
+ ok( InSendMessage(), "InSendMessage returned false\n" );
+ SendMessageCallbackA( hwnd, WM_USER + 10, 0, 0, msg_callback_nested, 0 );
+ flags = InSendMessageEx( NULL );
+ ok( flags == (ISMEX_SEND | ISMEX_REPLIED) || broken(flags == (ISMEX_NOTIFY | ISMEX_REPLIED)), "wrong flags %lx\n", flags );
+ ret = ReplyMessage( msg );
+ todo_wine
+ ok( !ret, "ReplyMessage returned %u\n", ret );
+ flags = InSendMessageEx( NULL );
+ ok( flags == (ISMEX_SEND | ISMEX_REPLIED) || broken(flags == (ISMEX_NOTIFY | ISMEX_REPLIED)), "wrong flags %lx\n", flags );
+ ok( InSendMessage(), "InSendMessage returned false\n" );
+ break;
+ case WM_USER + 5:
+ ok( flags == ISMEX_NOTIFY, "wrong flags %lx\n", flags );
+ ok( InSendMessage(), "InSendMessage returned false\n" );
+ SendMessageA( hwnd, WM_USER + 11, 0, 0 );
+ flags = InSendMessageEx( NULL );
+ ok( flags == ISMEX_NOTIFY, "wrong flags %lx\n", flags );
+ ret = ReplyMessage( msg );
+ ok( ret, "ReplyMessage failed err %lu\n", GetLastError() );
+ flags = InSendMessageEx( NULL );
+ ok( flags == ISMEX_NOTIFY, "wrong flags %lx\n", flags );
+ ok( InSendMessage(), "InSendMessage returned false\n" );
+ break;
+ case WM_USER + 6:
+ ok( flags == ISMEX_CALLBACK, "wrong flags %lx\n", flags );
+ ok( InSendMessage(), "InSendMessage returned false\n" );
+ SendMessageW( hwnd, WM_USER + 12, 0, 0 );
+ flags = InSendMessageEx( NULL );
+ ok( flags == (ISMEX_CALLBACK | ISMEX_REPLIED) || flags == ISMEX_SEND, "wrong flags %lx\n", flags );
+ ok( InSendMessage(), "InSendMessage returned false\n" );
+ ret = ReplyMessage( msg );
+ todo_wine
+ ok( !ret, "ReplyMessage returned %u\n", ret );
+ flags = InSendMessageEx( NULL );
+ ok( flags == (ISMEX_CALLBACK | ISMEX_REPLIED) || flags == ISMEX_SEND, "wrong flags %lx\n", flags );
+ ok( InSendMessage(), "InSendMessage returned false\n" );
+ break;
+ case WM_USER + 7:
+ ok( flags == ISMEX_NOSEND, "wrong flags %lx\n", flags );
+ ok( !InSendMessage(), "InSendMessage returned true\n" );
+ SendNotifyMessageW( hwnd, WM_USER + 13, 0, 0 );
+ flags = InSendMessageEx( NULL );
+ ok( flags == ISMEX_NOSEND, "wrong flags %lx\n", flags );
+ ok( !InSendMessage(), "InSendMessage returned true\n" );
+ ret = ReplyMessage( msg );
+ ok( !ret, "ReplyMessage succeeded\n" );
+ break;
+
+ case WM_USER + 10:
+ ok( flags == ISMEX_SEND, "wrong flags %lx\n", flags );
+ ok( InSendMessage(), "InSendMessage returned false\n" );
+ ret = ReplyMessage( msg );
+ ok( ret, "ReplyMessage failed err %lu\n", GetLastError() );
+ break;
+ case WM_USER + 11:
+ ok( flags == ISMEX_NOTIFY, "wrong flags %lx\n", flags );
+ ok( InSendMessage(), "InSendMessage returned false\n" );
+ ret = ReplyMessage( msg );
+ ok( ret, "ReplyMessage failed err %lu\n", GetLastError() );
+ break;
+ case WM_USER + 12:
+ ok( flags == ISMEX_CALLBACK, "wrong flags %lx\n", flags );
+ ok( InSendMessage(), "InSendMessage returned false\n" );
+ ret = ReplyMessage( msg );
+ ok( ret, "ReplyMessage failed err %lu\n", GetLastError() );
+ break;
+ case WM_USER + 13:
+ ok( flags == ISMEX_NOSEND, "wrong flags %lx\n", flags );
+ ok( !InSendMessage(), "InSendMessage returned false\n" );
+ ret = ReplyMessage( msg );
+ ok( !ret, "ReplyMessage returned %u\n", ret );
+ break;
}
return DefWindowProcA( hwnd, msg, wp, lp );
@@ -18572,6 +18652,12 @@ static void CALLBACK msg_callback( HWND hwnd, UINT msg, ULONG_PTR arg, LRESULT r
ok( result == WM_USER + 2, "wrong result %Ix\n", result );
}
+static void CALLBACK msg_callback2( HWND hwnd, UINT msg, ULONG_PTR arg, LRESULT result )
+{
+ ok( msg == WM_USER + 6, "wrong msg %x\n", msg );
+ ok( result == WM_USER + 6, "wrong result %Ix\n", result );
+}
+
static DWORD WINAPI send_message_thread( void *arg )
{
HWND win = arg;
@@ -18580,6 +18666,10 @@ static DWORD WINAPI send_message_thread( void *arg )
SendNotifyMessageA( win, WM_USER + 1, 0, 0 );
SendMessageCallbackA( win, WM_USER + 2, 0, 0, msg_callback, 0 );
PostMessageA( win, WM_USER + 3, 0, 0 );
+ SendMessageA( win, WM_USER + 4, 0, 0 );
+ SendNotifyMessageA( win, WM_USER + 5, 0, 0 );
+ SendMessageCallbackA( win, WM_USER + 6, 0, 0, msg_callback2, 0 );
+ PostMessageA( win, WM_USER + 7, 0, 0 );
PostMessageA( win, WM_QUIT, 0, 0 );
return 0;
}
--
2.34.1
June 10, 2022
Re: [PATCH v3 0/3] MR216: uiautomationcore: More UiaProviderFromIAccessible work.
by Connor McAdams (@cmcadams)
V3: used HRESULT for `msaa_acc_prop_match`, and split accName comparison into multiple if statements.
--
https://gitlab.winehq.org/wine/wine/-/merge_requests/216#note_1835
June 10, 2022
[PATCH v3 3/3] uiautomationcore: Add ILegacyIAccessibleProvider implementation for MSAA providers.
by Connor McAdams
From: Connor McAdams <cmcadams(a)codeweavers.com>
Signed-off-by: Connor McAdams <cmcadams(a)codeweavers.com>
---
dlls/uiautomationcore/tests/uiautomation.c | 57 +++++++
dlls/uiautomationcore/uia_provider.c | 167 ++++++++++++++++++++-
2 files changed, 222 insertions(+), 2 deletions(-)
diff --git a/dlls/uiautomationcore/tests/uiautomation.c b/dlls/uiautomationcore/tests/uiautomation.c
index 6ed3c907a40..6c07edcffa8 100644
--- a/dlls/uiautomationcore/tests/uiautomation.c
+++ b/dlls/uiautomationcore/tests/uiautomation.c
@@ -89,6 +89,20 @@ static BOOL check_variant_bool(VARIANT *v, BOOL val)
return FALSE;
}
+static BOOL iface_cmp(IUnknown *iface1, IUnknown *iface2)
+{
+ IUnknown *unk1, *unk2;
+ BOOL cmp;
+
+ IUnknown_QueryInterface(iface1, &IID_IUnknown, (void**)&unk1);
+ IUnknown_QueryInterface(iface2, &IID_IUnknown, (void**)&unk2);
+ cmp = (unk1 == unk2) ? TRUE : FALSE;
+
+ IUnknown_Release(unk1);
+ IUnknown_Release(unk2);
+ return cmp;
+}
+
static struct Accessible
{
IAccessible IAccessible_iface;
@@ -977,13 +991,16 @@ static void test_uia_prov_from_acc_properties(void)
static void test_UiaProviderFromIAccessible(void)
{
+ ILegacyIAccessibleProvider *accprov;
IRawElementProviderSimple *elprov, *elprov2;
enum ProviderOptions prov_opt;
IAccessible *acc;
+ IUnknown *unk;
WNDCLASSA cls;
HRESULT hr;
HWND hwnd;
VARIANT v;
+ INT cid;
CoInitializeEx(NULL, COINIT_MULTITHREADED);
cls.style = 0;
@@ -1084,6 +1101,26 @@ static void test_UiaProviderFromIAccessible(void)
ok(V_VT(&v) == VT_BSTR, "V_VT(&v) = %d\n", V_VT(&v));
VariantClear(&v);
+ hr = IRawElementProviderSimple_GetPatternProvider(elprov, UIA_LegacyIAccessiblePatternId, &unk);
+ ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
+ ok(!!unk, "unk == NULL\n");
+ ok(iface_cmp((IUnknown *)elprov, unk), "unk != elprov\n");
+
+ hr = IUnknown_QueryInterface(unk, &IID_ILegacyIAccessibleProvider, (void **)&accprov);
+ ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
+ ok(!!accprov, "accprov == NULL\n");
+
+ hr = ILegacyIAccessibleProvider_get_ChildId(accprov, &cid);
+ ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
+ ok(cid == CHILDID_SELF, "cid != CHILDID_SELF\n");
+
+ hr = ILegacyIAccessibleProvider_GetIAccessible(accprov, &acc);
+ ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
+ ok(acc == &Accessible.IAccessible_iface, "acc != &Accessible.IAccessible_iface\n");
+ IAccessible_Release(acc);
+ IUnknown_Release(unk);
+ ILegacyIAccessibleProvider_Release(accprov);
+
IRawElementProviderSimple_Release(elprov);
ok(Accessible.ref == 1, "Unexpected refcnt %ld\n", Accessible.ref);
@@ -1101,6 +1138,26 @@ static void test_UiaProviderFromIAccessible(void)
ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
ok(!elprov2, "elprov != NULL\n");
+ hr = IRawElementProviderSimple_GetPatternProvider(elprov, UIA_LegacyIAccessiblePatternId, &unk);
+ ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
+ ok(!!unk, "unk == NULL\n");
+ ok(iface_cmp((IUnknown *)elprov, unk), "unk != elprov\n");
+
+ hr = IUnknown_QueryInterface(unk, &IID_ILegacyIAccessibleProvider, (void **)&accprov);
+ ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
+ ok(!!accprov, "accprov == NULL\n");
+
+ hr = ILegacyIAccessibleProvider_get_ChildId(accprov, &cid);
+ ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
+ ok(cid == 1, "cid != CHILDID_SELF\n");
+
+ hr = ILegacyIAccessibleProvider_GetIAccessible(accprov, &acc);
+ ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
+ ok(acc == &Accessible.IAccessible_iface, "acc != &Accessible.IAccessible_iface\n");
+ IAccessible_Release(acc);
+ IUnknown_Release(unk);
+ ILegacyIAccessibleProvider_Release(accprov);
+
IRawElementProviderSimple_Release(elprov);
ok(Accessible.ref == 1, "Unexpected refcnt %ld\n", Accessible.ref);
diff --git a/dlls/uiautomationcore/uia_provider.c b/dlls/uiautomationcore/uia_provider.c
index 6c3bd1c2186..9d8d44c90fd 100644
--- a/dlls/uiautomationcore/uia_provider.c
+++ b/dlls/uiautomationcore/uia_provider.c
@@ -289,6 +289,7 @@ static LONG msaa_role_to_uia_control_type(LONG role)
*/
struct msaa_provider {
IRawElementProviderSimple IRawElementProviderSimple_iface;
+ ILegacyIAccessibleProvider ILegacyIAccessibleProvider_iface;
LONG refcount;
IAccessible *acc;
@@ -330,9 +331,13 @@ static inline struct msaa_provider *impl_from_msaa_provider(IRawElementProviderS
HRESULT WINAPI msaa_provider_QueryInterface(IRawElementProviderSimple *iface, REFIID riid, void **ppv)
{
+ struct msaa_provider *msaa_prov = impl_from_msaa_provider(iface);
+
*ppv = NULL;
if (IsEqualIID(riid, &IID_IRawElementProviderSimple) || IsEqualIID(riid, &IID_IUnknown))
*ppv = iface;
+ else if (IsEqualIID(riid, &IID_ILegacyIAccessibleProvider))
+ *ppv = &msaa_prov->ILegacyIAccessibleProvider_iface;
else
return E_NOINTERFACE;
@@ -377,9 +382,20 @@ HRESULT WINAPI msaa_provider_get_ProviderOptions(IRawElementProviderSimple *ifac
HRESULT WINAPI msaa_provider_GetPatternProvider(IRawElementProviderSimple *iface,
PATTERNID pattern_id, IUnknown **ret_val)
{
- FIXME("%p, %d, %p: stub!\n", iface, pattern_id, ret_val);
+ TRACE("%p, %d, %p\n", iface, pattern_id, ret_val);
+
*ret_val = NULL;
- return E_NOTIMPL;
+ switch (pattern_id)
+ {
+ case UIA_LegacyIAccessiblePatternId:
+ return IRawElementProviderSimple_QueryInterface(iface, &IID_IUnknown, (void **)ret_val);
+
+ default:
+ FIXME("Unimplemented patternId %d\n", pattern_id);
+ break;
+ }
+
+ return S_OK;
}
HRESULT WINAPI msaa_provider_GetPropertyValue(IRawElementProviderSimple *iface,
@@ -465,6 +481,152 @@ static const IRawElementProviderSimpleVtbl msaa_provider_vtbl = {
msaa_provider_get_HostRawElementProvider,
};
+/*
+ * ILegacyIAccessibleProvider interface for UiaProviderFromIAccessible
+ * providers.
+ */
+static inline struct msaa_provider *impl_from_msaa_acc_provider(ILegacyIAccessibleProvider *iface)
+{
+ return CONTAINING_RECORD(iface, struct msaa_provider, ILegacyIAccessibleProvider_iface);
+}
+
+static HRESULT WINAPI msaa_acc_provider_QueryInterface(ILegacyIAccessibleProvider *iface, REFIID riid, void **ppv)
+{
+ struct msaa_provider *msaa_prov = impl_from_msaa_acc_provider(iface);
+ return IRawElementProviderSimple_QueryInterface(&msaa_prov->IRawElementProviderSimple_iface, riid, ppv);
+}
+
+static ULONG WINAPI msaa_acc_provider_AddRef(ILegacyIAccessibleProvider *iface)
+{
+ struct msaa_provider *msaa_prov = impl_from_msaa_acc_provider(iface);
+ return IRawElementProviderSimple_AddRef(&msaa_prov->IRawElementProviderSimple_iface);
+}
+
+static ULONG WINAPI msaa_acc_provider_Release(ILegacyIAccessibleProvider *iface)
+{
+ struct msaa_provider *msaa_prov = impl_from_msaa_acc_provider(iface);
+ return IRawElementProviderSimple_Release(&msaa_prov->IRawElementProviderSimple_iface);
+}
+
+static HRESULT WINAPI msaa_acc_provider_Select(ILegacyIAccessibleProvider *iface, LONG select_flags)
+{
+ FIXME("%p, %#lx: stub!\n", iface, select_flags);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI msaa_acc_provider_DoDefaultAction(ILegacyIAccessibleProvider *iface)
+{
+ FIXME("%p: stub!\n", iface);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI msaa_acc_provider_SetValue(ILegacyIAccessibleProvider *iface, LPCWSTR val)
+{
+ FIXME("%p, %p<%s>: stub!\n", iface, val, debugstr_w(val));
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI msaa_acc_provider_GetIAccessible(ILegacyIAccessibleProvider *iface,
+ IAccessible **out_acc)
+{
+ struct msaa_provider *msaa_prov = impl_from_msaa_acc_provider(iface);
+
+ TRACE("%p, %p\n", iface, out_acc);
+
+ IAccessible_AddRef(msaa_prov->acc);
+ *out_acc = msaa_prov->acc;
+
+ return S_OK;
+}
+
+static HRESULT WINAPI msaa_acc_provider_get_ChildId(ILegacyIAccessibleProvider *iface, int *out_cid)
+{
+ struct msaa_provider *msaa_prov = impl_from_msaa_acc_provider(iface);
+
+ TRACE("%p, %p\n", iface, out_cid);
+ *out_cid = V_I4(&msaa_prov->cid);
+
+ return S_OK;
+}
+
+static HRESULT WINAPI msaa_acc_provider_get_Name(ILegacyIAccessibleProvider *iface, BSTR *out_name)
+{
+ FIXME("%p, %p: stub!\n", iface, out_name);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI msaa_acc_provider_get_Value(ILegacyIAccessibleProvider *iface, BSTR *out_value)
+{
+ FIXME("%p, %p: stub!\n", iface, out_value);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI msaa_acc_provider_get_Description(ILegacyIAccessibleProvider *iface,
+ BSTR *out_description)
+{
+ FIXME("%p, %p: stub!\n", iface, out_description);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI msaa_acc_provider_get_Role(ILegacyIAccessibleProvider *iface, DWORD *out_role)
+{
+ FIXME("%p, %p: stub!\n", iface, out_role);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI msaa_acc_provider_get_State(ILegacyIAccessibleProvider *iface, DWORD *out_state)
+{
+ FIXME("%p, %p: stub!\n", iface, out_state);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI msaa_acc_provider_get_Help(ILegacyIAccessibleProvider *iface, BSTR *out_help)
+{
+ FIXME("%p, %p: stub!\n", iface, out_help);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI msaa_acc_provider_get_KeyboardShortcut(ILegacyIAccessibleProvider *iface,
+ BSTR *out_kbd_shortcut)
+{
+ FIXME("%p, %p: stub!\n", iface, out_kbd_shortcut);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI msaa_acc_provider_GetSelection(ILegacyIAccessibleProvider *iface,
+ SAFEARRAY **out_selected)
+{
+ FIXME("%p, %p: stub!\n", iface, out_selected);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI msaa_acc_provider_get_DefaultAction(ILegacyIAccessibleProvider *iface,
+ BSTR *out_default_action)
+{
+ FIXME("%p, %p: stub!\n", iface, out_default_action);
+ return E_NOTIMPL;
+}
+
+static const ILegacyIAccessibleProviderVtbl msaa_acc_provider_vtbl = {
+ msaa_acc_provider_QueryInterface,
+ msaa_acc_provider_AddRef,
+ msaa_acc_provider_Release,
+ msaa_acc_provider_Select,
+ msaa_acc_provider_DoDefaultAction,
+ msaa_acc_provider_SetValue,
+ msaa_acc_provider_GetIAccessible,
+ msaa_acc_provider_get_ChildId,
+ msaa_acc_provider_get_Name,
+ msaa_acc_provider_get_Value,
+ msaa_acc_provider_get_Description,
+ msaa_acc_provider_get_Role,
+ msaa_acc_provider_get_State,
+ msaa_acc_provider_get_Help,
+ msaa_acc_provider_get_KeyboardShortcut,
+ msaa_acc_provider_GetSelection,
+ msaa_acc_provider_get_DefaultAction,
+};
+
/***********************************************************************
* UiaProviderFromIAccessible (uiautomationcore.@)
*/
@@ -520,6 +682,7 @@ HRESULT WINAPI UiaProviderFromIAccessible(IAccessible *acc, long child_id, DWORD
return E_OUTOFMEMORY;
msaa_prov->IRawElementProviderSimple_iface.lpVtbl = &msaa_provider_vtbl;
+ msaa_prov->ILegacyIAccessibleProvider_iface.lpVtbl = &msaa_acc_provider_vtbl;
msaa_prov->refcount = 1;
msaa_prov->hwnd = hwnd;
variant_init_i4(&msaa_prov->cid, child_id);
--
GitLab
https://gitlab.winehq.org/wine/wine/-/merge_requests/216
June 10, 2022
[PATCH v3 2/3] include: Add ILegacyIAccessibleProvider interface definition.
by Connor McAdams
From: Connor McAdams <cmcadams(a)codeweavers.com>
Signed-off-by: Connor McAdams <cmcadams(a)codeweavers.com>
---
include/uiautomationcore.idl | 31 +++++++++++++++++++++++++++++++
1 file changed, 31 insertions(+)
diff --git a/include/uiautomationcore.idl b/include/uiautomationcore.idl
index 170b0c76de1..c4aa258b5af 100644
--- a/include/uiautomationcore.idl
+++ b/include/uiautomationcore.idl
@@ -151,4 +151,35 @@ library UIA
HRESULT GetFocus([out, retval] IRawElementProviderFragment **pRetVal);
}
+
+ [
+ object,
+ uuid(e44c3566-915d-4070-99c6-047bff5a08f5),
+ pointer_default(unique),
+ oleautomation
+ ]
+ interface ILegacyIAccessibleProvider : IUnknown
+ {
+ HRESULT Select(long flagsSelect);
+ HRESULT DoDefaultAction();
+ HRESULT SetValue(LPCWSTR szValue);
+ HRESULT GetIAccessible([out, retval] IAccessible **ppAccessible);
+
+ [propget] HRESULT ChildId([out, retval] int *pRetVal);
+ [propget] HRESULT Name([out, retval] BSTR *pszName);
+ [propget] HRESULT Value([out, retval] BSTR *pszValue);
+ [propget] HRESULT Description([out, retval] BSTR *pszDescription);
+ [propget] HRESULT Role([out, retval] DWORD *pdwRole);
+ [propget] HRESULT State([out, retval] DWORD *pdwState);
+ [propget] HRESULT Help([out, retval] BSTR *pszHelp);
+ [propget] HRESULT KeyboardShortcut([out, retval] BSTR *pszKeyboardShortcut);
+ /*
+ * FIXME: Current versions of Windows SDK use
+ * SAFEARRAY(IRawElementProviderSimple *) instead of
+ * SAFEARRAY(VARIANT). The new type is currently unsupported
+ * in widl, we should switch to it when it is.
+ */
+ HRESULT GetSelection([out, retval] SAFEARRAY(VARIANT) *pvarSelectedChildren);
+ [propget] HRESULT DefaultAction([out, retval] BSTR *pszDefaultAction);
+ }
}
--
GitLab
https://gitlab.winehq.org/wine/wine/-/merge_requests/216
June 10, 2022
[PATCH v3 1/3] uiautomationcore: Implement get_HostRawElementProvider for MSAA providers.
by Connor McAdams
From: Connor McAdams <cmcadams(a)codeweavers.com>
Signed-off-by: Connor McAdams <cmcadams(a)codeweavers.com>
---
dlls/uiautomationcore/tests/uiautomation.c | 479 ++++++++++++++++++++-
dlls/uiautomationcore/uia_provider.c | 190 +++++++-
2 files changed, 654 insertions(+), 15 deletions(-)
diff --git a/dlls/uiautomationcore/tests/uiautomation.c b/dlls/uiautomationcore/tests/uiautomation.c
index f3e4b89a120..6ed3c907a40 100644
--- a/dlls/uiautomationcore/tests/uiautomation.c
+++ b/dlls/uiautomationcore/tests/uiautomation.c
@@ -58,13 +58,21 @@ static HRESULT (WINAPI *pUiaProviderFromIAccessible)(IAccessible *, long, DWORD,
DEFINE_EXPECT(winproc_GETOBJECT_CLIENT);
DEFINE_EXPECT(Accessible_accNavigate);
DEFINE_EXPECT(Accessible_get_accParent);
+DEFINE_EXPECT(Accessible_get_accChildCount);
+DEFINE_EXPECT(Accessible_get_accName);
DEFINE_EXPECT(Accessible_get_accRole);
DEFINE_EXPECT(Accessible_get_accState);
+DEFINE_EXPECT(Accessible_accLocation);
+DEFINE_EXPECT(Accessible2_get_accParent);
+DEFINE_EXPECT(Accessible2_get_accChildCount);
+DEFINE_EXPECT(Accessible2_get_accName);
+DEFINE_EXPECT(Accessible2_get_accRole);
+DEFINE_EXPECT(Accessible2_get_accState);
+DEFINE_EXPECT(Accessible2_accLocation);
+DEFINE_EXPECT(Accessible2_QI_IAccIdentity);
DEFINE_EXPECT(Accessible_child_accNavigate);
DEFINE_EXPECT(Accessible_child_get_accParent);
-static IAccessible *acc_client;
-
static BOOL check_variant_i4(VARIANT *v, int val)
{
if (V_VT(v) == VT_I4 && V_I4(v) == val)
@@ -92,7 +100,10 @@ static struct Accessible
HWND ow_hwnd;
INT role;
INT state;
-} Accessible, Accessible_child;
+ LONG child_count;
+ LPCWSTR name;
+ LONG left, top, width, height;
+} Accessible, Accessible2, Accessible_child;
static inline struct Accessible* impl_from_Accessible(IAccessible *iface)
{
@@ -104,6 +115,14 @@ static HRESULT WINAPI Accessible_QueryInterface(IAccessible *iface, REFIID riid,
struct Accessible *This = impl_from_Accessible(iface);
*obj = NULL;
+ if (IsEqualIID(riid, &IID_IAccIdentity))
+ {
+ if (This == &Accessible2)
+ CHECK_EXPECT(Accessible2_QI_IAccIdentity);
+ ok(This == &Accessible2, "unexpected call\n");
+ return E_NOINTERFACE;
+ }
+
if (IsEqualIID(riid, &IID_IUnknown) || IsEqualIID(riid, &IID_IDispatch) ||
IsEqualIID(riid, &IID_IAccessible))
*obj = iface;
@@ -162,6 +181,8 @@ static HRESULT WINAPI Accessible_get_accParent(IAccessible *iface, IDispatch **o
if (This == &Accessible_child)
CHECK_EXPECT(Accessible_child_get_accParent);
+ else if (This == &Accessible2)
+ CHECK_EXPECT(Accessible2_get_accParent);
else
CHECK_EXPECT(Accessible_get_accParent);
@@ -174,7 +195,19 @@ static HRESULT WINAPI Accessible_get_accParent(IAccessible *iface, IDispatch **o
static HRESULT WINAPI Accessible_get_accChildCount(IAccessible *iface, LONG *out_count)
{
- ok(0, "unexpected call\n");
+ struct Accessible *This = impl_from_Accessible(iface);
+
+ if (This == &Accessible2)
+ CHECK_EXPECT(Accessible2_get_accChildCount);
+ else
+ CHECK_EXPECT(Accessible_get_accChildCount);
+
+ if (This->child_count)
+ {
+ *out_count = This->child_count;
+ return S_OK;
+ }
+
return E_NOTIMPL;
}
@@ -188,7 +221,20 @@ static HRESULT WINAPI Accessible_get_accChild(IAccessible *iface, VARIANT child_
static HRESULT WINAPI Accessible_get_accName(IAccessible *iface, VARIANT child_id,
BSTR *out_name)
{
- ok(0, "unexpected call\n");
+ struct Accessible *This = impl_from_Accessible(iface);
+
+ *out_name = NULL;
+ if (This == &Accessible2)
+ CHECK_EXPECT(Accessible2_get_accName);
+ else
+ CHECK_EXPECT(Accessible_get_accName);
+
+ if (This->name)
+ {
+ *out_name = SysAllocString(This->name);
+ return S_OK;
+ }
+
return E_NOTIMPL;
}
@@ -211,8 +257,10 @@ static HRESULT WINAPI Accessible_get_accRole(IAccessible *iface, VARIANT child_i
{
struct Accessible *This = impl_from_Accessible(iface);
- ok(This == &Accessible, "unexpected call\n");
- CHECK_EXPECT(Accessible_get_accRole);
+ if (This == &Accessible2)
+ CHECK_EXPECT(Accessible2_get_accRole);
+ else
+ CHECK_EXPECT(Accessible_get_accRole);
if (This->role)
{
@@ -229,8 +277,10 @@ static HRESULT WINAPI Accessible_get_accState(IAccessible *iface, VARIANT child_
{
struct Accessible *This = impl_from_Accessible(iface);
- ok(This == &Accessible, "unexpected call\n");
- CHECK_EXPECT(Accessible_get_accState);
+ if (This == &Accessible2)
+ CHECK_EXPECT(Accessible2_get_accState);
+ else
+ CHECK_EXPECT(Accessible_get_accState);
if (This->state)
{
@@ -292,7 +342,22 @@ static HRESULT WINAPI Accessible_accSelect(IAccessible *iface, LONG select_flags
static HRESULT WINAPI Accessible_accLocation(IAccessible *iface, LONG *out_left,
LONG *out_top, LONG *out_width, LONG *out_height, VARIANT child_id)
{
- ok(0, "unexpected call\n");
+ struct Accessible *This = impl_from_Accessible(iface);
+
+ if (This == &Accessible2)
+ CHECK_EXPECT(Accessible2_accLocation);
+ else
+ CHECK_EXPECT(Accessible_accLocation);
+
+ if (This->width && This->height)
+ {
+ *out_left = This->left;
+ *out_top = This->top;
+ *out_width = This->width;
+ *out_height = This->height;
+ return S_OK;
+ }
+
return E_NOTIMPL;
}
@@ -430,8 +495,21 @@ static struct Accessible Accessible =
1,
NULL,
0, 0,
+ 0, 0, 0, NULL,
+ 0, 0, 0, 0,
+};
+
+static struct Accessible Accessible2 =
+{
+ { &AccessibleVtbl },
+ { &OleWindowVtbl },
+ 1,
+ NULL,
0, 0,
+ 0, 0, 0, NULL,
+ 0, 0, 0, 0,
};
+
static struct Accessible Accessible_child =
{
{ &AccessibleVtbl },
@@ -439,9 +517,11 @@ static struct Accessible Accessible_child =
1,
&Accessible.IAccessible_iface,
0, 0,
- 0, 0,
+ 0, 0, 0, NULL,
+ 0, 0, 0, 0,
};
+static IAccessible *acc_client;
static LRESULT WINAPI test_wnd_proc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
@@ -782,6 +862,20 @@ static const struct msaa_state_uia_prop msaa_state_uia_props[] = {
{ STATE_SYSTEM_PROTECTED, UIA_IsPasswordPropertyId },
};
+static void set_accessible_props(struct Accessible *acc, INT role, INT state,
+ LONG child_count, LPCWSTR name, LONG left, LONG top, LONG width, LONG height)
+{
+
+ acc->role = role;
+ acc->state = state;
+ acc->child_count = child_count;
+ acc->name = name;
+ acc->left = left;
+ acc->top = top;
+ acc->width = width;
+ acc->height = height;
+}
+
static void test_uia_prov_from_acc_properties(void)
{
IRawElementProviderSimple *elprov;
@@ -883,7 +977,7 @@ static void test_uia_prov_from_acc_properties(void)
static void test_UiaProviderFromIAccessible(void)
{
- IRawElementProviderSimple *elprov;
+ IRawElementProviderSimple *elprov, *elprov2;
enum ProviderOptions prov_opt;
IAccessible *acc;
WNDCLASSA cls;
@@ -891,7 +985,7 @@ static void test_UiaProviderFromIAccessible(void)
HWND hwnd;
VARIANT v;
-
+ CoInitializeEx(NULL, COINIT_MULTITHREADED);
cls.style = 0;
cls.lpfnWndProc = test_wnd_proc;
cls.cbClsExtra = 0;
@@ -997,11 +1091,370 @@ static void test_UiaProviderFromIAccessible(void)
hr = pUiaProviderFromIAccessible(&Accessible.IAccessible_iface, 1, UIA_PFIA_DEFAULT, &elprov);
ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
ok(Accessible.ref == 2, "Unexpected refcnt %ld\n", Accessible.ref);
+
+ /*
+ * Simple child element (IAccessible without CHILDID_SELF) cannot be root
+ * IAccessible. No checks against the root HWND IAccessible will be done.
+ */
+ elprov2 = (void *)0xdeadbeef;
+ hr = IRawElementProviderSimple_get_HostRawElementProvider(elprov, &elprov2);
+ ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
+ ok(!elprov2, "elprov != NULL\n");
+
+ IRawElementProviderSimple_Release(elprov);
+ ok(Accessible.ref == 1, "Unexpected refcnt %ld\n", Accessible.ref);
+
+ /*
+ * &Accessible.IAccessible_iface will be compared against the default
+ * client accessible object. Since we have all properties set to 0,
+ * we return failure HRESULTs and all properties will get queried but not
+ * compared.
+ */
+ hr = pUiaProviderFromIAccessible(&Accessible.IAccessible_iface, CHILDID_SELF, UIA_PFIA_DEFAULT, &elprov);
+ ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
+ ok(Accessible.ref == 2, "Unexpected refcnt %ld\n", Accessible.ref);
+
+ SET_EXPECT(winproc_GETOBJECT_CLIENT);
+ SET_EXPECT(Accessible_get_accRole);
+ SET_EXPECT(Accessible_get_accState);
+ SET_EXPECT(Accessible_get_accChildCount);
+ SET_EXPECT(Accessible_accLocation);
+ SET_EXPECT(Accessible_get_accName);
+ elprov2 = (void *)0xdeadbeef;
+ hr = IRawElementProviderSimple_get_HostRawElementProvider(elprov, &elprov2);
+ ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
+ ok(!elprov2, "elprov != NULL\n");
+ CHECK_CALLED(winproc_GETOBJECT_CLIENT);
+ CHECK_CALLED(Accessible_get_accRole);
+ CHECK_CALLED(Accessible_get_accState);
+ CHECK_CALLED(Accessible_get_accChildCount);
+ CHECK_CALLED(Accessible_accLocation);
+ CHECK_CALLED(Accessible_get_accName);
+
+ /* Second call won't send WM_GETOBJECT. */
+ elprov2 = (void *)0xdeadbeef;
+ hr = IRawElementProviderSimple_get_HostRawElementProvider(elprov, &elprov2);
+ ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
+ ok(!elprov2, "elprov != NULL\n");
+
+ IRawElementProviderSimple_Release(elprov);
+ ok(Accessible.ref == 1, "Unexpected refcnt %ld\n", Accessible.ref);
+
+ /*
+ * Return &Accessible.IAccessible_iface in response to OBJID_CLIENT,
+ * interface pointers will be compared, no method calls to check property
+ * values.
+ */
+ hr = pUiaProviderFromIAccessible(&Accessible.IAccessible_iface, CHILDID_SELF, UIA_PFIA_DEFAULT, &elprov);
+ ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
+ ok(Accessible.ref == 2, "Unexpected refcnt %ld\n", Accessible.ref);
+
+ SET_EXPECT(winproc_GETOBJECT_CLIENT);
+ elprov2 = (void *)0xdeadbeef;
+ acc_client = &Accessible.IAccessible_iface;
+ hr = IRawElementProviderSimple_get_HostRawElementProvider(elprov, &elprov2);
+ ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
+ ok(!!elprov2, "elprov == NULL, elprov %p\n", elprov2);
+ IRawElementProviderSimple_Release(elprov2);
+ CHECK_CALLED(winproc_GETOBJECT_CLIENT);
+
+ /* Second call, no checks. */
+ elprov2 = (void *)0xdeadbeef;
+ acc_client = NULL;
+ hr = IRawElementProviderSimple_get_HostRawElementProvider(elprov, &elprov2);
+ ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
+ ok(!!elprov2, "elprov == NULL, elprov %p\n", elprov2);
+ IRawElementProviderSimple_Release(elprov2);
+
+ IRawElementProviderSimple_Release(elprov);
+ ok(Accessible.ref == 1, "Unexpected refcnt %ld\n", Accessible.ref);
+
+ /*
+ * Return &Accessible2.IAccessible_iface in response to OBJID_CLIENT,
+ * interface pointers won't match, so properties will be compared.
+ */
+ hr = pUiaProviderFromIAccessible(&Accessible.IAccessible_iface, CHILDID_SELF, UIA_PFIA_DEFAULT, &elprov);
+ ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
+ ok(Accessible.ref == 2, "Unexpected refcnt %ld\n", Accessible.ref);
+
+ set_accessible_props(&Accessible, ROLE_SYSTEM_DOCUMENT, STATE_SYSTEM_FOCUSABLE, 1,
+ L"acc_name", 0, 0, 50, 50);
+ set_accessible_props(&Accessible2, ROLE_SYSTEM_DOCUMENT, STATE_SYSTEM_FOCUSABLE, 1,
+ L"acc_name", 0, 0, 50, 50);
+
+ acc_client = &Accessible2.IAccessible_iface;
+ SET_EXPECT(winproc_GETOBJECT_CLIENT);
+ SET_EXPECT(Accessible_get_accRole);
+ SET_EXPECT(Accessible_get_accState);
+ SET_EXPECT(Accessible_get_accChildCount);
+ SET_EXPECT(Accessible_accLocation);
+ SET_EXPECT(Accessible_get_accName);
+ SET_EXPECT(Accessible2_get_accRole);
+ SET_EXPECT(Accessible2_get_accState);
+ SET_EXPECT(Accessible2_get_accChildCount);
+ SET_EXPECT(Accessible2_accLocation);
+ SET_EXPECT(Accessible2_get_accName);
+ /*
+ * The IAccessible returned by WM_GETOBJECT will be checked for an
+ * IAccIdentity interface to see if Dynamic Annotation properties should
+ * be queried. If not present on the current IAccessible, it will check
+ * the parent IAccessible for one.
+ */
+ SET_EXPECT(Accessible2_QI_IAccIdentity);
+ SET_EXPECT(Accessible2_get_accParent);
+ elprov2 = (void *)0xdeadbeef;
+ hr = IRawElementProviderSimple_get_HostRawElementProvider(elprov, &elprov2);
+ ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
+ ok(!!elprov2, "elprov == NULL, elprov %p\n", elprov2);
+ ok(Accessible2.ref == 1, "Unexpected refcnt %ld\n", Accessible2.ref);
+ CHECK_CALLED(winproc_GETOBJECT_CLIENT);
+ CHECK_CALLED(Accessible_get_accRole);
+ CHECK_CALLED(Accessible_get_accState);
+ CHECK_CALLED(Accessible_get_accChildCount);
+ CHECK_CALLED(Accessible_accLocation);
+ CHECK_CALLED(Accessible_get_accName);
+ CHECK_CALLED(Accessible2_get_accRole);
+ CHECK_CALLED(Accessible2_get_accState);
+ CHECK_CALLED(Accessible2_get_accChildCount);
+ CHECK_CALLED(Accessible2_accLocation);
+ CHECK_CALLED(Accessible2_get_accName);
+ todo_wine CHECK_CALLED(Accessible2_QI_IAccIdentity);
+ todo_wine CHECK_CALLED(Accessible2_get_accParent);
+ IRawElementProviderSimple_Release(elprov2);
+
+ elprov2 = (void *)0xdeadbeef;
+ acc_client = NULL;
+ hr = IRawElementProviderSimple_get_HostRawElementProvider(elprov, &elprov2);
+ ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
+ ok(!!elprov2, "elprov == NULL, elprov %p\n", elprov2);
+ IRawElementProviderSimple_Release(elprov2);
+
+ IRawElementProviderSimple_Release(elprov);
+ ok(Accessible.ref == 1, "Unexpected refcnt %ld\n", Accessible.ref);
+
+ /*
+ * If a failure HRESULT is returned from the IRawElementProviderSimple
+ * IAccessible, the corresponding AOFW IAccessible method isn't called.
+ * An exception is get_accChildCount, which is always called, but only
+ * checked if the HRESULT return value is not a failure. If Role/State/Name
+ * are not queried, no IAccIdentity check is done.
+ */
+ hr = pUiaProviderFromIAccessible(&Accessible.IAccessible_iface, CHILDID_SELF, UIA_PFIA_DEFAULT, &elprov);
+ ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
+ ok(Accessible.ref == 2, "Unexpected refcnt %ld\n", Accessible.ref);
+
+ set_accessible_props(&Accessible, 0, 0, 0, NULL, 0, 0, 0, 0);
+ set_accessible_props(&Accessible2, ROLE_SYSTEM_DOCUMENT, STATE_SYSTEM_FOCUSABLE, 1,
+ L"acc_name", 0, 0, 50, 50);
+
+ acc_client = &Accessible2.IAccessible_iface;
+ SET_EXPECT(winproc_GETOBJECT_CLIENT);
+ SET_EXPECT(Accessible_get_accRole);
+ SET_EXPECT(Accessible_get_accState);
+ SET_EXPECT(Accessible_get_accChildCount);
+ SET_EXPECT(Accessible2_get_accChildCount);
+ SET_EXPECT(Accessible_accLocation);
+ SET_EXPECT(Accessible_get_accName);
+ elprov2 = (void *)0xdeadbeef;
+ hr = IRawElementProviderSimple_get_HostRawElementProvider(elprov, &elprov2);
+ ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
+ ok(!elprov2, "elprov != NULL, elprov %p\n", elprov2);
+ CHECK_CALLED(winproc_GETOBJECT_CLIENT);
+ CHECK_CALLED(Accessible_get_accRole);
+ CHECK_CALLED(Accessible_get_accState);
+ CHECK_CALLED(Accessible_get_accChildCount);
+ CHECK_CALLED(Accessible2_get_accChildCount);
+ CHECK_CALLED(Accessible_accLocation);
+ CHECK_CALLED(Accessible_get_accName);
+
+ acc_client = NULL;
+ elprov2 = (void *)0xdeadbeef;
+ hr = IRawElementProviderSimple_get_HostRawElementProvider(elprov, &elprov2);
+ ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
+ ok(!elprov2, "elprov != NULL, elprov %p\n", elprov2);
+
+ IRawElementProviderSimple_Release(elprov);
+ ok(Accessible.ref == 1, "Unexpected refcnt %ld\n", Accessible.ref);
+
+ /*
+ * Properties are checked in a sequence of accRole, accState,
+ * accChildCount, accLocation, and finally accName. If a mismatch is found
+ * early in the sequence, the rest aren't checked.
+ */
+ hr = pUiaProviderFromIAccessible(&Accessible.IAccessible_iface, CHILDID_SELF, UIA_PFIA_DEFAULT, &elprov);
+ ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
+ ok(Accessible.ref == 2, "Unexpected refcnt %ld\n", Accessible.ref);
+
+ set_accessible_props(&Accessible, ROLE_SYSTEM_DOCUMENT, STATE_SYSTEM_FOCUSABLE, 0, NULL, 0, 0, 0, 0);
+ set_accessible_props(&Accessible2, ROLE_SYSTEM_CLIENT, STATE_SYSTEM_FOCUSABLE, 0, NULL, 0, 0, 0, 0);
+
+ acc_client = &Accessible2.IAccessible_iface;
+ SET_EXPECT(winproc_GETOBJECT_CLIENT);
+ SET_EXPECT(Accessible_get_accRole);
+ SET_EXPECT(Accessible2_get_accRole);
+ SET_EXPECT(Accessible2_QI_IAccIdentity);
+ SET_EXPECT(Accessible2_get_accParent);
+ elprov2 = (void *)0xdeadbeef;
+ hr = IRawElementProviderSimple_get_HostRawElementProvider(elprov, &elprov2);
+ ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
+ ok(!elprov2, "elprov != NULL, elprov %p\n", elprov2);
+ CHECK_CALLED(winproc_GETOBJECT_CLIENT);
+ CHECK_CALLED(Accessible_get_accRole);
+ CHECK_CALLED(Accessible2_get_accRole);
+ todo_wine CHECK_CALLED(Accessible2_QI_IAccIdentity);
+ todo_wine CHECK_CALLED(Accessible2_get_accParent);
+
+ elprov2 = (void *)0xdeadbeef;
+ acc_client = NULL;
+ hr = IRawElementProviderSimple_get_HostRawElementProvider(elprov, &elprov2);
+ ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
+ ok(!elprov2, "elprov != NULL, elprov %p\n", elprov2);
+
+ IRawElementProviderSimple_Release(elprov);
+ ok(Accessible.ref == 1, "Unexpected refcnt %ld\n", Accessible.ref);
+
+ /* 4/5 properties match, considered a match. */
+ hr = pUiaProviderFromIAccessible(&Accessible.IAccessible_iface, CHILDID_SELF, UIA_PFIA_DEFAULT, &elprov);
+ ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
+ ok(Accessible.ref == 2, "Unexpected refcnt %ld\n", Accessible.ref);
+
+ set_accessible_props(&Accessible, ROLE_SYSTEM_DOCUMENT, STATE_SYSTEM_FOCUSABLE, 1, NULL, 0, 0, 50, 50);
+ set_accessible_props(&Accessible2, ROLE_SYSTEM_DOCUMENT, STATE_SYSTEM_FOCUSABLE, 1, NULL, 0, 0, 50, 50);
+
+ acc_client = &Accessible2.IAccessible_iface;
+ SET_EXPECT(winproc_GETOBJECT_CLIENT);
+ SET_EXPECT(Accessible_get_accRole);
+ SET_EXPECT(Accessible_get_accState);
+ SET_EXPECT(Accessible_get_accChildCount);
+ SET_EXPECT(Accessible_accLocation);
+ SET_EXPECT(Accessible_get_accName);
+ SET_EXPECT(Accessible2_get_accRole);
+ SET_EXPECT(Accessible2_get_accState);
+ SET_EXPECT(Accessible2_get_accChildCount);
+ SET_EXPECT(Accessible2_accLocation);
+ SET_EXPECT(Accessible2_QI_IAccIdentity);
+ SET_EXPECT(Accessible2_get_accParent);
+ elprov2 = (void *)0xdeadbeef;
+ hr = IRawElementProviderSimple_get_HostRawElementProvider(elprov, &elprov2);
+ ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
+ ok(!!elprov2, "elprov == NULL, elprov %p\n", elprov2);
+ ok(Accessible2.ref == 1, "Unexpected refcnt %ld\n", Accessible2.ref);
+ CHECK_CALLED(winproc_GETOBJECT_CLIENT);
+ CHECK_CALLED(Accessible_get_accRole);
+ CHECK_CALLED(Accessible_get_accState);
+ CHECK_CALLED(Accessible_get_accChildCount);
+ CHECK_CALLED(Accessible_accLocation);
+ CHECK_CALLED(Accessible_get_accName);
+ CHECK_CALLED(Accessible2_get_accRole);
+ CHECK_CALLED(Accessible2_get_accState);
+ CHECK_CALLED(Accessible2_get_accChildCount);
+ CHECK_CALLED(Accessible2_accLocation);
+ todo_wine CHECK_CALLED(Accessible2_QI_IAccIdentity);
+ todo_wine CHECK_CALLED(Accessible2_get_accParent);
+ IRawElementProviderSimple_Release(elprov2);
+
+ elprov2 = (void *)0xdeadbeef;
+ acc_client = NULL;
+ hr = IRawElementProviderSimple_get_HostRawElementProvider(elprov, &elprov2);
+ ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
+ ok(!!elprov2, "elprov == NULL, elprov %p\n", elprov2);
+ IRawElementProviderSimple_Release(elprov2);
+
+ IRawElementProviderSimple_Release(elprov);
+ ok(Accessible.ref == 1, "Unexpected refcnt %ld\n", Accessible.ref);
+
+ /* 3/5 properties match, not considered a match. */
+ hr = pUiaProviderFromIAccessible(&Accessible.IAccessible_iface, CHILDID_SELF, UIA_PFIA_DEFAULT, &elprov);
+ ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
+ ok(Accessible.ref == 2, "Unexpected refcnt %ld\n", Accessible.ref);
+
+ set_accessible_props(&Accessible, ROLE_SYSTEM_DOCUMENT, STATE_SYSTEM_FOCUSABLE, 1, NULL, 0, 0, 0, 0);
+ set_accessible_props(&Accessible2, ROLE_SYSTEM_DOCUMENT, STATE_SYSTEM_FOCUSABLE, 1, NULL, 0, 0, 0, 0);
+
+ acc_client = &Accessible2.IAccessible_iface;
+ SET_EXPECT(winproc_GETOBJECT_CLIENT);
+ SET_EXPECT(Accessible_get_accRole);
+ SET_EXPECT(Accessible_get_accState);
+ SET_EXPECT(Accessible_get_accChildCount);
+ SET_EXPECT(Accessible_accLocation);
+ SET_EXPECT(Accessible_get_accName);
+ SET_EXPECT(Accessible2_get_accRole);
+ SET_EXPECT(Accessible2_get_accState);
+ SET_EXPECT(Accessible2_get_accChildCount);
+ SET_EXPECT(Accessible2_QI_IAccIdentity);
+ SET_EXPECT(Accessible2_get_accParent);
+ elprov2 = (void *)0xdeadbeef;
+ hr = IRawElementProviderSimple_get_HostRawElementProvider(elprov, &elprov2);
+ ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
+ ok(!elprov2, "elprov != NULL, elprov %p\n", elprov2);
+ CHECK_CALLED(winproc_GETOBJECT_CLIENT);
+ CHECK_CALLED(Accessible_get_accRole);
+ CHECK_CALLED(Accessible_get_accState);
+ CHECK_CALLED(Accessible_get_accChildCount);
+ CHECK_CALLED(Accessible_accLocation);
+ CHECK_CALLED(Accessible_get_accName);
+ CHECK_CALLED(Accessible2_get_accRole);
+ CHECK_CALLED(Accessible2_get_accState);
+ CHECK_CALLED(Accessible2_get_accChildCount);
+ todo_wine CHECK_CALLED(Accessible2_QI_IAccIdentity);
+ todo_wine CHECK_CALLED(Accessible2_get_accParent);
+
+ elprov2 = (void *)0xdeadbeef;
+ acc_client = NULL;
+ hr = IRawElementProviderSimple_get_HostRawElementProvider(elprov, &elprov2);
+ ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
+ ok(!elprov2, "elprov != NULL, elprov %p\n", elprov2);
+
+ IRawElementProviderSimple_Release(elprov);
+ ok(Accessible.ref == 1, "Unexpected refcnt %ld\n", Accessible.ref);
+
+ /* Only name matches, considered a match. */
+ hr = pUiaProviderFromIAccessible(&Accessible.IAccessible_iface, CHILDID_SELF, UIA_PFIA_DEFAULT, &elprov);
+ ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
+ ok(Accessible.ref == 2, "Unexpected refcnt %ld\n", Accessible.ref);
+
+ set_accessible_props(&Accessible, 0, 0, 0, L"acc_name", 0, 0, 0, 0);
+ set_accessible_props(&Accessible2, 0, 0, 0, L"acc_name", 0, 0, 0, 0);
+
+ acc_client = &Accessible2.IAccessible_iface;
+ SET_EXPECT(winproc_GETOBJECT_CLIENT);
+ SET_EXPECT(Accessible_get_accRole);
+ SET_EXPECT(Accessible_get_accState);
+ SET_EXPECT(Accessible_get_accChildCount);
+ SET_EXPECT(Accessible_accLocation);
+ SET_EXPECT(Accessible_get_accName);
+ SET_EXPECT(Accessible2_get_accChildCount);
+ SET_EXPECT(Accessible2_get_accName);
+ SET_EXPECT(Accessible2_QI_IAccIdentity);
+ SET_EXPECT(Accessible2_get_accParent);
+ elprov2 = (void *)0xdeadbeef;
+ hr = IRawElementProviderSimple_get_HostRawElementProvider(elprov, &elprov2);
+ ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
+ ok(!!elprov2, "elprov == NULL, elprov %p\n", elprov2);
+ ok(Accessible2.ref == 1, "Unexpected refcnt %ld\n", Accessible2.ref);
+ CHECK_CALLED(winproc_GETOBJECT_CLIENT);
+ CHECK_CALLED(Accessible_get_accRole);
+ CHECK_CALLED(Accessible_get_accState);
+ CHECK_CALLED(Accessible_get_accChildCount);
+ CHECK_CALLED(Accessible_accLocation);
+ CHECK_CALLED(Accessible_get_accName);
+ CHECK_CALLED(Accessible2_get_accChildCount);
+ CHECK_CALLED(Accessible2_get_accName);
+ todo_wine CHECK_CALLED(Accessible2_QI_IAccIdentity);
+ todo_wine CHECK_CALLED(Accessible2_get_accParent);
+
+ elprov2 = (void *)0xdeadbeef;
+ acc_client = NULL;
+ hr = IRawElementProviderSimple_get_HostRawElementProvider(elprov, &elprov2);
+ ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
+ ok(!!elprov2, "elprov == NULL, elprov %p\n", elprov2);
+
IRawElementProviderSimple_Release(elprov);
ok(Accessible.ref == 1, "Unexpected refcnt %ld\n", Accessible.ref);
test_uia_prov_from_acc_properties();
+ CoUninitialize();
DestroyWindow(hwnd);
UnregisterClassA("pUiaProviderFromIAccessible class", NULL);
Accessible.acc_hwnd = NULL;
diff --git a/dlls/uiautomationcore/uia_provider.c b/dlls/uiautomationcore/uia_provider.c
index dae0187596d..6c3bd1c2186 100644
--- a/dlls/uiautomationcore/uia_provider.c
+++ b/dlls/uiautomationcore/uia_provider.c
@@ -23,9 +23,12 @@
#include "wine/debug.h"
#include "wine/heap.h"
+#include "initguid.h"
WINE_DEFAULT_DEBUG_CHANNEL(uiautomation);
+DEFINE_GUID(SID_AccFromDAWrapper, 0x33f139ee, 0xe509, 0x47f7, 0xbf,0x39, 0x83,0x76,0x44,0xf7,0x45,0x76);
+
static void variant_init_i4(VARIANT *v, int val)
{
V_VT(v) = VT_I4;
@@ -51,6 +54,157 @@ static BOOL msaa_check_acc_state(IAccessible *acc, VARIANT cid, ULONG flag)
return FALSE;
}
+static IAccessible *msaa_acc_da_unwrap(IAccessible *acc)
+{
+ IServiceProvider *sp;
+ IAccessible *acc2;
+ HRESULT hr;
+
+ hr = IAccessible_QueryInterface(acc, &IID_IServiceProvider, (void**)&sp);
+ if (SUCCEEDED(hr))
+ {
+ hr = IServiceProvider_QueryService(sp, &SID_AccFromDAWrapper, &IID_IAccessible, (void**)&acc2);
+ IServiceProvider_Release(sp);
+ }
+
+ if (SUCCEEDED(hr) && acc2)
+ return acc2;
+
+ IAccessible_AddRef(acc);
+ return acc;
+}
+
+/*
+ * Compare role, state, child count, and location properties of the two
+ * IAccessibles. If all four are successfully retrieved and are equal, this is
+ * considered a match.
+ */
+static HRESULT msaa_acc_prop_match(IAccessible *acc, IAccessible *acc2)
+{
+ BOOL role_match, state_match, child_count_match, location_match;
+ LONG child_count[2], left[2], top[2], width[2], height[2];
+ VARIANT cid, v, v2;
+ HRESULT hr, hr2;
+
+ role_match = state_match = child_count_match = location_match = FALSE;
+ variant_init_i4(&cid, CHILDID_SELF);
+ hr = IAccessible_get_accRole(acc, cid, &v);
+ if (SUCCEEDED(hr) && (V_VT(&v) == VT_I4))
+ {
+ VariantInit(&v2);
+ hr = IAccessible_get_accRole(acc2, cid, &v2);
+ if (SUCCEEDED(hr) && (V_VT(&v2) == VT_I4))
+ {
+ if (V_I4(&v) != V_I4(&v2))
+ return E_FAIL;
+
+ role_match = TRUE;
+ }
+ }
+
+ VariantInit(&v);
+ hr = IAccessible_get_accState(acc, cid, &v);
+ if (SUCCEEDED(hr) && (V_VT(&v) == VT_I4))
+ {
+ VariantInit(&v2);
+ hr = IAccessible_get_accState(acc2, cid, &v2);
+ if (SUCCEEDED(hr) && (V_VT(&v2) == VT_I4))
+ {
+ if (V_I4(&v) != V_I4(&v2))
+ return E_FAIL;
+
+ state_match = TRUE;
+ }
+ }
+
+ hr = IAccessible_get_accChildCount(acc, &child_count[0]);
+ hr2 = IAccessible_get_accChildCount(acc2, &child_count[1]);
+ if (SUCCEEDED(hr) && SUCCEEDED(hr2))
+ {
+ if (child_count[0] != child_count[1])
+ return E_FAIL;
+
+ child_count_match = TRUE;
+ }
+
+ hr = IAccessible_accLocation(acc, &left[0], &top[0], &width[0], &height[0], cid);
+ if (SUCCEEDED(hr))
+ {
+ hr = IAccessible_accLocation(acc2, &left[1], &top[1], &width[1], &height[1], cid);
+ if (SUCCEEDED(hr))
+ {
+ if ((left[0] != left[1]) || (top[0] != top[1]) || (width[0] != width[1]) ||
+ (height[0] != height[1]))
+ return E_FAIL;
+
+ location_match = TRUE;
+ }
+ }
+
+ if (role_match && state_match && child_count_match && location_match)
+ return S_OK;
+
+ return S_FALSE;
+}
+
+static BOOL msaa_acc_compare(IAccessible *acc, IAccessible *acc2)
+{
+ IUnknown *unk, *unk2;
+ BOOL matched = FALSE;
+ BSTR name[2];
+ VARIANT cid;
+ HRESULT hr;
+
+ acc = msaa_acc_da_unwrap(acc);
+ acc2 = msaa_acc_da_unwrap(acc2);
+ IAccessible_QueryInterface(acc, &IID_IUnknown, (void**)&unk);
+ IAccessible_QueryInterface(acc2, &IID_IUnknown, (void**)&unk2);
+ if (unk == unk2)
+ {
+ matched = TRUE;
+ goto exit;
+ }
+
+ hr = msaa_acc_prop_match(acc, acc2);
+ if (FAILED(hr))
+ goto exit;
+ if (hr == S_OK)
+ matched = TRUE;
+
+ variant_init_i4(&cid, CHILDID_SELF);
+ hr = IAccessible_get_accName(acc, cid, &name[0]);
+ if (SUCCEEDED(hr))
+ {
+ hr = IAccessible_get_accName(acc2, cid, &name[1]);
+ if (SUCCEEDED(hr))
+ {
+ if (!name[0] && !name[1])
+ matched = TRUE;
+ else if (!name[0] || !name[1])
+ matched = FALSE;
+ else
+ {
+ if (!wcscmp(name[0], name[1]))
+ matched = TRUE;
+ else
+ matched = FALSE;
+ }
+
+ SysFreeString(name[1]);
+ }
+
+ SysFreeString(name[0]);
+ }
+
+exit:
+ IUnknown_Release(unk);
+ IUnknown_Release(unk2);
+ IAccessible_Release(acc);
+ IAccessible_Release(acc2);
+
+ return matched;
+}
+
static LONG msaa_role_to_uia_control_type(LONG role)
{
switch (role)
@@ -141,8 +295,34 @@ struct msaa_provider {
VARIANT cid;
HWND hwnd;
LONG control_type;
+
+ BOOL root_acc_check_ran;
+ BOOL is_root_acc;
};
+static BOOL msaa_check_root_acc(struct msaa_provider *msaa_prov)
+{
+ IAccessible *acc;
+ HRESULT hr;
+
+ if (msaa_prov->root_acc_check_ran)
+ return msaa_prov->is_root_acc;
+
+ msaa_prov->root_acc_check_ran = TRUE;
+ if (V_I4(&msaa_prov->cid) != CHILDID_SELF)
+ return FALSE;
+
+ hr = AccessibleObjectFromWindow(msaa_prov->hwnd, OBJID_CLIENT, &IID_IAccessible, (void **)&acc);
+ if (FAILED(hr))
+ return FALSE;
+
+ if (msaa_acc_compare(msaa_prov->acc, acc))
+ msaa_prov->is_root_acc = TRUE;
+
+ IAccessible_Release(acc);
+ return msaa_prov->is_root_acc;
+}
+
static inline struct msaa_provider *impl_from_msaa_provider(IRawElementProviderSimple *iface)
{
return CONTAINING_RECORD(iface, struct msaa_provider, IRawElementProviderSimple_iface);
@@ -264,9 +444,15 @@ HRESULT WINAPI msaa_provider_GetPropertyValue(IRawElementProviderSimple *iface,
HRESULT WINAPI msaa_provider_get_HostRawElementProvider(IRawElementProviderSimple *iface,
IRawElementProviderSimple **ret_val)
{
- FIXME("%p, %p: stub!\n", iface, ret_val);
+ struct msaa_provider *msaa_prov = impl_from_msaa_provider(iface);
+
+ TRACE("%p, %p\n", iface, ret_val);
+
*ret_val = NULL;
- return E_NOTIMPL;
+ if (msaa_check_root_acc(msaa_prov))
+ return UiaHostProviderFromHwnd(msaa_prov->hwnd, ret_val);
+
+ return S_OK;
}
static const IRawElementProviderSimpleVtbl msaa_provider_vtbl = {
--
GitLab
https://gitlab.winehq.org/wine/wine/-/merge_requests/216
June 10, 2022
[PATCH v3 0/3] MR216: uiautomationcore: More UiaProviderFromIAccessible work.
by Connor McAdams (@cmcadams)
--
v3: uiautomationcore: Add ILegacyIAccessibleProvider implementation for MSAA providers.
include: Add ILegacyIAccessibleProvider interface definition.
uiautomationcore: Implement get_HostRawElementProvider for MSAA providers.
https://gitlab.winehq.org/wine/wine/-/merge_requests/216
June 10, 2022