Bumping manifests a=b2g-bump
[gecko.git] / accessible / atk / nsMaiInterfaceAction.cpp
blobe254938121c75d1a226a4966480761e056e937bd
1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /* vim: set ts=2 et sw=2 tw=80: */
3 /* This Source Code Form is subject to the terms of the Mozilla Public
4 * License, v. 2.0. If a copy of the MPL was not distributed with this
5 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
7 #include "InterfaceInitFuncs.h"
9 #include "Accessible-inl.h"
10 #include "nsMai.h"
11 #include "Role.h"
12 #include "mozilla/Likely.h"
14 #include "nsString.h"
16 using namespace mozilla::a11y;
18 extern "C" {
20 static gboolean
21 doActionCB(AtkAction *aAction, gint aActionIndex)
23 AccessibleWrap* accWrap = GetAccessibleWrap(ATK_OBJECT(aAction));
24 return accWrap && accWrap->DoAction(aActionIndex);
27 static gint
28 getActionCountCB(AtkAction *aAction)
30 AccessibleWrap* accWrap = GetAccessibleWrap(ATK_OBJECT(aAction));
31 return accWrap ? accWrap->ActionCount() : 0;
34 static const gchar*
35 getActionDescriptionCB(AtkAction *aAction, gint aActionIndex)
37 AccessibleWrap* accWrap = GetAccessibleWrap(ATK_OBJECT(aAction));
38 if (!accWrap)
39 return nullptr;
41 nsAutoString description;
42 accWrap->ActionDescriptionAt(aActionIndex, description);
43 return AccessibleWrap::ReturnString(description);
46 static const gchar*
47 getActionNameCB(AtkAction *aAction, gint aActionIndex)
49 AccessibleWrap* accWrap = GetAccessibleWrap(ATK_OBJECT(aAction));
50 if (!accWrap)
51 return nullptr;
53 nsAutoString autoStr;
54 accWrap->ActionNameAt(aActionIndex, autoStr);
55 return AccessibleWrap::ReturnString(autoStr);
58 static const gchar*
59 getKeyBindingCB(AtkAction *aAction, gint aActionIndex)
61 AccessibleWrap* acc = GetAccessibleWrap(ATK_OBJECT(aAction));
62 if (!acc)
63 return nullptr;
65 // Return all key bindings including access key and keyboard shortcut.
66 nsAutoString keyBindingsStr;
68 // Get access key.
69 KeyBinding keyBinding = acc->AccessKey();
70 if (!keyBinding.IsEmpty()) {
71 keyBinding.AppendToString(keyBindingsStr, KeyBinding::eAtkFormat);
73 Accessible* parent = acc->Parent();
74 roles::Role role = parent ? parent->Role() : roles::NOTHING;
75 if (role == roles::PARENT_MENUITEM || role == roles::MENUITEM ||
76 role == roles::RADIO_MENU_ITEM || role == roles::CHECK_MENU_ITEM) {
77 // It is submenu, expose keyboard shortcuts from menu hierarchy like
78 // "s;<Alt>f:s"
79 nsAutoString keysInHierarchyStr = keyBindingsStr;
80 do {
81 KeyBinding parentKeyBinding = parent->AccessKey();
82 if (!parentKeyBinding.IsEmpty()) {
83 nsAutoString str;
84 parentKeyBinding.ToString(str, KeyBinding::eAtkFormat);
85 str.Append(':');
87 keysInHierarchyStr.Insert(str, 0);
89 } while ((parent = parent->Parent()) && parent->Role() != roles::MENUBAR);
91 keyBindingsStr.Append(';');
92 keyBindingsStr.Append(keysInHierarchyStr);
94 } else {
95 // No access key, add ';' to point this.
96 keyBindingsStr.Append(';');
99 // Get keyboard shortcut.
100 keyBindingsStr.Append(';');
101 keyBinding = acc->KeyboardShortcut();
102 if (!keyBinding.IsEmpty()) {
103 keyBinding.AppendToString(keyBindingsStr, KeyBinding::eAtkFormat);
106 return AccessibleWrap::ReturnString(keyBindingsStr);
110 void
111 actionInterfaceInitCB(AtkActionIface* aIface)
113 NS_ASSERTION(aIface, "Invalid aIface");
114 if (MOZ_UNLIKELY(!aIface))
115 return;
117 aIface->do_action = doActionCB;
118 aIface->get_n_actions = getActionCountCB;
119 aIface->get_description = getActionDescriptionCB;
120 aIface->get_keybinding = getKeyBindingCB;
121 aIface->get_name = getActionNameCB;