[Libreoffice-commits] core.git: include/vcl vcl/source vcl/unx

Caolán McNamara caolanm at redhat.com
Sun Mar 25 15:37:56 UTC 2018


 include/vcl/weld.hxx          |    6 +++-
 vcl/source/app/salvtables.cxx |    7 +++--
 vcl/unx/gtk3/gtk3gtkinst.cxx  |   56 +++++++++++++++++++++++++++++++++++++++---
 3 files changed, 61 insertions(+), 8 deletions(-)

New commits:
commit 54c2637c1c9b526ffd9423e2d8e431474b535276
Author: Caolán McNamara <caolanm at redhat.com>
Date:   Fri Mar 23 14:53:02 2018 +0000

    provide a route to weld accessibility
    
    Change-Id: I92e88a4356cb8e4bd958fd86d33c52f5be82be54
    Reviewed-on: https://gerrit.libreoffice.org/51787
    Tested-by: Jenkins <ci at libreoffice.org>
    Reviewed-by: Caolán McNamara <caolanm at redhat.com>
    Tested-by: Caolán McNamara <caolanm at redhat.com>

diff --git a/include/vcl/weld.hxx b/include/vcl/weld.hxx
index d6234273b703..4a8340e1ed63 100644
--- a/include/vcl/weld.hxx
+++ b/include/vcl/weld.hxx
@@ -17,6 +17,8 @@
 #include <vcl/field.hxx>
 #include <vcl/virdev.hxx>
 
+typedef css::uno::Reference<css::accessibility::XAccessible> a11yref;
+
 namespace weld
 {
 class Container;
@@ -595,7 +597,9 @@ public:
     virtual TextView* weld_text_view(const OString& id, bool bTakeOwnership = false) = 0;
     virtual Expander* weld_expander(const OString& id, bool bTakeOwnership = false) = 0;
     virtual Entry* weld_entry(const OString& id, bool bTakeOwnership = false) = 0;
-    virtual DrawingArea* weld_drawing_area(const OString& id, bool bTakeOwnership = false) = 0;
+    virtual DrawingArea* weld_drawing_area(const OString& id, const a11yref& rA11yImpl = nullptr,
+                                           bool bTakeOwnership = false)
+        = 0;
     virtual ~Builder() {}
 };
 
diff --git a/vcl/source/app/salvtables.cxx b/vcl/source/app/salvtables.cxx
index 9cfe42eb9376..9e0b4eb0ce0a 100644
--- a/vcl/source/app/salvtables.cxx
+++ b/vcl/source/app/salvtables.cxx
@@ -1224,10 +1224,11 @@ private:
     DECL_LINK(MouseReleaseHdl, const Point&, void);
 
 public:
-    SalInstanceDrawingArea(VclDrawingArea* pDrawingArea, bool bTakeOwnership)
+    SalInstanceDrawingArea(VclDrawingArea* pDrawingArea, const a11yref& rAlly, bool bTakeOwnership)
         : SalInstanceWidget(pDrawingArea, bTakeOwnership)
         , m_xDrawingArea(pDrawingArea)
     {
+        m_xDrawingArea->SetAccessible(rAlly);
         m_xDrawingArea->SetPaintHdl(LINK(this, SalInstanceDrawingArea, PaintHdl));
         m_xDrawingArea->SetResizeHdl(LINK(this, SalInstanceDrawingArea, ResizeHdl));
         m_xDrawingArea->SetMousePressHdl(LINK(this, SalInstanceDrawingArea, MousePressHdl));
@@ -1601,10 +1602,10 @@ public:
         return pExpander ? new SalInstanceExpander(pExpander, bTakeOwnership) : nullptr;
     }
 
-    virtual weld::DrawingArea* weld_drawing_area(const OString &id, bool bTakeOwnership) override
+    virtual weld::DrawingArea* weld_drawing_area(const OString &id, const a11yref& rA11yImpl, bool bTakeOwnership) override
     {
         VclDrawingArea* pDrawingArea = m_xBuilder->get<VclDrawingArea>(id);
-        return pDrawingArea ? new SalInstanceDrawingArea(pDrawingArea, bTakeOwnership) : nullptr;
+        return pDrawingArea ? new SalInstanceDrawingArea(pDrawingArea, rA11yImpl, bTakeOwnership) : nullptr;
     }
 
     virtual ~SalInstanceBuilder() override
diff --git a/vcl/unx/gtk3/gtk3gtkinst.cxx b/vcl/unx/gtk3/gtk3gtkinst.cxx
index 947d1cc2f1da..c5ba7be58909 100644
--- a/vcl/unx/gtk3/gtk3gtkinst.cxx
+++ b/vcl/unx/gtk3/gtk3gtkinst.cxx
@@ -8,7 +8,7 @@
  */
 
 #include "../gtk/gtkinst.cxx"
-
+#include "../gtk/a11y/atkwrapper.hxx"
 #include <com/sun/star/lang/IllegalArgumentException.hpp>
 #include <com/sun/star/lang/XMultiServiceFactory.hpp>
 #include <com/sun/star/lang/XServiceInfo.hpp>
@@ -2615,6 +2615,8 @@ class GtkInstanceDrawingArea : public GtkInstanceWidget, public virtual weld::Dr
 {
 private:
     GtkDrawingArea* m_pDrawingArea;
+    a11yref m_xAccessible;
+    AtkObject *m_pAccessible;
     ScopedVclPtrInstance<VirtualDevice> m_xDevice;
     std::vector<unsigned char> m_aBuffer;
     cairo_surface_t* m_pSurface;
@@ -2699,9 +2701,11 @@ private:
     }
 
 public:
-    GtkInstanceDrawingArea(GtkDrawingArea* pDrawingArea, bool bTakeOwnership)
+    GtkInstanceDrawingArea(GtkDrawingArea* pDrawingArea, const a11yref& rA11y, bool bTakeOwnership)
         : GtkInstanceWidget(GTK_WIDGET(pDrawingArea), bTakeOwnership)
         , m_pDrawingArea(pDrawingArea)
+        , m_xAccessible(rA11y)
+        , m_pAccessible(nullptr)
         , m_xDevice(nullptr, Size(1, 1), DeviceFormat::DEFAULT)
         , m_pSurface(nullptr)
         , m_nDrawSignalId(g_signal_connect(m_pDrawingArea, "draw", G_CALLBACK(signalDraw), this))
@@ -2710,6 +2714,14 @@ public:
         , m_nMotionSignalId(g_signal_connect(m_pDrawingArea, "motion-notify-event", G_CALLBACK(signalMotion), this))
         , m_nButtonReleaseSignalId(g_signal_connect(m_pDrawingArea, "button-release-event", G_CALLBACK(signalButton), this))
     {
+        g_object_set_data(G_OBJECT(m_pDrawingArea), "g-lo-GtkInstanceDrawingArea", this);
+    }
+
+    AtkObject* GetAtkObject()
+    {
+        if (!m_pAccessible && m_xAccessible.is())
+            m_pAccessible = atk_object_wrapper_new(m_xAccessible);
+        return m_pAccessible;
     }
 
     virtual void queue_draw() override
@@ -2724,6 +2736,9 @@ public:
 
     virtual ~GtkInstanceDrawingArea() override
     {
+        g_object_steal_data(G_OBJECT(m_pDrawingArea), "g-lo-GtkInstanceDrawingArea");
+        if (m_pAccessible)
+            g_object_unref(m_pAccessible);
         if (m_pSurface)
             cairo_surface_destroy(m_pSurface);
         g_signal_handler_disconnect(m_pDrawingArea, m_nButtonPressSignalId);
@@ -3107,6 +3122,37 @@ namespace
     }
 }
 
+namespace
+{
+
+AtkObject* (*default_drawing_area_get_accessible)(GtkWidget *widget);
+
+AtkObject* drawing_area_get_accessibity(GtkWidget *pWidget)
+{
+    void* pData = g_object_get_data(G_OBJECT(pWidget), "g-lo-GtkInstanceDrawingArea");
+    GtkInstanceDrawingArea* pDrawingArea = static_cast<GtkInstanceDrawingArea*>(pData);
+    AtkObject *pAtkObj = pDrawingArea ? pDrawingArea->GetAtkObject() : nullptr;
+    if (pAtkObj)
+        return pAtkObj;
+    return default_drawing_area_get_accessible(pWidget);
+}
+
+void ensure_intercept_drawing_area_accessibility()
+{
+    static bool bDone;
+    if (!bDone)
+    {
+        gpointer pClass = g_type_class_ref(GTK_TYPE_DRAWING_AREA);
+        GtkWidgetClass* pWidgetClass = GTK_WIDGET_CLASS(pClass);
+        default_drawing_area_get_accessible = pWidgetClass->get_accessible;
+        pWidgetClass->get_accessible = drawing_area_get_accessibity;
+        g_type_class_unref(pClass);
+        bDone = true;
+    }
+}
+
+}
+
 class GtkInstanceBuilder : public weld::Builder
 {
 private:
@@ -3120,6 +3166,8 @@ public:
         , m_sHelpRoot(rUIFile)
         , m_pParentWidget(pParent)
     {
+        ensure_intercept_drawing_area_accessibility();
+
         OUString aUri(rUIRoot + rUIFile);
         OUString aPath;
         osl::FileBase::getSystemPathFromFileURL(aUri, aPath);
@@ -3301,13 +3349,13 @@ public:
         return new GtkInstanceExpander(pExpander, bTakeOwnership);
     }
 
-    virtual weld::DrawingArea* weld_drawing_area(const OString &id, bool bTakeOwnership) override
+    virtual weld::DrawingArea* weld_drawing_area(const OString &id, const a11yref& rA11y, bool bTakeOwnership) override
     {
         GtkDrawingArea* pDrawingArea = GTK_DRAWING_AREA(gtk_builder_get_object(m_pBuilder, id.getStr()));
         if (!pDrawingArea)
             return nullptr;
         auto_add_parentless_widgets_to_container(GTK_WIDGET(pDrawingArea));
-        return new GtkInstanceDrawingArea(pDrawingArea, bTakeOwnership);
+        return new GtkInstanceDrawingArea(pDrawingArea, rA11y, bTakeOwnership);
     }
 };
 


More information about the Libreoffice-commits mailing list