summaryrefslogtreecommitdiff
path: root/patches/a11y/vcl-unx-gtk-a11y-atkwrapper-cxx.diff
diff options
context:
space:
mode:
Diffstat (limited to 'patches/a11y/vcl-unx-gtk-a11y-atkwrapper-cxx.diff')
-rw-r--r--patches/a11y/vcl-unx-gtk-a11y-atkwrapper-cxx.diff595
1 files changed, 0 insertions, 595 deletions
diff --git a/patches/a11y/vcl-unx-gtk-a11y-atkwrapper-cxx.diff b/patches/a11y/vcl-unx-gtk-a11y-atkwrapper-cxx.diff
deleted file mode 100644
index 9bb883ec6..000000000
--- a/patches/a11y/vcl-unx-gtk-a11y-atkwrapper-cxx.diff
+++ /dev/null
@@ -1,595 +0,0 @@
---- /dev/null
-+++ vcl/unx/gtk/a11y/atkwrapper.cxx
-@@ -0,0 +1,592 @@
-+#include <com/sun/star/uno/Any.hxx>
-+#include <com/sun/star/uno/Type.hxx>
-+#include <com/sun/star/uno/Sequence.hxx>
-+#include <com/sun/star/accessibility/AccessibleRole.hpp>
-+#include <com/sun/star/accessibility/AccessibleRelation.hpp>
-+#include <com/sun/star/accessibility/AccessibleRelationType.hpp>
-+#include <com/sun/star/accessibility/AccessibleStateType.hpp>
-+#include <com/sun/star/accessibility/XAccessible.hpp>
-+#include <com/sun/star/accessibility/XAccessibleText.hpp>
-+#include <com/sun/star/accessibility/XAccessibleValue.hpp>
-+#include <com/sun/star/accessibility/XAccessibleAction.hpp>
-+#include <com/sun/star/accessibility/XAccessibleContext.hpp>
-+#include <com/sun/star/accessibility/XAccessibleComponent.hpp>
-+#include <com/sun/star/accessibility/XAccessibleEventBroadcaster.hpp>
-+#include <com/sun/star/accessibility/XAccessibleStateSet.hpp>
-+#include <com/sun/star/accessibility/XAccessibleRelationSet.hpp>
-+#include <com/sun/star/awt/XExtendedToolkit.hpp>
-+#include <com/sun/star/awt/XTopWindow.hpp>
-+#include <com/sun/star/awt/XTopWindowListener.hpp>
-+#include <com/sun/star/awt/XWindow.hpp>
-+#include <com/sun/star/lang/XComponent.hpp>
-+#include <com/sun/star/lang/XServiceInfo.hpp>
-+#include <com/sun/star/lang/XInitialization.hpp>
-+#include <com/sun/star/lang/XMultiServiceFactory.hpp>
-+#include <com/sun/star/lang/XSingleServiceFactory.hpp>
-+#include <com/sun/star/beans/Property.hpp>
-+
-+#include <rtl/ref.hxx>
-+#include <cppuhelper/factory.hxx>
-+#include <cppuhelper/queryinterface.hxx>
-+
-+#include "atkwrapper.hxx"
-+#include "atklistener.hxx"
-+
-+#define ATK_TYPE_OBJECT_WRAPPER atk_object_wrapper_get_type()
-+#define ATK_OBJECT_WRAPPER(obj) \
-+ (G_TYPE_CHECK_INSTANCE_CAST ((obj), ATK_TYPE_OBJECT_WRAPPER, AtkObjectWrapper))
-+
-+static GObjectClass *parent_class = NULL;
-+static GHashTable *uno_to_gobject = NULL;
-+
-+#define TRY_START try {
-+#define TRY_END } catch(const uno::Exception &e) { }
-+#define TRY_END_RETURN(v) } catch(const uno::Exception &e) { return v; }
-+
-+static G_CONST_RETURN gchar *
-+getAsConst( rtl::OUString rString )
-+{
-+ static const int nMax = 10;
-+ static rtl::OString aUgly[nMax];
-+ static int nIdx = 0;
-+ nIdx = (nIdx + 1) % nMax;
-+ aUgly[nIdx] = rtl::OUStringToOString( rString, RTL_TEXTENCODING_UTF8 );
-+ return aUgly[ nIdx ];
-+}
-+
-+static AtkRelationType mapRelationType( sal_Int16 nRelation )
-+{
-+#if 0
-+ static const ::sal_Int16 INVALID = (sal_Int16)0;
-+static const ::sal_Int16 CONTENT_FLOWS_FROM = (sal_Int16)1;
-+static const ::sal_Int16 CONTENT_FLOWS_TO = (sal_Int16)2;
-+static const ::sal_Int16 CONTROLLED_BY = (sal_Int16)3;
-+static const ::sal_Int16 CONTROLLER_FOR = (sal_Int16)4;
-+static const ::sal_Int16 LABEL_FOR = (sal_Int16)5;
-+static const ::sal_Int16 LABELED_BY = (sal_Int16)6;
-+static const ::sal_Int16 MEMBER_OF = (sal_Int16)7;
-+static const ::sal_Int16 SUB_WINDOW_OF = (sal_Int16)8;
-+ ATK_RELATION_NULL = 0,
-+ ATK_RELATION_CONTROLLED_BY,
-+ ATK_RELATION_CONTROLLER_FOR,
-+ ATK_RELATION_LABEL_FOR,
-+ ATK_RELATION_LABELLED_BY,
-+ ATK_RELATION_MEMBER_OF,
-+ ATK_RELATION_NODE_CHILD_OF,
-+ ATK_RELATION_FLOWS_TO,
-+ ATK_RELATION_FLOWS_FROM,
-+ ATK_RELATION_SUBWINDOW_OF,
-+ ATK_RELATION_EMBEDS,
-+ ATK_RELATION_EMBEDDED_BY,
-+ ATK_RELATION_POPUP_FOR,
-+ ATK_RELATION_LAST_DEFINED
-+ AtkRelationType;
-+#endif
-+ return ATK_RELATION_NULL;
-+}
-+
-+AtkStateType mapAtkState( sal_Int16 nState )
-+{
-+ // A perfect / complete mapping ...
-+ switch( nState )
-+ {
-+#define MAP_DIRECT( a ) \
-+ case accessibility::AccessibleStateType::a: \
-+ return ATK_STATE_##a; break
-+
-+ MAP_DIRECT( INVALID );
-+ MAP_DIRECT( ACTIVE );
-+ MAP_DIRECT( ARMED );
-+ MAP_DIRECT( BUSY );
-+ MAP_DIRECT( CHECKED );
-+ MAP_DIRECT( EDITABLE );
-+ MAP_DIRECT( ENABLED );
-+ MAP_DIRECT( EXPANDABLE );
-+ MAP_DIRECT( EXPANDED );
-+ MAP_DIRECT( FOCUSABLE );
-+ MAP_DIRECT( FOCUSED );
-+ MAP_DIRECT( HORIZONTAL );
-+ MAP_DIRECT( ICONIFIED );
-+ MAP_DIRECT( INDETERMINATE );
-+ MAP_DIRECT( MANAGES_DESCENDANTS );
-+ MAP_DIRECT( MODAL );
-+ MAP_DIRECT( MULTI_LINE );
-+ MAP_DIRECT( OPAQUE );
-+ MAP_DIRECT( PRESSED );
-+ MAP_DIRECT( RESIZABLE );
-+ MAP_DIRECT( SELECTABLE );
-+ MAP_DIRECT( SELECTED );
-+ MAP_DIRECT( SENSITIVE );
-+ MAP_DIRECT( SHOWING );
-+ MAP_DIRECT( SINGLE_LINE );
-+ MAP_DIRECT( STALE );
-+ MAP_DIRECT( TRANSIENT );
-+ MAP_DIRECT( VERTICAL );
-+ MAP_DIRECT( VISIBLE );
-+ // a spelling error ...
-+ case accessibility::AccessibleStateType::DEFUNC:
-+ return ATK_STATE_DEFUNCT; break;
-+ case accessibility::AccessibleStateType::MULTI_SELECTABLE:
-+ return ATK_STATE_MULTISELECTABLE; break;
-+ default:
-+ return ATK_STATE_INVALID;
-+ break;
-+ }
-+}
-+
-+static AtkRole mapToAtkRole( sal_Int16 nRole )
-+{
-+ switch( nRole )
-+ {
-+#define MAP(a,b) \
-+ case a: return b; break
-+
-+ MAP( ::accessibility::AccessibleRole::UNKNOWN, ATK_ROLE_UNKNOWN );
-+ MAP( ::accessibility::AccessibleRole::ALERT, ATK_ROLE_ALERT );
-+ MAP( ::accessibility::AccessibleRole::COLUMN_HEADER, ATK_ROLE_COLUMN_HEADER );
-+ MAP( ::accessibility::AccessibleRole::CANVAS, ATK_ROLE_CANVAS );
-+ MAP( ::accessibility::AccessibleRole::CHECK_BOX, ATK_ROLE_CHECK_BOX );
-+ MAP( ::accessibility::AccessibleRole::CHECK_MENU_ITEM, ATK_ROLE_CHECK_MENU_ITEM );
-+ MAP( ::accessibility::AccessibleRole::COLOR_CHOOSER, ATK_ROLE_COLOR_CHOOSER );
-+ MAP( ::accessibility::AccessibleRole::COMBO_BOX, ATK_ROLE_COMBO_BOX );
-+ MAP( ::accessibility::AccessibleRole::DATE_EDITOR, ATK_ROLE_DATE_EDITOR );
-+ MAP( ::accessibility::AccessibleRole::DESKTOP_ICON, ATK_ROLE_DESKTOP_ICON );
-+ MAP( ::accessibility::AccessibleRole::DESKTOP_PANE, ATK_ROLE_DESKTOP_FRAME ); // ? pane
-+ MAP( ::accessibility::AccessibleRole::DIRECTORY_PANE, ATK_ROLE_DIRECTORY_PANE );
-+ MAP( ::accessibility::AccessibleRole::DIALOG, ATK_ROLE_DIALOG );
-+ MAP( ::accessibility::AccessibleRole::DOCUMENT, ATK_ROLE_UNKNOWN ); // - FIXME -
-+ MAP( ::accessibility::AccessibleRole::EMBEDDED_OBJECT, ATK_ROLE_UNKNOWN ); // - FIXME -
-+ MAP( ::accessibility::AccessibleRole::END_NOTE, ATK_ROLE_UNKNOWN ); // - FIXME -
-+ MAP( ::accessibility::AccessibleRole::FILE_CHOOSER, ATK_ROLE_FILE_CHOOSER );
-+ MAP( ::accessibility::AccessibleRole::FILLER, ATK_ROLE_FILLER );
-+ MAP( ::accessibility::AccessibleRole::FONT_CHOOSER, ATK_ROLE_FONT_CHOOSER );
-+ MAP( ::accessibility::AccessibleRole::FOOTER, ATK_ROLE_FOOTER );
-+ MAP( ::accessibility::AccessibleRole::FOOTNOTE, ATK_ROLE_TEXT ); // - FIXME -
-+ MAP( ::accessibility::AccessibleRole::FRAME, ATK_ROLE_FRAME );
-+ MAP( ::accessibility::AccessibleRole::GLASS_PANE, ATK_ROLE_GLASS_PANE );
-+ MAP( ::accessibility::AccessibleRole::GRAPHIC, ATK_ROLE_UNKNOWN ); // - FIXME -
-+ MAP( ::accessibility::AccessibleRole::GROUP_BOX, ATK_ROLE_UNKNOWN ); // - FIXME -
-+ MAP( ::accessibility::AccessibleRole::HEADER, ATK_ROLE_HEADER );
-+ MAP( ::accessibility::AccessibleRole::HEADING, ATK_ROLE_HEADER ); // - FIXME -
-+ MAP( ::accessibility::AccessibleRole::HYPER_LINK, ATK_ROLE_TEXT ); // - FIXME -
-+ MAP( ::accessibility::AccessibleRole::ICON, ATK_ROLE_ICON );
-+ MAP( ::accessibility::AccessibleRole::INTERNAL_FRAME, ATK_ROLE_INTERNAL_FRAME );
-+ MAP( ::accessibility::AccessibleRole::LABEL, ATK_ROLE_LABEL );
-+ MAP( ::accessibility::AccessibleRole::LAYERED_PANE, ATK_ROLE_LAYERED_PANE );
-+ MAP( ::accessibility::AccessibleRole::LIST, ATK_ROLE_LIST );
-+ MAP( ::accessibility::AccessibleRole::LIST_ITEM, ATK_ROLE_LIST_ITEM );
-+ MAP( ::accessibility::AccessibleRole::MENU, ATK_ROLE_MENU );
-+ MAP( ::accessibility::AccessibleRole::MENU_BAR, ATK_ROLE_MENU_BAR );
-+ MAP( ::accessibility::AccessibleRole::MENU_ITEM, ATK_ROLE_MENU_ITEM );
-+ MAP( ::accessibility::AccessibleRole::OPTION_PANE, ATK_ROLE_OPTION_PANE );
-+ MAP( ::accessibility::AccessibleRole::PAGE_TAB, ATK_ROLE_PAGE_TAB );
-+ MAP( ::accessibility::AccessibleRole::PAGE_TAB_LIST, ATK_ROLE_PAGE_TAB_LIST );
-+ MAP( ::accessibility::AccessibleRole::PANEL, ATK_ROLE_PANEL );
-+ MAP( ::accessibility::AccessibleRole::PARAGRAPH, ATK_ROLE_PARAGRAPH );
-+ MAP( ::accessibility::AccessibleRole::PASSWORD_TEXT, ATK_ROLE_PASSWORD_TEXT );
-+ MAP( ::accessibility::AccessibleRole::POPUP_MENU, ATK_ROLE_POPUP_MENU );
-+ MAP( ::accessibility::AccessibleRole::PUSH_BUTTON, ATK_ROLE_PUSH_BUTTON );
-+ MAP( ::accessibility::AccessibleRole::PROGRESS_BAR, ATK_ROLE_PROGRESS_BAR );
-+ MAP( ::accessibility::AccessibleRole::RADIO_BUTTON, ATK_ROLE_RADIO_BUTTON );
-+ MAP( ::accessibility::AccessibleRole::RADIO_MENU_ITEM, ATK_ROLE_RADIO_MENU_ITEM );
-+ MAP( ::accessibility::AccessibleRole::ROW_HEADER, ATK_ROLE_ROW_HEADER );
-+ MAP( ::accessibility::AccessibleRole::ROOT_PANE, ATK_ROLE_ROOT_PANE );
-+ MAP( ::accessibility::AccessibleRole::SCROLL_BAR, ATK_ROLE_SCROLL_BAR );
-+ MAP( ::accessibility::AccessibleRole::SCROLL_PANE, ATK_ROLE_SCROLL_PANE );
-+ MAP( ::accessibility::AccessibleRole::SHAPE, ATK_ROLE_UNKNOWN ); // - FIXME -
-+ MAP( ::accessibility::AccessibleRole::SEPARATOR, ATK_ROLE_SEPARATOR );
-+ MAP( ::accessibility::AccessibleRole::SLIDER, ATK_ROLE_SLIDER );
-+ MAP( ::accessibility::AccessibleRole::SPIN_BOX, ATK_ROLE_SPIN_BUTTON ); // ?
-+ MAP( ::accessibility::AccessibleRole::SPLIT_PANE, ATK_ROLE_SPLIT_PANE );
-+ MAP( ::accessibility::AccessibleRole::STATUS_BAR, ATK_ROLE_STATUSBAR );
-+ MAP( ::accessibility::AccessibleRole::TABLE, ATK_ROLE_TABLE );
-+ MAP( ::accessibility::AccessibleRole::TABLE_CELL, ATK_ROLE_TABLE_CELL );
-+ MAP( ::accessibility::AccessibleRole::TEXT, ATK_ROLE_TEXT );
-+ MAP( ::accessibility::AccessibleRole::TEXT_FRAME, ATK_ROLE_UNKNOWN ); // - FIXME -
-+ MAP( ::accessibility::AccessibleRole::TOGGLE_BUTTON, ATK_ROLE_TOGGLE_BUTTON );
-+ MAP( ::accessibility::AccessibleRole::TOOL_BAR, ATK_ROLE_TOOL_BAR );
-+ MAP( ::accessibility::AccessibleRole::TOOL_TIP, ATK_ROLE_TOOL_TIP );
-+ MAP( ::accessibility::AccessibleRole::TREE, ATK_ROLE_TREE );
-+ MAP( ::accessibility::AccessibleRole::VIEW_PORT, ATK_ROLE_VIEWPORT );
-+ MAP( ::accessibility::AccessibleRole::WINDOW, ATK_ROLE_WINDOW );
-+#undef MAP
-+ }
-+/* Roles unimplemented by OO.o / a11y:
-+ ATK_ROLE_INVALID, ATK_ROLE_ACCEL_LABEL, ATK_ROLE_ANIMATION,
-+ ATK_ROLE_ARROW, ATK_ROLE_CALENDAR, ATK_ROLE_DIAL,
-+ ATK_ROLE_DRAWING_AREA, ATK_ROLE_HTML_CONTAINER, ATK_ROLE_IMAGE,
-+ ATK_ROLE_TABLE_COLUMN_HEADER, ATK_ROLE_TABLE_ROW_HEADER, ATK_ROLE_TEAR_OFF_MENU_ITEM,
-+ ATK_ROLE_TERMINAL, ATK_ROLE_TREE_TABLE, ATK_ROLE_RULER,
-+ ATK_ROLE_APPLICATION, ATK_ROLE_AUTOCOMPLETE, ATK_ROLE_EDITBAR */
-+
-+ return ATK_ROLE_UNKNOWN;
-+}
-+
-+static gchar *
-+mapToGChar( rtl::OUString aString )
-+{
-+ rtl::OString aUtf8 = rtl::OUStringToOString( aString, RTL_TEXTENCODING_UTF8 );
-+ return g_strdup( aUtf8 );
-+}
-+
-+extern "C" {
-+
-+static uno::Reference< accessibility::XAccessibleContext >
-+ getContext( AtkObject *pObject )
-+{
-+ AtkObjectWrapper *pWrap = ATK_OBJECT_WRAPPER( pObject );
-+ return uno::Reference< accessibility::XAccessibleContext >(
-+ pWrap->mpContext, uno::UNO_QUERY );
-+}
-+
-+static G_CONST_RETURN gchar *
-+wrapper_get_name( AtkObject *pObject )
-+{
-+ TRY_START
-+ return getAsConst( getContext( pObject )->getAccessibleName() );
-+ TRY_END_RETURN( NULL )
-+}
-+
-+static G_CONST_RETURN gchar *
-+wrapper_get_description( AtkObject *pObject )
-+{
-+ TRY_START
-+ return getAsConst( getContext( pObject )->getAccessibleDescription() );
-+ TRY_END_RETURN( NULL )
-+}
-+
-+static gint
-+wrapper_get_n_children( AtkObject *pObject )
-+{
-+ TRY_START
-+ return getContext( pObject )->getAccessibleChildCount();
-+ TRY_END_RETURN( 0 )
-+}
-+
-+static AtkObject *
-+wrapper_ref_child( AtkObject *pObject,
-+ gint i )
-+{
-+ TRY_START
-+ return atk_wrapper_get( getContext( pObject )->getAccessibleChild( i ) );
-+ TRY_END_RETURN( NULL )
-+}
-+
-+static gint
-+wrapper_get_index_in_parent( AtkObject *pObject )
-+{
-+ TRY_START
-+ return getContext( pObject )->getAccessibleIndexInParent();
-+ TRY_END_RETURN( 0 )
-+}
-+
-+static AtkRelationSet *
-+wrapper_ref_relation_set( AtkObject *pObject )
-+{
-+ AtkRelationSet *pSet = atk_relation_set_new();
-+ try {
-+ uno::Reference< accessibility::XAccessibleRelationSet > xRelationSet;
-+
-+ xRelationSet = getContext( pObject )->getAccessibleRelationSet();
-+
-+ sal_Int32 nRelations = xRelationSet->getRelationCount();
-+ for( sal_Int32 n = 0; n < nRelations; n++ )
-+ {
-+ accessibility::AccessibleRelation aRelation = xRelationSet->getRelation( n );
-+ sal_uInt32 nTargetCount = aRelation.TargetSet.getLength();
-+ AtkObject *pTargets[ nTargetCount ];
-+
-+ for( sal_uInt32 n = 0; n < nTargetCount; n++ )
-+ {
-+ uno::Reference< accessibility::XAccessible > xAccessible(
-+ aRelation.TargetSet[n], uno::UNO_QUERY );
-+ pTargets[n] = atk_wrapper_get( xAccessible );
-+ }
-+
-+ AtkRelation *pRel = atk_relation_new
-+ ( pTargets, nTargetCount,
-+ mapRelationType( aRelation.RelationType ) );
-+ atk_relation_set_add( pSet, pRel );
-+ g_object_unref( G_OBJECT( pRel ) );
-+ }
-+ }
-+ catch(const uno::Exception &e)
-+ {
-+ g_object_unref( G_OBJECT( pSet ) );
-+ pSet = NULL;
-+ }
-+
-+ return pSet;
-+}
-+
-+static AtkStateSet *
-+wrapper_ref_state_set( AtkObject *pObject )
-+{
-+ TRY_START
-+ uno::Reference< accessibility::XAccessibleStateSet > xStateSet;
-+
-+ xStateSet = getContext( pObject )->getAccessibleStateSet();
-+ AtkStateSet *pSet = atk_state_set_new();
-+
-+ uno::Sequence< sal_Int16 > aStates = xStateSet->getStates();
-+ for( sal_uInt32 n = 0; n < aStates.getLength(); n++ )
-+ atk_state_set_add_state( pSet, mapAtkState( n ) );
-+
-+ return pSet;
-+ TRY_END_RETURN( NULL )
-+}
-+
-+static void
-+atk_object_wrapper_finalize (GObject *obj)
-+{
-+ AtkObjectWrapper *pWrap = ATK_OBJECT_WRAPPER (obj);
-+
-+ if( pWrap->pListener )
-+ {
-+ /* FIXME: shoudl really de-register the listener too:
-+ uno::Reference<accessibility::XAccessibleEventBroadcaster> xBroadcaster
-+ ( xContext, uno::UNO_QUERY );
-+ if( xBroadcaster.is() )
-+ {
-+ pWrap->pListener = new AtkListener( pAObj );
-+ xBroadcaster->removeEventListener( pWrap->pListener );
-+ } */
-+
-+ pWrap->pListener->deRegister();
-+ pWrap->pListener->release();
-+ pWrap->pListener = NULL;
-+ }
-+
-+ if( pWrap->mpAccessible )
-+ {
-+ g_assert( g_hash_table_lookup( uno_to_gobject, pWrap->mpAccessible ) );
-+ g_hash_table_remove( uno_to_gobject, pWrap->mpAccessible );
-+ pWrap->mpAccessible->release();
-+ pWrap->mpAccessible = NULL;
-+ }
-+ if( pWrap->mpContext )
-+ {
-+ pWrap->mpContext->release();
-+ pWrap->mpContext = NULL;
-+ }
-+
-+ parent_class->finalize( obj );
-+}
-+
-+static void
-+atk_object_wrapper_class_init (AtkObjectWrapperClass *klass)
-+{
-+ GObjectClass *gobject_class = G_OBJECT_CLASS( klass );
-+ AtkObjectClass *atk_class = ATK_OBJECT_CLASS( klass );
-+
-+ parent_class = (GObjectClass *) g_type_class_peek_parent (klass);
-+
-+ // GObject methods
-+ gobject_class->finalize = atk_object_wrapper_finalize;
-+
-+ // AtkObject methods
-+ atk_class->get_name = wrapper_get_name;
-+ atk_class->get_description = wrapper_get_description;
-+ atk_class->get_n_children = wrapper_get_n_children;
-+ atk_class->ref_child = wrapper_ref_child;
-+ atk_class->get_index_in_parent = wrapper_get_index_in_parent;
-+ atk_class->ref_relation_set = wrapper_ref_relation_set;
-+ atk_class->ref_state_set = wrapper_ref_state_set;
-+}
-+
-+static void
-+atk_object_wrapper_init (AtkObjectWrapper *pWrap,
-+ AtkObjectWrapperClass *pClass)
-+{
-+}
-+
-+GType
-+atk_object_wrapper_get_type (void)
-+{
-+ static GType type = 0;
-+
-+ if (!type)
-+ {
-+ static const GTypeInfo typeInfo =
-+ {
-+ sizeof (AtkObjectWrapperClass),
-+ (GBaseInitFunc) NULL,
-+ (GBaseFinalizeFunc) NULL,
-+ (GClassInitFunc) atk_object_wrapper_class_init,
-+ (GClassFinalizeFunc) NULL,
-+ NULL,
-+ sizeof (AtkObjectWrapper),
-+ 0,
-+ (GInstanceInitFunc) atk_object_wrapper_init,
-+ } ;
-+ type = g_type_register_static (ATK_TYPE_OBJECT,
-+ "OOoAtkObj",
-+ &typeInfo, (GTypeFlags)0) ;
-+ }
-+ return type;
-+}
-+
-+static bool
-+isOfType( uno::XInterface *pInterface, const uno::Type & rType )
-+{
-+ g_return_val_if_fail( pInterface != NULL, false );
-+
-+ bool bIs = false;
-+ try {
-+ uno::Any aRet = pInterface->queryInterface( rType );
-+
-+ bIs = ( ( typelib_TypeClass_INTERFACE == aRet.pType->eTypeClass ) &&
-+ ( aRet.pReserved != NULL ) );
-+ } catch( const uno::Exception &e) { }
-+
-+ return bIs;
-+}
-+
-+// I suck: bite me.
-+#include "atkcomponent.cxx"
-+#include "atkaction.cxx"
-+#include "atktext.cxx"
-+#include "atkvalue.cxx"
-+
-+const struct {
-+ const char *name;
-+ GInterfaceInitFunc aInit;
-+ GType (*aGetGIfaceType) (void);
-+ const uno::Type & (*aGetUnoType) (void *);
-+} aTypeTable[] = {
-+// re-location heaven:
-+ {
-+ "Comp", (GInterfaceInitFunc) componentIfaceInit,
-+ atk_component_get_type,
-+ accessibility::XAccessibleComponent::static_type
-+ },
-+ {
-+ "Act", (GInterfaceInitFunc) actionIfaceInit,
-+ atk_action_get_type,
-+ accessibility::XAccessibleAction::static_type
-+ },
-+ {
-+ "Txt", (GInterfaceInitFunc) textIfaceInit,
-+ atk_text_get_type,
-+ accessibility::XAccessibleText::static_type
-+ },
-+ {
-+ "Val", (GInterfaceInitFunc) valueIfaceInit,
-+ atk_value_get_type,
-+ accessibility::XAccessibleValue::static_type
-+ }
-+};
-+const int aTypeTableSize = G_N_ELEMENTS( aTypeTable );
-+
-+static GType
-+ensureTypeFor( uno::XInterface *pAccessible )
-+{
-+ int i;
-+ int bTypes[ aTypeTableSize ] = { 0, };
-+ rtl::OString aTypeName( "OOoAtkObj" );
-+
-+ for( i = 0; i < aTypeTableSize; i++ )
-+ {
-+ if( isOfType( pAccessible, aTypeTable[i].aGetUnoType(0) ) )
-+ {
-+ aTypeName += aTypeTable[i].name;
-+ bTypes[i] = TRUE;
-+ }
-+// g_message( "Accessible %p has type '%s' (%d)",
-+// pAccessible, aTypeTable[i].name, bTypes[i] );
-+ }
-+
-+ GType nType = g_type_from_name( aTypeName );
-+ if( nType == G_TYPE_INVALID )
-+ {
-+ GTypeInfo aTypeInfo = {
-+ sizeof( AtkObjectWrapperClass ),
-+ NULL, NULL, NULL, NULL, NULL,
-+ sizeof( AtkObjectWrapper ),
-+ 0, NULL
-+ } ;
-+ nType = g_type_register_static( ATK_TYPE_OBJECT_WRAPPER,
-+ aTypeName, &aTypeInfo, (GTypeFlags)0 ) ;
-+
-+ for( int i = 0; i < aTypeTableSize; i++ )
-+ if( bTypes[i] )
-+ {
-+ GInterfaceInfo aIfaceInfo = { NULL, NULL, NULL };
-+ aIfaceInfo.interface_init = aTypeTable[i].aInit;
-+ g_type_add_interface_static (nType, aTypeTable[i].aGetGIfaceType(),
-+ &aIfaceInfo);
-+ }
-+ }
-+ return nType;
-+}
-+
-+static void initialize( AtkObjectWrapper *pWrap )
-+{
-+ AtkObject *pAObj = ATK_OBJECT( pWrap );
-+
-+ try {
-+ uno::Reference< accessibility::XAccessibleContext > xContext = pWrap->mpContext;
-+
-+ rtl::OString aValue;
-+ atk_object_set_role( pAObj, mapToAtkRole( xContext->getAccessibleRole() ) );
-+
-+ uno::Reference< accessibility::XAccessible > xParent;
-+ xParent = xContext->getAccessibleParent();
-+ if( xParent.is() )
-+ atk_object_set_parent( pAObj, atk_wrapper_get( xParent ) );
-+ else
-+ atk_object_set_parent( pAObj, atk_get_root() );
-+
-+ // Hook up basic events
-+ uno::Reference<accessibility::XAccessibleEventBroadcaster> xBroadcaster
-+ ( xContext, uno::UNO_QUERY );
-+ if( xBroadcaster.is() )
-+ {
-+ pWrap->pListener = new AtkListener( pAObj );
-+ xBroadcaster->addEventListener( pWrap->pListener );
-+ }
-+ } catch (const uno::Exception &e)
-+ {
-+ g_warning( "exception initializing accessible" );
-+ }
-+}
-+
-+AtkObject *
-+atk_wrapper_get( const uno::Reference< accessibility::XAccessible > &rAccessible )
-+{
-+ gpointer cached;
-+ accessibility::XAccessible *pAccessible = rAccessible.get();
-+
-+ g_return_val_if_fail( pAccessible != NULL, NULL );
-+
-+ // We assume direct pointer comparison is sufficient...
-+ if( !uno_to_gobject )
-+ uno_to_gobject = g_hash_table_new (NULL, NULL);
-+
-+ if( (cached = g_hash_table_lookup (uno_to_gobject, (gpointer) pAccessible) ) )
-+ return ATK_OBJECT (g_object_ref (cached));
-+
-+ uno::Reference< accessibility::XAccessibleContext > xContext;
-+ try {
-+ xContext = pAccessible->getAccessibleContext();
-+ } catch(const uno::Exception &e) {}
-+
-+ accessibility::XAccessibleContext *pContext = xContext.get();
-+ g_return_val_if_fail( xContext != NULL, NULL );
-+
-+ GType nType = ensureTypeFor( pContext );
-+ cached = g_object_new( nType, NULL);
-+ g_hash_table_insert( uno_to_gobject, (gpointer) pAccessible, cached );
-+ AtkObjectWrapper *pWrap = ATK_OBJECT_WRAPPER( cached );
-+
-+ pAccessible->acquire();
-+ pWrap->mpAccessible = pAccessible;
-+ pContext->acquire();
-+ pWrap->mpContext = pContext;
-+
-+ initialize( pWrap );
-+
-+ return ATK_OBJECT( pWrap );
-+}
-+
-+}; // extern C