diff options
Diffstat (limited to 'patches/a11y/vcl-unx-gtk-a11y-atkwrapper-cxx.diff')
-rw-r--r-- | patches/a11y/vcl-unx-gtk-a11y-atkwrapper-cxx.diff | 595 |
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 |