aboutsummaryrefslogtreecommitdiff
path: root/Src/Wasabi/api/wnd/accessible.h
diff options
context:
space:
mode:
Diffstat (limited to 'Src/Wasabi/api/wnd/accessible.h')
-rw-r--r--Src/Wasabi/api/wnd/accessible.h622
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