diff options
Diffstat (limited to 'Src/Wasabi/api/wnd/accessible.h')
-rw-r--r-- | Src/Wasabi/api/wnd/accessible.h | 622 |
1 files changed, 622 insertions, 0 deletions
diff --git a/Src/Wasabi/api/wnd/accessible.h b/Src/Wasabi/api/wnd/accessible.h new file mode 100644 index 00000000..13e544bb --- /dev/null +++ b/Src/Wasabi/api/wnd/accessible.h @@ -0,0 +1,622 @@ +#ifndef __ACCESSIBLE_H +#define __ACCESSIBLE_H + +#include <bfc/common.h> + +// Message sent to the OS window in order to retrieve an accessibility interface +#define WM_GETOBJECT 0x003D + +// undef some stuff we're gonna #define ourselves +#ifdef OBJID_WINDOW +#undef OBJID_WINDOW +#endif +#ifdef OBJID_SYSMENU +#undef OBJID_SYSMENU +#endif +#ifdef OBJID_TITLEBAR +#undef OBJID_TITLEBAR +#endif +#ifdef OBJID_MENU +#undef OBJID_MENU +#endif +#ifdef OBJID_CLIENT +#undef OBJID_CLIENT +#endif +#ifdef OBJID_VSCROLL +#undef OBJID_VSCROLL +#endif +#ifdef OBJID_HSCROLL +#undef OBJID_HSCROLL +#endif +#ifdef OBJID_SIZEGRIP +#undef OBJID_SIZEGRIP +#endif +#ifdef OBJID_CARET +#undef OBJID_CARET +#endif +#ifdef OBJID_CURSOR +#undef OBJID_CURSOR +#endif +#ifdef OBJID_ALERT +#undef OBJID_ALERT +#endif +#ifdef OBJID_SOUND +#undef OBJID_SOUND +#endif +#ifdef STATE_SYSTEM_VALID +#undef STATE_SYSTEM_VALID +#endif // STATE_SYSTEM_VALID + +// Accessibility system object IDs +#define OBJID_WINDOW 0x00000000 +#define OBJID_SYSMENU 0xFFFFFFFF +#define OBJID_TITLEBAR 0xFFFFFFFE +#define OBJID_MENU 0xFFFFFFFD +#define OBJID_CLIENT 0xFFFFFFFC +#define OBJID_VSCROLL 0xFFFFFFFB +#define OBJID_HSCROLL 0xFFFFFFFA +#define OBJID_SIZEGRIP 0xFFFFFFF9 +#define OBJID_CARET 0xFFFFFFF8 +#define OBJID_CURSOR 0xFFFFFFF7 +#define OBJID_ALERT 0xFFFFFFF6 +#define OBJID_SOUND 0xFFFFFFF5 + +#if 0 +#define ROLE_SYSTEM_TITLEBAR 0x00000001 +#define ROLE_SYSTEM_MENUBAR 0x00000002 +#define ROLE_SYSTEM_SCROLLBAR 0x00000003 +#define ROLE_SYSTEM_GRIP 0x00000004 +#define ROLE_SYSTEM_SOUND 0x00000005 +#define ROLE_SYSTEM_CURSOR 0x00000006 +#define ROLE_SYSTEM_CARET 0x00000007 +#define ROLE_SYSTEM_ALERT 0x00000008 +#define ROLE_SYSTEM_WINDOW 0x00000009 +#define ROLE_SYSTEM_CLIENT 0x0000000A +#define ROLE_SYSTEM_MENUPOPUP 0x0000000B +#define ROLE_SYSTEM_MENUITEM 0x0000000C +#define ROLE_SYSTEM_TOOLTIP 0x0000000D +#define ROLE_SYSTEM_APPLICATION 0x0000000E +#define ROLE_SYSTEM_DOCUMENT 0x0000000F +#define ROLE_SYSTEM_PANE 0x00000010 +#define ROLE_SYSTEM_CHART 0x00000011 +#define ROLE_SYSTEM_DIALOG 0x00000012 +#define ROLE_SYSTEM_BORDER 0x00000013 +#define ROLE_SYSTEM_GROUPING 0x00000014 +#define ROLE_SYSTEM_SEPARATOR 0x00000015 +#define ROLE_SYSTEM_TOOLBAR 0x00000016 +#define ROLE_SYSTEM_STATUSBAR 0x00000017 +#define ROLE_SYSTEM_TABLE 0x00000018 +#define ROLE_SYSTEM_COLUMNHEADER 0x00000019 +#define ROLE_SYSTEM_ROWHEADER 0x0000001A +#define ROLE_SYSTEM_COLUMN 0x0000001B +#define ROLE_SYSTEM_ROW 0x0000001C +#define ROLE_SYSTEM_CELL 0x0000001D +#define ROLE_SYSTEM_LINK 0x0000001E +#define ROLE_SYSTEM_HELPBALLOON 0x0000001F +#define ROLE_SYSTEM_CHARACTER 0x00000020 +#define ROLE_SYSTEM_LIST 0x00000021 +#define ROLE_SYSTEM_LISTITEM 0x00000022 +#define ROLE_SYSTEM_OUTLINE 0x00000023 +#define ROLE_SYSTEM_OUTLINEITEM 0x00000024 +#define ROLE_SYSTEM_PAGETAB 0x00000025 +#define ROLE_SYSTEM_PROPERTYPAGE 0x00000026 +#define ROLE_SYSTEM_INDICATOR 0x00000027 +#define ROLE_SYSTEM_GRAPHIC 0x00000028 +#define ROLE_SYSTEM_STATICTEXT 0x00000029 +#define ROLE_SYSTEM_TEXT 0x0000002A // Editable, selectable, etc. +#define ROLE_SYSTEM_PUSHBUTTON 0x0000002B +#define ROLE_SYSTEM_CHECKBUTTON 0x0000002C +#define ROLE_SYSTEM_RADIOBUTTON 0x0000002D +#define ROLE_SYSTEM_COMBOBOX 0x0000002E +#define ROLE_SYSTEM_DROPLIST 0x0000002F +#define ROLE_SYSTEM_PROGRESSBAR 0x00000030 +#define ROLE_SYSTEM_DIAL 0x00000031 +#define ROLE_SYSTEM_HOTKEYFIELD 0x00000032 +#define ROLE_SYSTEM_SLIDER 0x00000033 +#define ROLE_SYSTEM_SPINBUTTON 0x00000034 +#define ROLE_SYSTEM_DIAGRAM 0x00000035 +#define ROLE_SYSTEM_ANIMATION 0x00000036 +#define ROLE_SYSTEM_EQUATION 0x00000037 +#define ROLE_SYSTEM_BUTTONDROPDOWN 0x00000038 +#define ROLE_SYSTEM_BUTTONMENU 0x00000039 +#define ROLE_SYSTEM_BUTTONDROPDOWNGRID 0x0000003A +#define ROLE_SYSTEM_WHITESPACE 0x0000003B +#define ROLE_SYSTEM_PAGETABLIST 0x0000003C +#define ROLE_SYSTEM_CLOCK 0x0000003D +#endif +#define STATE_SYSTEM_UNAVAILABLE 0x00000001 // Disabled +#define STATE_SYSTEM_SELECTED 0x00000002 +#define STATE_SYSTEM_FOCUSED 0x00000004 +#define STATE_SYSTEM_PRESSED 0x00000008 +#define STATE_SYSTEM_CHECKED 0x00000010 +#define STATE_SYSTEM_MIXED 0x00000020 // 3-state checkbox or toolbar button +#define STATE_SYSTEM_READONLY 0x00000040 +#define STATE_SYSTEM_HOTTRACKED 0x00000080 +#define STATE_SYSTEM_DEFAULT 0x00000100 +#define STATE_SYSTEM_EXPANDED 0x00000200 +#define STATE_SYSTEM_COLLAPSED 0x00000400 +#define STATE_SYSTEM_BUSY 0x00000800 +#define STATE_SYSTEM_FLOATING 0x00001000 // Children "owned" not "contained" by parent +#define STATE_SYSTEM_MARQUEED 0x00002000 +#define STATE_SYSTEM_ANIMATED 0x00004000 +#define STATE_SYSTEM_INVISIBLE 0x00008000 +#define STATE_SYSTEM_OFFSCREEN 0x00010000 +#define STATE_SYSTEM_SIZEABLE 0x00020000 +#define STATE_SYSTEM_MOVEABLE 0x00040000 +#define STATE_SYSTEM_SELFVOICING 0x00080000 +#define STATE_SYSTEM_FOCUSABLE 0x00100000 +#define STATE_SYSTEM_SELECTABLE 0x00200000 +#define STATE_SYSTEM_LINKED 0x00400000 +#define STATE_SYSTEM_TRAVERSED 0x00800000 +#define STATE_SYSTEM_MULTISELECTABLE 0x01000000 // Supports multiple selection +#define STATE_SYSTEM_EXTSELECTABLE 0x02000000 // Supports extended selection +#define STATE_SYSTEM_ALERT_LOW 0x04000000 // This information is of low priority +#define STATE_SYSTEM_ALERT_MEDIUM 0x08000000 // This information is of medium priority +#define STATE_SYSTEM_ALERT_HIGH 0x10000000 // This information is of high priority + +#define STATE_SYSTEM_VALID 0x1FFFFFFF + +/* + * Reserved IDs for system objects + */ +#define OBJID_WINDOW 0x00000000 +#define OBJID_SYSMENU 0xFFFFFFFF +#define OBJID_TITLEBAR 0xFFFFFFFE +#define OBJID_MENU 0xFFFFFFFD +#define OBJID_CLIENT 0xFFFFFFFC +#define OBJID_VSCROLL 0xFFFFFFFB +#define OBJID_HSCROLL 0xFFFFFFFA +#define OBJID_SIZEGRIP 0xFFFFFFF9 +#define OBJID_CARET 0xFFFFFFF8 +#define OBJID_CURSOR 0xFFFFFFF7 +#define OBJID_ALERT 0xFFFFFFF6 +#define OBJID_SOUND 0xFFFFFFF5 + +/* + * EVENT DEFINITION + */ +#define EVENT_MIN 0x00000001 +#define EVENT_MAX 0x7FFFFFFF + + +/* + * EVENT_SYSTEM_SOUND + * Sent when a sound is played. Currently nothing is generating this, we + * this event when a system sound (for menus, etc) is played. Apps + * generate this, if accessible, when a private sound is played. For + * example, if Mail plays a "New Mail" sound. + * + * System Sounds: + * (Generated by PlaySoundEvent in USER itself) + * hwnd is NULL + * idObject is OBJID_SOUND + * idChild is sound child ID if one + * App Sounds: + * (PlaySoundEvent won't generate notification; up to app) + * hwnd + idObject gets interface pointer to Sound object + * idChild identifies the sound in question + * are going to be cleaning up the SOUNDSENTRY feature in the control panel + * and will use this at that time. Applications implementing WinEvents + * are perfectly welcome to use it. Clients of IAccessible* will simply + * turn around and get back a non-visual object that describes the sound. + */ +#define EVENT_SYSTEM_SOUND 0x0001 + +/* + * EVENT_SYSTEM_ALERT + * System Alerts: + * (Generated by MessageBox() calls for example) + * hwnd is hwndMessageBox + * idObject is OBJID_ALERT + * App Alerts: + * (Generated whenever) + * hwnd+idObject gets interface pointer to Alert + */ +#define EVENT_SYSTEM_ALERT 0x0002 + +/* + * EVENT_SYSTEM_FOREGROUND + * Sent when the foreground (active) window changes, even if it is changing + * to another window in the same thread as the previous one. + * hwnd is hwndNewForeground + * idObject is OBJID_WINDOW + * idChild is INDEXID_OBJECT + */ +#define EVENT_SYSTEM_FOREGROUND 0x0003 + +/* + * Menu + * hwnd is window (top level window or popup menu window) + * idObject is ID of control (OBJID_MENU, OBJID_SYSMENU, OBJID_SELF for popup) + * idChild is CHILDID_SELF + * + * EVENT_SYSTEM_MENUSTART + * EVENT_SYSTEM_MENUEND + * For MENUSTART, hwnd+idObject+idChild refers to the control with the menu bar, + * or the control bringing up the context menu. + * + * Sent when entering into and leaving from menu mode (system, app bar, and + * track popups). + */ +#define EVENT_SYSTEM_MENUSTART 0x0004 +#define EVENT_SYSTEM_MENUEND 0x0005 + +/* + * EVENT_SYSTEM_MENUPOPUPSTART + * EVENT_SYSTEM_MENUPOPUPEND + * Sent when a menu popup comes up and just before it is taken down. Note + * that for a call to TrackPopupMenu(), a client will see EVENT_SYSTEM_MENUSTART + * followed almost immediately by EVENT_SYSTEM_MENUPOPUPSTART for the popup + * being shown. + * + * For MENUPOPUP, hwnd+idObject+idChild refers to the NEW popup coming up, not the + * parent item which is hierarchical. You can get the parent menu/popup by + * asking for the accParent object. + */ +#define EVENT_SYSTEM_MENUPOPUPSTART 0x0006 +#define EVENT_SYSTEM_MENUPOPUPEND 0x0007 + + +/* + * EVENT_SYSTEM_CAPTURESTART + * EVENT_SYSTEM_CAPTUREEND + * Sent when a window takes the capture and releases the capture. + */ +#define EVENT_SYSTEM_CAPTURESTART 0x0008 +#define EVENT_SYSTEM_CAPTUREEND 0x0009 + +/* + * Move Size + * EVENT_SYSTEM_MOVESIZESTART + * EVENT_SYSTEM_MOVESIZEEND + * Sent when a window enters and leaves move-size dragging mode. + */ +#define EVENT_SYSTEM_MOVESIZESTART 0x000A +#define EVENT_SYSTEM_MOVESIZEEND 0x000B + +/* + * Context Help + * EVENT_SYSTEM_CONTEXTHELPSTART + * EVENT_SYSTEM_CONTEXTHELPEND + * Sent when a window enters and leaves context sensitive help mode. + */ +#define EVENT_SYSTEM_CONTEXTHELPSTART 0x000C +#define EVENT_SYSTEM_CONTEXTHELPEND 0x000D + +/* + * Drag & Drop + * EVENT_SYSTEM_DRAGDROPSTART + * EVENT_SYSTEM_DRAGDROPEND + * Send the START notification just before going into drag&drop loop. Send + * the END notification just after canceling out. + * Note that it is up to apps and OLE to generate this, since the system + * doesn't know. Like EVENT_SYSTEM_SOUND, it will be a while before this + * is prevalent. + */ +#define EVENT_SYSTEM_DRAGDROPSTART 0x000E +#define EVENT_SYSTEM_DRAGDROPEND 0x000F + +/* + * Dialog + * Send the START notification right after the dialog is completely + * initialized and visible. Send the END right before the dialog + * is hidden and goes away. + * EVENT_SYSTEM_DIALOGSTART + * EVENT_SYSTEM_DIALOGEND + */ +#define EVENT_SYSTEM_DIALOGSTART 0x0010 +#define EVENT_SYSTEM_DIALOGEND 0x0011 + +/* + * EVENT_SYSTEM_SCROLLING + * EVENT_SYSTEM_SCROLLINGSTART + * EVENT_SYSTEM_SCROLLINGEND + * Sent when beginning and ending the tracking of a scrollbar in a window, + * and also for scrollbar controls. + */ +#define EVENT_SYSTEM_SCROLLINGSTART 0x0012 +#define EVENT_SYSTEM_SCROLLINGEND 0x0013 + +/* + * Alt-Tab Window + * Send the START notification right after the switch window is initialized + * and visible. Send the END right before it is hidden and goes away. + * EVENT_SYSTEM_SWITCHSTART + * EVENT_SYSTEM_SWITCHEND + */ +#define EVENT_SYSTEM_SWITCHSTART 0x0014 +#define EVENT_SYSTEM_SWITCHEND 0x0015 + +/* + * EVENT_SYSTEM_MINIMIZESTART + * EVENT_SYSTEM_MINIMIZEEND + * Sent when a window minimizes and just before it restores. + */ +#define EVENT_SYSTEM_MINIMIZESTART 0x0016 +#define EVENT_SYSTEM_MINIMIZEEND 0x0017 + + + +/* + * Object events + * + * The system AND apps generate these. The system generates these for + * real windows. Apps generate these for objects within their window which + * act like a separate control, e.g. an item in a list view. + * + * When the system generate them, dwParam2 is always WMOBJID_SELF. When + * apps generate them, apps put the has-meaning-to-the-app-only ID value + * in dwParam2. + * For all events, if you want detailed accessibility information, callers + * should + * * Call AccessibleObjectFromWindow() with the hwnd, idObject parameters + * of the event, and IID_IAccessible as the REFIID, to get back an + * IAccessible* to talk to + * * Initialize and fill in a VARIANT as VT_I4 with lVal the idChild + * parameter of the event. + * * If idChild isn't zero, call get_accChild() in the container to see + * if the child is an object in its own right. If so, you will get + * back an IDispatch* object for the child. You should release the + * parent, and call QueryInterface() on the child object to get its + * IAccessible*. Then you talk directly to the child. Otherwise, + * if get_accChild() returns you nothing, you should continue to + * use the child VARIANT. You will ask the container for the properties + * of the child identified by the VARIANT. In other words, the + * child in this case is accessible but not a full-blown object. + * Like a button on a titlebar which is 'small' and has no children. + */ + +/* + * For all EVENT_OBJECT events, + * hwnd is the dude to Send the WM_GETOBJECT message to (unless NULL, + * see above for system things) + * idObject is the ID of the object that can resolve any queries a + * client might have. It's a way to deal with windowless controls, + * controls that are just drawn on the screen in some larger parent + * window (like SDM), or standard frame elements of a window. + * idChild is the piece inside of the object that is affected. This + * allows clients to access things that are too small to have full + * blown objects in their own right. Like the thumb of a scrollbar. + * The hwnd/idObject pair gets you to the container, the dude you + * probably want to talk to most of the time anyway. The idChild + * can then be passed into the acc properties to get the name/value + * of it as needed. + * + * Example #1: + * System propagating a listbox selection change + * EVENT_OBJECT_SELECTION + * hwnd == listbox hwnd + * idObject == OBJID_WINDOW + * idChild == new selected item, or CHILDID_SELF if + * nothing now selected within container. + * Word '97 propagating a listbox selection change + * hwnd == SDM window + * idObject == SDM ID to get at listbox 'control' + * idChild == new selected item, or CHILDID_SELF if + * nothing + * + * Example #2: + * System propagating a menu item selection on the menu bar + * EVENT_OBJECT_SELECTION + * hwnd == top level window + * idObject == OBJID_MENU + * idChild == ID of child menu bar item selected + * + * Example #3: + * System propagating a dropdown coming off of said menu bar item + * EVENT_OBJECT_CREATE + * hwnd == popup item + * idObject == OBJID_WINDOW + * idChild == CHILDID_SELF + * + * Example #4: + * + * For EVENT_OBJECT_REORDER, the object referred to by hwnd/idObject is the + * PARENT container in which the zorder is occurring. This is because if + * one child is zordering, all of them are changing their relative zorder. + */ +#define EVENT_OBJECT_CREATE 0x8000 // hwnd + ID + idChild is created item +#define EVENT_OBJECT_DESTROY 0x8001 // hwnd + ID + idChild is destroyed item +#define EVENT_OBJECT_SHOW 0x8002 // hwnd + ID + idChild is shown item +#define EVENT_OBJECT_HIDE 0x8003 // hwnd + ID + idChild is hidden item +#define EVENT_OBJECT_REORDER 0x8004 // hwnd + ID + idChild is parent of zordering children +/* + * NOTE: + * Minimize the number of notifications! + * + * When you are hiding a parent object, obviously all child objects are no + * longer visible on screen. They still have the same "visible" status, + * but are not truly visible. Hence do not send HIDE notifications for the + * children also. One implies all. The same goes for SHOW. + */ + + +#define EVENT_OBJECT_FOCUS 0x8005 // hwnd + ID + idChild is focused item +#define EVENT_OBJECT_SELECTION 0x8006 // hwnd + ID + idChild is selected item (if only one), or idChild is OBJID_WINDOW if complex +#define EVENT_OBJECT_SELECTIONADD 0x8007 // hwnd + ID + idChild is item added +#define EVENT_OBJECT_SELECTIONREMOVE 0x8008 // hwnd + ID + idChild is item removed +#define EVENT_OBJECT_SELECTIONWITHIN 0x8009 // hwnd + ID + idChild is parent of changed selected items + +/* + * NOTES: + * There is only one "focused" child item in a parent. This is the place + * keystrokes are going at a given moment. Hence only send a notification + * about where the NEW focus is going. A NEW item getting the focus already + * implies that the OLD item is losing it. + * + * SELECTION however can be multiple. Hence the different SELECTION + * notifications. Here's when to use each: + * + * (1) Send a SELECTION notification in the simple single selection + * case (like the focus) when the item with the selection is + * merely moving to a different item within a container. hwnd + ID + * is the container control, idChildItem is the new child with the + * selection. + * + * (2) Send a SELECTIONADD notification when a new item has simply been added + * to the selection within a container. This is appropriate when the + * number of newly selected items is very small. hwnd + ID is the + * container control, idChildItem is the new child added to the selection. + * + * (3) Send a SELECTIONREMOVE notification when a new item has simply been + * removed from the selection within a container. This is appropriate + * when the number of newly selected items is very small, just like + * SELECTIONADD. hwnd + ID is the container control, idChildItem is the + * new child removed from the selection. + * + * (4) Send a SELECTIONWITHIN notification when the selected items within a + * control have changed substantially. Rather than propagate a large + * number of changes to reflect removal for some items, addition of + * others, just tell somebody who cares that a lot happened. It will + * be faster an easier for somebody watching to just turn around and + * query the container control what the new bunch of selected items + * are. + */ + +#define EVENT_OBJECT_STATECHANGE 0x800A // hwnd + ID + idChild is item w/ state change +/* + * Examples of when to send an EVENT_OBJECT_STATECHANGE include + * * It is being enabled/disabled (USER does for windows) + * * It is being pressed/released (USER does for buttons) + * * It is being checked/unchecked (USER does for radio/check buttons) + */ +#define EVENT_OBJECT_LOCATIONCHANGE 0x800B // hwnd + ID + idChild is moved/sized item + +/* + * Note: + * A LOCATIONCHANGE is not sent for every child object when the parent + * changes shape/moves. Send one notification for the topmost object + * that is changing. For example, if the user resizes a top level window, + * USER will generate a LOCATIONCHANGE for it, but not for the menu bar, + * title bar, scrollbars, etc. that are also changing shape/moving. + * + * In other words, it only generates LOCATIONCHANGE notifications for + * real windows that are moving/sizing. It will not generate a LOCATIONCHANGE + * for every non-floating child window when the parent moves (the children are + * logically moving also on screen, but not relative to the parent). + * + * Now, if the app itself resizes child windows as a result of being + * sized, USER will generate LOCATIONCHANGEs for those dudes also because + * it doesn't know better. + * + * Note also that USER will generate LOCATIONCHANGE notifications for two + * non-window sys objects: + * (1) System caret + * (2) Cursor + */ + +#define EVENT_OBJECT_NAMECHANGE 0x800C // hwnd + ID + idChild is item w/ name change +#define EVENT_OBJECT_DESCRIPTIONCHANGE 0x800D // hwnd + ID + idChild is item w/ desc change +#define EVENT_OBJECT_VALUECHANGE 0x800E // hwnd + ID + idChild is item w/ value change +#define EVENT_OBJECT_PARENTCHANGE 0x800F // hwnd + ID + idChild is item w/ new parent +#define EVENT_OBJECT_HELPCHANGE 0x8010 // hwnd + ID + idChild is item w/ help change +#define EVENT_OBJECT_DEFACTIONCHANGE 0x8011 // hwnd + ID + idChild is item w/ def action change +#define EVENT_OBJECT_ACCELERATORCHANGE 0x8012 // hwnd + ID + idChild is item w/ keybd accel change + +#ifdef WIN32 +WINUSERAPI VOID WINAPI +NotifyWinEvent( + DWORD event, + HWND hwnd, + LONG idObject, + LONG idChild); +#endif + +#include <bfc/dispatch.h> + +struct IAccessible; + +class Accessible : public Dispatchable { + public: + IAccessible *getIAccessible(); +#ifdef _WIN32 + HRESULT getOSHandle(int p); +#endif + void release(); + void addRef(); + int getNumRefs(); + void onGetFocus(int idx=-1); + void onStateChange(int idx=-1); + void onSetName(const wchar_t *newname, int idx=-1); + OSWINDOWHANDLE getOSWnd(); + int flattenContent(OSWINDOWHANDLE *w); + + enum { + ACCESSIBLE_GETIACCESSIBLE=10, + ACCESSIBLE_GETOSHANDLE=20, + ACCESSIBLE_ADDREF=30, + ACCESSIBLE_RELEASE=40, + ACCESSIBLE_GETNUMREFS=50, + ACCESSIBLE_ONGETFOCUS=60, + ACCESSIBLE_ONSETNAME=70, + ACCESSIBLE_GETOSWND=80, + ACCESSIBLE_ONSTATECHANGE=90, + ACCESSIBLE_FLATTENCONTENT=100, + }; +}; + +inline IAccessible *Accessible::getIAccessible() { + return _call(ACCESSIBLE_GETIACCESSIBLE, (IAccessible *)NULL); +} + +#ifdef _WIN32 +inline HRESULT Accessible::getOSHandle(int p) { + return _call(ACCESSIBLE_GETOSHANDLE, (HRESULT)NULL, p); +} +#endif + +inline void Accessible::addRef() { + _voidcall(ACCESSIBLE_ADDREF); +} + +inline void Accessible::release() { + _voidcall(ACCESSIBLE_RELEASE); +} + +inline int Accessible::getNumRefs() { + return _call(ACCESSIBLE_GETNUMREFS, 0); +} + +inline void Accessible::onGetFocus(int idx/* =-1 */) { + _voidcall(ACCESSIBLE_ONGETFOCUS, idx); +} + +inline void Accessible::onSetName(const wchar_t *name, int idx) { + _voidcall(ACCESSIBLE_ONSETNAME, name, idx); +} + +inline OSWINDOWHANDLE Accessible::getOSWnd() { + return _call(ACCESSIBLE_GETOSWND, (OSWINDOWHANDLE)NULL); +} + +inline void Accessible::onStateChange(int idx/* =-1 */) { + _voidcall(ACCESSIBLE_ONSTATECHANGE, idx); +} + +inline int Accessible::flattenContent(OSWINDOWHANDLE *w) { + return _call(ACCESSIBLE_FLATTENCONTENT, 0, w); +} + +class AccessibleI : public Accessible { + public: + AccessibleI() {} + virtual ~AccessibleI() {} + + virtual IAccessible *getIAccessible()=0; +#ifdef _WIN32 + virtual HRESULT getOSHandle(int p)=0; +#endif + virtual void release()=0; + virtual void addRef()=0; + virtual int getNumRefs()=0; + virtual void onGetFocus(int idx=-1)=0; + virtual void onSetName(const wchar_t *name, int idx)=0; + virtual OSWINDOWHANDLE getOSWnd()=0; + virtual void onStateChange(int idx=-1)=0; + virtual int flattenContent(OSWINDOWHANDLE *w)=0; + + protected: + RECVS_DISPATCH; +}; + +#endif |