зеркало из https://github.com/mozilla/pjs.git
Bug 202085, Combine mai code into accessible/src/atk.
r=kyle.yuan@sun.com. This is NOT for default build.
This commit is contained in:
Родитель
bb62319ad0
Коммит
a6b3d071a2
|
@ -66,6 +66,9 @@ EXTRA_DSO_LDOPTS = \
|
|||
$(MOZ_COMPONENT_LIBS) \
|
||||
$(NULL)
|
||||
|
||||
ifeq ($(MOZ_WIDGET_TOOLKIT),gtk2)
|
||||
EXTRA_DSO_LDOPTS += $(MOZ_GTK2_LIBS)
|
||||
endif
|
||||
|
||||
include $(topsrcdir)/config/rules.mk
|
||||
|
||||
|
||||
|
|
|
@ -69,6 +69,7 @@ CPPSRCS = \
|
|||
nsAccessibleWrap.cpp \
|
||||
nsDocAccessibleWrap.cpp \
|
||||
nsRootAccessibleWrap.cpp \
|
||||
nsAppRootAccessible.cpp \
|
||||
nsAccessibleText.cpp \
|
||||
nsAccessibleHyperText.cpp \
|
||||
nsHTMLFormControlAccessibleWrap.cpp \
|
||||
|
@ -91,15 +92,19 @@ EXPORTS = \
|
|||
nsRootAccessibleWrap.h \
|
||||
$(NULL)
|
||||
|
||||
# we don't want the shared lib, but we want to force the creation of a static lib.
|
||||
# we want to force the creation of a static lib.
|
||||
FORCE_STATIC_LIB = 1
|
||||
|
||||
EXTRA_DSO_LDOPTS += $(MOZ_GTK2_LIBS)
|
||||
|
||||
include $(topsrcdir)/config/rules.mk
|
||||
|
||||
CFLAGS += $(MOZ_GTK2_CFLAGS)
|
||||
CXXFLAGS += $(MOZ_GTK2_CFLAGS)
|
||||
|
||||
LOCAL_INCLUDES += \
|
||||
-I$(srcdir) \
|
||||
-I$(srcdir)/../base \
|
||||
-I$(srcdir)/../html \
|
||||
-I$(srcdir)/../xul \
|
||||
$(NULL)
|
||||
|
||||
|
|
|
@ -56,4 +56,3 @@ class nsAccessNodeWrap : public nsAccessNode
|
|||
};
|
||||
|
||||
#endif
|
||||
|
||||
|
|
|
@ -1,26 +1,29 @@
|
|||
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
|
||||
/* vim:expandtab:shiftwidth=4:tabstop=4:
|
||||
*/
|
||||
/* ***** BEGIN LICENSE BLOCK *****
|
||||
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
|
||||
* Version: NPL 1.1/GPL 2.0/LGPL 2.1
|
||||
*
|
||||
* The contents of this file are subject to the Mozilla Public License Version
|
||||
* 1.1 (the "License"); you may not use this file except in compliance with
|
||||
* the License. You may obtain a copy of the License at
|
||||
* http://www.mozilla.org/MPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS IS" basis,
|
||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
||||
* for the specific language governing rights and limitations under the
|
||||
* License.
|
||||
* The contents of this file are subject to the Mozilla Public
|
||||
* License Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License. You may obtain a copy of
|
||||
* the License at http://www.mozilla.org/MPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS
|
||||
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
||||
* implied. See the License for the specific language governing
|
||||
* rights and limitations under the License.
|
||||
*
|
||||
* The Original Code is mozilla.org code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is
|
||||
* Netscape Communications Corporation.
|
||||
* Portions created by the Initial Developer are Copyright (C) 2003
|
||||
* the Initial Developer. All Rights Reserved.
|
||||
* The Initial Developer of the Original Code is Sun Microsystems, Inc.
|
||||
* Portions created by Sun Microsystems are Copyright (C) 2002 Sun
|
||||
* Microsystems, Inc. All Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
* Original Author: Aaron Leventhal (aaronl@netscape.com)
|
||||
* Original Author: Bolian Yin (bolian.yin@sun.com)
|
||||
*
|
||||
* Contributor(s): John Sun (john.sun@sun.com)
|
||||
*
|
||||
* Alternatively, the contents of this file may be used under the terms of
|
||||
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
||||
|
@ -28,28 +31,567 @@
|
|||
* in which case the provisions of the GPL or the LGPL are applicable instead
|
||||
* of those above. If you wish to allow use of your version of this file only
|
||||
* under the terms of either the GPL or the LGPL, and not to allow others to
|
||||
* use your version of this file under the terms of the MPL, indicate your
|
||||
* use your version of this file under the terms of the NPL, indicate your
|
||||
* decision by deleting the provisions above and replace them with the notice
|
||||
* and other provisions required by the GPL or the LGPL. If you do not delete
|
||||
* the provisions above, a recipient may use your version of this file under
|
||||
* the terms of any one of the MPL, the GPL or the LGPL.
|
||||
* the terms of any one of the NPL, the GPL or the LGPL.
|
||||
*
|
||||
* ***** END LICENSE BLOCK ***** */
|
||||
|
||||
#include "nsAccessibleWrap.h"
|
||||
#include <atk/atk.h>
|
||||
#include <glib.h>
|
||||
#include <glib-object.h>
|
||||
|
||||
//-----------------------------------------------------
|
||||
// construction
|
||||
//-----------------------------------------------------
|
||||
nsAccessibleWrap::nsAccessibleWrap(nsIDOMNode* aNode, nsIWeakReference *aShell):
|
||||
nsAccessible(aNode, aShell)
|
||||
#include "nsAccessibleWrap.h"
|
||||
#include "nsString.h"
|
||||
|
||||
/* MaiAtkObject */
|
||||
|
||||
#define MAI_TYPE_ATK_OBJECT (mai_atk_object_get_type ())
|
||||
#define MAI_ATK_OBJECT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), \
|
||||
MAI_TYPE_ATK_OBJECT, MaiAtkObject))
|
||||
#define MAI_ATK_OBJECT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), \
|
||||
MAI_TYPE_ATK_OBJECT, \
|
||||
MaiAtkObjectClass))
|
||||
#define MAI_IS_ATK_OBJECT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), \
|
||||
MAI_TYPE_ATK_OBJECT))
|
||||
#define MAI_IS_ATK_OBJECT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), \
|
||||
MAI_TYPE_ATK_OBJECT))
|
||||
#define MAI_ATK_OBJECT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), \
|
||||
MAI_TYPE_ATK_OBJECT, \
|
||||
MaiAtkObjectClass))
|
||||
|
||||
//typedef struct _MaiAtkObject MaiAtkObject;
|
||||
typedef struct _MaiAtkObjectClass MaiAtkObjectClass;
|
||||
|
||||
/**
|
||||
* This MaiAtkObject is a thin wrapper, in the MAI namespace, for AtkObject
|
||||
*/
|
||||
|
||||
struct _MaiAtkObject
|
||||
{
|
||||
AtkObject parent;
|
||||
|
||||
/*
|
||||
* The nsAccessibleWrap whose properties and features are exported
|
||||
* via this object instance.
|
||||
*/
|
||||
nsAccessibleWrap *accWrap;
|
||||
};
|
||||
|
||||
struct _MaiAtkObjectClass
|
||||
{
|
||||
AtkObjectClass parent_class;
|
||||
};
|
||||
|
||||
GType mai_atk_object_get_type(void);
|
||||
|
||||
#ifdef MAI_LOGGING
|
||||
gint num_created_mai_object = 0;
|
||||
gint num_deleted_mai_object = 0;
|
||||
#endif
|
||||
|
||||
static nsresult CheckMaiAtkObject(AtkObject *aAtkObj);
|
||||
|
||||
G_BEGIN_DECLS
|
||||
/* callbacks for MaiAtkObject */
|
||||
static void classInitCB(AtkObjectClass *aClass);
|
||||
static void initializeCB(AtkObject *aAtkObj, gpointer aData);
|
||||
static void finalizeCB(GObject *aObj);
|
||||
|
||||
/* callbacks for AtkObject virtual functions */
|
||||
static const gchar* getNameCB (AtkObject *aAtkObj);
|
||||
static const gchar* getDescriptionCB (AtkObject *aAtkObj);
|
||||
static AtkRole getRoleCB(AtkObject *aAtkObj);
|
||||
static AtkObject* getParentCB(AtkObject *aAtkObj);
|
||||
static gint getChildCountCB(AtkObject *aAtkObj);
|
||||
static AtkObject* refChildCB(AtkObject *aAtkObj, gint aChildIndex);
|
||||
static gint getIndexInParentCB(AtkObject *aAtkObj);
|
||||
|
||||
/* implemented by MaiWidget */
|
||||
//static AtkStateSet* refStateSetCB(AtkObject *aAtkObj);
|
||||
//static AtkRole getRoleCB(AtkObject *aAtkObj);
|
||||
|
||||
//static AtkRelationSet* refRelationSetCB(AtkObject *aAtkObj);
|
||||
//static AtkLayer getLayerCB(AtkObject *aAtkObj);
|
||||
//static gint getMdiZorderCB(AtkObject *aAtkObj);
|
||||
|
||||
/* the missing atkobject virtual functions */
|
||||
/*
|
||||
static void SetNameCB(AtkObject *aAtkObj,
|
||||
const gchar *name);
|
||||
static void SetDescriptionCB(AtkObject *aAtkObj,
|
||||
const gchar *description);
|
||||
static void SetParentCB(AtkObject *aAtkObj,
|
||||
AtkObject *parent);
|
||||
static void SetRoleCB(AtkObject *aAtkObj,
|
||||
AtkRole role);
|
||||
static guint ConnectPropertyChangeHandlerCB(
|
||||
AtkObject *aObj,
|
||||
AtkPropertyChangeHandler *handler);
|
||||
static void RemovePropertyChangeHandlerCB(
|
||||
AtkObject *aAtkObj,
|
||||
guint handler_id);
|
||||
static void InitializeCB(AtkObject *aAtkObj,
|
||||
gpointer data);
|
||||
static void ChildrenChangedCB(AtkObject *aAtkObj,
|
||||
guint change_index,
|
||||
gpointer changed_child);
|
||||
static void FocusEventCB(AtkObject *aAtkObj,
|
||||
gboolean focus_in);
|
||||
static void PropertyChangeCB(AtkObject *aAtkObj,
|
||||
AtkPropertyValues *values);
|
||||
static void StateChangeCB(AtkObject *aAtkObj,
|
||||
const gchar *name,
|
||||
gboolean state_set);
|
||||
static void VisibleDataChangedCB(AtkObject *aAtkObj);
|
||||
*/
|
||||
G_END_DECLS
|
||||
|
||||
static gpointer parent_class = NULL;
|
||||
|
||||
GType
|
||||
mai_atk_object_get_type(void)
|
||||
{
|
||||
static GType type = 0;
|
||||
|
||||
if (!type) {
|
||||
static const GTypeInfo tinfo = {
|
||||
sizeof(MaiAtkObjectClass),
|
||||
(GBaseInitFunc)NULL,
|
||||
(GBaseFinalizeFunc)NULL,
|
||||
(GClassInitFunc)classInitCB,
|
||||
(GClassFinalizeFunc)NULL,
|
||||
NULL, /* class data */
|
||||
sizeof(MaiAtkObject), /* instance size */
|
||||
0, /* nb preallocs */
|
||||
(GInstanceInitFunc)NULL,
|
||||
NULL /* value table */
|
||||
};
|
||||
|
||||
type = g_type_register_static(ATK_TYPE_OBJECT,
|
||||
"MaiAtkObject", &tinfo, GTypeFlags(0));
|
||||
}
|
||||
return type;
|
||||
}
|
||||
|
||||
nsAccessibleWrap::nsAccessibleWrap(nsIDOMNode* aNode,
|
||||
nsIWeakReference *aShell)
|
||||
: nsAccessible(aNode, aShell),
|
||||
mMaiAtkObject(nsnull)
|
||||
{
|
||||
#ifdef MAI_LOGGING
|
||||
num_created_mai_object++;
|
||||
#endif
|
||||
MAI_LOG_DEBUG(("==nsAccessibleWrap creating this=0x%x,total %d created\n",
|
||||
(unsigned int)this, num_created_mai_object));
|
||||
}
|
||||
|
||||
//-----------------------------------------------------
|
||||
// destruction
|
||||
//-----------------------------------------------------
|
||||
nsAccessibleWrap::~nsAccessibleWrap()
|
||||
{
|
||||
|
||||
#ifdef MAI_LOGGING
|
||||
num_deleted_mai_object++;
|
||||
#endif
|
||||
MAI_LOG_DEBUG(("==nsAccessibleWrap deleting this=0x%x, total %d deleted\n",
|
||||
(unsigned int)this, num_deleted_mai_object));
|
||||
|
||||
if (mMaiAtkObject) {
|
||||
mMaiAtkObject->accWrap = nsnull;
|
||||
g_object_unref(mMaiAtkObject);
|
||||
}
|
||||
}
|
||||
|
||||
AtkObject *
|
||||
nsAccessibleWrap::GetAtkObject(void)
|
||||
{
|
||||
if (mMaiAtkObject)
|
||||
return ATK_OBJECT(mMaiAtkObject);
|
||||
|
||||
CreateMaiInterfaces();
|
||||
mMaiAtkObject = (MaiAtkObject*) g_object_new(MAI_TYPE_ATK_OBJECT, NULL);
|
||||
g_return_val_if_fail(mMaiAtkObject != NULL, NULL);
|
||||
|
||||
atk_object_initialize(ATK_OBJECT(mMaiAtkObject), this);
|
||||
ATK_OBJECT(mMaiAtkObject)->role = ATK_ROLE_INVALID;
|
||||
ATK_OBJECT(mMaiAtkObject)->layer = ATK_LAYER_INVALID;
|
||||
MAI_LOG_DEBUG(("nsAccessibleWrap: Create MaiAtkObject=%p for AccWrap=%p\n",
|
||||
(void*)mMaiAtkObject, (void*)this));
|
||||
|
||||
return ATK_OBJECT(mMaiAtkObject);
|
||||
}
|
||||
|
||||
/* private */
|
||||
void
|
||||
nsAccessibleWrap::CreateMaiInterfaces(void)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
/* static functions for ATK callbacks */
|
||||
void
|
||||
classInitCB(AtkObjectClass *aClass)
|
||||
{
|
||||
GObjectClass *gobject_class = G_OBJECT_CLASS(aClass);
|
||||
|
||||
parent_class = g_type_class_peek_parent(aClass);
|
||||
|
||||
aClass->get_name = getNameCB;
|
||||
aClass->get_description = getDescriptionCB;
|
||||
aClass->get_parent = getParentCB;
|
||||
aClass->get_n_children = getChildCountCB;
|
||||
aClass->ref_child = refChildCB;
|
||||
aClass->get_index_in_parent = getIndexInParentCB;
|
||||
aClass->get_role = getRoleCB;
|
||||
|
||||
aClass->initialize = initializeCB;
|
||||
|
||||
gobject_class->finalize = finalizeCB;
|
||||
}
|
||||
|
||||
void
|
||||
initializeCB(AtkObject *aAtkObj, gpointer aData)
|
||||
{
|
||||
g_return_if_fail(MAI_IS_ATK_OBJECT(aAtkObj));
|
||||
g_return_if_fail(aData != NULL);
|
||||
|
||||
/* call parent init function */
|
||||
/* AtkObjectClass has not a "initialize" function now,
|
||||
* maybe it has later
|
||||
*/
|
||||
|
||||
if (ATK_OBJECT_CLASS(parent_class)->initialize)
|
||||
ATK_OBJECT_CLASS(parent_class)->initialize(aAtkObj, aData);
|
||||
|
||||
/* initialize object */
|
||||
MAI_ATK_OBJECT(aAtkObj)->accWrap =
|
||||
NS_STATIC_CAST(nsAccessibleWrap*, aData);
|
||||
}
|
||||
|
||||
void
|
||||
finalizeCB(GObject *aObj)
|
||||
{
|
||||
if (!MAI_IS_ATK_OBJECT(aObj))
|
||||
return;
|
||||
NS_ASSERTION(MAI_ATK_OBJECT(aObj)->accWrap == nsnull, "AccWrap NOT null");
|
||||
MAI_LOG_DEBUG(("====release MaiAtkObject=0x%x\n", (guint)aObj));
|
||||
|
||||
// call parent finalize function
|
||||
// finalize of GObjectClass will unref the accessible parent if has
|
||||
if (G_OBJECT_CLASS (parent_class)->finalize)
|
||||
G_OBJECT_CLASS (parent_class)->finalize(aObj);
|
||||
}
|
||||
|
||||
const gchar *
|
||||
getNameCB(AtkObject *aAtkObj)
|
||||
{
|
||||
NS_ENSURE_SUCCESS(CheckMaiAtkObject(aAtkObj), nsnull);
|
||||
|
||||
if (!aAtkObj->name) {
|
||||
gchar default_name[] = "no name";
|
||||
gint len;
|
||||
nsAutoString uniName;
|
||||
|
||||
nsAccessibleWrap *accWrap =
|
||||
NS_REINTERPRET_CAST(MaiAtkObject*, aAtkObj)->accWrap;
|
||||
|
||||
/* nsIAccessible is responsible for the non-NULL name */
|
||||
nsresult rv = accWrap->GetAccName(uniName);
|
||||
NS_ENSURE_SUCCESS(rv, nsnull);
|
||||
len = uniName.Length();
|
||||
if (len > 0) {
|
||||
atk_object_set_name(aAtkObj,
|
||||
NS_ConvertUCS2toUTF8(uniName).get());
|
||||
}
|
||||
else {
|
||||
atk_object_set_name(aAtkObj, default_name);
|
||||
}
|
||||
}
|
||||
return aAtkObj->name;
|
||||
}
|
||||
|
||||
const gchar *
|
||||
getDescriptionCB(AtkObject *aAtkObj)
|
||||
{
|
||||
NS_ENSURE_SUCCESS(CheckMaiAtkObject(aAtkObj), nsnull);
|
||||
|
||||
if (!aAtkObj->description) {
|
||||
gchar default_description[] = "no description";
|
||||
gint len;
|
||||
nsAutoString uniDesc;
|
||||
|
||||
nsAccessibleWrap *accWrap =
|
||||
NS_REINTERPRET_CAST(MaiAtkObject*, aAtkObj)->accWrap;
|
||||
|
||||
/* nsIAccessible is responsible for the non-NULL description */
|
||||
nsresult rv = accWrap->GetAccDescription(uniDesc);
|
||||
NS_ENSURE_SUCCESS(rv, nsnull);
|
||||
len = uniDesc.Length();
|
||||
if (len > 0) {
|
||||
atk_object_set_description(aAtkObj,
|
||||
NS_ConvertUCS2toUTF8(uniDesc).get());
|
||||
}
|
||||
else {
|
||||
atk_object_set_description(aAtkObj, default_description);
|
||||
}
|
||||
}
|
||||
return aAtkObj->description;
|
||||
}
|
||||
|
||||
AtkRole
|
||||
getRoleCB(AtkObject *aAtkObj)
|
||||
{
|
||||
NS_ENSURE_SUCCESS(CheckMaiAtkObject(aAtkObj), ATK_ROLE_INVALID);
|
||||
|
||||
if (aAtkObj->role == ATK_ROLE_INVALID) {
|
||||
nsAccessibleWrap *accWrap =
|
||||
NS_REINTERPRET_CAST(MaiAtkObject*, aAtkObj)->accWrap;
|
||||
|
||||
PRUint32 accRole;
|
||||
nsresult rv = accWrap->GetAccRole(&accRole);
|
||||
NS_ENSURE_SUCCESS(rv, ATK_ROLE_INVALID);
|
||||
|
||||
//the cross-platform Accessible object returns the same value for
|
||||
//both "ATK_ROLE_MENU_ITEM" and "ATK_ROLE_MENU"
|
||||
if (accRole == ATK_ROLE_MENU_ITEM) {
|
||||
PRInt32 childCount = 0;
|
||||
accWrap->GetAccChildCount(&childCount);
|
||||
if (childCount > 0)
|
||||
accRole = ATK_ROLE_MENU;
|
||||
}
|
||||
aAtkObj->role = NS_STATIC_CAST(AtkRole, accRole);
|
||||
}
|
||||
return aAtkObj->role;
|
||||
}
|
||||
|
||||
AtkObject *
|
||||
getParentCB(AtkObject *aAtkObj)
|
||||
{
|
||||
NS_ENSURE_SUCCESS(CheckMaiAtkObject(aAtkObj), nsnull);
|
||||
nsAccessibleWrap *accWrap =
|
||||
NS_REINTERPRET_CAST(MaiAtkObject*, aAtkObj)->accWrap;
|
||||
|
||||
nsCOMPtr<nsIAccessible> accParent;
|
||||
nsresult rv = accWrap->GetAccParent(getter_AddRefs(accParent));
|
||||
if (NS_FAILED(rv) || !accParent)
|
||||
return nsnull;
|
||||
nsIAccessible *tmpAccParent = accParent;
|
||||
nsAccessibleWrap *accWrapParent = NS_STATIC_CAST(nsAccessibleWrap *,
|
||||
tmpAccParent);
|
||||
|
||||
AtkObject *parentAtkObj = accWrapParent->GetAtkObject();
|
||||
if (parentAtkObj && !aAtkObj->accessible_parent) {
|
||||
atk_object_set_parent(aAtkObj, parentAtkObj);
|
||||
}
|
||||
return parentAtkObj;
|
||||
}
|
||||
|
||||
gint
|
||||
getChildCountCB(AtkObject *aAtkObj)
|
||||
{
|
||||
NS_ENSURE_SUCCESS(CheckMaiAtkObject(aAtkObj), 0);
|
||||
nsAccessibleWrap *accWrap =
|
||||
NS_REINTERPRET_CAST(MaiAtkObject*, aAtkObj)->accWrap;
|
||||
|
||||
PRInt32 count = 0;
|
||||
accWrap->GetAccChildCount(&count);
|
||||
return count;
|
||||
}
|
||||
|
||||
AtkObject *
|
||||
refChildCB(AtkObject *aAtkObj, gint aChildIndex)
|
||||
{
|
||||
NS_ENSURE_SUCCESS(CheckMaiAtkObject(aAtkObj), nsnull);
|
||||
nsAccessibleWrap *accWrap =
|
||||
NS_REINTERPRET_CAST(MaiAtkObject*, aAtkObj)->accWrap;
|
||||
|
||||
nsresult rv;
|
||||
nsCOMPtr<nsIAccessible> accChild;
|
||||
rv = accWrap->GetChildAt(aChildIndex, getter_AddRefs(accChild));
|
||||
|
||||
if (NS_FAILED(rv) || !accChild)
|
||||
return nsnull;
|
||||
|
||||
nsIAccessible *tmpAccChild = accChild;
|
||||
nsAccessibleWrap *accWrapChild =
|
||||
NS_STATIC_CAST(nsAccessibleWrap*, tmpAccChild);
|
||||
|
||||
//this will addref parent
|
||||
AtkObject *childAtkObj = accWrapChild->GetAtkObject();
|
||||
NS_ASSERTION(childAtkObj, "Fail to get AtkObj");
|
||||
if (!childAtkObj)
|
||||
return nsnull;
|
||||
atk_object_set_parent(childAtkObj,
|
||||
accWrap->GetAtkObject());
|
||||
g_object_ref(childAtkObj);
|
||||
return childAtkObj;
|
||||
}
|
||||
|
||||
gint
|
||||
getIndexInParentCB(AtkObject *aAtkObj)
|
||||
{
|
||||
NS_ENSURE_SUCCESS(CheckMaiAtkObject(aAtkObj), -1);
|
||||
nsAccessibleWrap *accWrap =
|
||||
NS_REINTERPRET_CAST(MaiAtkObject*, aAtkObj)->accWrap;
|
||||
|
||||
// we use accId to decide two accessible objects are the same.
|
||||
void *accId = nsnull;
|
||||
NS_ENSURE_SUCCESS(accWrap->GetUniqueID(&accId), -1);
|
||||
|
||||
nsCOMPtr<nsIAccessible> accParent;
|
||||
nsresult rv = accWrap->GetAccParent(getter_AddRefs(accParent));
|
||||
if (NS_FAILED(rv) || !accParent)
|
||||
return -1;
|
||||
|
||||
nsCOMPtr<nsIAccessible> accChild;
|
||||
nsCOMPtr<nsIAccessible> accTmpChild;
|
||||
accWrap->GetAccFirstChild(getter_AddRefs(accChild));
|
||||
|
||||
PRInt32 currentIndex = -1;
|
||||
void *currentAccId = nsnull;
|
||||
while (accChild) {
|
||||
++currentIndex;
|
||||
nsCOMPtr<nsIAccessNode> accNode(do_QueryInterface(accChild));
|
||||
if (accNode) {
|
||||
accNode->GetUniqueID(¤tAccId);
|
||||
if (currentAccId == accId)
|
||||
break;
|
||||
}
|
||||
accChild->GetAccNextSibling(getter_AddRefs(accTmpChild));
|
||||
accChild = accTmpChild;
|
||||
}
|
||||
return currentIndex;
|
||||
}
|
||||
|
||||
/******************************************************************************
|
||||
The following nsIAccessible states aren't translated, just ignored.
|
||||
STATE_MIXED: For a three-state check box.
|
||||
STATE_READONLY: The object is designated read-only.
|
||||
STATE_HOTTRACKED: Means its appearance has changed to indicate mouse
|
||||
over it.
|
||||
STATE_DEFAULT: Represents the default button in a window.
|
||||
STATE_FLOATING: Not supported yet.
|
||||
STATE_MARQUEED: Indicate scrolling or moving text or graphics.
|
||||
STATE_ANIMATED:
|
||||
STATE_OFFSCREEN: Has no on-screen representation.
|
||||
STATE_MOVEABLE:
|
||||
STATE_SELFVOICING: The object has self-TTS.
|
||||
STATE_LINKED: The object is formatted as a hyperlink.
|
||||
STATE_TRAVERSE: The object is a hyperlink that has been visited.
|
||||
STATE_EXTSELECTABLE: Indicates that an object extends its selectioin.
|
||||
STATE_ALERT_LOW: Not supported yet.
|
||||
STATE_ALERT_MEDIUM: Not supported yet.
|
||||
STATE_ALERT_HIGH: Not supported yet.
|
||||
STATE_PROTECTED: The object is a password-protected edit control.
|
||||
STATE_HASPOPUP: Object displays a pop-up menu or window when invoked.
|
||||
|
||||
Returned AtkStatusSet never contain the following AtkStates.
|
||||
ATK_STATE_ARMED: Indicates that the object is armed.
|
||||
ATK_STATE_DEFUNCT: Indicates the user interface object corresponding to
|
||||
thus object no longer exists.
|
||||
ATK_STATE_EDITABLE: Indicates the user can change the contents of the object.
|
||||
ATK_STATE_HORIZONTAL:Indicates the orientation of this object is horizontal.
|
||||
ATK_STATE_ICONIFIED:
|
||||
ATK_STATE_OPAQUE: Indicates the object paints every pixel within its
|
||||
rectangular region
|
||||
ATK_STATE_STALE: The index associated with this object has changed since
|
||||
the user accessed the object
|
||||
******************************************************************************/
|
||||
|
||||
void
|
||||
nsAccessibleWrap::TranslateStates(PRUint32 aAccState, AtkStateSet *state_set)
|
||||
{
|
||||
g_return_if_fail(state_set);
|
||||
|
||||
if (aAccState & nsIAccessible::STATE_SELECTED)
|
||||
atk_state_set_add_state (state_set, ATK_STATE_SELECTED);
|
||||
|
||||
if (aAccState & nsIAccessible::STATE_FOCUSED)
|
||||
atk_state_set_add_state (state_set, ATK_STATE_FOCUSED);
|
||||
|
||||
if (aAccState & nsIAccessible::STATE_PRESSED)
|
||||
atk_state_set_add_state (state_set, ATK_STATE_PRESSED);
|
||||
|
||||
if (aAccState & nsIAccessible::STATE_CHECKED)
|
||||
atk_state_set_add_state (state_set, ATK_STATE_CHECKED);
|
||||
|
||||
if (aAccState & nsIAccessible::STATE_EXPANDED)
|
||||
atk_state_set_add_state (state_set, ATK_STATE_EXPANDED);
|
||||
|
||||
if (aAccState & nsIAccessible::STATE_COLLAPSED)
|
||||
atk_state_set_add_state (state_set, ATK_STATE_EXPANDABLE);
|
||||
|
||||
// The control can't accept input at this time
|
||||
if (aAccState & nsIAccessible::STATE_BUSY)
|
||||
atk_state_set_add_state (state_set, ATK_STATE_BUSY);
|
||||
|
||||
if (aAccState & nsIAccessible::STATE_FOCUSABLE)
|
||||
atk_state_set_add_state (state_set, ATK_STATE_FOCUSABLE);
|
||||
|
||||
if (!(aAccState & nsIAccessible::STATE_INVISIBLE))
|
||||
atk_state_set_add_state (state_set, ATK_STATE_VISIBLE);
|
||||
|
||||
if (aAccState & nsIAccessible::STATE_SELECTABLE)
|
||||
atk_state_set_add_state (state_set, ATK_STATE_SELECTABLE);
|
||||
|
||||
if (aAccState & nsIAccessible::STATE_SIZEABLE)
|
||||
atk_state_set_add_state (state_set, ATK_STATE_RESIZABLE);
|
||||
|
||||
if (aAccState & nsIAccessible::STATE_MULTISELECTABLE)
|
||||
atk_state_set_add_state (state_set, ATK_STATE_MULTISELECTABLE);
|
||||
|
||||
if (!(aAccState & nsIAccessible::STATE_UNAVAILABLE))
|
||||
atk_state_set_add_state (state_set, ATK_STATE_ENABLED);
|
||||
|
||||
// The following state is
|
||||
// Extended state flags (for now non-MSAA, for Java and Gnome/ATK support)
|
||||
// This is only the states that there isn't already a mapping for in MSAA
|
||||
// See www.accessmozilla.org/article.php?sid=11 for information on the
|
||||
// mappings between accessibility API state
|
||||
if (aAccState & nsIAccessible::STATE_INVALID)
|
||||
atk_state_set_add_state (state_set, ATK_STATE_INVALID);
|
||||
|
||||
if (aAccState & nsIAccessible::STATE_ACTIVE)
|
||||
atk_state_set_add_state (state_set, ATK_STATE_ACTIVE);
|
||||
|
||||
if (aAccState & nsIAccessible::STATE_EXPANDABLE)
|
||||
atk_state_set_add_state (state_set, ATK_STATE_EXPANDABLE);
|
||||
|
||||
if (aAccState & nsIAccessible::STATE_MODAL)
|
||||
atk_state_set_add_state (state_set, ATK_STATE_MODAL);
|
||||
|
||||
if (aAccState & nsIAccessible::STATE_MULTI_LINE)
|
||||
atk_state_set_add_state (state_set, ATK_STATE_MULTI_LINE);
|
||||
|
||||
if (aAccState & nsIAccessible::STATE_SENSITIVE)
|
||||
atk_state_set_add_state (state_set, ATK_STATE_SENSITIVE);
|
||||
|
||||
if (aAccState & nsIAccessible::STATE_RESIZABLE)
|
||||
atk_state_set_add_state (state_set, ATK_STATE_RESIZABLE);
|
||||
|
||||
if (aAccState & nsIAccessible::STATE_SHOWING)
|
||||
atk_state_set_add_state (state_set, ATK_STATE_SHOWING);
|
||||
|
||||
if (aAccState & nsIAccessible::STATE_SINGLE_LINE)
|
||||
atk_state_set_add_state (state_set, ATK_STATE_SINGLE_LINE);
|
||||
|
||||
if (aAccState & nsIAccessible::STATE_TRANSIENT)
|
||||
atk_state_set_add_state (state_set, ATK_STATE_TRANSIENT);
|
||||
|
||||
if (aAccState & nsIAccessible::STATE_VERTICAL)
|
||||
atk_state_set_add_state (state_set, ATK_STATE_VERTICAL);
|
||||
|
||||
}
|
||||
|
||||
nsresult
|
||||
CheckMaiAtkObject(AtkObject *aAtkObj)
|
||||
{
|
||||
NS_ENSURE_ARG(MAI_IS_ATK_OBJECT(aAtkObj));
|
||||
nsAccessibleWrap * tmpAccWrap = MAI_ATK_OBJECT(aAtkObj)->accWrap;
|
||||
NS_ENSURE_TRUE(tmpAccWrap != nsnull, NS_ERROR_INVALID_POINTER);
|
||||
NS_ENSURE_TRUE(tmpAccWrap->GetAtkObject() == aAtkObj,
|
||||
NS_ERROR_FAILURE);
|
||||
return NS_OK;
|
||||
}
|
||||
|
|
|
@ -1,26 +1,29 @@
|
|||
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
|
||||
/* vim:expandtab:shiftwidth=4:tabstop=4:
|
||||
*/
|
||||
/* ***** BEGIN LICENSE BLOCK *****
|
||||
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
|
||||
* Version: NPL 1.1/GPL 2.0/LGPL 2.1
|
||||
*
|
||||
* The contents of this file are subject to the Mozilla Public License Version
|
||||
* 1.1 (the "License"); you may not use this file except in compliance with
|
||||
* the License. You may obtain a copy of the License at
|
||||
* http://www.mozilla.org/MPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS IS" basis,
|
||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
||||
* for the specific language governing rights and limitations under the
|
||||
* License.
|
||||
* The contents of this file are subject to the Mozilla Public
|
||||
* License Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License. You may obtain a copy of
|
||||
* the License at http://www.mozilla.org/MPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS
|
||||
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
||||
* implied. See the License for the specific language governing
|
||||
* rights and limitations under the License.
|
||||
*
|
||||
* The Original Code is mozilla.org code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is
|
||||
* Netscape Communications Corporation.
|
||||
* Portions created by the Initial Developer are Copyright (C) 2003
|
||||
* the Initial Developer. All Rights Reserved.
|
||||
* The Initial Developer of the Original Code is Sun Microsystems, Inc.
|
||||
* Portions created by Sun Microsystems are Copyright (C) 2002 Sun
|
||||
* Microsystems, Inc. All Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
* Original Author: Aaron Leventhal (aaronl@netscape.com)
|
||||
* Original Author: Bolian Yin (bolian.yin@sun.com)
|
||||
*
|
||||
* Contributor(s): John Sun (john.sun@sun.com)
|
||||
*
|
||||
* Alternatively, the contents of this file may be used under the terms of
|
||||
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
||||
|
@ -28,29 +31,86 @@
|
|||
* in which case the provisions of the GPL or the LGPL are applicable instead
|
||||
* of those above. If you wish to allow use of your version of this file only
|
||||
* under the terms of either the GPL or the LGPL, and not to allow others to
|
||||
* use your version of this file under the terms of the MPL, indicate your
|
||||
* use your version of this file under the terms of the NPL, indicate your
|
||||
* decision by deleting the provisions above and replace them with the notice
|
||||
* and other provisions required by the GPL or the LGPL. If you do not delete
|
||||
* the provisions above, a recipient may use your version of this file under
|
||||
* the terms of any one of the MPL, the GPL or the LGPL.
|
||||
* the terms of any one of the NPL, the GPL or the LGPL.
|
||||
*
|
||||
* ***** END LICENSE BLOCK ***** */
|
||||
|
||||
/* For documentation of the accessibility architecture,
|
||||
* see http://lxr.mozilla.org/seamonkey/source/accessible/accessible-docs.html
|
||||
*/
|
||||
|
||||
#ifndef _nsAccessibleWrap_H_
|
||||
#define _nsAccessibleWrap_H_
|
||||
#ifndef __NS_ACCESSIBLE_WRAP_H__
|
||||
#define __NS_ACCESSIBLE_WRAP_H__
|
||||
|
||||
#include "nsCOMPtr.h"
|
||||
#include "nsAccessible.h"
|
||||
|
||||
class nsAccessibleWrap : public nsAccessible
|
||||
#include "prlog.h"
|
||||
|
||||
extern PRLogModuleInfo *gMaiLog;
|
||||
|
||||
#ifdef PR_LOGGING
|
||||
#define MAI_LOGGING
|
||||
#endif /* #ifdef PR_LOGGING */
|
||||
|
||||
#ifdef MAI_LOGGING
|
||||
#define MAI_LOG(level, args) \
|
||||
PR_BEGIN_MACRO \
|
||||
if (!gMaiLog) { \
|
||||
gMaiLog = PR_NewLogModule("Mai"); \
|
||||
PR_ASSERT(gMaiLog); \
|
||||
} \
|
||||
PR_LOG(gMaiLog, (level), args); \
|
||||
PR_END_MACRO
|
||||
#else
|
||||
#define MAI_LOG(level, args)
|
||||
#endif
|
||||
|
||||
#define MAI_LOG_DEBUG(args) MAI_LOG(PR_LOG_DEBUG, args)
|
||||
#define MAI_LOG_WARNING(args) MAI_LOG(PR_LOG_WARNING, args)
|
||||
#define MAI_LOG_ERROR(args) MAI_LOG(PR_LOG_ERROR, args)
|
||||
|
||||
struct _AtkObject;
|
||||
struct _AtkStateSet;
|
||||
struct _MaiAtkObject;
|
||||
struct _GHashTable;
|
||||
|
||||
typedef struct _AtkObject AtkObject;
|
||||
typedef struct _AtkStateSet AtkStateSet;
|
||||
typedef struct _MaiAtkObject MaiAtkObject;
|
||||
typedef struct _GHashTable GHashTable;
|
||||
|
||||
/**
|
||||
* nsAccessibleWrap, and its descendents in atk directory provide the
|
||||
* implementation of AtkObject.
|
||||
*/
|
||||
|
||||
class nsAccessibleWrap: public nsAccessible
|
||||
{
|
||||
public: // construction, destruction
|
||||
public:
|
||||
nsAccessibleWrap(nsIDOMNode*, nsIWeakReference *aShell);
|
||||
virtual ~nsAccessibleWrap();
|
||||
|
||||
#ifdef MAI_LOGGING
|
||||
virtual void DumpnsAccessibleWrapInfo(int aDepth) {}
|
||||
#endif
|
||||
|
||||
public:
|
||||
virtual AtkObject *GetAtkObject(void);
|
||||
|
||||
static void TranslateStates(PRUint32 aAccState,
|
||||
AtkStateSet *state_set);
|
||||
protected:
|
||||
MaiAtkObject *mMaiAtkObject;
|
||||
|
||||
private:
|
||||
void CreateMaiInterfaces(void);
|
||||
|
||||
};
|
||||
|
||||
#ifdef MAI_LOGGING
|
||||
extern PRInt32 num_created_mai_object;
|
||||
extern PRInt32 num_deleted_mai_object;
|
||||
#endif
|
||||
|
||||
#endif /* __NS_ACCESSIBLE_WRAP_H__ */
|
||||
|
|
|
@ -0,0 +1,632 @@
|
|||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
|
||||
/* vim:expandtab:shiftwidth=4:tabstop=4:
|
||||
*/
|
||||
/* ***** BEGIN LICENSE BLOCK *****
|
||||
* Version: NPL 1.1/GPL 2.0/LGPL 2.1
|
||||
*
|
||||
*
|
||||
* The contents of this file are subject to the Mozilla Public
|
||||
* License Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License. You may obtain a copy of
|
||||
* the License at http://www.mozilla.org/MPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS
|
||||
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
||||
* implied. See the License for the specific language governing
|
||||
* rights and limitations under the License.
|
||||
*
|
||||
* The Original Code is mozilla.org code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is Sun Microsystems, Inc.
|
||||
* Portions created by Sun Microsystems are Copyright (C) 2002 Sun
|
||||
* Microsystems, Inc. All Rights Reserved.
|
||||
*
|
||||
* Original Author: Bolian Yin (bolian.yin@sun.com)
|
||||
*
|
||||
* Contributor(s):
|
||||
*
|
||||
* Alternatively, the contents of this file may be used under the terms of
|
||||
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
||||
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
||||
* in which case the provisions of the GPL or the LGPL are applicable instead
|
||||
* of those above. If you wish to allow use of your version of this file only
|
||||
* under the terms of either the GPL or the LGPL, and not to allow others to
|
||||
* use your version of this file under the terms of the NPL, indicate your
|
||||
* decision by deleting the provisions above and replace them with the notice
|
||||
* and other provisions required by the GPL or the LGPL. If you do not delete
|
||||
* the provisions above, a recipient may use your version of this file under
|
||||
* the terms of any one of the NPL, the GPL or the LGPL.
|
||||
*
|
||||
* ***** END LICENSE BLOCK ***** */
|
||||
|
||||
#include "nsCOMPtr.h"
|
||||
#include "nsAppRootAccessible.h"
|
||||
#include "prlink.h"
|
||||
|
||||
#include <atk/atk.h>
|
||||
|
||||
/* maiutil */
|
||||
|
||||
static guint mai_util_add_global_event_listener(GSignalEmissionHook listener,
|
||||
const gchar *event_type);
|
||||
static void mai_util_remove_global_event_listener(guint remove_listener);
|
||||
static AtkObject *mai_util_get_root(void);
|
||||
static G_CONST_RETURN gchar *mai_util_get_toolkit_name(void);
|
||||
static G_CONST_RETURN gchar *mai_util_get_toolkit_version(void);
|
||||
|
||||
|
||||
/* Misc */
|
||||
|
||||
static void _listener_info_destroy(gpointer data);
|
||||
static guint add_listener (GSignalEmissionHook listener,
|
||||
const gchar *object_type,
|
||||
const gchar *signal,
|
||||
const gchar *hook_data);
|
||||
|
||||
static GHashTable *listener_list = NULL;
|
||||
static gint listener_idx = 1;
|
||||
|
||||
typedef struct _MaiUtilListenerInfo MaiUtilListenerInfo;
|
||||
|
||||
|
||||
#define MAI_TYPE_UTIL (mai_util_get_type ())
|
||||
#define MAI_UTIL(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), \
|
||||
MAI_TYPE_UTIL, MaiUtil))
|
||||
#define MAI_UTIL_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), \
|
||||
MAI_TYPE_UTIL, MaiUtilClass))
|
||||
#define MAI_IS_UTIL(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), \
|
||||
MAI_TYPE_UTIL))
|
||||
#define MAI_IS_UTIL_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), \
|
||||
MAI_TYPE_UTIL))
|
||||
#define MAI_UTIL_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), \
|
||||
MAI_TYPE_UTIL, MaiUtilClass))
|
||||
|
||||
typedef struct _MaiUtil MaiUtil;
|
||||
typedef struct _MaiUtilClass MaiUtilClass;
|
||||
|
||||
G_BEGIN_DECLS
|
||||
typedef void (*GnomeAccessibilityInit) (void);
|
||||
typedef void (*GnomeAccessibilityShutdown) (void);
|
||||
G_END_DECLS
|
||||
|
||||
struct _MaiUtil
|
||||
{
|
||||
AtkUtil parent;
|
||||
GList *listener_list;
|
||||
};
|
||||
|
||||
struct GnomeAccessibilityModule
|
||||
{
|
||||
const char *libName;
|
||||
PRLibrary *lib;
|
||||
const char *initName;
|
||||
GnomeAccessibilityInit init;
|
||||
const char *shutdownName;
|
||||
GnomeAccessibilityShutdown shutdown;
|
||||
};
|
||||
|
||||
GType mai_util_get_type (void);
|
||||
static void mai_util_class_init(MaiUtilClass *klass);
|
||||
|
||||
struct _MaiUtilClass
|
||||
{
|
||||
AtkUtilClass parent_class;
|
||||
};
|
||||
|
||||
/* supporting */
|
||||
PRLogModuleInfo *gMaiLog = NULL;
|
||||
|
||||
#define MAI_VERSION "0.0.6"
|
||||
#define MAI_NAME "mozilla"
|
||||
|
||||
struct _MaiUtilListenerInfo
|
||||
{
|
||||
gint key;
|
||||
guint signal_id;
|
||||
gulong hook_id;
|
||||
};
|
||||
|
||||
static GnomeAccessibilityModule sAtkBridge = {
|
||||
"libatk-bridge.so", NULL,
|
||||
"gnome_accessibility_module_init", NULL,
|
||||
"gnome_accessibility_module_shutdown", NULL,
|
||||
};
|
||||
|
||||
GType
|
||||
mai_util_get_type(void)
|
||||
{
|
||||
static GType type = 0;
|
||||
|
||||
if (!type) {
|
||||
static const GTypeInfo tinfo = {
|
||||
sizeof(MaiUtilClass),
|
||||
(GBaseInitFunc) NULL, /* base init */
|
||||
(GBaseFinalizeFunc) NULL, /* base finalize */
|
||||
(GClassInitFunc) mai_util_class_init, /* class init */
|
||||
(GClassFinalizeFunc) NULL, /* class finalize */
|
||||
NULL, /* class data */
|
||||
sizeof(MaiUtil), /* instance size */
|
||||
0, /* nb preallocs */
|
||||
(GInstanceInitFunc) NULL, /* instance init */
|
||||
NULL /* value table */
|
||||
};
|
||||
|
||||
type = g_type_register_static(ATK_TYPE_UTIL,
|
||||
"MaiUtil", &tinfo, GTypeFlags(0));
|
||||
}
|
||||
return type;
|
||||
}
|
||||
|
||||
/* intialize the the atk interface (function pointers) with MAI implementation.
|
||||
* When atk bridge get loaded, these interface can be used.
|
||||
*/
|
||||
static void
|
||||
mai_util_class_init(MaiUtilClass *klass)
|
||||
{
|
||||
AtkUtilClass *atk_class;
|
||||
gpointer data;
|
||||
|
||||
data = g_type_class_peek(ATK_TYPE_UTIL);
|
||||
atk_class = ATK_UTIL_CLASS(data);
|
||||
|
||||
atk_class->add_global_event_listener =
|
||||
mai_util_add_global_event_listener;
|
||||
atk_class->remove_global_event_listener =
|
||||
mai_util_remove_global_event_listener;
|
||||
/*
|
||||
atk_class->add_key_event_listener =
|
||||
mai_util_add_key_event_listener;
|
||||
atk_class->remove_key_event_listener =
|
||||
mai_util_remove_key_event_listener;
|
||||
*/
|
||||
atk_class->get_root = mai_util_get_root;
|
||||
atk_class->get_toolkit_name = mai_util_get_toolkit_name;
|
||||
atk_class->get_toolkit_version = mai_util_get_toolkit_version;
|
||||
|
||||
listener_list = g_hash_table_new_full(g_int_hash, g_int_equal, NULL,
|
||||
_listener_info_destroy);
|
||||
}
|
||||
|
||||
static guint
|
||||
mai_util_add_global_event_listener(GSignalEmissionHook listener,
|
||||
const gchar *event_type)
|
||||
{
|
||||
guint rc = 0;
|
||||
gchar **split_string;
|
||||
|
||||
split_string = g_strsplit (event_type, ":", 3);
|
||||
|
||||
if (split_string) {
|
||||
if (!strcmp ("window", split_string[0])) {
|
||||
/* ???
|
||||
static gboolean initialized = FALSE;
|
||||
|
||||
if (!initialized) {
|
||||
do_window_event_initialization ();
|
||||
initialized = TRUE;
|
||||
}
|
||||
rc = add_listener (listener, "MaiWindow",
|
||||
split_string[1], event_type);
|
||||
*/
|
||||
}
|
||||
else {
|
||||
rc = add_listener (listener, split_string[1], split_string[2],
|
||||
event_type);
|
||||
}
|
||||
}
|
||||
return rc;
|
||||
}
|
||||
|
||||
static void
|
||||
mai_util_remove_global_event_listener(guint remove_listener)
|
||||
{
|
||||
if (remove_listener > 0) {
|
||||
MaiUtilListenerInfo *listener_info;
|
||||
gint tmp_idx = remove_listener;
|
||||
|
||||
listener_info = (MaiUtilListenerInfo *)
|
||||
g_hash_table_lookup(listener_list, &tmp_idx);
|
||||
|
||||
if (listener_info != NULL) {
|
||||
/* Hook id of 0 and signal id of 0 are invalid */
|
||||
if (listener_info->hook_id != 0 && listener_info->signal_id != 0) {
|
||||
/* Remove the emission hook */
|
||||
g_signal_remove_emission_hook(listener_info->signal_id,
|
||||
listener_info->hook_id);
|
||||
|
||||
/* Remove the element from the hash */
|
||||
g_hash_table_remove(listener_list, &tmp_idx);
|
||||
}
|
||||
else {
|
||||
/* do not use g_warning with such complex format args, */
|
||||
/* Forte CC can not preprocess it correctly */
|
||||
g_log((gchar *)0, G_LOG_LEVEL_WARNING,
|
||||
"Invalid listener hook_id %ld or signal_id %d\n",
|
||||
listener_info->hook_id, listener_info->signal_id);
|
||||
|
||||
}
|
||||
}
|
||||
else {
|
||||
/* do not use g_warning with such complex format args, */
|
||||
/* Forte CC can not preprocess it correctly */
|
||||
g_log((gchar *)0, G_LOG_LEVEL_WARNING,
|
||||
"No listener with the specified listener id %d",
|
||||
remove_listener);
|
||||
}
|
||||
}
|
||||
else {
|
||||
g_warning("Invalid listener_id %d", remove_listener);
|
||||
}
|
||||
}
|
||||
|
||||
AtkObject *
|
||||
mai_util_get_root(void)
|
||||
{
|
||||
nsAppRootAccessible *root = nsAppRootAccessible::Create();
|
||||
|
||||
if (!root)
|
||||
return nsnull;
|
||||
return root->GetAtkObject();
|
||||
}
|
||||
|
||||
G_CONST_RETURN gchar *
|
||||
mai_util_get_toolkit_name(void)
|
||||
{
|
||||
return MAI_NAME;
|
||||
}
|
||||
|
||||
G_CONST_RETURN gchar *
|
||||
mai_util_get_toolkit_version(void)
|
||||
{
|
||||
return MAI_VERSION;
|
||||
}
|
||||
|
||||
void
|
||||
_listener_info_destroy(gpointer data)
|
||||
{
|
||||
g_free(data);
|
||||
}
|
||||
|
||||
guint
|
||||
add_listener (GSignalEmissionHook listener,
|
||||
const gchar *object_type,
|
||||
const gchar *signal,
|
||||
const gchar *hook_data)
|
||||
{
|
||||
GType type;
|
||||
guint signal_id;
|
||||
gint rc = 0;
|
||||
|
||||
type = g_type_from_name(object_type);
|
||||
if (type) {
|
||||
signal_id = g_signal_lookup(signal, type);
|
||||
if (signal_id > 0) {
|
||||
MaiUtilListenerInfo *listener_info;
|
||||
|
||||
rc = listener_idx;
|
||||
|
||||
listener_info = (MaiUtilListenerInfo *)
|
||||
g_malloc(sizeof(MaiUtilListenerInfo));
|
||||
listener_info->key = listener_idx;
|
||||
listener_info->hook_id =
|
||||
g_signal_add_emission_hook(signal_id, 0, listener,
|
||||
g_strdup(hook_data),
|
||||
(GDestroyNotify)g_free);
|
||||
listener_info->signal_id = signal_id;
|
||||
|
||||
g_hash_table_insert(listener_list, &(listener_info->key),
|
||||
listener_info);
|
||||
listener_idx++;
|
||||
}
|
||||
else {
|
||||
g_warning("Invalid signal type %s\n", signal);
|
||||
}
|
||||
}
|
||||
else {
|
||||
g_warning("Invalid object type %s\n", object_type);
|
||||
}
|
||||
return rc;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
// currently support one child
|
||||
nsRootAccessibleWrap *sOnlyChild = nsnull;
|
||||
|
||||
static nsresult LoadGtkModule(GnomeAccessibilityModule& aModule);
|
||||
|
||||
nsAppRootAccessible::nsAppRootAccessible():
|
||||
nsAccessibleWrap(nsnull, nsnull),
|
||||
mChildren(nsnull),
|
||||
mInitialized(PR_FALSE)
|
||||
{
|
||||
MAI_LOG_DEBUG(("======Create AppRootAcc=%p\n", (void*)this));
|
||||
}
|
||||
|
||||
nsAppRootAccessible::~nsAppRootAccessible()
|
||||
{
|
||||
}
|
||||
|
||||
/* virtual functions */
|
||||
|
||||
/*
|
||||
#ifdef MAI_LOGGING
|
||||
void
|
||||
nsAppRootAccessible::DumpMaiObjectInfo(int aDepth)
|
||||
{
|
||||
--aDepth;
|
||||
if (aDepth < 0)
|
||||
return;
|
||||
g_print("nsAppRootAccessible: this=0x%x, aDepth=%d, type=%s\n",
|
||||
(unsigned int)this, aDepth, "nsAppRootAccessible");
|
||||
gint nChild = GetChildCount();
|
||||
g_print("#child=%d<br>\n", nChild);
|
||||
g_print("Iface num: 1=component, 2=action, 3=value, 4=editabletext,"
|
||||
"5=hyperlink, 6=hypertext, 7=selection, 8=table, 9=text\n");
|
||||
g_print("<ul>\n");
|
||||
|
||||
MaiObject *maiChild;
|
||||
for (int childIndex = 0; childIndex < nChild; childIndex++) {
|
||||
maiChild = RefChild(childIndex);
|
||||
if (maiChild) {
|
||||
g_print(" <li>");
|
||||
maiChild->DumpMaiObjectInfo(aDepth);
|
||||
}
|
||||
}
|
||||
g_print("</ul>\n");
|
||||
g_print("End of nsAppRootAccessible: this=0x%x, type=%s\n<br>",
|
||||
(unsigned int)this, "nsAppRootAccessible");
|
||||
}
|
||||
#endif
|
||||
*/
|
||||
|
||||
void
|
||||
nsAppRootAccessible::Initialize(void)
|
||||
{
|
||||
}
|
||||
|
||||
NS_IMETHODIMP nsAppRootAccessible::Init()
|
||||
{
|
||||
NS_ASSERTION((mInitialized == FALSE), "Init AppRoot Again!!");
|
||||
if (mInitialized == PR_TRUE)
|
||||
return NS_OK;
|
||||
|
||||
MAI_LOG_DEBUG(("Mozilla Atk Implementation initializing\n"));
|
||||
g_type_init();
|
||||
// Initialize the MAI Utility class
|
||||
g_type_class_unref(g_type_class_ref(MAI_TYPE_UTIL));
|
||||
|
||||
// load and initialize atk-bridge library
|
||||
nsresult rv = LoadGtkModule(sAtkBridge);
|
||||
if (NS_SUCCEEDED(rv)) {
|
||||
// init atk-bridge
|
||||
(*sAtkBridge.init)();
|
||||
}
|
||||
else
|
||||
MAI_LOG_DEBUG(("Fail to load lib: %s\n", sAtkBridge.libName));
|
||||
|
||||
rv = NS_NewArray(getter_AddRefs(mChildren));
|
||||
return rv;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP nsAppRootAccessible::Shutdown()
|
||||
{
|
||||
nsAppRootAccessible *root = nsAppRootAccessible::Create();
|
||||
if (root)
|
||||
NS_IF_RELEASE(root);
|
||||
if (sAtkBridge.lib) {
|
||||
if (sAtkBridge.shutdown)
|
||||
(*sAtkBridge.shutdown)();
|
||||
//Not unload atk-bridge library
|
||||
//an exit function registered will take care of it
|
||||
sAtkBridge.lib = NULL;
|
||||
sAtkBridge.init = NULL;
|
||||
sAtkBridge.shutdown = NULL;
|
||||
}
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP nsAppRootAccessible::GetAccName(nsAString& _retval)
|
||||
{
|
||||
_retval = NS_LITERAL_STRING("Mozilla");
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP nsAppRootAccessible::GetAccDescription(nsAString& aDescription)
|
||||
{
|
||||
aDescription = NS_LITERAL_STRING("Mozilla Root Accessible");
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP nsAppRootAccessible::GetAccRole(PRUint32 *aAccRole)
|
||||
{
|
||||
*aAccRole = ROLE_APPLICATION;
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP nsAppRootAccessible::GetAccParent(nsIAccessible ** aAccParent)
|
||||
{
|
||||
*aAccParent = nsnull;
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP nsAppRootAccessible::GetChildAt(PRInt32 aChildNum,
|
||||
nsIAccessible **aChild)
|
||||
{
|
||||
nsCOMPtr<nsIWeakReference> childWeakRef;
|
||||
*aChild = nsnull;
|
||||
nsresult rv = NS_OK;
|
||||
rv = mChildren->QueryElementAt(aChildNum, NS_GET_IID(nsIWeakReference),
|
||||
getter_AddRefs(childWeakRef));
|
||||
if (childWeakRef) {
|
||||
MAI_LOG_DEBUG(("GetChildAt(%d), has weak ref\n", aChildNum));
|
||||
nsCOMPtr<nsIAccessible> childAcc = do_QueryReferent(childWeakRef);
|
||||
if (childAcc) {
|
||||
MAI_LOG_DEBUG(("GetChildAt(%d), has Acc Child ref\n", aChildNum));
|
||||
NS_IF_ADDREF(*aChild = childAcc);
|
||||
}
|
||||
else
|
||||
MAI_LOG_DEBUG(("GetChildAt(%d), NOT has Acc Child ref\n",
|
||||
aChildNum));
|
||||
|
||||
}
|
||||
else
|
||||
MAI_LOG_DEBUG(("GetChildAt(%d), NOT has weak ref\n", aChildNum));
|
||||
return rv;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP nsAppRootAccessible::GetAccChildCount(PRInt32 *aAccChildCount)
|
||||
{
|
||||
PRUint32 count = 0;
|
||||
nsresult rv = NS_OK;
|
||||
if (mChildren)
|
||||
rv = mChildren->GetLength(&count);
|
||||
if (NS_SUCCEEDED(rv)) {
|
||||
MAI_LOG_DEBUG(("\nGet Acc Child OK, count=%d\n", count));
|
||||
}
|
||||
else
|
||||
MAI_LOG_DEBUG(("\nGet Acc Child Failed, count=%d\n", count));
|
||||
|
||||
*aAccChildCount = NS_STATIC_CAST(PRInt32, count);
|
||||
return rv;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP nsAppRootAccessible::GetAccFirstChild(nsIAccessible * *aAccFirstChild)
|
||||
{
|
||||
nsCOMPtr<nsIAccessible> firstChild;
|
||||
*aAccFirstChild = nsnull;
|
||||
nsresult rv = NS_OK;
|
||||
rv = mChildren->QueryElementAt(0, NS_GET_IID(nsIAccessible),
|
||||
getter_AddRefs(firstChild));
|
||||
if (firstChild)
|
||||
NS_IF_ADDREF(*aAccFirstChild = firstChild);
|
||||
return rv;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP nsAppRootAccessible::GetAccNextSibling(nsIAccessible * *aAccNextSibling)
|
||||
{
|
||||
*aAccNextSibling = nsnull;
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP nsAppRootAccessible::GetAccPreviousSibling(nsIAccessible * *aAccPreviousSibling)
|
||||
{
|
||||
*aAccPreviousSibling = nsnull;
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
nsresult
|
||||
nsAppRootAccessible::AddRootAccessible(nsRootAccessibleWrap *aRootAccWrap)
|
||||
{
|
||||
NS_ENSURE_ARG_POINTER(aRootAccWrap);
|
||||
|
||||
nsresult rv = NS_ERROR_FAILURE;
|
||||
|
||||
// weak reference
|
||||
rv = mChildren->AppendElement(NS_STATIC_CAST(nsISupports *,
|
||||
NS_STATIC_CAST(nsIAccessibleDocument*, aRootAccWrap)),
|
||||
PR_TRUE);
|
||||
PRUint32 count = 0;
|
||||
mChildren->GetLength(&count);
|
||||
|
||||
if (NS_SUCCEEDED(rv)) {
|
||||
MAI_LOG_DEBUG(("\nAdd RootAcc=%p OK, count=%d\n",
|
||||
(void*)aRootAccWrap, count));
|
||||
}
|
||||
else
|
||||
MAI_LOG_DEBUG(("\nAdd RootAcc=%p Failed, count=%d\n",
|
||||
(void*)aRootAccWrap, count));
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
nsresult
|
||||
nsAppRootAccessible::RemoveRootAccessible(nsRootAccessibleWrap *aRootAccWrap)
|
||||
{
|
||||
NS_ENSURE_ARG_POINTER(aRootAccWrap);
|
||||
PRUint32 index = 0;
|
||||
nsresult rv = mChildren->IndexOf(0, NS_STATIC_CAST(nsISupports *,
|
||||
NS_STATIC_CAST(nsIAccessibleDocument*, aRootAccWrap)),
|
||||
&index);
|
||||
if (NS_SUCCEEDED(rv))
|
||||
rv = mChildren->RemoveElementAt(index);
|
||||
|
||||
MAI_LOG_DEBUG(("\nRemove RootAcc=%p\n", (void*)aRootAccWrap));
|
||||
return rv;
|
||||
}
|
||||
|
||||
nsAppRootAccessible *
|
||||
nsAppRootAccessible::Create()
|
||||
{
|
||||
static nsAppRootAccessible *sAppRoot = nsnull;
|
||||
if (!sAppRoot) {
|
||||
sAppRoot = new nsAppRootAccessible();
|
||||
NS_ASSERTION(sAppRoot, "OUT OF MEMORY");
|
||||
if (sAppRoot) {
|
||||
if (NS_FAILED(sAppRoot->Init())) {
|
||||
delete sAppRoot;
|
||||
sAppRoot = nsnull;
|
||||
}
|
||||
else
|
||||
NS_IF_ADDREF(sAppRoot);
|
||||
}
|
||||
}
|
||||
return sAppRoot;
|
||||
}
|
||||
|
||||
static nsresult
|
||||
LoadGtkModule(GnomeAccessibilityModule& aModule)
|
||||
{
|
||||
NS_ENSURE_ARG(aModule.libName);
|
||||
|
||||
if (!(aModule.lib = PR_LoadLibrary(aModule.libName))) {
|
||||
|
||||
MAI_LOG_DEBUG(("Fail to load lib: %s in default path\n", aModule.libName));
|
||||
|
||||
//try to load the module with "gtk-2.0/modules" appended
|
||||
char *curLibPath = PR_GetLibraryPath();
|
||||
nsCAutoString libPath(curLibPath);
|
||||
MAI_LOG_DEBUG(("Current Lib path=%s\n", curLibPath));
|
||||
PR_FreeLibraryName(curLibPath);
|
||||
|
||||
PRInt16 loc1 = 0, loc2 = 0;
|
||||
PRInt16 subLen = 0;
|
||||
while (loc2 >= 0) {
|
||||
loc2 = libPath.FindChar(':', loc1);
|
||||
if (loc2 < 0)
|
||||
subLen = libPath.Length() - loc1;
|
||||
else
|
||||
subLen = loc2 - loc1;
|
||||
nsCAutoString sub(Substring(libPath, loc1, subLen));
|
||||
sub.Append("/gtk-2.0/modules/");
|
||||
sub.Append(aModule.libName);
|
||||
aModule.lib = PR_LoadLibrary(sub.get());
|
||||
if (aModule.lib) {
|
||||
MAI_LOG_DEBUG(("Ok, load %s from %s\n", aModule.libName, sub.get()));
|
||||
break;
|
||||
}
|
||||
loc1 = loc2+1;
|
||||
}
|
||||
if (!aModule.lib) {
|
||||
MAI_LOG_DEBUG(("Fail to load %s\n", aModule.libName));
|
||||
return NS_ERROR_FAILURE;
|
||||
}
|
||||
}
|
||||
|
||||
//we have loaded the library, try to get the function ptrs
|
||||
if (!(aModule.init = PR_FindFunctionSymbol(aModule.lib,
|
||||
aModule.initName)) ||
|
||||
!(aModule.shutdown = PR_FindFunctionSymbol(aModule.lib,
|
||||
aModule.shutdownName))) {
|
||||
|
||||
//fail, :(
|
||||
MAI_LOG_DEBUG(("Fail to find symbol %s in %s",
|
||||
aModule.init ? aModule.shutdownName : aModule.initName,
|
||||
aModule.libName));
|
||||
PR_UnloadLibrary(aModule.lib);
|
||||
aModule.lib = NULL;
|
||||
return NS_ERROR_FAILURE;
|
||||
}
|
||||
return NS_OK;
|
||||
}
|
|
@ -0,0 +1,102 @@
|
|||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
|
||||
/* vim:expandtab:shiftwidth=4:tabstop=4:
|
||||
*/
|
||||
/* ***** BEGIN LICENSE BLOCK *****
|
||||
* Version: NPL 1.1/GPL 2.0/LGPL 2.1
|
||||
*
|
||||
*
|
||||
* The contents of this file are subject to the Mozilla Public
|
||||
* License Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License. You may obtain a copy of
|
||||
* the License at http://www.mozilla.org/MPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS
|
||||
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
||||
* implied. See the License for the specific language governing
|
||||
* rights and limitations under the License.
|
||||
*
|
||||
* The Original Code is mozilla.org code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is Sun Microsystems, Inc.
|
||||
* Portions created by Sun Microsystems are Copyright (C) 2002 Sun
|
||||
* Microsystems, Inc. All Rights Reserved.
|
||||
*
|
||||
* Original Author: Bolian Yin (bolian.yin@sun.com)
|
||||
*
|
||||
* Contributor(s):
|
||||
*
|
||||
* Alternatively, the contents of this file may be used under the terms of
|
||||
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
||||
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
||||
* in which case the provisions of the GPL or the LGPL are applicable instead
|
||||
* of those above. If you wish to allow use of your version of this file only
|
||||
* under the terms of either the GPL or the LGPL, and not to allow others to
|
||||
* use your version of this file under the terms of the NPL, indicate your
|
||||
* decision by deleting the provisions above and replace them with the notice
|
||||
* and other provisions required by the GPL or the LGPL. If you do not delete
|
||||
* the provisions above, a recipient may use your version of this file under
|
||||
* the terms of any one of the NPL, the GPL or the LGPL.
|
||||
*
|
||||
* ***** END LICENSE BLOCK ***** */
|
||||
|
||||
#ifndef __NS_APP_ROOT_ACCESSIBLE_H__
|
||||
#define __NS_APP_ROOT_ACCESSIBLE_H__
|
||||
|
||||
#include "nsArray.h"
|
||||
#include "nsIAccessibleDocument.h"
|
||||
#include "nsAccessibilityService.h"
|
||||
#include "nsAccessibleWrap.h"
|
||||
#include "nsRootAccessibleWrap.h"
|
||||
|
||||
#define MAI_TYPE_APP_ROOT (MAI_TYPE_ATK_OBJECT)
|
||||
|
||||
/* nsAppRootAccessible is for the whole application of Mozilla.
|
||||
* Only one instance of nsAppRootAccessible exists for one Mozilla instance.
|
||||
* And this one should be created when Mozilla Startup (if accessibility
|
||||
* feature has been enabled) and destroyed when Mozilla Shutdown.
|
||||
*
|
||||
* All the accessibility objects for toplevel windows are direct children of
|
||||
* the nsAppRootAccessible instance.
|
||||
*/
|
||||
class nsAppRootAccessible;
|
||||
class nsAppRootAccessible: public nsAccessibleWrap
|
||||
{
|
||||
public:
|
||||
virtual ~nsAppRootAccessible();
|
||||
#ifdef MAI_LOGGING
|
||||
// virtual void DumpMaiObjectInfo(int aDepth);
|
||||
#endif
|
||||
|
||||
static nsAppRootAccessible *Create();
|
||||
|
||||
public:
|
||||
nsAppRootAccessible();
|
||||
|
||||
/* virtual functions from nsAccessibleNode */
|
||||
NS_IMETHOD Init();
|
||||
NS_IMETHOD Shutdown();
|
||||
|
||||
/* virtual functions from nsAccessible */
|
||||
NS_IMETHOD GetAccName(nsAString & aAccName);
|
||||
NS_IMETHOD GetAccDescription(nsAString & aAccDescription);
|
||||
NS_IMETHOD GetAccRole(PRUint32 *aAccRole);
|
||||
NS_IMETHOD GetAccParent(nsIAccessible * *aAccParent);
|
||||
NS_IMETHOD GetAccNextSibling(nsIAccessible * *aAccNextSibling);
|
||||
NS_IMETHOD GetAccPreviousSibling(nsIAccessible **aAccPreviousSibling);
|
||||
NS_IMETHOD GetChildAt(PRInt32 aChildNum, nsIAccessible **aChild);
|
||||
|
||||
NS_IMETHOD GetAccFirstChild(nsIAccessible * *aAccFirstChild);
|
||||
NS_IMETHOD GetAccChildCount(PRInt32 *aAccChildCount);
|
||||
|
||||
/* virtual functions from nsAccessibleWrap */
|
||||
virtual void Initialize(void);
|
||||
// virtual void Finalize(void);
|
||||
|
||||
nsresult AddRootAccessible(nsRootAccessibleWrap *aRootAccWrap);
|
||||
nsresult RemoveRootAccessible(nsRootAccessibleWrap *aRootAccWrap);
|
||||
private:
|
||||
nsCOMPtr<nsIMutableArray> mChildren;
|
||||
PRBool mInitialized;
|
||||
};
|
||||
|
||||
#endif /* __NS_APP_ROOT_ACCESSIBLE_H__ */
|
|
@ -1,26 +1,29 @@
|
|||
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
|
||||
/* vim:expandtab:shiftwidth=4:tabstop=4:
|
||||
*/
|
||||
/* ***** BEGIN LICENSE BLOCK *****
|
||||
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
|
||||
* Version: NPL 1.1/GPL 2.0/LGPL 2.1
|
||||
*
|
||||
* The contents of this file are subject to the Mozilla Public License Version
|
||||
* 1.1 (the "License"); you may not use this file except in compliance with
|
||||
* the License. You may obtain a copy of the License at
|
||||
* http://www.mozilla.org/MPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS IS" basis,
|
||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
||||
* for the specific language governing rights and limitations under the
|
||||
* License.
|
||||
* The contents of this file are subject to the Mozilla Public
|
||||
* License Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License. You may obtain a copy of
|
||||
* the License at http://www.mozilla.org/MPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS
|
||||
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
||||
* implied. See the License for the specific language governing
|
||||
* rights and limitations under the License.
|
||||
*
|
||||
* The Original Code is mozilla.org code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is
|
||||
* Netscape Communications Corporation.
|
||||
* Portions created by the Initial Developer are Copyright (C) 2003
|
||||
* the Initial Developer. All Rights Reserved.
|
||||
* The Initial Developer of the Original Code is Sun Microsystems, Inc.
|
||||
* Portions created by Sun Microsystems are Copyright (C) 2002 Sun
|
||||
* Microsystems, Inc. All Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
* Original Author: Aaron Leventhal (aaronl@netscape.com)
|
||||
* Original Author: Bolian Yin (bolian.yin@sun.com)
|
||||
*
|
||||
* Contributor(s): John Sun (john.sun@sun.com)
|
||||
*
|
||||
* Alternatively, the contents of this file may be used under the terms of
|
||||
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
||||
|
@ -28,19 +31,49 @@
|
|||
* in which case the provisions of the GPL or the LGPL are applicable instead
|
||||
* of those above. If you wish to allow use of your version of this file only
|
||||
* under the terms of either the GPL or the LGPL, and not to allow others to
|
||||
* use your version of this file under the terms of the MPL, indicate your
|
||||
* use your version of this file under the terms of the NPL, indicate your
|
||||
* decision by deleting the provisions above and replace them with the notice
|
||||
* and other provisions required by the GPL or the LGPL. If you do not delete
|
||||
* the provisions above, a recipient may use your version of this file under
|
||||
* the terms of any one of the MPL, the GPL or the LGPL.
|
||||
* the terms of any one of the NPL, the GPL or the LGPL.
|
||||
*
|
||||
* ***** END LICENSE BLOCK ***** */
|
||||
|
||||
#include "nsDocAccessibleWrap.h"
|
||||
#include "nsAccessibleEventData.h"
|
||||
|
||||
#include <atk/atk.h>
|
||||
#include <glib.h>
|
||||
#include <glib-object.h>
|
||||
|
||||
#define YBL_SHORT 1
|
||||
//----- nsDocAccessibleWrap -----
|
||||
|
||||
nsDocAccessibleWrap::nsDocAccessibleWrap(nsIDOMNode *aDOMNode, nsIWeakReference *aShell):
|
||||
/*
|
||||
* Must keep sychronization with enumerate AtkProperty in
|
||||
* accessible/src/base/nsAccessibleEventData.h
|
||||
*/
|
||||
static char * sAtkPropertyNameArray[PROP_LAST] = {
|
||||
0,
|
||||
"accessible_name",
|
||||
"accessible_description",
|
||||
"accessible_parent",
|
||||
"accessible_value",
|
||||
"accessible_role",
|
||||
"accessible_layer",
|
||||
"accessible_mdi_zorder",
|
||||
"accessible_table_caption",
|
||||
"accessible_table_column_description",
|
||||
"accessible_table_column_header",
|
||||
"accessible_table_row_description",
|
||||
"accessible_table_row_header",
|
||||
"accessible_table_summary"
|
||||
};
|
||||
|
||||
static AtkStateType TranslateAState(PRUint32 aAccState);
|
||||
|
||||
nsDocAccessibleWrap::nsDocAccessibleWrap(nsIDOMNode *aDOMNode,
|
||||
nsIWeakReference *aShell):
|
||||
nsDocAccessible(aDOMNode, aShell)
|
||||
{
|
||||
}
|
||||
|
@ -49,8 +82,400 @@ nsDocAccessibleWrap::~nsDocAccessibleWrap()
|
|||
{
|
||||
}
|
||||
|
||||
NS_IMETHODIMP nsDocAccessibleWrap::FireToolkitEvent(PRUint32 aEvent, nsIAccessible* aAccessible, void* aData)
|
||||
NS_IMETHODIMP nsDocAccessibleWrap::FireToolkitEvent(PRUint32 aEvent,
|
||||
nsIAccessible* aAccessible,
|
||||
void* aEventData)
|
||||
{
|
||||
// XXX Bolian fire events from here
|
||||
return NS_OK;
|
||||
NS_ENSURE_ARG_POINTER(aAccessible);
|
||||
|
||||
nsresult rv = NS_ERROR_FAILURE;
|
||||
#ifdef YBL_SHORT
|
||||
return rv;
|
||||
#else
|
||||
|
||||
nsAccessibleWrap *accWrap =
|
||||
NS_STATIC_CAST(nsAccessibleWrap *, aAccessible);
|
||||
MAI_LOG_DEBUG(("\n\nReceived event: aEvent=%u, obj=0x%x, data=0x%x \n",
|
||||
aEvent, aAccessible, aEventData));
|
||||
|
||||
nsAccessibleWrap *oldAccWrap = nsnull, *newAccWrap = nsnull;
|
||||
AtkTableChange * pAtkTableChange = nsnull;
|
||||
|
||||
switch (aEvent) {
|
||||
case nsIAccessibleEventReceiver::EVENT_FOCUS:
|
||||
MAI_LOG_DEBUG(("\n\nReceived: EVENT_FOCUS\n"));
|
||||
atk_focus_tracker_notify(accWrap->GetAtkObject());
|
||||
rv = NS_OK;
|
||||
break;
|
||||
|
||||
case nsIAccessibleEventReceiver::EVENT_STATE_CHANGE:
|
||||
AtkStateChange *pAtkStateChange;
|
||||
AtkStateType atkState;
|
||||
|
||||
MAI_LOG_DEBUG(("\n\nReceived: EVENT_STATE_CHANGE\n"));
|
||||
if (!aEventData)
|
||||
break;
|
||||
|
||||
pAtkStateChange = NS_REINTERPRET_CAST(AtkStateChange *, aEventData);
|
||||
|
||||
switch (pAtkStateChange->state) {
|
||||
case nsIAccessible::STATE_INVISIBLE:
|
||||
atkState = ATK_STATE_VISIBLE;
|
||||
break;
|
||||
case nsIAccessible::STATE_UNAVAILABLE:
|
||||
atkState = ATK_STATE_ENABLED;
|
||||
break;
|
||||
default:
|
||||
atkState = TranslateAState(pAtkStateChange->state);
|
||||
}
|
||||
|
||||
atk_object_notify_state_change(accWrap->GetAtkObject(),
|
||||
atkState, pAtkStateChange->enable);
|
||||
rv = NS_OK;
|
||||
break;
|
||||
|
||||
/*
|
||||
* More complex than I ever thought.
|
||||
* Need handle them separately.
|
||||
*/
|
||||
case nsIAccessibleEventReceiver::EVENT_ATK_PROPERTY_CHANGE :
|
||||
AtkPropertyChange *pAtkPropChange;
|
||||
AtkPropertyValues values;
|
||||
|
||||
MAI_LOG_DEBUG(("\n\nReceived: EVENT_ATK_PROPERTY_CHANGE\n"));
|
||||
if (!aEventData)
|
||||
break;
|
||||
|
||||
pAtkPropChange = NS_REINTERPRET_CAST(AtkPropertyChange *, aEventData);
|
||||
values.property_name = sAtkPropertyNameArray[pAtkPropChange->type];
|
||||
|
||||
MAI_LOG_DEBUG(("\n\nthe type of EVENT_ATK_PROPERTY_CHANGE: %d\n\n",
|
||||
pAtkPropChange->type));
|
||||
|
||||
switch (pAtkPropChange->type) {
|
||||
case PROP_TABLE_CAPTION:
|
||||
case PROP_TABLE_SUMMARY:
|
||||
|
||||
if (pAtkPropChange->oldvalue)
|
||||
oldAccWrap = NS_REINTERPRET_CAST(nsAccessibleWrap *,
|
||||
pAtkPropChange->oldvalue);
|
||||
|
||||
if (pAtkPropChange->newvalue)
|
||||
newAccWrap = NS_REINTERPRET_CAST(nsAccessibleWrap *,
|
||||
pAtkPropChange->newvalue);
|
||||
|
||||
if (oldAccWrap && newAccWrap) {
|
||||
g_value_init(&values.old_value, G_TYPE_POINTER);
|
||||
g_value_set_pointer(&values.old_value,
|
||||
oldAccWrap->GetAtkObject());
|
||||
g_value_init(&values.new_value, G_TYPE_POINTER);
|
||||
g_value_set_pointer(&values.new_value,
|
||||
newAccWrap->GetAtkObject());
|
||||
rv = NS_OK;
|
||||
}
|
||||
/* ??? YBL it is different now, can we still unref them */
|
||||
/*
|
||||
if (oldAccWrap)
|
||||
g_object_unref(oldAccWrap->GetAtkObject());
|
||||
if (newAccWrap)
|
||||
g_object_unref(newAccWrap->GetAtkObject());
|
||||
*/
|
||||
break;
|
||||
|
||||
case PROP_TABLE_COLUMN_DESCRIPTION:
|
||||
case PROP_TABLE_COLUMN_HEADER:
|
||||
case PROP_TABLE_ROW_HEADER:
|
||||
case PROP_TABLE_ROW_DESCRIPTION:
|
||||
g_value_init(&values.new_value, G_TYPE_INT);
|
||||
g_value_set_int(&values.new_value,
|
||||
*NS_REINTERPRET_CAST(gint *,
|
||||
pAtkPropChange->newvalue));
|
||||
rv = NS_OK;
|
||||
break;
|
||||
|
||||
//Perhaps need more cases in the future
|
||||
default:
|
||||
g_value_init (&values.old_value, G_TYPE_POINTER);
|
||||
g_value_set_pointer (&values.old_value, pAtkPropChange->oldvalue);
|
||||
g_value_init (&values.new_value, G_TYPE_POINTER);
|
||||
g_value_set_pointer (&values.new_value, pAtkPropChange->newvalue);
|
||||
rv = NS_OK;
|
||||
}
|
||||
if (NS_SUCCEEDED(rv))
|
||||
g_signal_emit_by_name(accWrap->GetAtkObject(),
|
||||
g_strconcat("property_change::",
|
||||
values.property_name),
|
||||
&values, NULL);
|
||||
|
||||
break;
|
||||
|
||||
case nsIAccessibleEventReceiver::EVENT_ATK_SELECTION_CHANGE:
|
||||
MAI_LOG_DEBUG(("\n\nReceived: EVENT_ATK_SELECTION_CHANGE\n"));
|
||||
g_signal_emit_by_name(accWrap->GetAtkObject(),
|
||||
"selection_changed");
|
||||
rv = NS_OK;
|
||||
break;
|
||||
|
||||
case nsIAccessibleEventReceiver::EVENT_ATK_TEXT_CHANGE:
|
||||
AtkTextChange *pAtkTextChange;
|
||||
|
||||
MAI_LOG_DEBUG(("\n\nReceived: EVENT_ATK_TEXT_CHANGE\n"));
|
||||
if (!aEventData)
|
||||
break;
|
||||
|
||||
pAtkTextChange = NS_REINTERPRET_CAST(AtkTextChange *, aEventData);
|
||||
g_signal_emit_by_name (accWrap->GetAtkObject(),
|
||||
pAtkTextChange->add ? \
|
||||
"text_changed::insert":"text_changed::delete",
|
||||
pAtkTextChange->start,
|
||||
pAtkTextChange->length);
|
||||
rv = NS_OK;
|
||||
break;
|
||||
|
||||
case nsIAccessibleEventReceiver::EVENT_ATK_TEXT_SELECTION_CHANGE:
|
||||
MAI_LOG_DEBUG(("\n\nReceived: EVENT_ATK_TEXT_SELECTION_CHANGE\n"));
|
||||
g_signal_emit_by_name(accWrap->GetAtkObject(),
|
||||
"text_selection_changed");
|
||||
rv = NS_OK;
|
||||
break;
|
||||
|
||||
case nsIAccessibleEventReceiver::EVENT_ATK_TEXT_CARET_MOVE:
|
||||
MAI_LOG_DEBUG(("\n\nReceived: EVENT_ATK_TEXT_CARET_MOVE\n"));
|
||||
if (!aEventData)
|
||||
break;
|
||||
|
||||
MAI_LOG_DEBUG(("\n\nCaret postion: %d", *(gint *)aEventData ));
|
||||
g_signal_emit_by_name(accWrap->GetAtkObject(),
|
||||
"text_caret_moved",
|
||||
// Curent caret position
|
||||
*(gint *)aEventData);
|
||||
rv = NS_OK;
|
||||
break;
|
||||
|
||||
case nsIAccessibleEventReceiver::EVENT_ATK_TABLE_MODEL_CHANGE:
|
||||
MAI_LOG_DEBUG(("\n\nReceived: EVENT_ATK_TABLE_MODEL_CHANGE\n"));
|
||||
g_signal_emit_by_name(accWrap->GetAtkObject(),
|
||||
"model_changed");
|
||||
rv = NS_OK;
|
||||
break;
|
||||
|
||||
case nsIAccessibleEventReceiver::EVENT_ATK_TABLE_ROW_INSERT:
|
||||
MAI_LOG_DEBUG(("\n\nReceived: EVENT_ATK_TABLE_ROW_INSERT\n"));
|
||||
if (!aEventData)
|
||||
break;
|
||||
|
||||
pAtkTableChange = NS_REINTERPRET_CAST(AtkTableChange *, aEventData);
|
||||
|
||||
g_signal_emit_by_name(accWrap->GetAtkObject(),
|
||||
"row_inserted",
|
||||
// After which the rows are inserted
|
||||
pAtkTableChange->index,
|
||||
// The number of the inserted
|
||||
pAtkTableChange->count);
|
||||
rv = NS_OK;
|
||||
break;
|
||||
|
||||
case nsIAccessibleEventReceiver::EVENT_ATK_TABLE_ROW_DELETE:
|
||||
MAI_LOG_DEBUG(("\n\nReceived: EVENT_ATK_TABLE_ROW_DELETE\n"));
|
||||
if (!aEventData)
|
||||
break;
|
||||
|
||||
pAtkTableChange = NS_REINTERPRET_CAST(AtkTableChange *, aEventData);
|
||||
|
||||
g_signal_emit_by_name(accWrap->GetAtkObject(),
|
||||
"row_deleted",
|
||||
// After which the rows are deleted
|
||||
pAtkTableChange->index,
|
||||
// The number of the deleted
|
||||
pAtkTableChange->count);
|
||||
rv = NS_OK;
|
||||
break;
|
||||
|
||||
case nsIAccessibleEventReceiver::EVENT_ATK_TABLE_ROW_REORDER:
|
||||
MAI_LOG_DEBUG(("\n\nReceived: EVENT_ATK_TABLE_ROW_REORDER\n"));
|
||||
g_signal_emit_by_name(accWrap->GetAtkObject(),
|
||||
"row_reordered");
|
||||
rv = NS_OK;
|
||||
break;
|
||||
|
||||
case nsIAccessibleEventReceiver::EVENT_ATK_TABLE_COLUMN_INSERT:
|
||||
MAI_LOG_DEBUG(("\n\nReceived: EVENT_ATK_TABLE_COLUMN_INSERT\n"));
|
||||
if (!aEventData)
|
||||
break;
|
||||
|
||||
pAtkTableChange = NS_REINTERPRET_CAST(AtkTableChange *, aEventData);
|
||||
|
||||
g_signal_emit_by_name(accWrap->GetAtkObject(),
|
||||
"column_inserted",
|
||||
// After which the columns are inserted
|
||||
pAtkTableChange->index,
|
||||
// The number of the inserted
|
||||
pAtkTableChange->count);
|
||||
rv = NS_OK;
|
||||
break;
|
||||
|
||||
case nsIAccessibleEventReceiver::EVENT_ATK_TABLE_COLUMN_DELETE:
|
||||
MAI_LOG_DEBUG(("\n\nReceived: EVENT_ATK_TABLE_COLUMN_DELETE\n"));
|
||||
if (!aEventData)
|
||||
break;
|
||||
|
||||
pAtkTableChange = NS_REINTERPRET_CAST(AtkTableChange *, aEventData);
|
||||
|
||||
g_signal_emit_by_name(accWrap->GetAtkObject(),
|
||||
"column_deleted",
|
||||
// After which the columns are deleted
|
||||
pAtkTableChange->index,
|
||||
// The number of the deleted
|
||||
pAtkTableChange->count);
|
||||
rv = NS_OK;
|
||||
break;
|
||||
|
||||
case nsIAccessibleEventReceiver::EVENT_ATK_TABLE_COLUMN_REORDER:
|
||||
MAI_LOG_DEBUG(("\n\nReceived: EVENT_ATK_TABLE_COLUMN_REORDER\n"));
|
||||
g_signal_emit_by_name(accWrap->GetAtkObject(),
|
||||
"column_reordered");
|
||||
rv = NS_OK;
|
||||
break;
|
||||
|
||||
case nsIAccessibleEventReceiver::EVENT_ATK_VISIBLE_DATA_CHANGE:
|
||||
MAI_LOG_DEBUG(("\n\nReceived: EVENT_ATK_VISIBLE_DATA_CHANGE\n"));
|
||||
g_signal_emit_by_name(accWrap->GetAtkObject(),
|
||||
"visible_data_changed");
|
||||
rv = NS_OK;
|
||||
break;
|
||||
|
||||
// Is a superclass of ATK event children_changed
|
||||
case nsIAccessibleEventReceiver::EVENT_REORDER:
|
||||
AtkChildrenChange *pAtkChildrenChange;
|
||||
|
||||
MAI_LOG_DEBUG(("\n\nReceived: EVENT_REORDER(children_change)\n"));
|
||||
|
||||
pAtkChildrenChange = NS_REINTERPRET_CAST(AtkChildrenChange *,
|
||||
aEventData);
|
||||
nsAccessibleWrap *childAccWrap;
|
||||
if (pAtkChildrenChange && pAtkChildrenChange->child) {
|
||||
childAccWrap = NS_STATIC_CAST(nsAccessibleWrap *,
|
||||
pAtkChildrenChange->child);
|
||||
g_signal_emit_by_name (accWrap->GetAtkObject(),
|
||||
pAtkChildrenChange->add ? \
|
||||
"children_changed::add" : \
|
||||
"children_changed::remove",
|
||||
pAtkChildrenChange->index,
|
||||
childAccWrap->GetAtkObject(),
|
||||
NULL);
|
||||
/* ??? YBL same as above ??? */
|
||||
// g_object_unref(childAccWrap->GetAtkObject());
|
||||
}
|
||||
else {
|
||||
g_signal_emit_by_name (accWrap->GetAtkObject(),
|
||||
"children_changed",
|
||||
-1, NULL, NULL);
|
||||
}
|
||||
|
||||
rv = NS_OK;
|
||||
break;
|
||||
|
||||
/*
|
||||
* Because dealing with menu is very different between nsIAccessible
|
||||
* and ATK, and the menu activity is important, specially transfer the
|
||||
* following two event.
|
||||
* Need more verification by AT test.
|
||||
*/
|
||||
case nsIAccessibleEventReceiver::EVENT_MENUSTART:
|
||||
MAI_LOG_DEBUG(("\n\nReceived: EVENT_MENUSTART\n"));
|
||||
atk_focus_tracker_notify(accWrap->GetAtkObject());
|
||||
g_signal_emit_by_name(accWrap->GetAtkObject(),
|
||||
"selection_changed");
|
||||
rv = NS_OK;
|
||||
break;
|
||||
|
||||
case nsIAccessibleEventReceiver::EVENT_MENUEND:
|
||||
MAI_LOG_DEBUG(("\n\nReceived: EVENT_MENUEND\n"));
|
||||
g_signal_emit_by_name(accWrap->GetAtkObject(),
|
||||
"selection_changed");
|
||||
rv = NS_OK;
|
||||
break;
|
||||
|
||||
default:
|
||||
// Don't transfer others
|
||||
MAI_LOG_DEBUG(("\n\nReceived an unknown event=0x%u\n", aEvent));
|
||||
break;
|
||||
}
|
||||
|
||||
g_object_unref(accWrap->GetAtkObject());
|
||||
return rv;
|
||||
}
|
||||
|
||||
/* static */
|
||||
AtkStateType
|
||||
TranslateAState(PRUint32 aAccState)
|
||||
{
|
||||
switch (aAccState) {
|
||||
case nsIAccessible::STATE_SELECTED:
|
||||
return ATK_STATE_SELECTED;
|
||||
case nsIAccessible::STATE_FOCUSED:
|
||||
return ATK_STATE_FOCUSED;
|
||||
case nsIAccessible::STATE_PRESSED:
|
||||
return ATK_STATE_PRESSED;
|
||||
case nsIAccessible::STATE_CHECKED:
|
||||
return ATK_STATE_CHECKED;
|
||||
case nsIAccessible::STATE_EXPANDED:
|
||||
return ATK_STATE_EXPANDED;
|
||||
case nsIAccessible::STATE_COLLAPSED:
|
||||
return ATK_STATE_EXPANDABLE;
|
||||
// The control can't accept input at this time
|
||||
case nsIAccessible::STATE_BUSY:
|
||||
return ATK_STATE_BUSY;
|
||||
case nsIAccessible::STATE_FOCUSABLE:
|
||||
return ATK_STATE_FOCUSABLE;
|
||||
case nsIAccessible::STATE_SELECTABLE:
|
||||
return ATK_STATE_SELECTABLE;
|
||||
case nsIAccessible::STATE_SIZEABLE:
|
||||
return ATK_STATE_RESIZABLE;
|
||||
case nsIAccessible::STATE_MULTISELECTABLE:
|
||||
return ATK_STATE_MULTISELECTABLE;
|
||||
|
||||
#if 0
|
||||
// The following two state need to deal specially
|
||||
case nsIAccessible::STATE_INVISIBLE:
|
||||
return !ATK_STATE_VISIBLE;
|
||||
|
||||
case nsIAccessible::STATE_UNAVAILABLE:
|
||||
return !ATK_STATE_ENABLED;
|
||||
#endif
|
||||
|
||||
// The following state is
|
||||
// Extended state flags (for non-MSAA, for Java and Gnome/ATK support)
|
||||
// They are only the states that are not already mapped in MSAA
|
||||
// See www.accessmozilla.org/article.php?sid=11 for information on the
|
||||
// mappings between accessibility API state
|
||||
|
||||
case nsIAccessible::STATE_ACTIVE:
|
||||
return ATK_STATE_ACTIVE;
|
||||
case nsIAccessible::STATE_EXPANDABLE:
|
||||
return ATK_STATE_EXPANDABLE;
|
||||
#if 0
|
||||
// Need change definitions in nsIAccessible.idl to avoid
|
||||
// duplicate value
|
||||
case nsIAccessible::STATE_MODAL:
|
||||
return ATK_STATE_MODAL;
|
||||
#endif
|
||||
case nsIAccessible::STATE_MULTI_LINE:
|
||||
return ATK_STATE_MULTI_LINE;
|
||||
case nsIAccessible::STATE_SENSITIVE:
|
||||
return ATK_STATE_SENSITIVE;
|
||||
case nsIAccessible::STATE_RESIZABLE:
|
||||
return ATK_STATE_RESIZABLE;
|
||||
case nsIAccessible::STATE_SHOWING:
|
||||
return ATK_STATE_SHOWING;
|
||||
case nsIAccessible::STATE_SINGLE_LINE:
|
||||
return ATK_STATE_SINGLE_LINE;
|
||||
case nsIAccessible::STATE_TRANSIENT:
|
||||
return ATK_STATE_TRANSIENT;
|
||||
case nsIAccessible::STATE_VERTICAL:
|
||||
return ATK_STATE_VERTICAL;
|
||||
default:
|
||||
return ATK_STATE_INVALID;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
|
|
@ -1,26 +1,29 @@
|
|||
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
|
||||
/* vim:expandtab:shiftwidth=4:tabstop=4:
|
||||
*/
|
||||
/* ***** BEGIN LICENSE BLOCK *****
|
||||
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
|
||||
* Version: NPL 1.1/GPL 2.0/LGPL 2.1
|
||||
*
|
||||
* The contents of this file are subject to the Mozilla Public License Version
|
||||
* 1.1 (the "License"); you may not use this file except in compliance with
|
||||
* the License. You may obtain a copy of the License at
|
||||
* http://www.mozilla.org/MPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS IS" basis,
|
||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
||||
* for the specific language governing rights and limitations under the
|
||||
* License.
|
||||
* The contents of this file are subject to the Mozilla Public
|
||||
* License Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License. You may obtain a copy of
|
||||
* the License at http://www.mozilla.org/MPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS
|
||||
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
||||
* implied. See the License for the specific language governing
|
||||
* rights and limitations under the License.
|
||||
*
|
||||
* The Original Code is mozilla.org code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is
|
||||
* Netscape Communications Corporation.
|
||||
* Portions created by the Initial Developer are Copyright (C) 2003
|
||||
* the Initial Developer. All Rights Reserved.
|
||||
* The Initial Developer of the Original Code is Sun Microsystems, Inc.
|
||||
* Portions created by Sun Microsystems are Copyright (C) 2002 Sun
|
||||
* Microsystems, Inc. All Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
* Original Author: Aaron Leventhal (aaronl@netscape.com)
|
||||
* Original Author: Bolian Yin (bolian.yin@sun.com)
|
||||
*
|
||||
* Contributor(s): John Sun (john.sun@sun.com)
|
||||
*
|
||||
* Alternatively, the contents of this file may be used under the terms of
|
||||
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
||||
|
@ -28,11 +31,11 @@
|
|||
* in which case the provisions of the GPL or the LGPL are applicable instead
|
||||
* of those above. If you wish to allow use of your version of this file only
|
||||
* under the terms of either the GPL or the LGPL, and not to allow others to
|
||||
* use your version of this file under the terms of the MPL, indicate your
|
||||
* use your version of this file under the terms of the NPL, indicate your
|
||||
* decision by deleting the provisions above and replace them with the notice
|
||||
* and other provisions required by the GPL or the LGPL. If you do not delete
|
||||
* the provisions above, a recipient may use your version of this file under
|
||||
* the terms of any one of the MPL, the GPL or the LGPL.
|
||||
* the terms of any one of the NPL, the GPL or the LGPL.
|
||||
*
|
||||
* ***** END LICENSE BLOCK ***** */
|
||||
|
||||
|
@ -48,9 +51,10 @@
|
|||
class nsDocAccessibleWrap: public nsDocAccessible
|
||||
{
|
||||
public:
|
||||
nsDocAccessibleWrap(nsIDOMNode *aNode, nsIWeakReference *aShell);
|
||||
virtual ~nsDocAccessibleWrap();
|
||||
NS_IMETHOD FireToolkitEvent(PRUint32 aEvent, nsIAccessible* aAccessible, void* aData);
|
||||
nsDocAccessibleWrap(nsIDOMNode *aNode, nsIWeakReference *aShell);
|
||||
virtual ~nsDocAccessibleWrap();
|
||||
NS_IMETHOD FireToolkitEvent(PRUint32 aEvent, nsIAccessible* aAccessible,
|
||||
void* aData);
|
||||
};
|
||||
|
||||
#endif
|
||||
|
|
|
@ -1,26 +1,27 @@
|
|||
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
|
||||
/* vim:expandtab:shiftwidth=4:tabstop=4:
|
||||
*/
|
||||
/* ***** BEGIN LICENSE BLOCK *****
|
||||
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
|
||||
* Version: NPL 1.1/GPL 2.0/LGPL 2.1
|
||||
*
|
||||
* The contents of this file are subject to the Mozilla Public License Version
|
||||
* 1.1 (the "License"); you may not use this file except in compliance with
|
||||
* the License. You may obtain a copy of the License at
|
||||
* http://www.mozilla.org/MPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS IS" basis,
|
||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
||||
* for the specific language governing rights and limitations under the
|
||||
* License.
|
||||
* The contents of this file are subject to the Mozilla Public
|
||||
* License Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License. You may obtain a copy of
|
||||
* the License at http://www.mozilla.org/MPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS
|
||||
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
||||
* implied. See the License for the specific language governing
|
||||
* rights and limitations under the License.
|
||||
*
|
||||
* The Original Code is mozilla.org code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is
|
||||
* Netscape Communications Corporation.
|
||||
* Portions created by the Initial Developer are Copyright (C) 2003
|
||||
* the Initial Developer. All Rights Reserved.
|
||||
* The Initial Developer of the Original Code is Sun Microsystems, Inc.
|
||||
* Portions created by Sun Microsystems are Copyright (C) 2002 Sun
|
||||
* Microsystems, Inc. All Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
* Original Author: Aaron Leventhal (aaronl@netscape.com)
|
||||
* Original Author: Bolian Yin (bolian.yin@sun.com)
|
||||
*
|
||||
* Alternatively, the contents of this file may be used under the terms of
|
||||
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
||||
|
@ -28,27 +29,60 @@
|
|||
* in which case the provisions of the GPL or the LGPL are applicable instead
|
||||
* of those above. If you wish to allow use of your version of this file only
|
||||
* under the terms of either the GPL or the LGPL, and not to allow others to
|
||||
* use your version of this file under the terms of the MPL, indicate your
|
||||
* use your version of this file under the terms of the NPL, indicate your
|
||||
* decision by deleting the provisions above and replace them with the notice
|
||||
* and other provisions required by the GPL or the LGPL. If you do not delete
|
||||
* the provisions above, a recipient may use your version of this file under
|
||||
* the terms of any one of the MPL, the GPL or the LGPL.
|
||||
* the terms of any one of the NPL, the GPL or the LGPL.
|
||||
*
|
||||
* ***** END LICENSE BLOCK ***** */
|
||||
|
||||
#include "nsCOMPtr.h"
|
||||
#include "nsRootAccessibleWrap.h"
|
||||
#include "nsIServiceManager.h"
|
||||
#include "nsIAccessibilityService.h"
|
||||
#include "nsAppRootAccessible.h"
|
||||
|
||||
//----- nsRootAccessibleWrap -----
|
||||
|
||||
nsRootAccessibleWrap::nsRootAccessibleWrap(nsIDOMNode *aDOMNode, nsIWeakReference *aShell):
|
||||
nsRootAccessible(aDOMNode, aShell)
|
||||
nsRootAccessibleWrap::nsRootAccessibleWrap(nsIDOMNode *aDOMNode,
|
||||
nsIWeakReference* aShell):
|
||||
nsRootAccessible(aDOMNode, aShell)
|
||||
{
|
||||
MAI_LOG_DEBUG(("New Root Acc=%p\n", (void*)this));
|
||||
}
|
||||
|
||||
nsRootAccessibleWrap::~nsRootAccessibleWrap()
|
||||
{
|
||||
MAI_LOG_DEBUG(("Delete Root Acc=%p\n", (void*)this));
|
||||
}
|
||||
|
||||
NS_IMETHODIMP nsRootAccessibleWrap::Init()
|
||||
{
|
||||
nsRootAccessible::Init();
|
||||
nsAppRootAccessible *root = nsAppRootAccessible::Create();
|
||||
|
||||
nsresult rv = NS_ERROR_FAILURE;
|
||||
if (root)
|
||||
rv = root->AddRootAccessible(this);
|
||||
return rv;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP nsRootAccessibleWrap::Shutdown()
|
||||
{
|
||||
nsAppRootAccessible *root = nsAppRootAccessible::Create();
|
||||
nsresult rv = NS_ERROR_FAILURE;
|
||||
if (root)
|
||||
rv = root->RemoveRootAccessible(this);
|
||||
nsRootAccessible::Shutdown();
|
||||
return rv;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP nsRootAccessibleWrap::GetAccParent(nsIAccessible ** aAccParent)
|
||||
{
|
||||
nsAppRootAccessible *root = nsAppRootAccessible::Create();
|
||||
nsresult rv = NS_OK;
|
||||
if (root) {
|
||||
NS_IF_ADDREF(*aAccParent = root);
|
||||
}
|
||||
else {
|
||||
*aAccParent = nsnull;
|
||||
rv = NS_ERROR_FAILURE;
|
||||
}
|
||||
return rv;
|
||||
}
|
||||
|
|
|
@ -1,26 +1,29 @@
|
|||
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
|
||||
/* vim:expandtab:shiftwidth=4:tabstop=4:
|
||||
*/
|
||||
/* ***** BEGIN LICENSE BLOCK *****
|
||||
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
|
||||
* Version: NPL 1.1/GPL 2.0/LGPL 2.1
|
||||
*
|
||||
* The contents of this file are subject to the Mozilla Public License Version
|
||||
* 1.1 (the "License"); you may not use this file except in compliance with
|
||||
* the License. You may obtain a copy of the License at
|
||||
* http://www.mozilla.org/MPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS IS" basis,
|
||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
||||
* for the specific language governing rights and limitations under the
|
||||
* License.
|
||||
* The contents of this file are subject to the Mozilla Public
|
||||
* License Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License. You may obtain a copy of
|
||||
* the License at http://www.mozilla.org/MPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS
|
||||
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
||||
* implied. See the License for the specific language governing
|
||||
* rights and limitations under the License.
|
||||
*
|
||||
* The Original Code is mozilla.org code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is
|
||||
* Netscape Communications Corporation.
|
||||
* Portions created by the Initial Developer are Copyright (C) 2003
|
||||
* the Initial Developer. All Rights Reserved.
|
||||
* The Initial Developer of the Original Code is Sun Microsystems, Inc.
|
||||
* Portions created by Sun Microsystems are Copyright (C) 2002 Sun
|
||||
* Microsystems, Inc. All Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
* Original Author: Aaron Leventhal (aaronl@netscape.com)
|
||||
* Original Author: Bolian Yin (bolian.yin@sun.com)
|
||||
*
|
||||
* Contributor(s):
|
||||
*
|
||||
* Alternatively, the contents of this file may be used under the terms of
|
||||
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
||||
|
@ -28,29 +31,36 @@
|
|||
* in which case the provisions of the GPL or the LGPL are applicable instead
|
||||
* of those above. If you wish to allow use of your version of this file only
|
||||
* under the terms of either the GPL or the LGPL, and not to allow others to
|
||||
* use your version of this file under the terms of the MPL, indicate your
|
||||
* use your version of this file under the terms of the NPL, indicate your
|
||||
* decision by deleting the provisions above and replace them with the notice
|
||||
* and other provisions required by the GPL or the LGPL. If you do not delete
|
||||
* the provisions above, a recipient may use your version of this file under
|
||||
* the terms of any one of the MPL, the GPL or the LGPL.
|
||||
* the terms of any one of the NPL, the GPL or the LGPL.
|
||||
*
|
||||
* ***** END LICENSE BLOCK ***** */
|
||||
|
||||
/* For documentation of the accessibility architecture,
|
||||
* see http://lxr.mozilla.org/seamonkey/source/accessible/accessible-docs.html
|
||||
*/
|
||||
|
||||
#ifndef _nsRootAccessibleWrap_H_
|
||||
#define _nsRootAccessibleWrap_H_
|
||||
#ifndef __NS_ROOT_ACCESSIBLE_WRAP_H__
|
||||
#define __NS_ROOT_ACCESSIBLE_WRAP_H__
|
||||
|
||||
#include "nsRootAccessible.h"
|
||||
|
||||
/* nsRootAccessibleWrap is the accessible class for toplevel Window.
|
||||
* The instance of nsRootAccessibleWrap will be child of MaiAppRoot instance.
|
||||
* It is added into root when the toplevel window is created, and removed
|
||||
* from root when the toplevel window is destroyed.
|
||||
*/
|
||||
|
||||
class nsRootAccessibleWrap: public nsRootAccessible
|
||||
{
|
||||
public:
|
||||
nsRootAccessibleWrap(nsIDOMNode *aNode, nsIWeakReference *aShell);
|
||||
nsRootAccessibleWrap(nsIDOMNode *aDOMNode, nsIWeakReference* aShell);
|
||||
virtual ~nsRootAccessibleWrap();
|
||||
|
||||
// virtual funcs from nsIAccessNode
|
||||
NS_IMETHOD Init(void);
|
||||
NS_IMETHOD Shutdown(void);
|
||||
|
||||
NS_IMETHOD GetAccParent(nsIAccessible ** aAccParent);
|
||||
};
|
||||
|
||||
|
||||
#endif
|
||||
#endif /* __NS_ROOT_ACCESSIBLE_WRAP_H__ */
|
||||
|
|
|
@ -298,6 +298,11 @@ NS_IMETHODIMP nsAccessible::GetChildAt(PRInt32 aChildNum, nsIAccessible **aChild
|
|||
PRInt32 numChildren;
|
||||
GetAccChildCount(&numChildren);
|
||||
|
||||
if (aChildNum >= numChildren) {
|
||||
*aChild = nsnull;
|
||||
return NS_ERROR_FAILURE;
|
||||
}
|
||||
|
||||
nsCOMPtr<nsIAccessible> current(mFirstChild), nextSibling;
|
||||
PRInt32 index = 0;
|
||||
|
||||
|
|
|
@ -76,7 +76,7 @@ struct AtkPropertyChange {
|
|||
};
|
||||
|
||||
struct AtkChildrenChange {
|
||||
PRUint32 index; // index of child in parent
|
||||
PRInt32 index; // index of child in parent
|
||||
nsIAccessible *child;
|
||||
PRBool add; // true for add, false for delete
|
||||
};
|
||||
|
|
|
@ -531,7 +531,6 @@ widget/src/Makefile
|
|||
widget/src/beos/Makefile
|
||||
widget/src/build/Makefile
|
||||
widget/src/gtk/Makefile
|
||||
widget/src/gtk2/mai/Makefile
|
||||
widget/src/gtksuperwin/Makefile
|
||||
widget/src/gtkxtbin/Makefile
|
||||
widget/src/photon/Makefile
|
||||
|
|
|
@ -92,7 +92,6 @@ my %map = (
|
|||
'liveconnect', 'js/src/liveconnect',
|
||||
'locale', 'intl/locale',
|
||||
'lwbrk', 'intl/lwbrk',
|
||||
'mai', 'widget/src/gtk2/mai',
|
||||
'mailnews', 'mailnews',
|
||||
'MapiProxy', 'mailnews/mapi/mapihook/build',
|
||||
'mfcEmbed', 'embedding/tests/winEmbed',
|
||||
|
|
|
@ -60,14 +60,11 @@ CPPSRCS = \
|
|||
nsClipboard.cpp \
|
||||
nsDragService.cpp \
|
||||
nsSound.cpp \
|
||||
nsGConfInterface.cpp \
|
||||
$(NULL)
|
||||
|
||||
# build our subdirs, too
|
||||
ifdef ACCESSIBILITY
|
||||
DIRS = mai
|
||||
REQUIRES += accessibility
|
||||
CPPSRCS += nsAccessibilityInterface.cpp
|
||||
endif
|
||||
|
||||
SHARED_LIBRARY_LIBS = $(DIST)/lib/libxpwidgets_s.a
|
||||
|
|
|
@ -47,10 +47,6 @@
|
|||
|
||||
#include <gtk/gtkmain.h>
|
||||
|
||||
#ifdef ACCESSIBILITY
|
||||
#include "nsAccessibilityInterface.h"
|
||||
#endif
|
||||
|
||||
static PRBool sInitialized = PR_FALSE;
|
||||
static PLHashTable *sQueueHashTable = nsnull;
|
||||
static PLHashTable *sCountHashTable = nsnull;
|
||||
|
@ -112,9 +108,6 @@ nsAppShell::Create(int *argc, char **argv)
|
|||
|
||||
// XXX add all of the command line handling
|
||||
|
||||
#ifdef ACCESSIBILITY
|
||||
nsAccessibilityInterface::Init();
|
||||
#endif
|
||||
|
||||
if (PR_GetEnv("MOZ_DEBUG_PAINTS")) {
|
||||
gdk_window_set_debug_updates(TRUE);
|
||||
|
|
|
@ -51,10 +51,6 @@
|
|||
#include "nsSound.h"
|
||||
#include "nsBidiKeyboard.h"
|
||||
|
||||
#ifdef ACCESSIBILITY
|
||||
#include "nsAccessibilityInterface.h"
|
||||
#endif
|
||||
|
||||
NS_GENERIC_FACTORY_CONSTRUCTOR(nsWindow)
|
||||
NS_GENERIC_FACTORY_CONSTRUCTOR(nsChildWindow)
|
||||
NS_GENERIC_FACTORY_CONSTRUCTOR(nsAppShell)
|
||||
|
@ -123,9 +119,6 @@ static const nsModuleComponentInfo components[] =
|
|||
PR_STATIC_CALLBACK(void)
|
||||
nsWidgetGtk2ModuleDtor(nsIModule *aSelf)
|
||||
{
|
||||
#ifdef ACCESSIBILITY
|
||||
nsAccessibilityInterface::ShutDown();
|
||||
#endif
|
||||
}
|
||||
|
||||
NS_IMPL_NSGETMODULE_WITH_DTOR(nsWidgetGtk2Module,
|
||||
|
|
|
@ -58,6 +58,15 @@
|
|||
#include "nsIPref.h"
|
||||
#include "nsIServiceManager.h"
|
||||
|
||||
#ifdef ACCESSIBILITY
|
||||
#include "prenv.h"
|
||||
#include "stdlib.h"
|
||||
static PRBool sAccessibilityChecked = PR_FALSE;
|
||||
static PRBool sAccessibilityEnabled = PR_FALSE;
|
||||
static const char sGconfAccKey [] = "/desktop/gnome/interface/accessibility";
|
||||
static const char sAccEnv [] = "GNOME_ACCESSIBILITY";
|
||||
#endif
|
||||
|
||||
/* For SetIcon */
|
||||
#include "nsAppDirectoryServiceDefs.h"
|
||||
#include "nsXPIDLString.h"
|
||||
|
@ -249,7 +258,7 @@ nsWindow::nsWindow()
|
|||
#endif
|
||||
|
||||
#ifdef ACCESSIBILITY
|
||||
mTopLevelAccessible = nsnull;
|
||||
mRootAccessible = nsnull;
|
||||
#endif
|
||||
}
|
||||
|
||||
|
@ -276,9 +285,6 @@ nsWindow::Create(nsIWidget *aParent,
|
|||
{
|
||||
nsresult rv = NativeCreate(aParent, nsnull, aRect, aHandleEventFunction,
|
||||
aContext, aAppShell, aToolkit, aInitData);
|
||||
#ifdef ACCESSIBILITY
|
||||
CreateTopLevelAccessible();
|
||||
#endif
|
||||
return rv;
|
||||
}
|
||||
|
||||
|
@ -293,9 +299,6 @@ nsWindow::Create(nsNativeWidget aParent,
|
|||
{
|
||||
nsresult rv = NativeCreate(nsnull, aParent, aRect, aHandleEventFunction,
|
||||
aContext, aAppShell, aToolkit, aInitData);
|
||||
#ifdef ACCESSIBILITY
|
||||
CreateTopLevelAccessible();
|
||||
#endif
|
||||
return rv;
|
||||
}
|
||||
|
||||
|
@ -376,9 +379,11 @@ nsWindow::Destroy(void)
|
|||
OnDestroy();
|
||||
|
||||
#ifdef ACCESSIBILITY
|
||||
if (mTopLevelAccessible) {
|
||||
nsAccessibilityInterface::RemoveTopLevel(mTopLevelAccessible);
|
||||
mTopLevelAccessible = nsnull;
|
||||
if (mRootAccessible) {
|
||||
nsCOMPtr<nsIAccessNode> accNode(do_QueryInterface(mRootAccessible));
|
||||
if (accNode)
|
||||
accNode->Shutdown();
|
||||
mRootAccessible = nsnull;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
@ -2221,6 +2226,37 @@ nsWindow::NativeCreate(nsIWidget *aParent,
|
|||
// resize so that everything is set to the right dimensions
|
||||
Resize(mBounds.width, mBounds.height, PR_FALSE);
|
||||
|
||||
#ifdef ACCESSIBILITY
|
||||
nsresult rv;
|
||||
if (!sAccessibilityChecked) {
|
||||
sAccessibilityChecked = PR_TRUE;
|
||||
|
||||
//check if accessibility enabled/disabled by environment variable
|
||||
const char *envValue = PR_GetEnv(sAccEnv);
|
||||
if (envValue) {
|
||||
sAccessibilityEnabled = atoi(envValue);
|
||||
LOG(("Accessibility Env %s=%s\n", sAccEnv, envValue));
|
||||
}
|
||||
//check gconf-2 setting
|
||||
else {
|
||||
nsCOMPtr<nsIPrefBranch> sysPrefService =
|
||||
do_GetService(sGconfAccKey, &rv);
|
||||
if (NS_SUCCEEDED(rv) && sysPrefService) {
|
||||
|
||||
// do the work to get gconf setting.
|
||||
// will be done soon later.
|
||||
sysPrefService->GetBoolPref("accessibility.enabled",
|
||||
&sAccessibilityEnabled);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
if (sAccessibilityEnabled) {
|
||||
LOG(("nsWindow:: Create Toplevel Accessibility\n"));
|
||||
CreateRootAccessible();
|
||||
}
|
||||
#endif
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
|
@ -3537,22 +3573,19 @@ key_event_to_context_menu_event(const nsKeyEvent* aKeyEvent,
|
|||
#ifdef ACCESSIBILITY
|
||||
/**
|
||||
* void
|
||||
* nsWindow::CreateTopLevelAccessible
|
||||
* nsWindow::CreateRootAccessible
|
||||
*
|
||||
* request to create the nsIAccessible Object for the toplevel window
|
||||
**/
|
||||
void
|
||||
nsWindow::CreateTopLevelAccessible()
|
||||
nsWindow::CreateRootAccessible()
|
||||
{
|
||||
if (mIsTopLevel && !mTopLevelAccessible &&
|
||||
nsAccessibilityInterface::IsInitialized()) {
|
||||
|
||||
if (mIsTopLevel && !mRootAccessible) {
|
||||
nsCOMPtr<nsIAccessible> acc;
|
||||
DispatchAccessibleEvent(getter_AddRefs(acc));
|
||||
|
||||
if (acc) {
|
||||
mTopLevelAccessible = acc;
|
||||
nsAccessibilityInterface::AddTopLevel(acc);
|
||||
mRootAccessible = acc;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -53,7 +53,8 @@
|
|||
#include <gtk/gtkwindow.h>
|
||||
|
||||
#ifdef ACCESSIBILITY
|
||||
#include "nsAccessibilityInterface.h"
|
||||
#include "nsIAccessNode.h"
|
||||
#include "nsIAccessible.h"
|
||||
#endif
|
||||
|
||||
#ifdef USE_XIM
|
||||
|
@ -283,8 +284,8 @@ private:
|
|||
PRInt32 mSizeState;
|
||||
|
||||
#ifdef ACCESSIBILITY
|
||||
nsCOMPtr<nsIAccessible> mTopLevelAccessible;
|
||||
void CreateTopLevelAccessible();
|
||||
nsCOMPtr<nsIAccessible> mRootAccessible;
|
||||
void CreateRootAccessible();
|
||||
NS_IMETHOD_(PRBool) DispatchAccessibleEvent(nsIAccessible** aAccessible);
|
||||
#endif
|
||||
|
||||
|
|
|
@ -150,8 +150,6 @@ bin/components/libwallet.so
|
|||
bin/components/libwalletviewers.so
|
||||
bin/components/libwidget_gtk.so
|
||||
bin/components/libwidget_gtk2.so
|
||||
; accessibility library for gtk2 is loaded at runtime
|
||||
bin/libmai.so
|
||||
bin/components/libxpconnect.so
|
||||
bin/components/locale.xpt
|
||||
bin/components/mozbrwsr.xpt
|
||||
|
|
Загрузка…
Ссылка в новой задаче