|
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/. */ |
|
6 |
|
7 #include "InterfaceInitFuncs.h" |
|
8 |
|
9 #include "AccessibleWrap.h" |
|
10 #include "nsMai.h" |
|
11 |
|
12 #include "mozilla/FloatingPoint.h" |
|
13 #include "mozilla/Likely.h" |
|
14 |
|
15 using namespace mozilla; |
|
16 using namespace mozilla::a11y; |
|
17 |
|
18 extern "C" { |
|
19 |
|
20 static void |
|
21 getCurrentValueCB(AtkValue *obj, GValue *value) |
|
22 { |
|
23 AccessibleWrap* accWrap = GetAccessibleWrap(ATK_OBJECT(obj)); |
|
24 if (!accWrap) |
|
25 return; |
|
26 |
|
27 memset (value, 0, sizeof (GValue)); |
|
28 double accValue = accWrap->CurValue(); |
|
29 if (IsNaN(accValue)) |
|
30 return; |
|
31 |
|
32 g_value_init (value, G_TYPE_DOUBLE); |
|
33 g_value_set_double (value, accValue); |
|
34 } |
|
35 |
|
36 static void |
|
37 getMaximumValueCB(AtkValue *obj, GValue *value) |
|
38 { |
|
39 AccessibleWrap* accWrap = GetAccessibleWrap(ATK_OBJECT(obj)); |
|
40 if (!accWrap) |
|
41 return; |
|
42 |
|
43 memset(value, 0, sizeof (GValue)); |
|
44 double accValue = accWrap->MaxValue(); |
|
45 if (IsNaN(accValue)) |
|
46 return; |
|
47 |
|
48 g_value_init(value, G_TYPE_DOUBLE); |
|
49 g_value_set_double(value, accValue); |
|
50 } |
|
51 |
|
52 static void |
|
53 getMinimumValueCB(AtkValue *obj, GValue *value) |
|
54 { |
|
55 AccessibleWrap* accWrap = GetAccessibleWrap(ATK_OBJECT(obj)); |
|
56 if (!accWrap) |
|
57 return; |
|
58 |
|
59 memset(value, 0, sizeof (GValue)); |
|
60 double accValue = accWrap->MinValue(); |
|
61 if (IsNaN(accValue)) |
|
62 return; |
|
63 |
|
64 g_value_init(value, G_TYPE_DOUBLE); |
|
65 g_value_set_double(value, accValue); |
|
66 } |
|
67 |
|
68 static void |
|
69 getMinimumIncrementCB(AtkValue *obj, GValue *minimumIncrement) |
|
70 { |
|
71 AccessibleWrap* accWrap = GetAccessibleWrap(ATK_OBJECT(obj)); |
|
72 if (!accWrap) |
|
73 return; |
|
74 |
|
75 memset(minimumIncrement, 0, sizeof (GValue)); |
|
76 double accValue = accWrap->Step(); |
|
77 if (IsNaN(accValue)) |
|
78 accValue = 0; // zero if the minimum increment is undefined |
|
79 |
|
80 g_value_init(minimumIncrement, G_TYPE_DOUBLE); |
|
81 g_value_set_double(minimumIncrement, accValue); |
|
82 } |
|
83 |
|
84 static gboolean |
|
85 setCurrentValueCB(AtkValue *obj, const GValue *value) |
|
86 { |
|
87 AccessibleWrap* accWrap = GetAccessibleWrap(ATK_OBJECT(obj)); |
|
88 if (!accWrap) |
|
89 return FALSE; |
|
90 |
|
91 double accValue =g_value_get_double(value); |
|
92 return accWrap->SetCurValue(accValue); |
|
93 } |
|
94 } |
|
95 |
|
96 void |
|
97 valueInterfaceInitCB(AtkValueIface* aIface) |
|
98 { |
|
99 NS_ASSERTION(aIface, "Invalid aIface"); |
|
100 if (MOZ_UNLIKELY(!aIface)) |
|
101 return; |
|
102 |
|
103 aIface->get_current_value = getCurrentValueCB; |
|
104 aIface->get_maximum_value = getMaximumValueCB; |
|
105 aIface->get_minimum_value = getMinimumValueCB; |
|
106 aIface->get_minimum_increment = getMinimumIncrementCB; |
|
107 aIface->set_current_value = setCurrentValueCB; |
|
108 } |