Index: ui/accessibility/platform/atk_util_auralinux.cc |
diff --git a/ui/accessibility/platform/atk_util_auralinux.cc b/ui/accessibility/platform/atk_util_auralinux.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..a15df08137d874609305f90a6bca6e5c15e5c213 |
--- /dev/null |
+++ b/ui/accessibility/platform/atk_util_auralinux.cc |
@@ -0,0 +1,161 @@ |
+// Copyright 2015 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include <atk/atk.h> |
+#include <gconf/gconf-client.h> |
+#include <glib-2.0/gmodule.h> |
+ |
+#include "base/files/file_path.h" |
+#include "base/logging.h" |
+#include "base/memory/singleton.h" |
+#include "ui/accessibility/platform/atk_util_auralinux.h" |
+#include "ui/accessibility/platform/ax_platform_node_auralinux.h" |
+ |
+namespace { |
+ |
+const char kGnomeAccessibilityEnabledKey[] = |
+ "/desktop/gnome/interface/accessibility"; |
+ |
+bool ShouldEnableAccessibility() { |
+ GConfClient* client = gconf_client_get_default(); |
+ if (!client) { |
+ LOG(ERROR) << "gconf_client_get_default failed"; |
+ return false; |
+ } |
+ |
+ GError* error = nullptr; |
+ gboolean value = gconf_client_get_bool(client, |
+ kGnomeAccessibilityEnabledKey, |
+ &error); |
+ if (error) { |
+ VLOG(1) << "gconf_client_get_bool failed"; |
+ g_error_free(error); |
+ g_object_unref(client); |
+ return false; |
+ } |
+ |
+ g_object_unref(client); |
+ return value; |
+} |
+ |
+} // namespace |
+ |
+G_BEGIN_DECLS |
+ |
+// |
+// atk_util_auralinux AtkObject definition and implementation. |
+// |
+ |
+#define ATK_UTIL_AURALINUX_TYPE (atk_util_auralinux_get_type()) |
+#define ATK_UTIL_AURALINUX(obj) \ |
+ (G_TYPE_CHECK_INSTANCE_CAST((obj), \ |
+ ATK_UTIL_AURALINUX_TYPE, \ |
+ AtkUtilAuraLinux)) |
+#define ATK_UTIL_AURALINUX_CLASS(klass) \ |
+ (G_TYPE_CHECK_CLASS_CAST((klass), \ |
+ ATK_UTIL_AURALINUX_TYPE, \ |
+ AtkUtilAuraLinuxClass)) |
+#define IS_ATK_UTIL_AURALINUX(obj) \ |
+ (G_TYPE_CHECK_INSTANCE_TYPE((obj), ATK_UTIL_AURALINUX_TYPE)) |
+#define IS_ATK_UTIL_AURALINUX_CLASS(klass) \ |
+ (G_TYPE_CHECK_CLASS_TYPE((klass), ATK_UTIL_AURALINUX_TYPE)) |
+#define ATK_UTIL_AURALINUX_GET_CLASS(obj) \ |
+ (G_TYPE_INSTANCE_GET_CLASS((obj), \ |
+ ATK_UTIL_AURALINUX_TYPE, \ |
+ AtkUtilAuraLinuxClass)) |
+ |
+typedef struct _AtkUtilAuraLinux AtkUtilAuraLinux; |
+typedef struct _AtkUtilAuraLinuxClass AtkUtilAuraLinuxClass; |
+ |
+struct _AtkUtilAuraLinux |
+{ |
+ AtkUtil parent; |
+}; |
+ |
+struct _AtkUtilAuraLinuxClass |
+{ |
+ AtkUtilClass parent_class; |
+}; |
+ |
+GType atk_util_auralinux_get_type(); |
+ |
+G_DEFINE_TYPE(AtkUtilAuraLinux, atk_util_auralinux, ATK_TYPE_UTIL); |
+ |
+static void atk_util_auralinux_init(AtkUtilAuraLinux *ax_util) { |
+} |
+ |
+static AtkObject* atk_util_auralinux_get_root() { |
+ ui::AXPlatformNode* application = ui::AXPlatformNodeAuraLinux::application(); |
+ if (application) { |
+ return application->GetNativeViewAccessible(); |
+ } |
+ return nullptr; |
+} |
+ |
+static G_CONST_RETURN gchar* atk_util_auralinux_get_toolkit_name(void) { |
+ return "Chromium"; |
+} |
+ |
+static G_CONST_RETURN gchar* atk_util_auralinux_get_toolkit_version(void) { |
+ return "1.0"; |
+} |
+ |
+static void atk_util_auralinux_class_init(AtkUtilAuraLinuxClass *klass) { |
+ AtkUtilClass *atk_class; |
+ gpointer data; |
+ |
+ data = g_type_class_peek(ATK_TYPE_UTIL); |
+ atk_class = ATK_UTIL_CLASS(data); |
+ |
+ atk_class->get_root = atk_util_auralinux_get_root; |
+ atk_class->get_toolkit_name = atk_util_auralinux_get_toolkit_name; |
+ atk_class->get_toolkit_version = atk_util_auralinux_get_toolkit_version; |
+} |
+ |
+G_END_DECLS |
+ |
+// |
+// AtkUtilAuraLinuxClass implementation. |
+// |
+ |
+namespace ui { |
+ |
+// static |
+AtkUtilAuraLinux* AtkUtilAuraLinux::GetInstance() { |
+ return Singleton<AtkUtilAuraLinux>::get(); |
+} |
+ |
+AtkUtilAuraLinux::AtkUtilAuraLinux() { |
+ // Register our util class. |
+ g_type_class_unref(g_type_class_ref(ATK_UTIL_AURALINUX_TYPE)); |
+ |
+ if (!ShouldEnableAccessibility()) { |
+ VLOG(1) << "Will not enable ATK accessibility support."; |
+ return; |
+ } |
+ |
+ VLOG(1) << "Enabling ATK accessibility support."; |
+ |
+ // Try to load libatk-bridge.so. |
+ base::FilePath atk_bridge_path(ATK_LIB_DIR); |
+ atk_bridge_path = atk_bridge_path.Append("gtk-2.0/modules/libatk-bridge.so"); |
+ GModule* bridge = g_module_open(atk_bridge_path.value().c_str(), |
+ static_cast<GModuleFlags>(0)); |
+ if (!bridge) { |
+ VLOG(1) << "Unable to open module " << atk_bridge_path.value(); |
+ return; |
+ } |
+ |
+ // Try to call gnome_accessibility_module_init from libatk-bridge.so. |
+ void (*gnome_accessibility_module_init)(); |
+ if (g_module_symbol(bridge, "gnome_accessibility_module_init", |
+ (gpointer *)&gnome_accessibility_module_init)) { |
+ (*gnome_accessibility_module_init)(); |
+ } |
+} |
+ |
+AtkUtilAuraLinux::~AtkUtilAuraLinux() { |
+} |
+ |
+} // namespace ui |