accessible/src/atk/AtkSocketAccessible.cpp

changeset 0
6474c204b198
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/accessible/src/atk/AtkSocketAccessible.cpp	Wed Dec 31 06:09:35 2014 +0100
     1.3 @@ -0,0 +1,156 @@
     1.4 +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
     1.5 +/* vim: set ts=2 et sw=2 tw=80: */
     1.6 +/* This Source Code Form is subject to the terms of the Mozilla Public
     1.7 + * License, v. 2.0. If a copy of the MPL was not distributed with this
     1.8 + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
     1.9 +
    1.10 +#include <atk/atk.h>
    1.11 +#include "AtkSocketAccessible.h"
    1.12 +
    1.13 +#include "InterfaceInitFuncs.h"
    1.14 +#include "nsMai.h"
    1.15 +#include "mozilla/Likely.h"
    1.16 +
    1.17 +using namespace mozilla::a11y;
    1.18 +
    1.19 +AtkSocketEmbedType AtkSocketAccessible::g_atk_socket_embed = nullptr;
    1.20 +GType AtkSocketAccessible::g_atk_socket_type = G_TYPE_INVALID;
    1.21 +const char* AtkSocketAccessible::sATKSocketEmbedSymbol = "atk_socket_embed";
    1.22 +const char* AtkSocketAccessible::sATKSocketGetTypeSymbol = "atk_socket_get_type";
    1.23 +
    1.24 +bool AtkSocketAccessible::gCanEmbed = FALSE;
    1.25 +
    1.26 +extern "C" void mai_atk_component_iface_init(AtkComponentIface* aIface);
    1.27 +extern "C" GType mai_atk_socket_get_type(void);
    1.28 +
    1.29 +/* MaiAtkSocket */
    1.30 +
    1.31 +#define MAI_TYPE_ATK_SOCKET              (mai_atk_socket_get_type ())
    1.32 +#define MAI_ATK_SOCKET(obj)              (G_TYPE_CHECK_INSTANCE_CAST ((obj),\
    1.33 +                                          MAI_TYPE_ATK_SOCKET, MaiAtkSocket))
    1.34 +#define MAI_IS_ATK_SOCKET(obj)           (G_TYPE_CHECK_INSTANCE_TYPE ((obj),\
    1.35 +                                          MAI_TYPE_ATK_SOCKET))
    1.36 +#define MAI_ATK_SOCKET_CLASS(klass)      (G_TYPE_CHECK_CLASS_CAST ((klass),\
    1.37 +                                          MAI_TYPE_ATK_SOCKET,\
    1.38 +                                          MaiAtkSocketClass))
    1.39 +#define MAI_IS_ATK_SOCKET_CLASS(klass)   (G_TYPE_CHECK_CLASS_TYPE ((klass),\
    1.40 +                                          MAI_TYPE_ATK_SOCKET))
    1.41 +#define MAI_ATK_SOCKET_GET_CLASS(obj)    (G_TYPE_INSTANCE_GET_CLASS ((obj),\
    1.42 +                                          MAI_TYPE_ATK_SOCKET,\
    1.43 +                                          MaiAtkSocketClass))
    1.44 +
    1.45 +typedef struct _MaiAtkSocket
    1.46 +{
    1.47 +  AtkSocket parent;
    1.48 +
    1.49 +  AccessibleWrap* accWrap;
    1.50 +} MaiAtkSocket;
    1.51 +
    1.52 +typedef struct _MaiAtkSocketClass
    1.53 +{
    1.54 +  AtkSocketClass parent_class;
    1.55 +} MaiAtkSocketClass;
    1.56 +
    1.57 +G_DEFINE_TYPE_EXTENDED(MaiAtkSocket, mai_atk_socket,
    1.58 +                       AtkSocketAccessible::g_atk_socket_type, 0,
    1.59 +                       G_IMPLEMENT_INTERFACE(ATK_TYPE_COMPONENT,
    1.60 +                                             mai_atk_component_iface_init))
    1.61 +
    1.62 +void
    1.63 +mai_atk_socket_class_init(MaiAtkSocketClass* aAcc)
    1.64 +{
    1.65 +}
    1.66 +
    1.67 +void
    1.68 +mai_atk_socket_init(MaiAtkSocket* aAcc)
    1.69 +{
    1.70 +}
    1.71 +
    1.72 +static AtkObject*
    1.73 +mai_atk_socket_new(AccessibleWrap* aAccWrap)
    1.74 +{
    1.75 +  NS_ENSURE_TRUE(aAccWrap, nullptr);
    1.76 +
    1.77 +  MaiAtkSocket* acc = nullptr;
    1.78 +  acc = static_cast<MaiAtkSocket*>(g_object_new(MAI_TYPE_ATK_SOCKET, nullptr));
    1.79 +  NS_ENSURE_TRUE(acc, nullptr);
    1.80 +
    1.81 +  acc->accWrap = aAccWrap;
    1.82 +  return ATK_OBJECT(acc);
    1.83 +}
    1.84 +
    1.85 +extern "C" {
    1.86 +static AtkObject*
    1.87 +RefAccessibleAtPoint(AtkComponent* aComponent, gint aX, gint aY,
    1.88 +                     AtkCoordType aCoordType)
    1.89 +{
    1.90 +  NS_ENSURE_TRUE(MAI_IS_ATK_SOCKET(aComponent), nullptr);
    1.91 +
    1.92 +  return refAccessibleAtPointHelper(MAI_ATK_SOCKET(aComponent)->accWrap,
    1.93 +                                    aX, aY, aCoordType);
    1.94 +}
    1.95 +
    1.96 +static void
    1.97 +GetExtents(AtkComponent* aComponent, gint* aX, gint* aY, gint* aWidth,
    1.98 +           gint* aHeight, AtkCoordType aCoordType)
    1.99 +{
   1.100 +  *aX = *aY = *aWidth = *aHeight = 0;
   1.101 +
   1.102 +  if (!MAI_IS_ATK_SOCKET(aComponent))
   1.103 +    return;
   1.104 +
   1.105 +  getExtentsHelper(MAI_ATK_SOCKET(aComponent)->accWrap,
   1.106 +                   aX, aY, aWidth, aHeight, aCoordType);
   1.107 +}
   1.108 +}
   1.109 +
   1.110 +void
   1.111 +mai_atk_component_iface_init(AtkComponentIface* aIface)
   1.112 +{
   1.113 +  NS_ASSERTION(aIface, "Invalid Interface");
   1.114 +  if (MOZ_UNLIKELY(!aIface))
   1.115 +    return;
   1.116 +
   1.117 +  aIface->ref_accessible_at_point = RefAccessibleAtPoint;
   1.118 +  aIface->get_extents = GetExtents;
   1.119 +}
   1.120 +
   1.121 +AtkSocketAccessible::AtkSocketAccessible(nsIContent* aContent,
   1.122 +                                         DocAccessible* aDoc,
   1.123 +                                         const nsCString& aPlugId) :
   1.124 +  AccessibleWrap(aContent, aDoc)
   1.125 +{
   1.126 +  mAtkObject = mai_atk_socket_new(this);
   1.127 +  if (!mAtkObject)
   1.128 +    return;
   1.129 +
   1.130 +  // Embeds the children of an AtkPlug, specified by plugId, as the children of
   1.131 +  // this socket.
   1.132 +  // Using G_TYPE macros instead of ATK_SOCKET macros to avoid undefined
   1.133 +  // symbols.
   1.134 +  if (gCanEmbed && G_TYPE_CHECK_INSTANCE_TYPE(mAtkObject, g_atk_socket_type) &&
   1.135 +      !aPlugId.IsVoid()) {
   1.136 +    AtkSocket* accSocket =
   1.137 +      G_TYPE_CHECK_INSTANCE_CAST(mAtkObject, g_atk_socket_type, AtkSocket);
   1.138 +    g_atk_socket_embed(accSocket, (gchar*)aPlugId.get());
   1.139 +  }
   1.140 +}
   1.141 +
   1.142 +NS_IMETHODIMP
   1.143 +AtkSocketAccessible::GetNativeInterface(void** aOutAccessible)
   1.144 +{
   1.145 +  *aOutAccessible = mAtkObject;
   1.146 +  return NS_OK;
   1.147 +}
   1.148 +
   1.149 +void
   1.150 +AtkSocketAccessible::Shutdown()
   1.151 +{
   1.152 +  if (mAtkObject) {
   1.153 +    if (MAI_IS_ATK_SOCKET(mAtkObject))
   1.154 +      MAI_ATK_SOCKET(mAtkObject)->accWrap = nullptr;
   1.155 +    g_object_unref(mAtkObject);
   1.156 +    mAtkObject = nullptr;
   1.157 +  }
   1.158 +  AccessibleWrap::Shutdown();
   1.159 +}

mercurial