michael@0: /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ michael@0: /* vim: set ts=2 et sw=2 tw=80: */ michael@0: /* This Source Code Form is subject to the terms of the Mozilla Public michael@0: * License, v. 2.0. If a copy of the MPL was not distributed with this michael@0: * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ michael@0: michael@0: #include "InterfaceInitFuncs.h" michael@0: michael@0: #include "AccessibleWrap.h" michael@0: #include "nsMai.h" michael@0: michael@0: #include "mozilla/FloatingPoint.h" michael@0: #include "mozilla/Likely.h" michael@0: michael@0: using namespace mozilla; michael@0: using namespace mozilla::a11y; michael@0: michael@0: extern "C" { michael@0: michael@0: static void michael@0: getCurrentValueCB(AtkValue *obj, GValue *value) michael@0: { michael@0: AccessibleWrap* accWrap = GetAccessibleWrap(ATK_OBJECT(obj)); michael@0: if (!accWrap) michael@0: return; michael@0: michael@0: memset (value, 0, sizeof (GValue)); michael@0: double accValue = accWrap->CurValue(); michael@0: if (IsNaN(accValue)) michael@0: return; michael@0: michael@0: g_value_init (value, G_TYPE_DOUBLE); michael@0: g_value_set_double (value, accValue); michael@0: } michael@0: michael@0: static void michael@0: getMaximumValueCB(AtkValue *obj, GValue *value) michael@0: { michael@0: AccessibleWrap* accWrap = GetAccessibleWrap(ATK_OBJECT(obj)); michael@0: if (!accWrap) michael@0: return; michael@0: michael@0: memset(value, 0, sizeof (GValue)); michael@0: double accValue = accWrap->MaxValue(); michael@0: if (IsNaN(accValue)) michael@0: return; michael@0: michael@0: g_value_init(value, G_TYPE_DOUBLE); michael@0: g_value_set_double(value, accValue); michael@0: } michael@0: michael@0: static void michael@0: getMinimumValueCB(AtkValue *obj, GValue *value) michael@0: { michael@0: AccessibleWrap* accWrap = GetAccessibleWrap(ATK_OBJECT(obj)); michael@0: if (!accWrap) michael@0: return; michael@0: michael@0: memset(value, 0, sizeof (GValue)); michael@0: double accValue = accWrap->MinValue(); michael@0: if (IsNaN(accValue)) michael@0: return; michael@0: michael@0: g_value_init(value, G_TYPE_DOUBLE); michael@0: g_value_set_double(value, accValue); michael@0: } michael@0: michael@0: static void michael@0: getMinimumIncrementCB(AtkValue *obj, GValue *minimumIncrement) michael@0: { michael@0: AccessibleWrap* accWrap = GetAccessibleWrap(ATK_OBJECT(obj)); michael@0: if (!accWrap) michael@0: return; michael@0: michael@0: memset(minimumIncrement, 0, sizeof (GValue)); michael@0: double accValue = accWrap->Step(); michael@0: if (IsNaN(accValue)) michael@0: accValue = 0; // zero if the minimum increment is undefined michael@0: michael@0: g_value_init(minimumIncrement, G_TYPE_DOUBLE); michael@0: g_value_set_double(minimumIncrement, accValue); michael@0: } michael@0: michael@0: static gboolean michael@0: setCurrentValueCB(AtkValue *obj, const GValue *value) michael@0: { michael@0: AccessibleWrap* accWrap = GetAccessibleWrap(ATK_OBJECT(obj)); michael@0: if (!accWrap) michael@0: return FALSE; michael@0: michael@0: double accValue =g_value_get_double(value); michael@0: return accWrap->SetCurValue(accValue); michael@0: } michael@0: } michael@0: michael@0: void michael@0: valueInterfaceInitCB(AtkValueIface* aIface) michael@0: { michael@0: NS_ASSERTION(aIface, "Invalid aIface"); michael@0: if (MOZ_UNLIKELY(!aIface)) michael@0: return; michael@0: michael@0: aIface->get_current_value = getCurrentValueCB; michael@0: aIface->get_maximum_value = getMaximumValueCB; michael@0: aIface->get_minimum_value = getMinimumValueCB; michael@0: aIface->get_minimum_increment = getMinimumIncrementCB; michael@0: aIface->set_current_value = setCurrentValueCB; michael@0: }