ReactOS 0.4.16-dev-2491-g3dc6630
uia_provider.c File Reference
#include "uia_private.h"
#include "ocidl.h"
#include "wine/debug.h"
#include "initguid.h"
#include "wine/iaccessible2.h"
Include dependency graph for uia_provider.c:

Go to the source code of this file.

Classes

struct  msaa_provider
 
struct  base_hwnd_provider
 
struct  uia_provider_thread
 
struct  uia_provider_thread_map_entry
 

Macros

#define DIR_FORWARD   0
 
#define DIR_REVERSE   1
 
#define UIA_DEFAULT_MSG_TIMEOUT   10000
 
#define WM_GET_OBJECT_UIA_NODE   (WM_USER + 1)
 
#define WM_UIA_PROVIDER_THREAD_STOP   (WM_USER + 2)
 

Functions

 WINE_DEFAULT_DEBUG_CHANNEL (uiautomation)
 
 DEFINE_GUID (SID_AccFromDAWrapper, 0x33f139ee, 0xe509, 0x47f7, 0xbf, 0x39, 0x83, 0x76, 0x44, 0xf7, 0x45, 0x76)
 
static HRESULT msaa_check_acc_state_hres (IAccessible *acc, VARIANT cid, ULONG flag)
 
static BOOL msaa_check_acc_state (IAccessible *acc, VARIANT cid, ULONG flag)
 
static HRESULT msaa_acc_get_service (IAccessible *acc, REFGUID sid, REFIID riid, void **service)
 
static IAccessible2msaa_acc_get_ia2 (IAccessible *acc)
 
static IAccessiblemsaa_acc_da_unwrap (IAccessible *acc)
 
static BOOL msaa_acc_is_oleacc_proxy (IAccessible *acc)
 
static HRESULT msaa_acc_prop_match (IAccessible *acc, IAccessible *acc2)
 
static BOOL msaa_acc_iface_cmp (IAccessible *acc, IAccessible *acc2)
 
static BOOL msaa_acc_compare (IAccessible *acc, IAccessible *acc2)
 
static HRESULT msaa_acc_get_parent (IAccessible *acc, IAccessible **parent)
 
static HRESULT msaa_acc_get_next_child (IAccessible *acc, LONG start_pos, LONG direction, IAccessible **child, LONG *child_id, LONG *child_pos, BOOL check_visible)
 
static HRESULT msaa_acc_get_child_pos (IAccessible *acc, IAccessible **out_parent, LONG *out_child_pos)
 
static LONG msaa_role_to_uia_control_type (LONG role)
 
static BOOL msaa_check_root_acc (struct msaa_provider *msaa_prov)
 
static struct msaa_providerimpl_from_msaa_provider (IRawElementProviderSimple *iface)
 
HRESULT WINAPI msaa_provider_QueryInterface (IRawElementProviderSimple *iface, REFIID riid, void **ppv)
 
ULONG WINAPI msaa_provider_AddRef (IRawElementProviderSimple *iface)
 
ULONG WINAPI msaa_provider_Release (IRawElementProviderSimple *iface)
 
HRESULT WINAPI msaa_provider_get_ProviderOptions (IRawElementProviderSimple *iface, enum ProviderOptions *ret_val)
 
HRESULT WINAPI msaa_provider_GetPatternProvider (IRawElementProviderSimple *iface, PATTERNID pattern_id, IUnknown **ret_val)
 
HRESULT WINAPI msaa_provider_GetPropertyValue (IRawElementProviderSimple *iface, PROPERTYID prop_id, VARIANT *ret_val)
 
HRESULT WINAPI msaa_provider_get_HostRawElementProvider (IRawElementProviderSimple *iface, IRawElementProviderSimple **ret_val)
 
static struct msaa_providerimpl_from_msaa_fragment (IRawElementProviderFragment *iface)
 
static HRESULT WINAPI msaa_fragment_QueryInterface (IRawElementProviderFragment *iface, REFIID riid, void **ppv)
 
static ULONG WINAPI msaa_fragment_AddRef (IRawElementProviderFragment *iface)
 
static ULONG WINAPI msaa_fragment_Release (IRawElementProviderFragment *iface)
 
static HRESULT WINAPI msaa_fragment_Navigate (IRawElementProviderFragment *iface, enum NavigateDirection direction, IRawElementProviderFragment **ret_val)
 
static HRESULT WINAPI msaa_fragment_GetRuntimeId (IRawElementProviderFragment *iface, SAFEARRAY **ret_val)
 
static HRESULT WINAPI msaa_fragment_get_BoundingRectangle (IRawElementProviderFragment *iface, struct UiaRect *ret_val)
 
static HRESULT WINAPI msaa_fragment_GetEmbeddedFragmentRoots (IRawElementProviderFragment *iface, SAFEARRAY **ret_val)
 
static HRESULT WINAPI msaa_fragment_SetFocus (IRawElementProviderFragment *iface)
 
static HRESULT WINAPI msaa_fragment_get_FragmentRoot (IRawElementProviderFragment *iface, IRawElementProviderFragmentRoot **ret_val)
 
static struct msaa_providerimpl_from_msaa_fragment_root (IRawElementProviderFragmentRoot *iface)
 
static HRESULT WINAPI msaa_fragment_root_QueryInterface (IRawElementProviderFragmentRoot *iface, REFIID riid, void **ppv)
 
static ULONG WINAPI msaa_fragment_root_AddRef (IRawElementProviderFragmentRoot *iface)
 
static ULONG WINAPI msaa_fragment_root_Release (IRawElementProviderFragmentRoot *iface)
 
static HRESULT WINAPI msaa_fragment_root_ElementProviderFromPoint (IRawElementProviderFragmentRoot *iface, double x, double y, IRawElementProviderFragment **ret_val)
 
static HRESULT msaa_acc_get_focus (struct msaa_provider *prov, struct msaa_provider **out_prov)
 
static HRESULT WINAPI msaa_fragment_root_GetFocus (IRawElementProviderFragmentRoot *iface, IRawElementProviderFragment **ret_val)
 
static struct msaa_providerimpl_from_msaa_acc_provider (ILegacyIAccessibleProvider *iface)
 
static HRESULT WINAPI msaa_acc_provider_QueryInterface (ILegacyIAccessibleProvider *iface, REFIID riid, void **ppv)
 
static ULONG WINAPI msaa_acc_provider_AddRef (ILegacyIAccessibleProvider *iface)
 
static ULONG WINAPI msaa_acc_provider_Release (ILegacyIAccessibleProvider *iface)
 
static HRESULT WINAPI msaa_acc_provider_Select (ILegacyIAccessibleProvider *iface, LONG select_flags)
 
static HRESULT WINAPI msaa_acc_provider_DoDefaultAction (ILegacyIAccessibleProvider *iface)
 
static HRESULT WINAPI msaa_acc_provider_SetValue (ILegacyIAccessibleProvider *iface, LPCWSTR val)
 
static HRESULT WINAPI msaa_acc_provider_GetIAccessible (ILegacyIAccessibleProvider *iface, IAccessible **out_acc)
 
static HRESULT WINAPI msaa_acc_provider_get_ChildId (ILegacyIAccessibleProvider *iface, int *out_cid)
 
static HRESULT WINAPI msaa_acc_provider_get_Name (ILegacyIAccessibleProvider *iface, BSTR *out_name)
 
static HRESULT WINAPI msaa_acc_provider_get_Value (ILegacyIAccessibleProvider *iface, BSTR *out_value)
 
static HRESULT WINAPI msaa_acc_provider_get_Description (ILegacyIAccessibleProvider *iface, BSTR *out_description)
 
static HRESULT WINAPI msaa_acc_provider_get_Role (ILegacyIAccessibleProvider *iface, DWORD *out_role)
 
static HRESULT WINAPI msaa_acc_provider_get_State (ILegacyIAccessibleProvider *iface, DWORD *out_state)
 
static HRESULT WINAPI msaa_acc_provider_get_Help (ILegacyIAccessibleProvider *iface, BSTR *out_help)
 
static HRESULT WINAPI msaa_acc_provider_get_KeyboardShortcut (ILegacyIAccessibleProvider *iface, BSTR *out_kbd_shortcut)
 
static HRESULT WINAPI msaa_acc_provider_GetSelection (ILegacyIAccessibleProvider *iface, SAFEARRAY **out_selected)
 
static HRESULT WINAPI msaa_acc_provider_get_DefaultAction (ILegacyIAccessibleProvider *iface, BSTR *out_default_action)
 
static struct msaa_providerimpl_from_msaa_winevent_handler (IProxyProviderWinEventHandler *iface)
 
static HRESULT WINAPI msaa_winevent_handler_QueryInterface (IProxyProviderWinEventHandler *iface, REFIID riid, void **ppv)
 
static ULONG WINAPI msaa_winevent_handler_AddRef (IProxyProviderWinEventHandler *iface)
 
static ULONG WINAPI msaa_winevent_handler_Release (IProxyProviderWinEventHandler *iface)
 
static HRESULT WINAPI msaa_winevent_handler_RespondToWinEvent (IProxyProviderWinEventHandler *iface, DWORD event_id, HWND hwnd, LONG objid, LONG cid, IProxyProviderWinEventSink *event_sink)
 
HRESULT create_msaa_provider (IAccessible *acc, LONG child_id, HWND hwnd, BOOL root_acc_known, BOOL is_root_acc, IRawElementProviderSimple **elprov)
 
HRESULT WINAPI UiaProviderFromIAccessible (IAccessible *acc, LONG child_id, DWORD flags, IRawElementProviderSimple **elprov)
 
static HRESULT uia_get_hr_for_last_error (void)
 
static HRESULT uia_send_message_timeout (HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam, UINT timeout, LRESULT *lres)
 
static HRESULT get_uia_control_type_for_hwnd (HWND hwnd, int *control_type)
 
static struct base_hwnd_providerimpl_from_base_hwnd_provider (IRawElementProviderSimple *iface)
 
static HRESULT WINAPI base_hwnd_provider_QueryInterface (IRawElementProviderSimple *iface, REFIID riid, void **ppv)
 
static ULONG WINAPI base_hwnd_provider_AddRef (IRawElementProviderSimple *iface)
 
static ULONG WINAPI base_hwnd_provider_Release (IRawElementProviderSimple *iface)
 
static HRESULT WINAPI base_hwnd_provider_get_ProviderOptions (IRawElementProviderSimple *iface, enum ProviderOptions *ret_val)
 
static HRESULT WINAPI base_hwnd_provider_GetPatternProvider (IRawElementProviderSimple *iface, PATTERNID pattern_id, IUnknown **ret_val)
 
static HRESULT WINAPI base_hwnd_provider_GetPropertyValue (IRawElementProviderSimple *iface, PROPERTYID prop_id, VARIANT *ret_val)
 
static HRESULT WINAPI base_hwnd_provider_get_HostRawElementProvider (IRawElementProviderSimple *iface, IRawElementProviderSimple **ret_val)
 
static struct base_hwnd_providerimpl_from_base_hwnd_fragment (IRawElementProviderFragment *iface)
 
static HRESULT WINAPI base_hwnd_fragment_QueryInterface (IRawElementProviderFragment *iface, REFIID riid, void **ppv)
 
static ULONG WINAPI base_hwnd_fragment_AddRef (IRawElementProviderFragment *iface)
 
static ULONG WINAPI base_hwnd_fragment_Release (IRawElementProviderFragment *iface)
 
static HRESULT WINAPI base_hwnd_fragment_Navigate (IRawElementProviderFragment *iface, enum NavigateDirection direction, IRawElementProviderFragment **ret_val)
 
static HRESULT WINAPI base_hwnd_fragment_GetRuntimeId (IRawElementProviderFragment *iface, SAFEARRAY **ret_val)
 
static HRESULT WINAPI base_hwnd_fragment_get_BoundingRectangle (IRawElementProviderFragment *iface, struct UiaRect *ret_val)
 
static HRESULT WINAPI base_hwnd_fragment_GetEmbeddedFragmentRoots (IRawElementProviderFragment *iface, SAFEARRAY **ret_val)
 
static HRESULT WINAPI base_hwnd_fragment_SetFocus (IRawElementProviderFragment *iface)
 
static HRESULT WINAPI base_hwnd_fragment_get_FragmentRoot (IRawElementProviderFragment *iface, IRawElementProviderFragmentRoot **ret_val)
 
HRESULT create_base_hwnd_provider (HWND hwnd, IRawElementProviderSimple **elprov)
 
static int uia_runtime_id_compare (const void *key, const struct rb_entry *entry)
 
void uia_provider_thread_remove_node (HUIANODE node)
 
static void uia_provider_thread_disconnect_node (SAFEARRAY *sa)
 
static HRESULT uia_provider_thread_add_node (HUIANODE node, SAFEARRAY *rt_id)
 
static LRESULT CALLBACK uia_provider_thread_msg_proc (HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
 
static DWORD WINAPI uia_provider_thread_proc (void *arg)
 
static BOOL uia_start_provider_thread (void)
 
void uia_stop_provider_thread (void)
 
LRESULT uia_lresult_from_node (HUIANODE huianode)
 
LRESULT WINAPI UiaReturnRawElementProvider (HWND hwnd, WPARAM wparam, LPARAM lparam, IRawElementProviderSimple *elprov)
 
HRESULT WINAPI UiaDisconnectProvider (IRawElementProviderSimple *elprov)
 

Variables

static const IRawElementProviderSimpleVtbl msaa_provider_vtbl
 
static const IRawElementProviderFragmentVtbl msaa_fragment_vtbl
 
static const IRawElementProviderFragmentRootVtbl msaa_fragment_root_vtbl
 
static const ILegacyIAccessibleProviderVtbl msaa_acc_provider_vtbl
 
static const IProxyProviderWinEventHandlerVtbl msaa_winevent_handler_vtbl
 
static const IRawElementProviderSimpleVtbl base_hwnd_provider_vtbl
 
static const IRawElementProviderFragmentVtbl base_hwnd_fragment_vtbl
 
static struct uia_provider_thread provider_thread
 
static CRITICAL_SECTION provider_thread_cs = { &provider_thread_cs_debug, -1, 0, 0, 0, 0 }
 
static CRITICAL_SECTION_DEBUG provider_thread_cs_debug
 

Macro Definition Documentation

◆ DIR_FORWARD

#define DIR_FORWARD   0

Definition at line 299 of file uia_provider.c.

◆ DIR_REVERSE

#define DIR_REVERSE   1

Definition at line 300 of file uia_provider.c.

◆ UIA_DEFAULT_MSG_TIMEOUT

#define UIA_DEFAULT_MSG_TIMEOUT   10000

Definition at line 1541 of file uia_provider.c.

◆ WM_GET_OBJECT_UIA_NODE

#define WM_GET_OBJECT_UIA_NODE   (WM_USER + 1)

Definition at line 2093 of file uia_provider.c.

◆ WM_UIA_PROVIDER_THREAD_STOP

#define WM_UIA_PROVIDER_THREAD_STOP   (WM_USER + 2)

Definition at line 2094 of file uia_provider.c.

Function Documentation

◆ base_hwnd_fragment_AddRef()

static ULONG WINAPI base_hwnd_fragment_AddRef ( IRawElementProviderFragment *  iface)
static

Definition at line 1784 of file uia_provider.c.

1785{
1787 return IRawElementProviderSimple_AddRef(&base_hwnd_prov->IRawElementProviderSimple_iface);
1788}
static struct base_hwnd_provider * impl_from_base_hwnd_fragment(IRawElementProviderFragment *iface)
static IRawElementProviderSimple * base_hwnd_prov

◆ base_hwnd_fragment_get_BoundingRectangle()

static HRESULT WINAPI base_hwnd_fragment_get_BoundingRectangle ( IRawElementProviderFragment *  iface,
struct UiaRect ret_val 
)
static

Definition at line 1856 of file uia_provider.c.

1858{
1860 RECT rect = { 0 };
1861
1862 TRACE("%p, %p\n", iface, ret_val);
1863
1864 memset(ret_val, 0, sizeof(*ret_val));
1865
1866 /* Top level minimized window - Return empty rect. */
1868 return S_OK;
1869
1870 if (!GetWindowRect(base_hwnd_prov->hwnd, &rect))
1872
1873 ret_val->left = rect.left;
1874 ret_val->top = rect.top;
1875 ret_val->width = (rect.right - rect.left);
1876 ret_val->height = (rect.bottom - rect.top);
1877
1878 return S_OK;
1879}
#define S_OK
Definition: intsafe.h:52
#define memset(x, y, z)
Definition: compat.h:39
#define TRACE(s)
Definition: solgame.cpp:4
& rect
Definition: startmenu.cpp:1413
BOOL uia_is_top_level_hwnd(HWND hwnd)
Definition: uia_utils.c:407
static HRESULT uia_get_hr_for_last_error(void)
BOOL WINAPI GetWindowRect(_In_ HWND, _Out_ LPRECT)
BOOL WINAPI IsIconic(_In_ HWND)

◆ base_hwnd_fragment_get_FragmentRoot()

static HRESULT WINAPI base_hwnd_fragment_get_FragmentRoot ( IRawElementProviderFragment *  iface,
IRawElementProviderFragmentRoot **  ret_val 
)
static

Definition at line 1895 of file uia_provider.c.

1897{
1898 FIXME("%p, %p: stub!\n", iface, ret_val);
1899 *ret_val = NULL;
1900 return S_OK;
1901}
#define FIXME(fmt,...)
Definition: precomp.h:53
#define NULL
Definition: types.h:112

◆ base_hwnd_fragment_GetEmbeddedFragmentRoots()

static HRESULT WINAPI base_hwnd_fragment_GetEmbeddedFragmentRoots ( IRawElementProviderFragment *  iface,
SAFEARRAY **  ret_val 
)
static

Definition at line 1881 of file uia_provider.c.

1883{
1884 FIXME("%p, %p: stub!\n", iface, ret_val);
1885 *ret_val = NULL;
1886 return S_OK;
1887}

◆ base_hwnd_fragment_GetRuntimeId()

static HRESULT WINAPI base_hwnd_fragment_GetRuntimeId ( IRawElementProviderFragment *  iface,
SAFEARRAY **  ret_val 
)
static

Definition at line 1848 of file uia_provider.c.

1850{
1851 FIXME("%p, %p: stub!\n", iface, ret_val);
1852 *ret_val = NULL;
1853 return E_NOTIMPL;
1854}
#define E_NOTIMPL
Definition: ddrawi.h:99

◆ base_hwnd_fragment_Navigate()

static HRESULT WINAPI base_hwnd_fragment_Navigate ( IRawElementProviderFragment *  iface,
enum NavigateDirection  direction,
IRawElementProviderFragment **  ret_val 
)
static

Definition at line 1796 of file uia_provider.c.

1798{
1800 IRawElementProviderSimple *elprov = NULL;
1801 HRESULT hr = S_OK;
1802
1803 TRACE("%p, %d, %p\n", iface, direction, ret_val);
1804
1805 *ret_val = NULL;
1806
1807 switch (direction)
1808 {
1810 {
1811 HWND parent, owner;
1812
1813 /*
1814 * Top level owned windows have their owner window as a parent instead
1815 * of the desktop window.
1816 */
1818 parent = owner;
1819 else
1821
1822 if (parent)
1824 break;
1825 }
1826
1831 FIXME("Unimplemented NavigateDirection %d\n", direction);
1832 return E_NOTIMPL;
1833
1834 default:
1835 FIXME("Invalid NavigateDirection %d\n", direction);
1836 return E_INVALIDARG;
1837 }
1838
1839 if (elprov)
1840 {
1841 hr = IRawElementProviderSimple_QueryInterface(elprov, &IID_IRawElementProviderFragment, (void **)ret_val);
1842 IRawElementProviderSimple_Release(elprov);
1843 }
1844
1845 return hr;
1846}
#define E_INVALIDARG
Definition: ddrawi.h:101
HRESULT hr
Definition: delayimp.cpp:573
r parent
Definition: btrfs.c:3010
direction
Definition: netio.c:882
HRESULT create_base_hwnd_provider(HWND hwnd, IRawElementProviderSimple **elprov)
@ NavigateDirection_NextSibling
@ NavigateDirection_PreviousSibling
@ NavigateDirection_Parent
@ NavigateDirection_LastChild
@ NavigateDirection_FirstChild
#define GW_OWNER
Definition: winuser.h:777
#define GA_PARENT
Definition: winuser.h:2892
HWND WINAPI GetWindow(_In_ HWND, _In_ UINT)
HWND WINAPI GetAncestor(_In_ HWND, _In_ UINT)
Definition: window.c:929

◆ base_hwnd_fragment_QueryInterface()

static HRESULT WINAPI base_hwnd_fragment_QueryInterface ( IRawElementProviderFragment *  iface,
REFIID  riid,
void **  ppv 
)
static

Definition at line 1777 of file uia_provider.c.

1779{
1781 return IRawElementProviderSimple_QueryInterface(&base_hwnd_prov->IRawElementProviderSimple_iface, riid, ppv);
1782}
REFIID riid
Definition: atlbase.h:39
REFIID LPVOID * ppv
Definition: atlbase.h:39

◆ base_hwnd_fragment_Release()

static ULONG WINAPI base_hwnd_fragment_Release ( IRawElementProviderFragment *  iface)
static

Definition at line 1790 of file uia_provider.c.

1791{
1793 return IRawElementProviderSimple_Release(&base_hwnd_prov->IRawElementProviderSimple_iface);
1794}

◆ base_hwnd_fragment_SetFocus()

static HRESULT WINAPI base_hwnd_fragment_SetFocus ( IRawElementProviderFragment *  iface)
static

Definition at line 1889 of file uia_provider.c.

1890{
1891 FIXME("%p: stub!\n", iface);
1892 return E_NOTIMPL;
1893}

◆ base_hwnd_provider_AddRef()

static ULONG WINAPI base_hwnd_provider_AddRef ( IRawElementProviderSimple *  iface)
static

Definition at line 1617 of file uia_provider.c.

1618{
1621
1622 TRACE("%p, refcount %ld\n", iface, refcount);
1623
1624 return refcount;
1625}
#define InterlockedIncrement
Definition: armddk.h:53
uint32_t ULONG
Definition: typedefs.h:59
static struct base_hwnd_provider * impl_from_base_hwnd_provider(IRawElementProviderSimple *iface)

◆ base_hwnd_provider_get_HostRawElementProvider()

static HRESULT WINAPI base_hwnd_provider_get_HostRawElementProvider ( IRawElementProviderSimple *  iface,
IRawElementProviderSimple **  ret_val 
)
static

Definition at line 1750 of file uia_provider.c.

1752{
1753 TRACE("%p, %p\n", iface, ret_val);
1754 *ret_val = NULL;
1755 return S_OK;
1756}

◆ base_hwnd_provider_get_ProviderOptions()

static HRESULT WINAPI base_hwnd_provider_get_ProviderOptions ( IRawElementProviderSimple *  iface,
enum ProviderOptions ret_val 
)
static

Definition at line 1640 of file uia_provider.c.

1642{
1643 TRACE("%p, %p\n", iface, ret_val);
1645 return S_OK;
1646}
@ ProviderOptions_ClientSideProvider

◆ base_hwnd_provider_GetPatternProvider()

static HRESULT WINAPI base_hwnd_provider_GetPatternProvider ( IRawElementProviderSimple *  iface,
PATTERNID  pattern_id,
IUnknown **  ret_val 
)
static

Definition at line 1648 of file uia_provider.c.

1650{
1651 FIXME("%p, %d, %p: stub\n", iface, pattern_id, ret_val);
1652 *ret_val = NULL;
1653 return E_NOTIMPL;
1654}

◆ base_hwnd_provider_GetPropertyValue()

static HRESULT WINAPI base_hwnd_provider_GetPropertyValue ( IRawElementProviderSimple *  iface,
PROPERTYID  prop_id,
VARIANT ret_val 
)
static

Definition at line 1656 of file uia_provider.c.

1658{
1660 HRESULT hr = S_OK;
1661
1662 TRACE("%p, %d, %p\n", iface, prop_id, ret_val);
1663
1664 VariantInit(ret_val);
1665 if (!IsWindow(base_hwnd_prov->hwnd))
1667
1668 switch (prop_id)
1669 {
1671 V_VT(ret_val) = VT_BSTR;
1672 V_BSTR(ret_val) = SysAllocString(L"Wine: HWND Proxy");
1673 break;
1674
1676 V_VT(ret_val) = VT_I4;
1677 V_I4(ret_val) = HandleToUlong(base_hwnd_prov->hwnd);
1678 break;
1679
1681 {
1682 DWORD pid;
1683
1686
1687 V_VT(ret_val) = VT_I4;
1688 V_I4(ret_val) = pid;
1689 break;
1690 }
1691
1693 {
1694 WCHAR buf[256] = { 0 };
1695
1698 else
1699 {
1700 V_VT(ret_val) = VT_BSTR;
1701 V_BSTR(ret_val) = SysAllocString(buf);
1702 }
1703 break;
1704 }
1705
1706 case UIA_NamePropertyId:
1707 {
1708 LRESULT lres;
1709
1710 V_VT(ret_val) = VT_BSTR;
1711 V_BSTR(ret_val) = SysAllocString(L"");
1713 if (FAILED(hr) || !lres)
1714 break;
1715
1716 if (!SysReAllocStringLen(&V_BSTR(ret_val), NULL, lres))
1717 {
1718 hr = E_OUTOFMEMORY;
1719 break;
1720 }
1721
1723 (LPARAM)V_BSTR(ret_val), UIA_DEFAULT_MSG_TIMEOUT, &lres);
1724 break;
1725 }
1726
1728 {
1729 int control_type;
1730
1732 if (SUCCEEDED(hr))
1733 {
1734 V_VT(ret_val) = VT_I4;
1735 V_I4(ret_val) = control_type;
1736 }
1737 break;
1738 }
1739
1740 default:
1741 break;
1742 }
1743
1744 if (FAILED(hr))
1745 VariantClear(ret_val);
1746
1747 return hr;
1748}
#define ARRAY_SIZE(A)
Definition: main.h:20
#define HandleToUlong(h)
Definition: basetsd.h:73
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
@ VT_BSTR
Definition: compat.h:2303
@ VT_I4
Definition: compat.h:2298
#define L(x)
Definition: resources.c:13
unsigned long DWORD
Definition: ntddk_ex.h:95
GLenum GLuint GLenum GLsizei const GLchar * buf
Definition: glext.h:7751
#define SUCCEEDED(hr)
Definition: intsafe.h:50
#define FAILED(hr)
Definition: intsafe.h:51
LONG_PTR LPARAM
Definition: minwindef.h:175
LONG_PTR LRESULT
Definition: minwindef.h:176
static const char * control_type(DWORD dwControlType)
Definition: mixer.c:110
BSTR WINAPI SysAllocString(LPCOLESTR str)
Definition: oleaut.c:238
UINT WINAPI SysStringLen(BSTR str)
Definition: oleaut.c:196
int WINAPI SysReAllocStringLen(BSTR *old, const OLECHAR *str, unsigned int len)
Definition: oleaut.c:383
#define V_VT(A)
Definition: oleauto.h:211
#define V_BSTR(A)
Definition: oleauto.h:226
#define V_I4(A)
Definition: oleauto.h:247
#define UIA_DEFAULT_MSG_TIMEOUT
static HRESULT uia_send_message_timeout(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam, UINT timeout, LRESULT *lres)
static HRESULT get_uia_control_type_for_hwnd(HWND hwnd, int *control_type)
#define UIA_E_ELEMENTNOTAVAILABLE
HRESULT WINAPI DECLSPEC_HOTPATCH VariantClear(VARIANTARG *pVarg)
Definition: variant.c:648
void WINAPI VariantInit(VARIANTARG *pVarg)
Definition: variant.c:568
DWORD WINAPI GetWindowThreadProcessId(HWND hWnd, PDWORD lpdwProcessId)
_In_ ULONG_PTR _In_ ULONG _Out_ ULONG_PTR * pid
Definition: winddi.h:3837
BOOL WINAPI IsWindow(_In_opt_ HWND)
#define WM_GETTEXTLENGTH
Definition: winuser.h:1647
#define WM_GETTEXT
Definition: winuser.h:1646
int WINAPI GetClassNameW(_In_ HWND hWnd, _Out_writes_to_(nMaxCount, return) LPWSTR lpClassName, _In_ int nMaxCount)
__wchar_t WCHAR
Definition: xmlstorage.h:180

◆ base_hwnd_provider_QueryInterface()

static HRESULT WINAPI base_hwnd_provider_QueryInterface ( IRawElementProviderSimple *  iface,
REFIID  riid,
void **  ppv 
)
static

Definition at line 1601 of file uia_provider.c.

1602{
1604
1605 *ppv = NULL;
1606 if (IsEqualIID(riid, &IID_IRawElementProviderSimple) || IsEqualIID(riid, &IID_IUnknown))
1607 *ppv = iface;
1608 else if (IsEqualIID(riid, &IID_IRawElementProviderFragment))
1609 *ppv = &base_hwnd_prov->IRawElementProviderFragment_iface;
1610 else
1611 return E_NOINTERFACE;
1612
1613 IRawElementProviderSimple_AddRef(iface);
1614 return S_OK;
1615}
const GUID IID_IUnknown
#define IsEqualIID(riid1, riid2)
Definition: guiddef.h:95
#define E_NOINTERFACE
Definition: winerror.h:3479

◆ base_hwnd_provider_Release()

static ULONG WINAPI base_hwnd_provider_Release ( IRawElementProviderSimple *  iface)
static

Definition at line 1627 of file uia_provider.c.

1628{
1631
1632 TRACE("%p, refcount %ld\n", iface, refcount);
1633
1634 if (!refcount)
1636
1637 return refcount;
1638}
#define InterlockedDecrement
Definition: armddk.h:52
#define free
Definition: debug_ros.c:5

◆ create_base_hwnd_provider()

HRESULT create_base_hwnd_provider ( HWND  hwnd,
IRawElementProviderSimple **  elprov 
)

Definition at line 1915 of file uia_provider.c.

1916{
1918
1919 *elprov = NULL;
1920
1921 if (!hwnd)
1922 return E_INVALIDARG;
1923
1924 if (!IsWindow(hwnd))
1926
1927 if (!(base_hwnd_prov = calloc(1, sizeof(*base_hwnd_prov))))
1928 return E_OUTOFMEMORY;
1929
1930 base_hwnd_prov->IRawElementProviderSimple_iface.lpVtbl = &base_hwnd_provider_vtbl;
1931 base_hwnd_prov->IRawElementProviderFragment_iface.lpVtbl = &base_hwnd_fragment_vtbl;
1932 base_hwnd_prov->refcount = 1;
1933 base_hwnd_prov->hwnd = hwnd;
1934 *elprov = &base_hwnd_prov->IRawElementProviderSimple_iface;
1935
1936 return S_OK;
1937}
#define calloc
Definition: rosglue.h:14
static const IRawElementProviderSimpleVtbl base_hwnd_provider_vtbl
static const IRawElementProviderFragmentVtbl base_hwnd_fragment_vtbl
_In_ LONG _In_ HWND hwnd
Definition: winddi.h:4023

Referenced by base_hwnd_fragment_Navigate(), and default_uia_provider_callback().

◆ create_msaa_provider()

HRESULT create_msaa_provider ( IAccessible acc,
LONG  child_id,
HWND  hwnd,
BOOL  root_acc_known,
BOOL  is_root_acc,
IRawElementProviderSimple **  elprov 
)

Definition at line 1443 of file uia_provider.c.

1445{
1446 struct msaa_provider *msaa_prov = calloc(1, sizeof(*msaa_prov));
1447
1448 if (!msaa_prov)
1449 return E_OUTOFMEMORY;
1450
1456 msaa_prov->refcount = 1;
1457 variant_init_i4(&msaa_prov->cid, child_id);
1458 msaa_prov->acc = acc;
1459 IAccessible_AddRef(acc);
1460 msaa_prov->ia2 = msaa_acc_get_ia2(acc);
1461
1462 if (!hwnd)
1463 {
1464 HRESULT hr;
1465
1466 hr = WindowFromAccessibleObject(acc, &msaa_prov->hwnd);
1467 if (FAILED(hr))
1468 WARN("WindowFromAccessibleObject failed with hr %#lx\n", hr);
1469 }
1470 else
1471 msaa_prov->hwnd = hwnd;
1472
1473 if (root_acc_known)
1474 {
1475 msaa_prov->root_acc_check_ran = TRUE;
1476 msaa_prov->is_root_acc = is_root_acc;
1477 }
1478
1479 *elprov = &msaa_prov->IRawElementProviderSimple_iface;
1480
1481 return S_OK;
1482}
#define WARN(fmt,...)
Definition: precomp.h:61
#define TRUE
Definition: types.h:120
HRESULT WINAPI WindowFromAccessibleObject(IAccessible *acc, HWND *phwnd)
Definition: main.c:372
IAccessible * acc
Definition: uia_provider.c:536
IAccessible2 * ia2
Definition: uia_provider.c:537
IRawElementProviderFragmentRoot IRawElementProviderFragmentRoot_iface
Definition: uia_provider.c:531
BOOL root_acc_check_ran
Definition: uia_provider.c:542
IRawElementProviderFragment IRawElementProviderFragment_iface
Definition: uia_provider.c:530
IRawElementProviderSimple IRawElementProviderSimple_iface
Definition: uia_provider.c:529
ILegacyIAccessibleProvider ILegacyIAccessibleProvider_iface
Definition: uia_provider.c:532
IProxyProviderWinEventHandler IProxyProviderWinEventHandler_iface
Definition: uia_provider.c:533
static void variant_init_i4(VARIANT *v, int val)
Definition: uia_private.h:169
static const IRawElementProviderFragmentRootVtbl msaa_fragment_root_vtbl
static const IProxyProviderWinEventHandlerVtbl msaa_winevent_handler_vtbl
static IAccessible2 * msaa_acc_get_ia2(IAccessible *acc)
Definition: uia_provider.c:64
static const IRawElementProviderFragmentVtbl msaa_fragment_vtbl
static const ILegacyIAccessibleProviderVtbl msaa_acc_provider_vtbl
static const IRawElementProviderSimpleVtbl msaa_provider_vtbl
Definition: uia_provider.c:793

Referenced by create_msaa_provider_from_hwnd(), default_uia_provider_callback(), msaa_acc_get_focus(), msaa_fragment_get_FragmentRoot(), msaa_fragment_Navigate(), msaa_fragment_root_GetFocus(), and UiaProviderFromIAccessible().

◆ DEFINE_GUID()

DEFINE_GUID ( SID_AccFromDAWrapper  ,
0x33f139ee  ,
0xe509  ,
0x47f7  ,
0xbf  ,
0x39  ,
0x83  ,
0x76  ,
0x44  ,
0xf7  ,
0x45  ,
0x76   
)

◆ get_uia_control_type_for_hwnd()

static HRESULT get_uia_control_type_for_hwnd ( HWND  hwnd,
int control_type 
)
static

Definition at line 1551 of file uia_provider.c.

1552{
1553 LONG_PTR style, ex_style;
1554
1555 *control_type = 0;
1557 {
1559 return S_OK;
1560 }
1561
1565
1566 /*
1567 * Non-caption HWNDs that are popups or tool windows aren't considered full
1568 * windows, only panes.
1569 */
1570 if (((style & WS_CAPTION) != WS_CAPTION) && ((ex_style & WS_EX_TOOLWINDOW) || (style & WS_POPUP)))
1571 {
1573 return S_OK;
1574 }
1575
1576 /* Non top-level HWNDs are considered panes as well. */
1579 else
1581
1582 return S_OK;
1583}
Arabic default style
Definition: afstyles.h:94
#define NO_ERROR
Definition: dderror.h:5
#define SetLastError(x)
Definition: compat.h:752
__int3264 LONG_PTR
Definition: mstsclib_h.h:276
#define WS_CAPTION
Definition: pedump.c:624
#define WS_POPUP
Definition: pedump.c:616
DWORD WINAPI GetLastError(void)
Definition: except.c:1042
#define GetWindowLongPtrW
Definition: winuser.h:4983
#define WS_EX_APPWINDOW
Definition: winuser.h:383
#define WS_EX_TOOLWINDOW
Definition: winuser.h:404
#define GWL_STYLE
Definition: winuser.h:863
#define GWL_EXSTYLE
Definition: winuser.h:862

Referenced by base_hwnd_provider_GetPropertyValue().

◆ impl_from_base_hwnd_fragment()

static struct base_hwnd_provider * impl_from_base_hwnd_fragment ( IRawElementProviderFragment *  iface)
inlinestatic

Definition at line 1772 of file uia_provider.c.

1773{
1774 return CONTAINING_RECORD(iface, struct base_hwnd_provider, IRawElementProviderFragment_iface);
1775}
#define CONTAINING_RECORD(address, type, field)
Definition: typedefs.h:260

Referenced by base_hwnd_fragment_AddRef(), base_hwnd_fragment_get_BoundingRectangle(), base_hwnd_fragment_Navigate(), base_hwnd_fragment_QueryInterface(), and base_hwnd_fragment_Release().

◆ impl_from_base_hwnd_provider()

static struct base_hwnd_provider * impl_from_base_hwnd_provider ( IRawElementProviderSimple *  iface)
inlinestatic

Definition at line 1596 of file uia_provider.c.

1597{
1598 return CONTAINING_RECORD(iface, struct base_hwnd_provider, IRawElementProviderSimple_iface);
1599}

Referenced by base_hwnd_provider_AddRef(), base_hwnd_provider_GetPropertyValue(), base_hwnd_provider_QueryInterface(), and base_hwnd_provider_Release().

◆ impl_from_msaa_acc_provider()

static struct msaa_provider * impl_from_msaa_acc_provider ( ILegacyIAccessibleProvider *  iface)
inlinestatic

◆ impl_from_msaa_fragment()

static struct msaa_provider * impl_from_msaa_fragment ( IRawElementProviderFragment *  iface)
inlinestatic

◆ impl_from_msaa_fragment_root()

static struct msaa_provider * impl_from_msaa_fragment_root ( IRawElementProviderFragmentRoot *  iface)
inlinestatic

Definition at line 1061 of file uia_provider.c.

1062{
1063 return CONTAINING_RECORD(iface, struct msaa_provider, IRawElementProviderFragmentRoot_iface);
1064}

Referenced by msaa_fragment_root_AddRef(), msaa_fragment_root_GetFocus(), msaa_fragment_root_QueryInterface(), and msaa_fragment_root_Release().

◆ impl_from_msaa_provider()

static struct msaa_provider * impl_from_msaa_provider ( IRawElementProviderSimple *  iface)
inlinestatic

◆ impl_from_msaa_winevent_handler()

static struct msaa_provider * impl_from_msaa_winevent_handler ( IProxyProviderWinEventHandler *  iface)
inlinestatic

Definition at line 1379 of file uia_provider.c.

1380{
1381 return CONTAINING_RECORD(iface, struct msaa_provider, IProxyProviderWinEventHandler_iface);
1382}

Referenced by msaa_winevent_handler_AddRef(), msaa_winevent_handler_QueryInterface(), msaa_winevent_handler_Release(), and msaa_winevent_handler_RespondToWinEvent().

◆ msaa_acc_compare()

static BOOL msaa_acc_compare ( IAccessible acc,
IAccessible acc2 
)
static

Definition at line 200 of file uia_provider.c.

201{
202 IAccessible2 *ia2[2] = { NULL, NULL };
203 IUnknown *unk, *unk2;
205 LONG unique_id[2];
206 BSTR name[2];
207 VARIANT cid;
208 HRESULT hr;
209
210 acc = msaa_acc_da_unwrap(acc);
211 acc2 = msaa_acc_da_unwrap(acc2);
212 IAccessible_QueryInterface(acc, &IID_IUnknown, (void**)&unk);
213 IAccessible_QueryInterface(acc2, &IID_IUnknown, (void**)&unk2);
214 if (unk == unk2)
215 {
216 matched = TRUE;
217 goto exit;
218 }
219
220 ia2[0] = msaa_acc_get_ia2(acc);
221 ia2[1] = msaa_acc_get_ia2(acc2);
222 if (!ia2[0] != !ia2[1])
223 goto exit;
224 if (ia2[0])
225 {
226 hr = IAccessible2_get_uniqueID(ia2[0], &unique_id[0]);
227 if (SUCCEEDED(hr))
228 {
229 hr = IAccessible2_get_uniqueID(ia2[1], &unique_id[1]);
230 if (SUCCEEDED(hr))
231 {
232 if (unique_id[0] == unique_id[1])
233 matched = TRUE;
234
235 goto exit;
236 }
237 }
238 }
239
240 hr = msaa_acc_prop_match(acc, acc2);
241 if (FAILED(hr))
242 goto exit;
243 if (hr == S_OK)
244 matched = TRUE;
245
247 hr = IAccessible_get_accName(acc, cid, &name[0]);
248 if (SUCCEEDED(hr))
249 {
250 hr = IAccessible_get_accName(acc2, cid, &name[1]);
251 if (SUCCEEDED(hr))
252 {
253 if (!name[0] && !name[1])
254 matched = TRUE;
255 else if (!name[0] || !name[1])
256 matched = FALSE;
257 else
258 {
259 if (!wcscmp(name[0], name[1]))
260 matched = TRUE;
261 else
262 matched = FALSE;
263 }
264
266 }
267
269 }
270
271exit:
272 IUnknown_Release(unk);
273 IUnknown_Release(unk2);
274 IAccessible_Release(acc);
275 IAccessible_Release(acc2);
276 if (ia2[0])
277 IAccessible2_Release(ia2[0]);
278 if (ia2[1])
279 IAccessible2_Release(ia2[1]);
280
281 return matched;
282}
#define FALSE
Definition: types.h:117
OLECHAR * BSTR
Definition: compat.h:2293
_ACRTIMP int __cdecl wcscmp(const wchar_t *, const wchar_t *)
Definition: wcs.c:1972
unsigned int BOOL
Definition: ntddk_ex.h:94
static TfClientId cid
This interface exposes the primary set of information about an IAccessible2 enabled accessible object...
void WINAPI DECLSPEC_HOTPATCH SysFreeString(BSTR str)
Definition: oleaut.c:271
long LONG
Definition: pedump.c:60
#define exit(n)
Definition: config.h:202
Definition: name.c:39
BOOL matched
Definition: taskkill.c:46
static IAccessible * msaa_acc_da_unwrap(IAccessible *acc)
Definition: uia_provider.c:80
static HRESULT msaa_acc_prop_match(IAccessible *acc, IAccessible *acc2)
Definition: uia_provider.c:113
#define CHILDID_SELF
Definition: winable.h:14

Referenced by msaa_acc_get_child_pos(), and msaa_check_root_acc().

◆ msaa_acc_da_unwrap()

static IAccessible * msaa_acc_da_unwrap ( IAccessible acc)
static

Definition at line 80 of file uia_provider.c.

81{
82 IAccessible *acc2;
83 HRESULT hr;
84
85 hr = msaa_acc_get_service(acc, &SID_AccFromDAWrapper, &IID_IAccessible, (void **)&acc2);
86 if (SUCCEEDED(hr) && acc2)
87 return acc2;
88
89 IAccessible_AddRef(acc);
90 return acc;
91}
static HRESULT msaa_acc_get_service(IAccessible *acc, REFGUID sid, REFIID riid, void **service)
Definition: uia_provider.c:49

Referenced by msaa_acc_compare(), and msaa_acc_iface_cmp().

◆ msaa_acc_get_child_pos()

static HRESULT msaa_acc_get_child_pos ( IAccessible acc,
IAccessible **  out_parent,
LONG out_child_pos 
)
static

Definition at line 366 of file uia_provider.c.

368{
369 LONG child_count, child_id, child_pos, match_pos;
370 IAccessible *child, *parent, *match, **children;
371 HRESULT hr;
372 int i;
373
374 *out_parent = NULL;
375 *out_child_pos = 0;
377 if (FAILED(hr) || !parent)
378 return hr;
379
380 hr = IAccessible_get_accChildCount(parent, &child_count);
381 if (FAILED(hr) || !child_count)
382 {
383 IAccessible_Release(parent);
384 return hr;
385 }
386
387 children = calloc(child_count, sizeof(*children));
388 if (!children)
389 return E_OUTOFMEMORY;
390
391 match = NULL;
392 for (i = 0; i < child_count; i++)
393 {
394 hr = msaa_acc_get_next_child(parent, i + 1, DIR_FORWARD, &child, &child_id, &child_pos, FALSE);
395 if (FAILED(hr) || !child)
396 goto exit;
397
398 if (child != parent)
399 children[i] = child;
400 else
401 IAccessible_Release(child);
402 }
403
404 for (i = 0; i < child_count; i++)
405 {
406 if (!children[i])
407 continue;
408
409 if (msaa_acc_compare(acc, children[i]))
410 {
411 if (!match)
412 {
413 match = children[i];
414 match_pos = i + 1;
415 }
416 /* Can't have more than one IAccessible match. */
417 else
418 {
419 match = NULL;
420 match_pos = 0;
421 break;
422 }
423 }
424 }
425
426exit:
427 if (match)
428 {
429 *out_parent = parent;
430 *out_child_pos = match_pos;
431 }
432 else
433 IAccessible_Release(parent);
434
435 for (i = 0; i < child_count; i++)
436 {
437 if (children[i])
438 IAccessible_Release(children[i]);
439 }
440
441 free(children);
442
443 return hr;
444}
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
static HWND child
Definition: cursoricon.c:298
Definition: match.c:28
static BOOL msaa_acc_compare(IAccessible *acc, IAccessible *acc2)
Definition: uia_provider.c:200
static HRESULT msaa_acc_get_next_child(IAccessible *acc, LONG start_pos, LONG direction, IAccessible **child, LONG *child_id, LONG *child_pos, BOOL check_visible)
Definition: uia_provider.c:301
#define DIR_FORWARD
Definition: uia_provider.c:299
static HRESULT msaa_acc_get_parent(IAccessible *acc, IAccessible **parent)
Definition: uia_provider.c:284

Referenced by msaa_fragment_Navigate().

◆ msaa_acc_get_focus()

static HRESULT msaa_acc_get_focus ( struct msaa_provider prov,
struct msaa_provider **  out_prov 
)
static

Definition at line 1093 of file uia_provider.c.

1094{
1095 IRawElementProviderSimple *elprov;
1096 IAccessible *focus_acc = NULL;
1097 INT focus_cid = CHILDID_SELF;
1098 HWND hwnd = NULL;
1099 HRESULT hr;
1100 VARIANT v;
1101
1102 *out_prov = NULL;
1103
1104 if (V_I4(&prov->cid) != CHILDID_SELF)
1105 return S_OK;
1106
1107 VariantInit(&v);
1108 hr = IAccessible_get_accFocus(prov->acc, &v);
1109 if (FAILED(hr) || (V_VT(&v) != VT_I4 && V_VT(&v) != VT_DISPATCH))
1110 {
1111 VariantClear(&v);
1112 return hr;
1113 }
1114
1115 if (V_VT(&v) == VT_I4)
1116 {
1117 IDispatch *disp = NULL;
1118
1119 if (V_I4(&v) == CHILDID_SELF)
1120 return S_OK;
1121
1122 hr = IAccessible_get_accChild(prov->acc, v, &disp);
1123 if (FAILED(hr))
1124 return hr;
1125
1126 if (hr == S_FALSE)
1127 {
1128 hwnd = prov->hwnd;
1129 focus_acc = prov->acc;
1130 IAccessible_AddRef(focus_acc);
1131 focus_cid = V_I4(&v);
1132 }
1133 else if (disp)
1134 {
1135 V_VT(&v) = VT_DISPATCH;
1136 V_DISPATCH(&v) = disp;
1137 }
1138 else
1139 return E_FAIL;
1140 }
1141
1142 if (V_VT(&v) == VT_DISPATCH)
1143 {
1144 hr = IDispatch_QueryInterface(V_DISPATCH(&v), &IID_IAccessible, (void **)&focus_acc);
1145 VariantClear(&v);
1146 if (FAILED(hr))
1147 return hr;
1148
1149 hr = WindowFromAccessibleObject(focus_acc, &hwnd);
1150 if (FAILED(hr) || !hwnd)
1151 {
1152 IAccessible_Release(focus_acc);
1153 return hr;
1154 }
1155 }
1156
1157 hr = create_msaa_provider(focus_acc, focus_cid, hwnd, FALSE, FALSE, &elprov);
1158 IAccessible_Release(focus_acc);
1159 if (SUCCEEDED(hr))
1160 *out_prov = impl_from_msaa_provider(elprov);
1161
1162 return hr;
1163}
#define E_FAIL
Definition: ddrawi.h:102
@ VT_DISPATCH
Definition: compat.h:2304
const GLdouble * v
Definition: gl.h:2040
#define V_DISPATCH(A)
Definition: oleauto.h:239
int32_t INT
Definition: typedefs.h:58
HRESULT create_msaa_provider(IAccessible *acc, LONG child_id, HWND hwnd, BOOL root_acc_known, BOOL is_root_acc, IRawElementProviderSimple **elprov)
static struct msaa_provider * impl_from_msaa_provider(IRawElementProviderSimple *iface)
Definition: uia_provider.c:572
#define S_FALSE
Definition: winerror.h:3451

Referenced by msaa_fragment_root_GetFocus().

◆ msaa_acc_get_ia2()

static IAccessible2 * msaa_acc_get_ia2 ( IAccessible acc)
static

Definition at line 64 of file uia_provider.c.

65{
66 IAccessible2 *ia2 = NULL;
67 HRESULT hr;
68
69 hr = msaa_acc_get_service(acc, &IID_IAccessible2, &IID_IAccessible2, (void **)&ia2);
70 if (SUCCEEDED(hr) && ia2)
71 return ia2;
72
73 hr = IAccessible_QueryInterface(acc, &IID_IAccessible2, (void **)&ia2);
74 if (SUCCEEDED(hr) && ia2)
75 return ia2;
76
77 return NULL;
78}

Referenced by create_msaa_provider(), and msaa_acc_compare().

◆ msaa_acc_get_next_child()

static HRESULT msaa_acc_get_next_child ( IAccessible acc,
LONG  start_pos,
LONG  direction,
IAccessible **  child,
LONG child_id,
LONG child_pos,
BOOL  check_visible 
)
static

Definition at line 301 of file uia_provider.c.

303{
304 LONG child_count, cur_pos;
305 IDispatch *disp;
306 VARIANT cid;
307 HRESULT hr;
308
309 *child = NULL;
310 *child_id = 0;
311 cur_pos = start_pos;
312 while (1)
313 {
314 hr = IAccessible_get_accChildCount(acc, &child_count);
315 if (FAILED(hr) || (cur_pos > child_count))
316 break;
317
318 variant_init_i4(&cid, cur_pos);
319 hr = IAccessible_get_accChild(acc, cid, &disp);
320 if (FAILED(hr))
321 break;
322
323 if (hr == S_FALSE)
324 {
325 if (!check_visible || !msaa_check_acc_state(acc, cid, STATE_SYSTEM_INVISIBLE))
326 {
327 *child = acc;
328 *child_id = *child_pos = cur_pos;
329 IAccessible_AddRef(acc);
330 return S_OK;
331 }
332 }
333 else
334 {
335 IAccessible *acc_child = NULL;
336
337 hr = IDispatch_QueryInterface(disp, &IID_IAccessible, (void **)&acc_child);
338 IDispatch_Release(disp);
339 if (FAILED(hr))
340 break;
341
343 if (!check_visible || !msaa_check_acc_state(acc_child, cid, STATE_SYSTEM_INVISIBLE))
344 {
345 *child = acc_child;
346 *child_id = CHILDID_SELF;
347 *child_pos = cur_pos;
348 return S_OK;
349 }
350
351 IAccessible_Release(acc_child);
352 }
353
354 if (direction == DIR_FORWARD)
355 cur_pos++;
356 else
357 cur_pos--;
358
359 if ((cur_pos > child_count) || (cur_pos <= 0))
360 break;
361 }
362
363 return hr;
364}
static BOOL msaa_check_acc_state(IAccessible *acc, VARIANT cid, ULONG flag)
Definition: uia_provider.c:44
#define STATE_SYSTEM_INVISIBLE
Definition: winuser.h:2984

Referenced by msaa_acc_get_child_pos(), and msaa_fragment_Navigate().

◆ msaa_acc_get_parent()

static HRESULT msaa_acc_get_parent ( IAccessible acc,
IAccessible **  parent 
)
static

Definition at line 284 of file uia_provider.c.

285{
286 IDispatch *disp = NULL;
287 HRESULT hr;
288
289 *parent = NULL;
290 hr = IAccessible_get_accParent(acc, &disp);
291 if (FAILED(hr) || !disp)
292 return hr;
293
294 hr = IDispatch_QueryInterface(disp, &IID_IAccessible, (void**)parent);
295 IDispatch_Release(disp);
296 return hr;
297}

Referenced by msaa_acc_get_child_pos(), and msaa_fragment_Navigate().

◆ msaa_acc_get_service()

static HRESULT msaa_acc_get_service ( IAccessible acc,
REFGUID  sid,
REFIID  riid,
void **  service 
)
static

Definition at line 49 of file uia_provider.c.

50{
52 HRESULT hr;
53
54 *service = NULL;
55 hr = IAccessible_QueryInterface(acc, &IID_IServiceProvider, (void **)&sp);
56 if (FAILED(hr))
57 return hr;
58
59 hr = IServiceProvider_QueryService(sp, sid, riid, (void **)service);
60 IServiceProvider_Release(sp);
61 return hr;
62}
FT_UInt sid
Definition: cffcmap.c:138
static const WCHAR sp[]
Definition: suminfo.c:287

Referenced by msaa_acc_da_unwrap(), msaa_acc_get_ia2(), and msaa_acc_is_oleacc_proxy().

◆ msaa_acc_iface_cmp()

static BOOL msaa_acc_iface_cmp ( IAccessible acc,
IAccessible acc2 
)
static

Definition at line 181 of file uia_provider.c.

182{
183 IUnknown *unk, *unk2;
185
186 acc = msaa_acc_da_unwrap(acc);
187 acc2 = msaa_acc_da_unwrap(acc2);
188 IAccessible_QueryInterface(acc, &IID_IUnknown, (void**)&unk);
189 IAccessible_QueryInterface(acc2, &IID_IUnknown, (void**)&unk2);
190 matched = (unk == unk2);
191
192 IAccessible_Release(acc);
193 IUnknown_Release(unk);
194 IAccessible_Release(acc2);
195 IUnknown_Release(unk2);
196
197 return matched;
198}

Referenced by msaa_fragment_root_GetFocus().

◆ msaa_acc_is_oleacc_proxy()

static BOOL msaa_acc_is_oleacc_proxy ( IAccessible acc)
static

Definition at line 93 of file uia_provider.c.

94{
95 IUnknown *unk;
96 HRESULT hr;
97
98 hr = msaa_acc_get_service(acc, &IIS_IsOleaccProxy, &IID_IUnknown, (void **)&unk);
99 if (SUCCEEDED(hr) && unk)
100 {
101 IUnknown_Release(unk);
102 return TRUE;
103 }
104
105 return FALSE;
106}

Referenced by msaa_acc_provider_GetIAccessible(), and UiaProviderFromIAccessible().

◆ msaa_acc_prop_match()

static HRESULT msaa_acc_prop_match ( IAccessible acc,
IAccessible acc2 
)
static

Definition at line 113 of file uia_provider.c.

114{
115 BOOL role_match, state_match, child_count_match, location_match;
116 LONG child_count[2], left[2], top[2], width[2], height[2];
117 VARIANT cid, v, v2;
118 HRESULT hr, hr2;
119
120 role_match = state_match = child_count_match = location_match = FALSE;
122 hr = IAccessible_get_accRole(acc, cid, &v);
123 if (SUCCEEDED(hr) && (V_VT(&v) == VT_I4))
124 {
125 VariantInit(&v2);
126 hr = IAccessible_get_accRole(acc2, cid, &v2);
127 if (SUCCEEDED(hr) && (V_VT(&v2) == VT_I4))
128 {
129 if (V_I4(&v) != V_I4(&v2))
130 return E_FAIL;
131
132 role_match = TRUE;
133 }
134 }
135
136 VariantInit(&v);
137 hr = IAccessible_get_accState(acc, cid, &v);
138 if (SUCCEEDED(hr) && (V_VT(&v) == VT_I4))
139 {
140 VariantInit(&v2);
141 hr = IAccessible_get_accState(acc2, cid, &v2);
142 if (SUCCEEDED(hr) && (V_VT(&v2) == VT_I4))
143 {
144 if (V_I4(&v) != V_I4(&v2))
145 return E_FAIL;
146
147 state_match = TRUE;
148 }
149 }
150
151 hr = IAccessible_get_accChildCount(acc, &child_count[0]);
152 hr2 = IAccessible_get_accChildCount(acc2, &child_count[1]);
153 if (SUCCEEDED(hr) && SUCCEEDED(hr2))
154 {
155 if (child_count[0] != child_count[1])
156 return E_FAIL;
157
158 child_count_match = TRUE;
159 }
160
161 hr = IAccessible_accLocation(acc, &left[0], &top[0], &width[0], &height[0], cid);
162 if (SUCCEEDED(hr))
163 {
164 hr = IAccessible_accLocation(acc2, &left[1], &top[1], &width[1], &height[1], cid);
165 if (SUCCEEDED(hr))
166 {
167 if ((left[0] != left[1]) || (top[0] != top[1]) || (width[0] != width[1]) ||
168 (height[0] != height[1]))
169 return E_FAIL;
170
171 location_match = TRUE;
172 }
173 }
174
175 if (role_match && state_match && child_count_match && location_match)
176 return S_OK;
177
178 return S_FALSE;
179}
GLint GLint GLsizei GLsizei height
Definition: gl.h:1546
GLint GLint GLsizei width
Definition: gl.h:1546
GLdouble GLdouble GLdouble GLdouble top
Definition: glext.h:10859
GLint left
Definition: glext.h:7726
GLfloat GLfloat GLfloat v2
Definition: glext.h:6063

Referenced by msaa_acc_compare().

◆ msaa_acc_provider_AddRef()

static ULONG WINAPI msaa_acc_provider_AddRef ( ILegacyIAccessibleProvider *  iface)
static

Definition at line 1232 of file uia_provider.c.

1233{
1234 struct msaa_provider *msaa_prov = impl_from_msaa_acc_provider(iface);
1235 return IRawElementProviderSimple_AddRef(&msaa_prov->IRawElementProviderSimple_iface);
1236}
static struct msaa_provider * impl_from_msaa_acc_provider(ILegacyIAccessibleProvider *iface)

◆ msaa_acc_provider_DoDefaultAction()

static HRESULT WINAPI msaa_acc_provider_DoDefaultAction ( ILegacyIAccessibleProvider *  iface)
static

Definition at line 1250 of file uia_provider.c.

1251{
1252 FIXME("%p: stub!\n", iface);
1253 return E_NOTIMPL;
1254}

◆ msaa_acc_provider_get_ChildId()

static HRESULT WINAPI msaa_acc_provider_get_ChildId ( ILegacyIAccessibleProvider *  iface,
int out_cid 
)
static

Definition at line 1276 of file uia_provider.c.

1277{
1278 struct msaa_provider *msaa_prov = impl_from_msaa_acc_provider(iface);
1279
1280 TRACE("%p, %p\n", iface, out_cid);
1281 *out_cid = V_I4(&msaa_prov->cid);
1282
1283 return S_OK;
1284}

◆ msaa_acc_provider_get_DefaultAction()

static HRESULT WINAPI msaa_acc_provider_get_DefaultAction ( ILegacyIAccessibleProvider *  iface,
BSTR out_default_action 
)
static

Definition at line 1348 of file uia_provider.c.

1350{
1351 FIXME("%p, %p: stub!\n", iface, out_default_action);
1352 return E_NOTIMPL;
1353}

◆ msaa_acc_provider_get_Description()

static HRESULT WINAPI msaa_acc_provider_get_Description ( ILegacyIAccessibleProvider *  iface,
BSTR out_description 
)
static

Definition at line 1298 of file uia_provider.c.

1300{
1301 FIXME("%p, %p: stub!\n", iface, out_description);
1302 return E_NOTIMPL;
1303}

◆ msaa_acc_provider_get_Help()

static HRESULT WINAPI msaa_acc_provider_get_Help ( ILegacyIAccessibleProvider *  iface,
BSTR out_help 
)
static

Definition at line 1328 of file uia_provider.c.

1329{
1330 FIXME("%p, %p: stub!\n", iface, out_help);
1331 return E_NOTIMPL;
1332}

◆ msaa_acc_provider_get_KeyboardShortcut()

static HRESULT WINAPI msaa_acc_provider_get_KeyboardShortcut ( ILegacyIAccessibleProvider *  iface,
BSTR out_kbd_shortcut 
)
static

Definition at line 1334 of file uia_provider.c.

1336{
1337 FIXME("%p, %p: stub!\n", iface, out_kbd_shortcut);
1338 return E_NOTIMPL;
1339}

◆ msaa_acc_provider_get_Name()

static HRESULT WINAPI msaa_acc_provider_get_Name ( ILegacyIAccessibleProvider *  iface,
BSTR out_name 
)
static

Definition at line 1286 of file uia_provider.c.

1287{
1288 FIXME("%p, %p: stub!\n", iface, out_name);
1289 return E_NOTIMPL;
1290}

◆ msaa_acc_provider_get_Role()

static HRESULT WINAPI msaa_acc_provider_get_Role ( ILegacyIAccessibleProvider *  iface,
DWORD out_role 
)
static

Definition at line 1305 of file uia_provider.c.

1306{
1307 struct msaa_provider *msaa_prov = impl_from_msaa_acc_provider(iface);
1308 HRESULT hr;
1309 VARIANT v;
1310
1311 TRACE("%p, %p\n", iface, out_role);
1312
1313 *out_role = 0;
1314 VariantInit(&v);
1315 hr = IAccessible_get_accRole(msaa_prov->acc, msaa_prov->cid, &v);
1316 if (SUCCEEDED(hr) && V_VT(&v) == VT_I4)
1317 *out_role = V_I4(&v);
1318
1319 return S_OK;
1320}

◆ msaa_acc_provider_get_State()

static HRESULT WINAPI msaa_acc_provider_get_State ( ILegacyIAccessibleProvider *  iface,
DWORD out_state 
)
static

Definition at line 1322 of file uia_provider.c.

1323{
1324 FIXME("%p, %p: stub!\n", iface, out_state);
1325 return E_NOTIMPL;
1326}

◆ msaa_acc_provider_get_Value()

static HRESULT WINAPI msaa_acc_provider_get_Value ( ILegacyIAccessibleProvider *  iface,
BSTR out_value 
)
static

Definition at line 1292 of file uia_provider.c.

1293{
1294 FIXME("%p, %p: stub!\n", iface, out_value);
1295 return E_NOTIMPL;
1296}

◆ msaa_acc_provider_GetIAccessible()

static HRESULT WINAPI msaa_acc_provider_GetIAccessible ( ILegacyIAccessibleProvider *  iface,
IAccessible **  out_acc 
)
static

Definition at line 1262 of file uia_provider.c.

1264{
1265 struct msaa_provider *msaa_prov = impl_from_msaa_acc_provider(iface);
1266
1267 TRACE("%p, %p\n", iface, out_acc);
1268
1269 *out_acc = NULL;
1270 if (msaa_acc_is_oleacc_proxy(msaa_prov->acc))
1271 return S_OK;
1272
1273 return IAccessible_QueryInterface(msaa_prov->acc, &IID_IAccessible, (void **)out_acc);
1274}
static BOOL msaa_acc_is_oleacc_proxy(IAccessible *acc)
Definition: uia_provider.c:93

◆ msaa_acc_provider_GetSelection()

static HRESULT WINAPI msaa_acc_provider_GetSelection ( ILegacyIAccessibleProvider *  iface,
SAFEARRAY **  out_selected 
)
static

Definition at line 1341 of file uia_provider.c.

1343{
1344 FIXME("%p, %p: stub!\n", iface, out_selected);
1345 return E_NOTIMPL;
1346}

◆ msaa_acc_provider_QueryInterface()

static HRESULT WINAPI msaa_acc_provider_QueryInterface ( ILegacyIAccessibleProvider *  iface,
REFIID  riid,
void **  ppv 
)
static

Definition at line 1226 of file uia_provider.c.

1227{
1228 struct msaa_provider *msaa_prov = impl_from_msaa_acc_provider(iface);
1229 return IRawElementProviderSimple_QueryInterface(&msaa_prov->IRawElementProviderSimple_iface, riid, ppv);
1230}

◆ msaa_acc_provider_Release()

static ULONG WINAPI msaa_acc_provider_Release ( ILegacyIAccessibleProvider *  iface)
static

Definition at line 1238 of file uia_provider.c.

1239{
1240 struct msaa_provider *msaa_prov = impl_from_msaa_acc_provider(iface);
1241 return IRawElementProviderSimple_Release(&msaa_prov->IRawElementProviderSimple_iface);
1242}

◆ msaa_acc_provider_Select()

static HRESULT WINAPI msaa_acc_provider_Select ( ILegacyIAccessibleProvider *  iface,
LONG  select_flags 
)
static

Definition at line 1244 of file uia_provider.c.

1245{
1246 FIXME("%p, %#lx: stub!\n", iface, select_flags);
1247 return E_NOTIMPL;
1248}

◆ msaa_acc_provider_SetValue()

static HRESULT WINAPI msaa_acc_provider_SetValue ( ILegacyIAccessibleProvider *  iface,
LPCWSTR  val 
)
static

Definition at line 1256 of file uia_provider.c.

1257{
1258 FIXME("%p, %p<%s>: stub!\n", iface, val, debugstr_w(val));
1259 return E_NOTIMPL;
1260}
GLuint GLfloat * val
Definition: glext.h:7180
#define debugstr_w
Definition: kernel32.h:32

◆ msaa_check_acc_state()

static BOOL msaa_check_acc_state ( IAccessible acc,
VARIANT  cid,
ULONG  flag 
)
static

Definition at line 44 of file uia_provider.c.

45{
46 return msaa_check_acc_state_hres(acc, cid, flag) == S_OK;
47}
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean flag
Definition: glfuncs.h:52
static HRESULT msaa_check_acc_state_hres(IAccessible *acc, VARIANT cid, ULONG flag)
Definition: uia_provider.c:31

Referenced by msaa_acc_get_next_child(), msaa_fragment_get_BoundingRectangle(), and msaa_provider_GetPropertyValue().

◆ msaa_check_acc_state_hres()

static HRESULT msaa_check_acc_state_hres ( IAccessible acc,
VARIANT  cid,
ULONG  flag 
)
static

Definition at line 31 of file uia_provider.c.

32{
33 HRESULT hr;
34 VARIANT v;
35
36 VariantInit(&v);
37 hr = IAccessible_get_accState(acc, cid, &v);
38 if (SUCCEEDED(hr))
39 hr = ((V_VT(&v) == VT_I4) && (V_I4(&v) & flag)) ? S_OK : S_FALSE;
40
41 return hr;
42}

Referenced by msaa_check_acc_state(), msaa_fragment_root_GetFocus(), and msaa_provider_GetPropertyValue().

◆ msaa_check_root_acc()

static BOOL msaa_check_root_acc ( struct msaa_provider msaa_prov)
static

Definition at line 549 of file uia_provider.c.

550{
551 IAccessible *acc;
552 HRESULT hr;
553
554 if (msaa_prov->root_acc_check_ran)
555 return msaa_prov->is_root_acc;
556
557 msaa_prov->root_acc_check_ran = TRUE;
558 if (V_I4(&msaa_prov->cid) != CHILDID_SELF || msaa_prov->parent)
559 return FALSE;
560
561 hr = AccessibleObjectFromWindow(msaa_prov->hwnd, OBJID_CLIENT, &IID_IAccessible, (void **)&acc);
562 if (FAILED(hr))
563 return FALSE;
564
565 if (msaa_acc_compare(msaa_prov->acc, acc))
566 msaa_prov->is_root_acc = TRUE;
567
568 IAccessible_Release(acc);
569 return msaa_prov->is_root_acc;
570}
HRESULT WINAPI AccessibleObjectFromWindow(HWND hwnd, DWORD dwObjectID, REFIID riid, void **ppvObject)
Definition: main.c:349
IAccessible * parent
Definition: uia_provider.c:545
#define OBJID_CLIENT
Definition: winable.h:19

Referenced by msaa_fragment_get_BoundingRectangle(), msaa_fragment_Navigate(), and msaa_provider_get_HostRawElementProvider().

◆ msaa_fragment_AddRef()

static ULONG WINAPI msaa_fragment_AddRef ( IRawElementProviderFragment *  iface)
static

Definition at line 819 of file uia_provider.c.

820{
821 struct msaa_provider *msaa_prov = impl_from_msaa_fragment(iface);
822 return IRawElementProviderSimple_AddRef(&msaa_prov->IRawElementProviderSimple_iface);
823}
static struct msaa_provider * impl_from_msaa_fragment(IRawElementProviderFragment *iface)
Definition: uia_provider.c:807

◆ msaa_fragment_get_BoundingRectangle()

static HRESULT WINAPI msaa_fragment_get_BoundingRectangle ( IRawElementProviderFragment *  iface,
struct UiaRect ret_val 
)
static

Definition at line 972 of file uia_provider.c.

974{
975 struct msaa_provider *msaa_prov = impl_from_msaa_fragment(iface);
977 HRESULT hr;
978
979 TRACE("%p, %p\n", iface, ret_val);
980
981 memset(ret_val, 0, sizeof(*ret_val));
982
983 /*
984 * If this IAccessible is at the root of its HWND, the BaseHwnd provider
985 * will supply the bounding rectangle.
986 */
987 if (msaa_check_root_acc(msaa_prov))
988 return S_OK;
989
990 if (msaa_check_acc_state(msaa_prov->acc, msaa_prov->cid, STATE_SYSTEM_OFFSCREEN))
991 return S_OK;
992
993 hr = IAccessible_accLocation(msaa_prov->acc, &left, &top, &width, &height, msaa_prov->cid);
994 if (FAILED(hr))
995 return hr;
996
997 ret_val->left = left;
998 ret_val->top = top;
999 ret_val->width = width;
1000 ret_val->height = height;
1001
1002 return S_OK;
1003}
static BOOL msaa_check_root_acc(struct msaa_provider *msaa_prov)
Definition: uia_provider.c:549
#define STATE_SYSTEM_OFFSCREEN
Definition: winuser.h:2985

◆ msaa_fragment_get_FragmentRoot()

static HRESULT WINAPI msaa_fragment_get_FragmentRoot ( IRawElementProviderFragment *  iface,
IRawElementProviderFragmentRoot **  ret_val 
)
static

Definition at line 1019 of file uia_provider.c.

1021{
1022 struct msaa_provider *msaa_prov = impl_from_msaa_fragment(iface);
1023 IRawElementProviderSimple *elprov;
1025 HRESULT hr;
1026
1027 TRACE("%p, %p\n", iface, ret_val);
1028
1029 *ret_val = NULL;
1030 hr = AccessibleObjectFromWindow(msaa_prov->hwnd, OBJID_CLIENT, &IID_IAccessible, (void **)&acc);
1031 if (FAILED(hr) || !acc)
1032 return hr;
1033
1034 hr = create_msaa_provider(acc, CHILDID_SELF, msaa_prov->hwnd, TRUE, TRUE, &elprov);
1035 IAccessible_Release(acc);
1036 if (FAILED(hr))
1037 return hr;
1038
1039 hr = IRawElementProviderSimple_QueryInterface(elprov, &IID_IRawElementProviderFragmentRoot, (void **)ret_val);
1040 IRawElementProviderSimple_Release(elprov);
1041
1042 return hr;
1043}

◆ msaa_fragment_GetEmbeddedFragmentRoots()

static HRESULT WINAPI msaa_fragment_GetEmbeddedFragmentRoots ( IRawElementProviderFragment *  iface,
SAFEARRAY **  ret_val 
)
static

Definition at line 1005 of file uia_provider.c.

1007{
1008 TRACE("%p, %p\n", iface, ret_val);
1009 *ret_val = NULL;
1010 return S_OK;
1011}

◆ msaa_fragment_GetRuntimeId()

static HRESULT WINAPI msaa_fragment_GetRuntimeId ( IRawElementProviderFragment *  iface,
SAFEARRAY **  ret_val 
)
static

Definition at line 964 of file uia_provider.c.

966{
967 FIXME("%p, %p: stub!\n", iface, ret_val);
968 *ret_val = NULL;
969 return E_NOTIMPL;
970}

◆ msaa_fragment_Navigate()

static HRESULT WINAPI msaa_fragment_Navigate ( IRawElementProviderFragment *  iface,
enum NavigateDirection  direction,
IRawElementProviderFragment **  ret_val 
)
static

Definition at line 831 of file uia_provider.c.

833{
834 struct msaa_provider *msaa_prov = impl_from_msaa_fragment(iface);
835 LONG child_count, child_id, child_pos;
836 IRawElementProviderSimple *elprov;
838 HRESULT hr;
839
840 TRACE("%p, %d, %p\n", iface, direction, ret_val);
841
842 *ret_val = NULL;
843 switch (direction)
844 {
846 if (msaa_check_root_acc(msaa_prov))
847 break;
848
849 if (V_I4(&msaa_prov->cid) == CHILDID_SELF)
850 {
851 hr = msaa_acc_get_parent(msaa_prov->acc, &acc);
852 if (FAILED(hr) || !acc)
853 break;
854 }
855 else
856 acc = msaa_prov->acc;
857
859 if (SUCCEEDED(hr))
860 {
861 struct msaa_provider *prov = impl_from_msaa_provider(elprov);
862 *ret_val = &prov->IRawElementProviderFragment_iface;
863 }
864
865 if (acc != msaa_prov->acc)
866 IAccessible_Release(acc);
867
868 break;
869
872 if (V_I4(&msaa_prov->cid) != CHILDID_SELF)
873 break;
874
875 hr = IAccessible_get_accChildCount(msaa_prov->acc, &child_count);
876 if (FAILED(hr) || !child_count)
877 break;
878
880 hr = msaa_acc_get_next_child(msaa_prov->acc, 1, DIR_FORWARD, &acc, &child_id,
881 &child_pos, TRUE);
882 else
883 hr = msaa_acc_get_next_child(msaa_prov->acc, child_count, DIR_REVERSE, &acc, &child_id,
884 &child_pos, TRUE);
885
886 if (FAILED(hr) || !acc)
887 break;
888
889 hr = create_msaa_provider(acc, child_id, NULL, FALSE, FALSE, &elprov);
890 if (SUCCEEDED(hr))
891 {
892 struct msaa_provider *prov = impl_from_msaa_provider(elprov);
893
894 *ret_val = &prov->IRawElementProviderFragment_iface;
895 prov->parent = msaa_prov->acc;
896 IAccessible_AddRef(msaa_prov->acc);
897 if (acc != msaa_prov->acc)
898 prov->child_pos = child_pos;
899 else
900 prov->child_pos = child_id;
901 }
902 IAccessible_Release(acc);
903
904 break;
905
908 if (msaa_check_root_acc(msaa_prov))
909 break;
910
911 if (!msaa_prov->parent)
912 {
913 if (V_I4(&msaa_prov->cid) != CHILDID_SELF)
914 {
915 msaa_prov->parent = msaa_prov->acc;
916 IAccessible_AddRef(msaa_prov->acc);
917 msaa_prov->child_pos = V_I4(&msaa_prov->cid);
918 }
919 else
920 {
921 hr = msaa_acc_get_child_pos(msaa_prov->acc, &acc, &child_pos);
922 if (FAILED(hr) || !acc)
923 break;
924 msaa_prov->parent = acc;
925 msaa_prov->child_pos = child_pos;
926 }
927 }
928
930 hr = msaa_acc_get_next_child(msaa_prov->parent, msaa_prov->child_pos + 1, DIR_FORWARD,
931 &acc, &child_id, &child_pos, TRUE);
932 else
933 hr = msaa_acc_get_next_child(msaa_prov->parent, msaa_prov->child_pos - 1, DIR_REVERSE,
934 &acc, &child_id, &child_pos, TRUE);
935
936 if (FAILED(hr) || !acc)
937 break;
938
939 hr = create_msaa_provider(acc, child_id, NULL, FALSE, FALSE, &elprov);
940 if (SUCCEEDED(hr))
941 {
942 struct msaa_provider *prov = impl_from_msaa_provider(elprov);
943
944 *ret_val = &prov->IRawElementProviderFragment_iface;
945 prov->parent = msaa_prov->parent;
946 IAccessible_AddRef(msaa_prov->parent);
947 if (acc != msaa_prov->acc)
948 prov->child_pos = child_pos;
949 else
950 prov->child_pos = child_id;
951 }
952 IAccessible_Release(acc);
953
954 break;
955
956 default:
957 FIXME("Invalid NavigateDirection %d\n", direction);
958 return E_INVALIDARG;
959 }
960
961 return S_OK;
962}
#define DIR_REVERSE
Definition: uia_provider.c:300
static HRESULT msaa_acc_get_child_pos(IAccessible *acc, IAccessible **out_parent, LONG *out_child_pos)
Definition: uia_provider.c:366

◆ msaa_fragment_QueryInterface()

static HRESULT WINAPI msaa_fragment_QueryInterface ( IRawElementProviderFragment *  iface,
REFIID  riid,
void **  ppv 
)
static

Definition at line 812 of file uia_provider.c.

814{
815 struct msaa_provider *msaa_prov = impl_from_msaa_fragment(iface);
816 return IRawElementProviderSimple_QueryInterface(&msaa_prov->IRawElementProviderSimple_iface, riid, ppv);
817}

◆ msaa_fragment_Release()

static ULONG WINAPI msaa_fragment_Release ( IRawElementProviderFragment *  iface)
static

Definition at line 825 of file uia_provider.c.

826{
827 struct msaa_provider *msaa_prov = impl_from_msaa_fragment(iface);
828 return IRawElementProviderSimple_Release(&msaa_prov->IRawElementProviderSimple_iface);
829}

◆ msaa_fragment_root_AddRef()

static ULONG WINAPI msaa_fragment_root_AddRef ( IRawElementProviderFragmentRoot *  iface)
static

Definition at line 1073 of file uia_provider.c.

1074{
1075 struct msaa_provider *msaa_prov = impl_from_msaa_fragment_root(iface);
1076 return IRawElementProviderSimple_AddRef(&msaa_prov->IRawElementProviderSimple_iface);
1077}
static struct msaa_provider * impl_from_msaa_fragment_root(IRawElementProviderFragmentRoot *iface)

◆ msaa_fragment_root_ElementProviderFromPoint()

static HRESULT WINAPI msaa_fragment_root_ElementProviderFromPoint ( IRawElementProviderFragmentRoot *  iface,
double  x,
double  y,
IRawElementProviderFragment **  ret_val 
)
static

Definition at line 1085 of file uia_provider.c.

1087{
1088 FIXME("%p, %f, %f, %p: stub!\n", iface, x, y, ret_val);
1089 *ret_val = NULL;
1090 return E_NOTIMPL;
1091}
GLint GLint GLint GLint GLint x
Definition: gl.h:1548
GLint GLint GLint GLint GLint GLint y
Definition: gl.h:1548

◆ msaa_fragment_root_GetFocus()

static HRESULT WINAPI msaa_fragment_root_GetFocus ( IRawElementProviderFragmentRoot *  iface,
IRawElementProviderFragment **  ret_val 
)
static

Definition at line 1165 of file uia_provider.c.

1167{
1168 struct msaa_provider *msaa_prov = impl_from_msaa_fragment_root(iface);
1169 struct msaa_provider *prov, *prov2;
1170 IRawElementProviderSimple *elprov;
1171 HRESULT hr;
1172
1173 TRACE("%p, %p\n", iface, ret_val);
1174
1175 *ret_val = NULL;
1176 if (V_I4(&msaa_prov->cid) != CHILDID_SELF)
1177 return S_OK;
1178
1179 hr = create_msaa_provider(msaa_prov->acc, CHILDID_SELF, msaa_prov->hwnd, FALSE, FALSE, &elprov);
1180 if (FAILED(hr))
1181 return hr;
1182
1183 prov = impl_from_msaa_provider(elprov);
1184 while (SUCCEEDED(msaa_acc_get_focus(prov, &prov2)))
1185 {
1186 if (!prov2 || (msaa_check_acc_state_hres(prov2->acc, prov2->cid, STATE_SYSTEM_INVISIBLE) != S_FALSE) ||
1187 ((V_I4(&prov2->cid) == CHILDID_SELF) && msaa_acc_iface_cmp(prov->acc, prov2->acc)))
1188 {
1189 if (prov2)
1190 IRawElementProviderSimple_Release(&prov2->IRawElementProviderSimple_iface);
1191
1192 if (msaa_acc_iface_cmp(prov->acc, msaa_prov->acc) && V_I4(&prov->cid) == CHILDID_SELF)
1193 {
1194 IRawElementProviderSimple_Release(&prov->IRawElementProviderSimple_iface);
1195 return S_OK;
1196 }
1197 break;
1198 }
1199
1200 IRawElementProviderSimple_Release(&prov->IRawElementProviderSimple_iface);
1201 prov = prov2;
1202 }
1203
1204 hr = IRawElementProviderSimple_QueryInterface(&prov->IRawElementProviderSimple_iface, &IID_IRawElementProviderFragment, (void **)ret_val);
1205 IRawElementProviderSimple_Release(&prov->IRawElementProviderSimple_iface);
1206 return hr;
1207}
static BOOL msaa_acc_iface_cmp(IAccessible *acc, IAccessible *acc2)
Definition: uia_provider.c:181
static HRESULT msaa_acc_get_focus(struct msaa_provider *prov, struct msaa_provider **out_prov)

◆ msaa_fragment_root_QueryInterface()

static HRESULT WINAPI msaa_fragment_root_QueryInterface ( IRawElementProviderFragmentRoot *  iface,
REFIID  riid,
void **  ppv 
)
static

Definition at line 1066 of file uia_provider.c.

1068{
1069 struct msaa_provider *msaa_prov = impl_from_msaa_fragment_root(iface);
1070 return IRawElementProviderSimple_QueryInterface(&msaa_prov->IRawElementProviderSimple_iface, riid, ppv);
1071}

◆ msaa_fragment_root_Release()

static ULONG WINAPI msaa_fragment_root_Release ( IRawElementProviderFragmentRoot *  iface)
static

Definition at line 1079 of file uia_provider.c.

1080{
1081 struct msaa_provider *msaa_prov = impl_from_msaa_fragment_root(iface);
1082 return IRawElementProviderSimple_Release(&msaa_prov->IRawElementProviderSimple_iface);
1083}

◆ msaa_fragment_SetFocus()

static HRESULT WINAPI msaa_fragment_SetFocus ( IRawElementProviderFragment *  iface)
static

Definition at line 1013 of file uia_provider.c.

1014{
1015 FIXME("%p: stub!\n", iface);
1016 return E_NOTIMPL;
1017}

◆ msaa_provider_AddRef()

ULONG WINAPI msaa_provider_AddRef ( IRawElementProviderSimple *  iface)

Definition at line 599 of file uia_provider.c.

600{
601 struct msaa_provider *msaa_prov = impl_from_msaa_provider(iface);
603
604 TRACE("%p, refcount %ld\n", iface, refcount);
605
606 return refcount;
607}

◆ msaa_provider_get_HostRawElementProvider()

HRESULT WINAPI msaa_provider_get_HostRawElementProvider ( IRawElementProviderSimple *  iface,
IRawElementProviderSimple **  ret_val 
)

Definition at line 779 of file uia_provider.c.

781{
782 struct msaa_provider *msaa_prov = impl_from_msaa_provider(iface);
783
784 TRACE("%p, %p\n", iface, ret_val);
785
786 *ret_val = NULL;
787 if (msaa_check_root_acc(msaa_prov))
788 return UiaHostProviderFromHwnd(msaa_prov->hwnd, ret_val);
789
790 return S_OK;
791}
HRESULT WINAPI UiaHostProviderFromHwnd(HWND hwnd, IRawElementProviderSimple **provider)
Definition: uia_main.c:361

◆ msaa_provider_get_ProviderOptions()

HRESULT WINAPI msaa_provider_get_ProviderOptions ( IRawElementProviderSimple *  iface,
enum ProviderOptions ret_val 
)

Definition at line 629 of file uia_provider.c.

631{
632 TRACE("%p, %p\n", iface, ret_val);
634 return S_OK;
635}
@ ProviderOptions_ServerSideProvider
@ ProviderOptions_UseComThreading

◆ msaa_provider_GetPatternProvider()

HRESULT WINAPI msaa_provider_GetPatternProvider ( IRawElementProviderSimple *  iface,
PATTERNID  pattern_id,
IUnknown **  ret_val 
)

Definition at line 637 of file uia_provider.c.

639{
640 TRACE("%p, %d, %p\n", iface, pattern_id, ret_val);
641
642 *ret_val = NULL;
643 switch (pattern_id)
644 {
646 return IRawElementProviderSimple_QueryInterface(iface, &IID_IUnknown, (void **)ret_val);
647
648 default:
649 FIXME("Unimplemented patternId %d\n", pattern_id);
650 break;
651 }
652
653 return S_OK;
654}

◆ msaa_provider_GetPropertyValue()

HRESULT WINAPI msaa_provider_GetPropertyValue ( IRawElementProviderSimple *  iface,
PROPERTYID  prop_id,
VARIANT ret_val 
)

Definition at line 656 of file uia_provider.c.

658{
659 struct msaa_provider *msaa_prov = impl_from_msaa_provider(iface);
660 HRESULT hr;
661 VARIANT v;
662
663 TRACE("%p, %d, %p\n", iface, prop_id, ret_val);
664
665 VariantInit(ret_val);
666 VariantInit(&v);
667 switch (prop_id)
668 {
670 V_VT(ret_val) = VT_BSTR;
671 V_BSTR(ret_val) = SysAllocString(L"Wine: MSAA Proxy");
672 break;
673
675 if (!msaa_prov->control_type)
676 {
677 hr = IAccessible_get_accRole(msaa_prov->acc, msaa_prov->cid, &v);
678 if (SUCCEEDED(hr) && (V_VT(&v) == VT_I4))
680 }
681
682 if (msaa_prov->control_type)
683 variant_init_i4(ret_val, msaa_prov->control_type);
684
685 break;
686
688 hr = msaa_check_acc_state_hres(msaa_prov->acc, msaa_prov->cid, STATE_SYSTEM_FOCUSED);
689 if (FAILED(hr))
690 return hr;
691
692 variant_init_bool(ret_val, hr == S_OK);
693 break;
694
696 hr = msaa_check_acc_state_hres(msaa_prov->acc, msaa_prov->cid, STATE_SYSTEM_FOCUSABLE);
697 if (FAILED(hr))
698 return hr;
699
700 variant_init_bool(ret_val, hr == S_OK);
701 break;
702
705 if (FAILED(hr))
706 return hr;
707
708 variant_init_bool(ret_val, hr == S_FALSE);
709 break;
710
712 hr = msaa_check_acc_state_hres(msaa_prov->acc, msaa_prov->cid, STATE_SYSTEM_PROTECTED);
713 if (FAILED(hr))
714 return hr;
715
716 variant_init_bool(ret_val, hr == S_OK);
717 break;
718
720 {
721 BSTR name;
722
723 hr = IAccessible_get_accName(msaa_prov->acc, msaa_prov->cid, &name);
724 if (SUCCEEDED(hr) && name)
725 {
726 V_VT(ret_val) = VT_BSTR;
727 V_BSTR(ret_val) = name;
728 }
729 break;
730 }
731
733 {
734 RECT rect[2] = { 0 };
735 RECT intersect_rect;
737
738 variant_init_bool(ret_val, FALSE);
739 if (msaa_check_acc_state(msaa_prov->acc, msaa_prov->cid, STATE_SYSTEM_OFFSCREEN))
740 {
741 variant_init_bool(ret_val, TRUE);
742 break;
743 }
744
745 hr = IAccessible_accLocation(msaa_prov->acc, &rect[0].left, &rect[0].top, &width, &height, msaa_prov->cid);
746 if (FAILED(hr))
747 break;
748
749 rect[0].right = rect[0].left + width;
750 rect[0].bottom = rect[0].top + height;
752 if (!GetClientRect(msaa_prov->hwnd, &rect[1]))
753 {
755 variant_init_bool(ret_val, TRUE);
756 break;
757 }
758
760 if (!MapWindowPoints(msaa_prov->hwnd, NULL, (POINT *)&rect[1], 2) && GetLastError())
761 {
763 variant_init_bool(ret_val, TRUE);
764 break;
765 }
766
767 variant_init_bool(ret_val, !IntersectRect(&intersect_rect, &rect[0], &rect[1]));
768 break;
769 }
770
771 default:
772 FIXME("Unimplemented propertyId %d\n", prop_id);
773 break;
774 }
775
776 return S_OK;
777}
static void variant_init_bool(VARIANT *v, BOOL val)
Definition: uia_private.h:163
static LONG msaa_role_to_uia_control_type(LONG role)
Definition: uia_provider.c:446
#define NOERROR
Definition: winerror.h:3448
#define ERROR_INVALID_WINDOW_HANDLE
Definition: winerror.h:1226
#define STATE_SYSTEM_FOCUSED
Definition: winuser.h:2971
int WINAPI MapWindowPoints(_In_opt_ HWND hWndFrom, _In_opt_ HWND hWndTo, _Inout_updates_(cPoints) LPPOINT lpPoints, _In_ UINT cPoints)
BOOL WINAPI GetClientRect(_In_ HWND, _Out_ LPRECT)
#define STATE_SYSTEM_FOCUSABLE
Definition: winuser.h:2989
BOOL WINAPI IntersectRect(_Out_ LPRECT, _In_ LPCRECT, _In_ LPCRECT)
#define STATE_SYSTEM_UNAVAILABLE
Definition: winuser.h:2969
#define STATE_SYSTEM_PROTECTED
Definition: winuser.h:2998

◆ msaa_provider_QueryInterface()

HRESULT WINAPI msaa_provider_QueryInterface ( IRawElementProviderSimple *  iface,
REFIID  riid,
void **  ppv 
)

Definition at line 577 of file uia_provider.c.

578{
579 struct msaa_provider *msaa_prov = impl_from_msaa_provider(iface);
580
581 *ppv = NULL;
582 if (IsEqualIID(riid, &IID_IRawElementProviderSimple) || IsEqualIID(riid, &IID_IUnknown))
583 *ppv = iface;
584 else if (IsEqualIID(riid, &IID_IRawElementProviderFragment))
586 else if (IsEqualIID(riid, &IID_IRawElementProviderFragmentRoot))
588 else if (IsEqualIID(riid, &IID_ILegacyIAccessibleProvider))
590 else if (IsEqualIID(riid, &IID_IProxyProviderWinEventHandler))
592 else
593 return E_NOINTERFACE;
594
595 IRawElementProviderSimple_AddRef(iface);
596 return S_OK;
597}

◆ msaa_provider_Release()

ULONG WINAPI msaa_provider_Release ( IRawElementProviderSimple *  iface)

Definition at line 609 of file uia_provider.c.

610{
611 struct msaa_provider *msaa_prov = impl_from_msaa_provider(iface);
613
614 TRACE("%p, refcount %ld\n", iface, refcount);
615
616 if (!refcount)
617 {
618 IAccessible_Release(msaa_prov->acc);
619 if (msaa_prov->parent)
620 IAccessible_Release(msaa_prov->parent);
621 if (msaa_prov->ia2)
622 IAccessible2_Release(msaa_prov->ia2);
623 free(msaa_prov);
624 }
625
626 return refcount;
627}

◆ msaa_role_to_uia_control_type()

static LONG msaa_role_to_uia_control_type ( LONG  role)
static

Definition at line 446 of file uia_provider.c.

447{
448 switch (role)
449 {
450 case ROLE_SYSTEM_TITLEBAR: return UIA_TitleBarControlTypeId;
451 case ROLE_SYSTEM_MENUBAR: return UIA_MenuBarControlTypeId;
452 case ROLE_SYSTEM_SCROLLBAR: return UIA_ScrollBarControlTypeId;
453 case ROLE_SYSTEM_INDICATOR:
454 case ROLE_SYSTEM_GRIP: return UIA_ThumbControlTypeId;
455 case ROLE_SYSTEM_APPLICATION:
456 case ROLE_SYSTEM_WINDOW: return UIA_WindowControlTypeId;
457 case ROLE_SYSTEM_MENUPOPUP: return UIA_MenuControlTypeId;
458 case ROLE_SYSTEM_TOOLTIP: return UIA_ToolTipControlTypeId;
459 case ROLE_SYSTEM_DOCUMENT: return UIA_DocumentControlTypeId;
460 case ROLE_SYSTEM_PANE: return UIA_PaneControlTypeId;
461 case ROLE_SYSTEM_GROUPING: return UIA_GroupControlTypeId;
462 case ROLE_SYSTEM_SEPARATOR: return UIA_SeparatorControlTypeId;
463 case ROLE_SYSTEM_TOOLBAR: return UIA_ToolBarControlTypeId;
464 case ROLE_SYSTEM_STATUSBAR: return UIA_StatusBarControlTypeId;
465 case ROLE_SYSTEM_TABLE: return UIA_TableControlTypeId;
466 case ROLE_SYSTEM_COLUMNHEADER:
467 case ROLE_SYSTEM_ROWHEADER: return UIA_HeaderControlTypeId;
468 case ROLE_SYSTEM_CELL: return UIA_DataItemControlTypeId;
469 case ROLE_SYSTEM_LINK: return UIA_HyperlinkControlTypeId;
470 case ROLE_SYSTEM_LIST: return UIA_ListControlTypeId;
471 case ROLE_SYSTEM_LISTITEM: return UIA_ListItemControlTypeId;
472 case ROLE_SYSTEM_OUTLINE: return UIA_TreeControlTypeId;
473 case ROLE_SYSTEM_OUTLINEITEM: return UIA_TreeItemControlTypeId;
474 case ROLE_SYSTEM_PAGETAB: return UIA_TabItemControlTypeId;
475 case ROLE_SYSTEM_GRAPHIC: return UIA_ImageControlTypeId;
476 case ROLE_SYSTEM_STATICTEXT: return UIA_TextControlTypeId;
477 case ROLE_SYSTEM_TEXT: return UIA_EditControlTypeId;
478 case ROLE_SYSTEM_CLOCK:
479 case ROLE_SYSTEM_BUTTONDROPDOWNGRID:
480 case ROLE_SYSTEM_PUSHBUTTON: return UIA_ButtonControlTypeId;
481 case ROLE_SYSTEM_CHECKBUTTON: return UIA_CheckBoxControlTypeId;
482 case ROLE_SYSTEM_RADIOBUTTON: return UIA_RadioButtonControlTypeId;
483 case ROLE_SYSTEM_COMBOBOX: return UIA_ComboBoxControlTypeId;
484 case ROLE_SYSTEM_PROGRESSBAR: return UIA_ProgressBarControlTypeId;
485 case ROLE_SYSTEM_SLIDER: return UIA_SliderControlTypeId;
486 case ROLE_SYSTEM_SPINBUTTON: return UIA_SpinnerControlTypeId;
487 case ROLE_SYSTEM_BUTTONMENU:
488 case ROLE_SYSTEM_MENUITEM: return UIA_MenuItemControlTypeId;
489 case ROLE_SYSTEM_PAGETABLIST: return UIA_TabControlTypeId;
490 case ROLE_SYSTEM_BUTTONDROPDOWN:
491 case ROLE_SYSTEM_SPLITBUTTON: return UIA_SplitButtonControlTypeId;
492 case ROLE_SYSTEM_SOUND:
493 case ROLE_SYSTEM_CURSOR:
494 case ROLE_SYSTEM_CARET:
495 case ROLE_SYSTEM_ALERT:
496 case ROLE_SYSTEM_CLIENT:
497 case ROLE_SYSTEM_CHART:
498 case ROLE_SYSTEM_DIALOG:
499 case ROLE_SYSTEM_BORDER:
500 case ROLE_SYSTEM_COLUMN:
501 case ROLE_SYSTEM_ROW:
502 case ROLE_SYSTEM_HELPBALLOON:
503 case ROLE_SYSTEM_CHARACTER:
504 case ROLE_SYSTEM_PROPERTYPAGE:
505 case ROLE_SYSTEM_DROPLIST:
506 case ROLE_SYSTEM_DIAL:
507 case ROLE_SYSTEM_HOTKEYFIELD:
508 case ROLE_SYSTEM_DIAGRAM:
509 case ROLE_SYSTEM_ANIMATION:
510 case ROLE_SYSTEM_EQUATION:
511 case ROLE_SYSTEM_WHITESPACE:
512 case ROLE_SYSTEM_IPADDRESS:
513 case ROLE_SYSTEM_OUTLINEBUTTON:
514 WARN("No UIA control type mapping for MSAA role %ld\n", role);
515 break;
516
517 default:
518 FIXME("UIA control type mapping unimplemented for MSAA role %ld\n", role);
519 break;
520 }
521
522 return 0;
523}

Referenced by msaa_provider_GetPropertyValue().

◆ msaa_winevent_handler_AddRef()

static ULONG WINAPI msaa_winevent_handler_AddRef ( IProxyProviderWinEventHandler *  iface)
static

Definition at line 1391 of file uia_provider.c.

1392{
1393 struct msaa_provider *msaa_prov = impl_from_msaa_winevent_handler(iface);
1394 return IRawElementProviderSimple_AddRef(&msaa_prov->IRawElementProviderSimple_iface);
1395}
static struct msaa_provider * impl_from_msaa_winevent_handler(IProxyProviderWinEventHandler *iface)

◆ msaa_winevent_handler_QueryInterface()

static HRESULT WINAPI msaa_winevent_handler_QueryInterface ( IProxyProviderWinEventHandler *  iface,
REFIID  riid,
void **  ppv 
)
static

Definition at line 1384 of file uia_provider.c.

1386{
1387 struct msaa_provider *msaa_prov = impl_from_msaa_winevent_handler(iface);
1388 return IRawElementProviderSimple_QueryInterface(&msaa_prov->IRawElementProviderSimple_iface, riid, ppv);
1389}

◆ msaa_winevent_handler_Release()

static ULONG WINAPI msaa_winevent_handler_Release ( IProxyProviderWinEventHandler *  iface)
static

Definition at line 1397 of file uia_provider.c.

1398{
1399 struct msaa_provider *msaa_prov = impl_from_msaa_winevent_handler(iface);
1400 return IRawElementProviderSimple_Release(&msaa_prov->IRawElementProviderSimple_iface);
1401}

◆ msaa_winevent_handler_RespondToWinEvent()

static HRESULT WINAPI msaa_winevent_handler_RespondToWinEvent ( IProxyProviderWinEventHandler *  iface,
DWORD  event_id,
HWND  hwnd,
LONG  objid,
LONG  cid,
IProxyProviderWinEventSink *  event_sink 
)
static

Definition at line 1403 of file uia_provider.c.

1405{
1406 struct msaa_provider *msaa_prov = impl_from_msaa_winevent_handler(iface);
1407 HRESULT hr;
1408
1409 TRACE("%p, %ld, %p, %ld, %ld, %p\n", iface, event_id, hwnd, objid, cid, event_sink);
1410
1411 switch (event_id)
1412 {
1413 case EVENT_SYSTEM_ALERT:
1414 hr = IProxyProviderWinEventSink_AddAutomationEvent(event_sink, &msaa_prov->IRawElementProviderSimple_iface,
1415 UIA_SystemAlertEventId);
1416 if (FAILED(hr))
1417 WARN("AddAutomationEvent failed with hr %#lx\n", hr);
1418 break;
1419
1420 case EVENT_OBJECT_REORDER:
1421 case EVENT_OBJECT_SELECTION:
1422 case EVENT_OBJECT_NAMECHANGE:
1423 case EVENT_OBJECT_VALUECHANGE:
1424 case EVENT_OBJECT_HELPCHANGE:
1425 case EVENT_OBJECT_INVOKED:
1426 FIXME("WinEvent %ld currently unimplemented\n", event_id);
1427 return E_NOTIMPL;
1428
1429 default:
1430 break;
1431 }
1432
1433 return S_OK;
1434}

◆ uia_get_hr_for_last_error()

static HRESULT uia_get_hr_for_last_error ( void  )
static

Definition at line 1524 of file uia_provider.c.

1525{
1526 DWORD last_err = GetLastError();
1527
1528 switch (last_err)
1529 {
1532
1533 case ERROR_TIMEOUT:
1534 return UIA_E_TIMEOUT;
1535
1536 default:
1537 return E_FAIL;
1538 }
1539}
#define UIA_E_TIMEOUT
#define ERROR_TIMEOUT
Definition: winerror.h:1286

Referenced by base_hwnd_fragment_get_BoundingRectangle(), base_hwnd_provider_GetPropertyValue(), get_uia_control_type_for_hwnd(), and uia_send_message_timeout().

◆ uia_lresult_from_node()

LRESULT uia_lresult_from_node ( HUIANODE  huianode)

Definition at line 2236 of file uia_provider.c.

2237{
2238 SAFEARRAY *rt_id;
2239 LRESULT lr = 0;
2240 HRESULT hr;
2241
2242 hr = UiaGetRuntimeId(huianode, &rt_id);
2244 lr = SendMessageW(provider_thread.hwnd, WM_GET_OBJECT_UIA_NODE, (WPARAM)rt_id, (LPARAM)huianode);
2245
2246 if (FAILED(hr))
2247 WARN("UiaGetRuntimeId failed with hr %#lx\n", hr);
2248
2249 /*
2250 * LresultFromObject increases refcnt by 1. If LresultFromObject
2251 * failed or wasn't called, this is expected to release the node.
2252 */
2253 UiaNodeRelease(huianode);
2254 SafeArrayDestroy(rt_id);
2255 return lr;
2256}
HRESULT WINAPI SafeArrayDestroy(SAFEARRAY *psa)
Definition: safearray.c:1347
UINT_PTR WPARAM
Definition: minwindef.h:174
HRESULT WINAPI UiaGetRuntimeId(HUIANODE huianode, SAFEARRAY **runtime_id)
Definition: uia_client.c:3045
BOOL WINAPI UiaNodeRelease(HUIANODE huianode)
Definition: uia_client.c:2876
static struct uia_provider_thread provider_thread
static BOOL uia_start_provider_thread(void)
#define WM_GET_OBJECT_UIA_NODE
LRESULT WINAPI SendMessageW(_In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)

Referenced by get_variant_for_elprov_node(), uia_raise_serverside_event(), and UiaReturnRawElementProvider().

◆ uia_provider_thread_add_node()

static HRESULT uia_provider_thread_add_node ( HUIANODE  node,
SAFEARRAY rt_id 
)
static

Definition at line 2041 of file uia_provider.c.

2042{
2043 struct uia_node *node_data = impl_from_IWineUiaNode((IWineUiaNode *)node);
2044 int prov_type = get_node_provider_type_at_idx(node_data, 0);
2045 struct uia_provider *prov_data;
2046 HRESULT hr = S_OK;
2047
2048 prov_data = impl_from_IWineUiaProvider(node_data->prov[prov_type]);
2049 node_data->nested_node = prov_data->return_nested_node = prov_data->refuse_hwnd_node_providers = TRUE;
2050
2051 TRACE("Adding node %p\n", node);
2052
2054 list_add_tail(&provider_thread.nodes_list, &node_data->prov_thread_list_entry);
2055
2056 /* If we have a runtime ID, create an entry in the rb tree. */
2057 if (rt_id)
2058 {
2059 struct uia_provider_thread_map_entry *prov_map;
2060 struct rb_entry *rb_entry;
2061
2062 if ((rb_entry = rb_get(&provider_thread.node_map, rt_id)))
2064 else
2065 {
2066 prov_map = calloc(1, sizeof(*prov_map));
2067 if (!prov_map)
2068 {
2069 hr = E_OUTOFMEMORY;
2070 goto exit;
2071 }
2072
2073 hr = SafeArrayCopy(rt_id, &prov_map->runtime_id);
2074 if (FAILED(hr))
2075 {
2076 free(prov_map);
2077 goto exit;
2078 }
2079 list_init(&prov_map->nodes_list);
2080 rb_put(&provider_thread.node_map, prov_map->runtime_id, &prov_map->entry);
2081 }
2082
2083 list_add_tail(&prov_map->nodes_list, &node_data->node_map_list_entry);
2084 node_data->map = prov_map;
2085 }
2086
2087exit:
2089
2090 return hr;
2091}
static void list_add_tail(struct list_entry *head, struct list_entry *entry)
Definition: list.h:83
static void list_init(struct list_entry *head)
Definition: list.h:51
HRESULT WINAPI SafeArrayCopy(SAFEARRAY *psa, SAFEARRAY **ppsaOut)
Definition: safearray.c:1379
#define rb_entry(ptr, type, member)
Definition: rbtree.h:130
uint32_t entry
Definition: isohybrid.c:63
#define RB_ENTRY_VALUE(element, type, field)
Definition: rbtree.h:26
static int rb_put(struct rb_tree *tree, const void *key, struct rb_entry *entry)
Definition: rbtree.h:204
static struct rb_entry * rb_get(const struct rb_tree *tree, const void *key)
Definition: rbtree.h:192
Definition: rbtree.h:30
BOOL nested_node
Definition: uia_private.h:76
struct uia_provider_thread_map_entry * map
Definition: uia_private.h:84
IWineUiaProvider * prov[PROV_TYPE_COUNT]
Definition: uia_private.h:68
struct list prov_thread_list_entry
Definition: uia_private.h:82
struct list node_map_list_entry
Definition: uia_private.h:83
SAFEARRAY * runtime_id
struct rb_entry entry
struct list nodes_list
BOOL return_nested_node
Definition: uia_private.h:98
BOOL refuse_hwnd_node_providers
Definition: uia_private.h:97
int get_node_provider_type_at_idx(struct uia_node *node, int idx)
Definition: uia_client.c:266
static struct uia_provider * impl_from_IWineUiaProvider(IWineUiaProvider *iface)
Definition: uia_private.h:104
static struct uia_node * impl_from_IWineUiaNode(IWineUiaNode *iface)
Definition: uia_private.h:87
static CRITICAL_SECTION provider_thread_cs
Definition: dlist.c:348
void WINAPI LeaveCriticalSection(LPCRITICAL_SECTION)
void WINAPI EnterCriticalSection(LPCRITICAL_SECTION)

Referenced by uia_provider_thread_msg_proc().

◆ uia_provider_thread_disconnect_node()

static void uia_provider_thread_disconnect_node ( SAFEARRAY sa)
static

Definition at line 2001 of file uia_provider.c.

2002{
2003 struct rb_entry *rb_entry;
2004
2006
2007 /* Provider thread hasn't been started, no nodes to disconnect. */
2008 if (!provider_thread.ref)
2009 goto exit;
2010
2011 rb_entry = rb_get(&provider_thread.node_map, sa);
2012 if (rb_entry)
2013 {
2014 struct uia_provider_thread_map_entry *prov_map;
2015 struct list *cursor, *cursor2;
2016 struct uia_node *node_data;
2017
2019 LIST_FOR_EACH_SAFE(cursor, cursor2, &prov_map->nodes_list)
2020 {
2021 node_data = LIST_ENTRY(cursor, struct uia_node, node_map_list_entry);
2022
2025 list_init(&node_data->prov_thread_list_entry);
2026 list_init(&node_data->node_map_list_entry);
2027 node_data->map = NULL;
2028
2029 IWineUiaNode_disconnect(&node_data->IWineUiaNode_iface);
2030 }
2031
2032 rb_remove(&provider_thread.node_map, &prov_map->entry);
2033 SafeArrayDestroy(prov_map->runtime_id);
2034 free(prov_map);
2035 }
2036
2037exit:
2039}
static struct sockaddr_in sa
Definition: adnsresfilter.c:69
static void list_remove(struct list_entry *entry)
Definition: list.h:90
Definition: list.h:37
const char cursor[]
Definition: icontest.c:13
#define LIST_FOR_EACH_SAFE(cursor, cursor2, list)
Definition: list.h:192
static void rb_remove(struct rb_tree *tree, struct rb_entry *entry)
Definition: rbtree.h:272
IWineUiaNode IWineUiaNode_iface
Definition: uia_private.h:65
#define LIST_ENTRY(type)
Definition: queue.h:175

Referenced by UiaDisconnectProvider().

◆ uia_provider_thread_msg_proc()

static LRESULT CALLBACK uia_provider_thread_msg_proc ( HWND  hwnd,
UINT  msg,
WPARAM  wparam,
LPARAM  lparam 
)
static

Definition at line 2095 of file uia_provider.c.

2097{
2098 switch (msg)
2099 {
2101 {
2102 SAFEARRAY *rt_id = (SAFEARRAY *)wparam;
2103 HUIANODE node = (HUIANODE)lparam;
2104 LRESULT lr;
2105
2107 {
2108 WARN("Failed to add node %p to provider thread list.\n", node);
2109 return 0;
2110 }
2111
2112 /*
2113 * LresultFromObject returns an index into the global atom string table,
2114 * which has a valid range of 0xc000-0xffff.
2115 */
2116 lr = LresultFromObject(&IID_IWineUiaNode, 0, (IUnknown *)node);
2117 if ((lr > 0xffff) || (lr < 0xc000))
2118 {
2119 WARN("Got invalid lresult %Ix\n", lr);
2120 lr = 0;
2121 }
2122
2123 return lr;
2124 }
2125
2126 default:
2127 break;
2128 }
2129
2130 return DefWindowProcW(hwnd, msg, wparam, lparam);
2131}
@ lparam
Definition: SystemMenu.c:31
@ wparam
Definition: SystemMenu.c:30
#define msg(x)
Definition: auth_time.c:54
LRESULT WINAPI LresultFromObject(REFIID riid, WPARAM wParam, LPUNKNOWN pAcc)
Definition: main.c:249
static HRESULT uia_provider_thread_add_node(HUIANODE node, SAFEARRAY *rt_id)
LRESULT WINAPI DefWindowProcW(_In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)

Referenced by uia_provider_thread_proc().

◆ uia_provider_thread_proc()

static DWORD WINAPI uia_provider_thread_proc ( void arg)
static

Definition at line 2133 of file uia_provider.c.

2134{
2135 HANDLE initialized_event = arg;
2136 HWND hwnd;
2137 MSG msg;
2138
2140 hwnd = CreateWindowW(L"Message", NULL, 0, 0, 0, 0, 0, HWND_MESSAGE, NULL, NULL, NULL);
2141 if (!hwnd)
2142 {
2143 WARN("CreateWindow failed: %ld\n", GetLastError());
2146 }
2147
2149 provider_thread.hwnd = hwnd;
2150
2151 /* Initialization complete, thread can now process window messages. */
2152 SetEvent(initialized_event);
2153 TRACE("Provider thread started.\n");
2154 while (GetMessageW(&msg, NULL, 0, 0))
2155 {
2156 if (msg.message == WM_UIA_PROVIDER_THREAD_STOP)
2157 break;
2160 }
2161
2162 TRACE("Shutting down UI Automation provider thread.\n");
2163
2167}
HRESULT WINAPI DECLSPEC_HOTPATCH CoInitializeEx(void *reserved, DWORD model)
Definition: combase.c:2803
void WINAPI DECLSPEC_HOTPATCH CoUninitialize(void)
Definition: combase.c:2842
VOID WINAPI FreeLibraryAndExitThread(HMODULE hLibModule, DWORD dwExitCode)
Definition: loader.c:507
@ COINIT_MULTITHREADED
Definition: objbase.h:280
BOOL WINAPI DECLSPEC_HOTPATCH SetEvent(IN HANDLE hEvent)
Definition: synch.c:669
#define GWLP_WNDPROC
Definition: treelist.c:66
TW_UINT32 TW_UINT16 TW_UINT16 MSG
Definition: twain.h:1829
HMODULE huia_module
Definition: uia_main.c:29
#define WM_UIA_PROVIDER_THREAD_STOP
static LRESULT CALLBACK uia_provider_thread_msg_proc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
void * arg
Definition: msvc.h:10
#define HWND_MESSAGE
Definition: winuser.h:1221
BOOL WINAPI TranslateMessage(_In_ const MSG *)
BOOL WINAPI GetMessageW(_Out_ LPMSG, _In_opt_ HWND, _In_ UINT, _In_ UINT)
#define CreateWindowW(a, b, c, d, e, f, g, h, i, j, k)
Definition: winuser.h:4470
LRESULT WINAPI DispatchMessageW(_In_ const MSG *)
#define SetWindowLongPtrW
Definition: winuser.h:5512
BOOL WINAPI DestroyWindow(_In_ HWND)

Referenced by uia_start_provider_thread().

◆ uia_provider_thread_remove_node()

void uia_provider_thread_remove_node ( HUIANODE  node)

Definition at line 1975 of file uia_provider.c.

1976{
1977 struct uia_node *node_data = impl_from_IWineUiaNode((IWineUiaNode *)node);
1978
1979 TRACE("Removing node %p\n", node);
1980
1982
1984 list_init(&node_data->prov_thread_list_entry);
1985 if (!list_empty(&node_data->node_map_list_entry))
1986 {
1987 list_remove(&node_data->node_map_list_entry);
1988 list_init(&node_data->node_map_list_entry);
1989 if (list_empty(&node_data->map->nodes_list))
1990 {
1991 rb_remove(&provider_thread.node_map, &node_data->map->entry);
1992 SafeArrayDestroy(node_data->map->runtime_id);
1993 free(node_data->map);
1994 }
1995 node_data->map = NULL;
1996 }
1997
1999}
static int list_empty(struct list_entry *head)
Definition: list.h:58

Referenced by uia_node_Release().

◆ uia_runtime_id_compare()

static int uia_runtime_id_compare ( const void key,
const struct rb_entry entry 
)
static

Definition at line 1969 of file uia_provider.c.

1970{
1972 return uia_compare_safearrays(prov_entry->runtime_id, (SAFEARRAY *)key, UIAutomationType_IntArray);
1973}
Definition: copy.c:22
int uia_compare_safearrays(SAFEARRAY *sa1, SAFEARRAY *sa2, int prop_type)
Definition: uia_utils.c:334

Referenced by uia_start_provider_thread().

◆ uia_send_message_timeout()

static HRESULT uia_send_message_timeout ( HWND  hwnd,
UINT  msg,
WPARAM  wparam,
LPARAM  lparam,
UINT  timeout,
LRESULT lres 
)
static

Definition at line 1542 of file uia_provider.c.

1543{
1544 *lres = 0;
1547
1548 return S_OK;
1549}
ULONG_PTR * PDWORD_PTR
Definition: basetsd.h:176
Definition: dhcpd.h:248
LRESULT WINAPI SendMessageTimeoutW(_In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM, _In_ UINT, _In_ UINT, _Out_opt_ PDWORD_PTR)
#define SMTO_NORMAL
Definition: winuser.h:1236

Referenced by base_hwnd_provider_GetPropertyValue().

◆ uia_start_provider_thread()

static BOOL uia_start_provider_thread ( void  )
static

Definition at line 2169 of file uia_provider.c.

2170{
2171 BOOL started = TRUE;
2172
2174 if (++provider_thread.ref == 1)
2175 {
2176 HANDLE ready_event;
2177 HANDLE events[2];
2179 DWORD wait_obj;
2180
2181 /* Increment DLL reference count. */
2182 GetModuleHandleExW(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS,
2184
2185 list_init(&provider_thread.nodes_list);
2187 events[0] = ready_event = CreateEventW(NULL, FALSE, FALSE, NULL);
2189 ready_event, 0, NULL)))
2190 {
2192 started = FALSE;
2193 goto exit;
2194 }
2195
2196 events[1] = provider_thread.hthread;
2198 if (wait_obj != WAIT_OBJECT_0)
2199 {
2201 started = FALSE;
2202 }
2203
2204exit:
2205 CloseHandle(ready_event);
2206 if (!started)
2207 {
2208 WARN("Failed to start provider thread\n");
2210 }
2211 }
2212
2214 return started;
2215}
#define CloseHandle
Definition: compat.h:739
#define FreeLibrary(x)
Definition: compat.h:748
BOOL WINAPI GetModuleHandleExW(IN DWORD dwFlags, IN LPCWSTR lpwModuleName OPTIONAL, OUT HMODULE *phModule)
Definition: loader.c:866
HANDLE WINAPI DECLSPEC_HOTPATCH CreateThread(IN LPSECURITY_ATTRIBUTES lpThreadAttributes, IN DWORD dwStackSize, IN LPTHREAD_START_ROUTINE lpStartAddress, IN LPVOID lpParameter, IN DWORD dwCreationFlags, OUT LPDWORD lpThreadId)
Definition: thread.c:137
#define INFINITE
Definition: serial.h:102
HANDLE events[2]
Definition: event.c:4
static HMODULE hmodule
Definition: rasapi.c:29
static void rb_init(struct rb_tree *tree, rb_compare_func_t compare)
Definition: rbtree.h:173
DWORD WINAPI WaitForMultipleObjects(IN DWORD nCount, IN CONST HANDLE *lpHandles, IN BOOL bWaitAll, IN DWORD dwMilliseconds)
Definition: synch.c:151
HANDLE WINAPI DECLSPEC_HOTPATCH CreateEventW(IN LPSECURITY_ATTRIBUTES lpEventAttributes OPTIONAL, IN BOOL bManualReset, IN BOOL bInitialState, IN LPCWSTR lpName OPTIONAL)
Definition: synch.c:587
static int uia_runtime_id_compare(const void *key, const struct rb_entry *entry)
static DWORD WINAPI uia_provider_thread_proc(void *arg)
#define WAIT_OBJECT_0
Definition: winbase.h:383

Referenced by uia_lresult_from_node(), and uia_start_provider_thread().

◆ uia_stop_provider_thread()

void uia_stop_provider_thread ( void  )

Definition at line 2217 of file uia_provider.c.

2218{
2220 if (!--provider_thread.ref)
2221 {
2224 if (!list_empty(&provider_thread.nodes_list))
2225 ERR("Provider thread shutdown with nodes still in the list\n");
2227 }
2229}
#define ERR(fmt,...)
Definition: precomp.h:57
BOOL WINAPI PostMessageW(_In_opt_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)

Referenced by uia_node_Release().

◆ UiaDisconnectProvider()

HRESULT WINAPI UiaDisconnectProvider ( IRawElementProviderSimple *  elprov)

Definition at line 2294 of file uia_provider.c.

2295{
2296 SAFEARRAY *sa;
2297 HUIANODE node;
2298 HRESULT hr;
2299
2300 TRACE("(%p)\n", elprov);
2301
2302 hr = create_uia_node_from_elprov(elprov, &node, FALSE, 0);
2303 if (FAILED(hr))
2304 return hr;
2305
2308 if (FAILED(hr))
2309 return hr;
2310
2311 if (!sa)
2312 return E_INVALIDARG;
2313
2315
2317
2318 return S_OK;
2319}
HRESULT create_uia_node_from_elprov(IRawElementProviderSimple *elprov, HUIANODE *out_node, BOOL get_hwnd_providers, int node_flags)
Definition: uia_client.c:2049
static void uia_provider_thread_disconnect_node(SAFEARRAY *sa)

◆ UiaProviderFromIAccessible()

HRESULT WINAPI UiaProviderFromIAccessible ( IAccessible acc,
LONG  child_id,
DWORD  flags,
IRawElementProviderSimple **  elprov 
)

Definition at line 1487 of file uia_provider.c.

1489{
1490 HWND hwnd = NULL;
1491 HRESULT hr;
1492
1493 TRACE("(%p, %ld, %#lx, %p)\n", acc, child_id, flags, elprov);
1494
1495 if (elprov)
1496 *elprov = NULL;
1497
1498 if (!elprov)
1499 return E_POINTER;
1500 if (!acc)
1501 return E_INVALIDARG;
1502
1503 if (flags != UIA_PFIA_DEFAULT)
1504 {
1505 FIXME("unsupported flags %#lx\n", flags);
1506 return E_NOTIMPL;
1507 }
1508
1509 if (msaa_acc_is_oleacc_proxy(acc))
1510 {
1511 WARN("Cannot wrap an oleacc proxy IAccessible!\n");
1512 return E_INVALIDARG;
1513 }
1514
1516 if (FAILED(hr))
1517 return hr;
1518 if (!hwnd)
1519 return E_FAIL;
1520
1521 return create_msaa_provider(acc, child_id, hwnd, FALSE, FALSE, elprov);
1522}
GLbitfield flags
Definition: glext.h:7161
#define UIA_PFIA_DEFAULT
#define E_POINTER
Definition: winerror.h:3480

◆ UiaReturnRawElementProvider()

LRESULT WINAPI UiaReturnRawElementProvider ( HWND  hwnd,
WPARAM  wparam,
LPARAM  lparam,
IRawElementProviderSimple *  elprov 
)

Definition at line 2261 of file uia_provider.c.

2263{
2264 HUIANODE node;
2265 HRESULT hr;
2266
2267 TRACE("(%p, %Ix, %#Ix, %p)\n", hwnd, wparam, lparam, elprov);
2268
2269 if (!wparam && !lparam && !elprov)
2270 {
2271 FIXME("UIA-to-MSAA bridge not implemented, no provider map to free.\n");
2272 return 0;
2273 }
2274
2275 if (lparam != UiaRootObjectId)
2276 {
2277 FIXME("Unsupported object id %Id, ignoring.\n", lparam);
2278 return 0;
2279 }
2280
2281 hr = create_uia_node_from_elprov(elprov, &node, FALSE, 0);
2282 if (FAILED(hr))
2283 {
2284 WARN("Failed to create HUIANODE with hr %#lx\n", hr);
2285 return 0;
2286 }
2287
2289}
LRESULT uia_lresult_from_node(HUIANODE huianode)
#define UiaRootObjectId

Referenced by child_test_wnd_proc(), and test_wnd_proc().

◆ WINE_DEFAULT_DEBUG_CHANNEL()

WINE_DEFAULT_DEBUG_CHANNEL ( uiautomation  )

Variable Documentation

◆ base_hwnd_fragment_vtbl

const IRawElementProviderFragmentVtbl base_hwnd_fragment_vtbl
static
Initial value:
= {
}
static HRESULT WINAPI base_hwnd_fragment_SetFocus(IRawElementProviderFragment *iface)
static ULONG WINAPI base_hwnd_fragment_Release(IRawElementProviderFragment *iface)
static HRESULT WINAPI base_hwnd_fragment_GetRuntimeId(IRawElementProviderFragment *iface, SAFEARRAY **ret_val)
static ULONG WINAPI base_hwnd_fragment_AddRef(IRawElementProviderFragment *iface)
static HRESULT WINAPI base_hwnd_fragment_GetEmbeddedFragmentRoots(IRawElementProviderFragment *iface, SAFEARRAY **ret_val)
static HRESULT WINAPI base_hwnd_fragment_get_BoundingRectangle(IRawElementProviderFragment *iface, struct UiaRect *ret_val)
static HRESULT WINAPI base_hwnd_fragment_Navigate(IRawElementProviderFragment *iface, enum NavigateDirection direction, IRawElementProviderFragment **ret_val)
static HRESULT WINAPI base_hwnd_fragment_get_FragmentRoot(IRawElementProviderFragment *iface, IRawElementProviderFragmentRoot **ret_val)
static HRESULT WINAPI base_hwnd_fragment_QueryInterface(IRawElementProviderFragment *iface, REFIID riid, void **ppv)

Definition at line 1903 of file uia_provider.c.

Referenced by create_base_hwnd_provider().

◆ base_hwnd_provider_vtbl

const IRawElementProviderSimpleVtbl base_hwnd_provider_vtbl
static
Initial value:
= {
}
static HRESULT WINAPI base_hwnd_provider_GetPropertyValue(IRawElementProviderSimple *iface, PROPERTYID prop_id, VARIANT *ret_val)
static ULONG WINAPI base_hwnd_provider_Release(IRawElementProviderSimple *iface)
static HRESULT WINAPI base_hwnd_provider_get_HostRawElementProvider(IRawElementProviderSimple *iface, IRawElementProviderSimple **ret_val)
static HRESULT WINAPI base_hwnd_provider_get_ProviderOptions(IRawElementProviderSimple *iface, enum ProviderOptions *ret_val)
static ULONG WINAPI base_hwnd_provider_AddRef(IRawElementProviderSimple *iface)
static HRESULT WINAPI base_hwnd_provider_QueryInterface(IRawElementProviderSimple *iface, REFIID riid, void **ppv)
static HRESULT WINAPI base_hwnd_provider_GetPatternProvider(IRawElementProviderSimple *iface, PATTERNID pattern_id, IUnknown **ret_val)

Definition at line 1758 of file uia_provider.c.

Referenced by create_base_hwnd_provider().

◆ msaa_acc_provider_vtbl

const ILegacyIAccessibleProviderVtbl msaa_acc_provider_vtbl
static
Initial value:
= {
}
static HRESULT WINAPI msaa_acc_provider_GetIAccessible(ILegacyIAccessibleProvider *iface, IAccessible **out_acc)
static HRESULT WINAPI msaa_acc_provider_get_ChildId(ILegacyIAccessibleProvider *iface, int *out_cid)
static HRESULT WINAPI msaa_acc_provider_get_KeyboardShortcut(ILegacyIAccessibleProvider *iface, BSTR *out_kbd_shortcut)
static HRESULT WINAPI msaa_acc_provider_get_Role(ILegacyIAccessibleProvider *iface, DWORD *out_role)
static HRESULT WINAPI msaa_acc_provider_get_Name(ILegacyIAccessibleProvider *iface, BSTR *out_name)
static HRESULT WINAPI msaa_acc_provider_GetSelection(ILegacyIAccessibleProvider *iface, SAFEARRAY **out_selected)
static ULONG WINAPI msaa_acc_provider_Release(ILegacyIAccessibleProvider *iface)
static HRESULT WINAPI msaa_acc_provider_get_Value(ILegacyIAccessibleProvider *iface, BSTR *out_value)
static ULONG WINAPI msaa_acc_provider_AddRef(ILegacyIAccessibleProvider *iface)
static HRESULT WINAPI msaa_acc_provider_get_DefaultAction(ILegacyIAccessibleProvider *iface, BSTR *out_default_action)
static HRESULT WINAPI msaa_acc_provider_Select(ILegacyIAccessibleProvider *iface, LONG select_flags)
static HRESULT WINAPI msaa_acc_provider_get_Help(ILegacyIAccessibleProvider *iface, BSTR *out_help)
static HRESULT WINAPI msaa_acc_provider_get_Description(ILegacyIAccessibleProvider *iface, BSTR *out_description)
static HRESULT WINAPI msaa_acc_provider_get_State(ILegacyIAccessibleProvider *iface, DWORD *out_state)
static HRESULT WINAPI msaa_acc_provider_DoDefaultAction(ILegacyIAccessibleProvider *iface)
static HRESULT WINAPI msaa_acc_provider_SetValue(ILegacyIAccessibleProvider *iface, LPCWSTR val)
static HRESULT WINAPI msaa_acc_provider_QueryInterface(ILegacyIAccessibleProvider *iface, REFIID riid, void **ppv)

Definition at line 1355 of file uia_provider.c.

Referenced by create_msaa_provider().

◆ msaa_fragment_root_vtbl

const IRawElementProviderFragmentRootVtbl msaa_fragment_root_vtbl
static
Initial value:
= {
}
static ULONG WINAPI msaa_fragment_root_AddRef(IRawElementProviderFragmentRoot *iface)
static HRESULT WINAPI msaa_fragment_root_GetFocus(IRawElementProviderFragmentRoot *iface, IRawElementProviderFragment **ret_val)
static HRESULT WINAPI msaa_fragment_root_QueryInterface(IRawElementProviderFragmentRoot *iface, REFIID riid, void **ppv)
static HRESULT WINAPI msaa_fragment_root_ElementProviderFromPoint(IRawElementProviderFragmentRoot *iface, double x, double y, IRawElementProviderFragment **ret_val)
static ULONG WINAPI msaa_fragment_root_Release(IRawElementProviderFragmentRoot *iface)

Definition at line 1209 of file uia_provider.c.

Referenced by create_msaa_provider().

◆ msaa_fragment_vtbl

const IRawElementProviderFragmentVtbl msaa_fragment_vtbl
static
Initial value:
= {
}
static HRESULT WINAPI msaa_fragment_get_BoundingRectangle(IRawElementProviderFragment *iface, struct UiaRect *ret_val)
Definition: uia_provider.c:972
static HRESULT WINAPI msaa_fragment_get_FragmentRoot(IRawElementProviderFragment *iface, IRawElementProviderFragmentRoot **ret_val)
static ULONG WINAPI msaa_fragment_Release(IRawElementProviderFragment *iface)
Definition: uia_provider.c:825
static HRESULT WINAPI msaa_fragment_QueryInterface(IRawElementProviderFragment *iface, REFIID riid, void **ppv)
Definition: uia_provider.c:812
static HRESULT WINAPI msaa_fragment_GetRuntimeId(IRawElementProviderFragment *iface, SAFEARRAY **ret_val)
Definition: uia_provider.c:964
static HRESULT WINAPI msaa_fragment_GetEmbeddedFragmentRoots(IRawElementProviderFragment *iface, SAFEARRAY **ret_val)
static HRESULT WINAPI msaa_fragment_Navigate(IRawElementProviderFragment *iface, enum NavigateDirection direction, IRawElementProviderFragment **ret_val)
Definition: uia_provider.c:831
static ULONG WINAPI msaa_fragment_AddRef(IRawElementProviderFragment *iface)
Definition: uia_provider.c:819
static HRESULT WINAPI msaa_fragment_SetFocus(IRawElementProviderFragment *iface)

Definition at line 1045 of file uia_provider.c.

Referenced by create_msaa_provider().

◆ msaa_provider_vtbl

const IRawElementProviderSimpleVtbl msaa_provider_vtbl
static
Initial value:
= {
}
HRESULT WINAPI msaa_provider_QueryInterface(IRawElementProviderSimple *iface, REFIID riid, void **ppv)
Definition: uia_provider.c:577
HRESULT WINAPI msaa_provider_GetPatternProvider(IRawElementProviderSimple *iface, PATTERNID pattern_id, IUnknown **ret_val)
Definition: uia_provider.c:637
ULONG WINAPI msaa_provider_AddRef(IRawElementProviderSimple *iface)
Definition: uia_provider.c:599
ULONG WINAPI msaa_provider_Release(IRawElementProviderSimple *iface)
Definition: uia_provider.c:609
HRESULT WINAPI msaa_provider_get_HostRawElementProvider(IRawElementProviderSimple *iface, IRawElementProviderSimple **ret_val)
Definition: uia_provider.c:779
HRESULT WINAPI msaa_provider_get_ProviderOptions(IRawElementProviderSimple *iface, enum ProviderOptions *ret_val)
Definition: uia_provider.c:629
HRESULT WINAPI msaa_provider_GetPropertyValue(IRawElementProviderSimple *iface, PROPERTYID prop_id, VARIANT *ret_val)
Definition: uia_provider.c:656

Definition at line 793 of file uia_provider.c.

Referenced by create_msaa_provider().

◆ msaa_winevent_handler_vtbl

const IProxyProviderWinEventHandlerVtbl msaa_winevent_handler_vtbl
static
Initial value:
= {
}
static ULONG WINAPI msaa_winevent_handler_Release(IProxyProviderWinEventHandler *iface)
static HRESULT WINAPI msaa_winevent_handler_RespondToWinEvent(IProxyProviderWinEventHandler *iface, DWORD event_id, HWND hwnd, LONG objid, LONG cid, IProxyProviderWinEventSink *event_sink)
static HRESULT WINAPI msaa_winevent_handler_QueryInterface(IProxyProviderWinEventHandler *iface, REFIID riid, void **ppv)
static ULONG WINAPI msaa_winevent_handler_AddRef(IProxyProviderWinEventHandler *iface)

Definition at line 1436 of file uia_provider.c.

Referenced by create_msaa_provider().

◆ provider_thread

◆ provider_thread_cs

◆ provider_thread_cs_debug

CRITICAL_SECTION_DEBUG provider_thread_cs_debug
static
Initial value:
=
{
0, 0, { (DWORD_PTR)(__FILE__ ": provider_thread_cs") }
}
#define DWORD_PTR
Definition: treelist.c:76
static CRITICAL_SECTION_DEBUG provider_thread_cs_debug

Definition at line 1953 of file uia_provider.c.