nsMaiInterfaceValue.cpp 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
  2. /* This Source Code Form is subject to the terms of the Mozilla Public
  3. * License, v. 2.0. If a copy of the MPL was not distributed with this
  4. * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
  5. #include "InterfaceInitFuncs.h"
  6. #include "AccessibleWrap.h"
  7. #include "nsMai.h"
  8. #include "ProxyAccessible.h"
  9. #include "mozilla/FloatingPoint.h"
  10. #include "mozilla/Likely.h"
  11. using namespace mozilla;
  12. using namespace mozilla::a11y;
  13. extern "C" {
  14. static void
  15. getCurrentValueCB(AtkValue *obj, GValue *value)
  16. {
  17. ProxyAccessible* proxy = nullptr;
  18. AccessibleWrap* accWrap = GetAccessibleWrap(ATK_OBJECT(obj));
  19. if (!accWrap) {
  20. proxy = GetProxy(ATK_OBJECT(obj));
  21. if (!proxy) {
  22. return;
  23. }
  24. }
  25. memset (value, 0, sizeof (GValue));
  26. double accValue = accWrap ? accWrap->CurValue() : proxy->CurValue();
  27. if (IsNaN(accValue))
  28. return;
  29. g_value_init (value, G_TYPE_DOUBLE);
  30. g_value_set_double (value, accValue);
  31. }
  32. static void
  33. getMaximumValueCB(AtkValue *obj, GValue *value)
  34. {
  35. ProxyAccessible* proxy = nullptr;
  36. AccessibleWrap* accWrap = GetAccessibleWrap(ATK_OBJECT(obj));
  37. if (!accWrap) {
  38. proxy = GetProxy(ATK_OBJECT(obj));
  39. if (!proxy) {
  40. return;
  41. }
  42. }
  43. memset(value, 0, sizeof (GValue));
  44. double accValue = accWrap ? accWrap->MaxValue() : proxy->MaxValue();
  45. if (IsNaN(accValue))
  46. return;
  47. g_value_init(value, G_TYPE_DOUBLE);
  48. g_value_set_double(value, accValue);
  49. }
  50. static void
  51. getMinimumValueCB(AtkValue *obj, GValue *value)
  52. {
  53. ProxyAccessible* proxy = nullptr;
  54. AccessibleWrap* accWrap = GetAccessibleWrap(ATK_OBJECT(obj));
  55. if (!accWrap) {
  56. proxy = GetProxy(ATK_OBJECT(obj));
  57. if (!proxy) {
  58. return;
  59. }
  60. }
  61. memset(value, 0, sizeof (GValue));
  62. double accValue = accWrap ? accWrap->MinValue() : proxy->MinValue();
  63. if (IsNaN(accValue))
  64. return;
  65. g_value_init(value, G_TYPE_DOUBLE);
  66. g_value_set_double(value, accValue);
  67. }
  68. static void
  69. getMinimumIncrementCB(AtkValue *obj, GValue *minimumIncrement)
  70. {
  71. ProxyAccessible* proxy = nullptr;
  72. AccessibleWrap* accWrap = GetAccessibleWrap(ATK_OBJECT(obj));
  73. if (!accWrap) {
  74. proxy = GetProxy(ATK_OBJECT(obj));
  75. if (!proxy) {
  76. return;
  77. }
  78. }
  79. memset(minimumIncrement, 0, sizeof (GValue));
  80. double accValue = accWrap ? accWrap->Step() : proxy->Step();
  81. if (IsNaN(accValue))
  82. accValue = 0; // zero if the minimum increment is undefined
  83. g_value_init(minimumIncrement, G_TYPE_DOUBLE);
  84. g_value_set_double(minimumIncrement, accValue);
  85. }
  86. static gboolean
  87. setCurrentValueCB(AtkValue *obj, const GValue *value)
  88. {
  89. ProxyAccessible* proxy = nullptr;
  90. AccessibleWrap* accWrap = GetAccessibleWrap(ATK_OBJECT(obj));
  91. if (!accWrap) {
  92. proxy = GetProxy(ATK_OBJECT(obj));
  93. if (!proxy) {
  94. return FALSE;
  95. }
  96. }
  97. double accValue =g_value_get_double(value);
  98. return accWrap ? accWrap->SetCurValue(accValue) : proxy->SetCurValue(accValue);
  99. }
  100. }
  101. void
  102. valueInterfaceInitCB(AtkValueIface* aIface)
  103. {
  104. NS_ASSERTION(aIface, "Invalid aIface");
  105. if (MOZ_UNLIKELY(!aIface))
  106. return;
  107. aIface->get_current_value = getCurrentValueCB;
  108. aIface->get_maximum_value = getMaximumValueCB;
  109. aIface->get_minimum_value = getMinimumValueCB;
  110. aIface->get_minimum_increment = getMinimumIncrementCB;
  111. aIface->set_current_value = setCurrentValueCB;
  112. }