[gnome-shell] Added a11y initialization code
- From: Alejandro Piñeiro Iglesias <apinheiro src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-shell] Added a11y initialization code
- Date: Thu, 20 Jan 2011 14:50:14 +0000 (UTC)
commit 13cc58937e8a9da88e3b3908946ecac97099a176
Author: Alejandro Piñeiro <apinheiro igalia com>
Date: Tue Jan 4 00:42:38 2011 +0100
Added a11y initialization code
This basically:
* Checks a11y configuration properties
* Checks if clutter has a11y enabled
* Loads atk-bridge
It also ensure proper NO_GAIL and NO_AT_BRIDGE values on gnome-shell
startup script
https://bugzilla.gnome.org/show_bug.cgi?id=612599
src/Makefile.am | 2 +
src/gnome-shell-plugin.c | 3 +
src/gnome-shell.in | 13 ++++-
src/shell-a11y.c | 165 ++++++++++++++++++++++++++++++++++++++++++++++
src/shell-a11y.h | 32 +++++++++
5 files changed, 214 insertions(+), 1 deletions(-)
---
diff --git a/src/Makefile.am b/src/Makefile.am
index 0740f06..f252e5b 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -81,6 +81,8 @@ libgnome_shell_la_SOURCES = \
shell-wm-private.h \
gnome-shell-plugin.c \
shell-app.c \
+ shell-a11y.h \
+ shell-a11y.c \
shell-app-system.c \
shell-app-usage.c \
shell-arrow.c \
diff --git a/src/gnome-shell-plugin.c b/src/gnome-shell-plugin.c
index c77cbda..96075f4 100644
--- a/src/gnome-shell-plugin.c
+++ b/src/gnome-shell-plugin.c
@@ -52,6 +52,7 @@
#include "shell-perf-log.h"
#include "shell-wm-private.h"
#include "st.h"
+#include "shell-a11y.h"
static void gnome_shell_plugin_dispose (GObject *object);
static void gnome_shell_plugin_finalize (GObject *object);
@@ -420,6 +421,8 @@ gnome_shell_plugin_start (MetaPlugin *plugin)
bindtextdomain (GETTEXT_PACKAGE, LOCALEDIR);
bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8");
+ shell_a11y_init ();
+
settings = gtk_settings_get_default ();
g_object_connect (settings,
"signal::notify::gtk-xft-dpi",
diff --git a/src/gnome-shell.in b/src/gnome-shell.in
index 8500d98..a161029 100755
--- a/src/gnome-shell.in
+++ b/src/gnome-shell.in
@@ -219,12 +219,23 @@ def start_shell(perf_output=None):
js_dir = os.path.join('@pkgdatadir@', 'js')
# Set up environment
+
+ # About the value of NO_GAIL and NO_AT_BRIDGE: If a11y is enabled,
+ # gtk_init() will normally load gail and at-bridge. But we don't
+ # want at-bridge to be loaded until after clutter is initialized
+ # (which mutter does after initializing gtk) and we don't want
+ # gail to be loaded at all. So set these flags. shell_a11y_init()
+ # will clear them so they don't get passed to gnome-shell's
+ # children.
+
env = dict(os.environ)
env.update({'GNOME_SHELL_JS' : js_dir,
'PATH' : '@MUTTER_BIN_DIR@:' + os.environ.get('PATH', ''),
'XDG_CONFIG_DIRS' : '@sysconfdir@/xdg:' + (os.environ.get('XDG_CONFIG_DIRS') or '/etc/xdg'),
'XDG_DATA_DIRS' : '@datadir@:' + (os.environ.get('XDG_DATA_DIRS') or '/usr/local/share:/usr/share'),
- 'GNOME_DISABLE_CRASH_DIALOG' : '1'})
+ 'GNOME_DISABLE_CRASH_DIALOG' : '1',
+ 'NO_GAIL' : '1',
+ 'NO_AT_BRIDGE' : '1'})
if running_from_source_tree:
env.update({'GNOME_SHELL_DATADIR' : data_dir,
diff --git a/src/shell-a11y.c b/src/shell-a11y.c
new file mode 100644
index 0000000..1715cf6
--- /dev/null
+++ b/src/shell-a11y.c
@@ -0,0 +1,165 @@
+/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*-
+ *
+ * Copyright (C) 2010 Igalia, S.L.
+ *
+ * Author: Alejandro Piñeiro Iglesias <apinheiro igalia com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ */
+
+#include <string.h>
+#include <gmodule.h>
+#include <clutter/clutter.h>
+
+#include "shell-a11y.h"
+
+#define INIT_METHOD "gnome_accessibility_module_init"
+#define DESKTOP_SCHEMA "org.gnome.desktop.interface"
+#define ACCESSIBILITY_ENABLED_KEY "accessibility"
+#define AT_SPI_SCHEMA "org.a11y.atspi"
+#define ATK_BRIDGE_LOCATION_KEY "atk-bridge-location"
+
+static gboolean
+should_enable_a11y (void)
+{
+ GSettings *desktop_settings = NULL;
+ gboolean value = FALSE;
+
+ desktop_settings = g_settings_new (DESKTOP_SCHEMA);
+ value = g_settings_get_boolean (desktop_settings, ACCESSIBILITY_ENABLED_KEY);
+
+ g_object_unref (desktop_settings);
+
+ return value;
+}
+
+static char*
+get_atk_bridge_path (void)
+{
+ GSettings *atspi_settings = NULL;
+ char *value = NULL;
+ const char * const *schemas = NULL;
+ gboolean found = FALSE;
+ int i = 0;
+
+ schemas = g_settings_list_schemas ();
+
+ for (i = 0; schemas [i]; i++)
+ {
+ if (!strcmp (schemas[i], AT_SPI_SCHEMA))
+ {
+ found = TRUE;
+ break;
+ }
+ }
+
+ if (!found)
+ {
+ g_warning ("Accessibility: %s schema not found. Are you sure that at-spi or"
+ " at-spi2 is installed on your system?", AT_SPI_SCHEMA);
+ return NULL;
+ }
+
+ atspi_settings = g_settings_new (AT_SPI_SCHEMA);
+ value = g_settings_get_string (atspi_settings, ATK_BRIDGE_LOCATION_KEY);
+
+ g_object_unref (atspi_settings);
+
+ return value;
+}
+
+static gboolean
+a11y_invoke_module (const char *module_path)
+{
+ GModule *handle;
+ void (*invoke_fn) (void);
+
+ if (!module_path)
+ {
+ g_warning ("Accessibility: invalid module path (NULL)");
+
+ return FALSE;
+ }
+
+ if (!(handle = g_module_open (module_path, 0)))
+ {
+ g_warning ("Accessibility: failed to load module '%s': '%s'",
+ module_path, g_module_error ());
+
+ return FALSE;
+ }
+
+ if (!g_module_symbol (handle, INIT_METHOD, (gpointer *)&invoke_fn))
+ {
+ g_warning ("Accessibility: error library '%s' does not include "
+ "method '%s' required for accessibility support",
+ module_path, INIT_METHOD);
+ g_module_close (handle);
+
+ return FALSE;
+ }
+
+ invoke_fn ();
+
+ return TRUE;
+}
+
+/*
+ * It loads the atk-bridge if required. It checks:
+ * * If the proper gsetting key is set
+ * * If clutter has already enabled the accessibility
+ *
+ * You need to ensure that the atk-bridge was not loaded before this
+ * call, because in that case the application would be already
+ * registered on at-spi using the AtkUtil implementation on that
+ * moment (if any, although without anyone the application would
+ * crash). Anyway this is the reason of NO_AT_BRIDGE.
+ *
+ */
+void
+shell_a11y_init (void)
+{
+ char *bridge_path = NULL;
+
+ g_unsetenv ("NO_AT_BRIDGE");
+ g_unsetenv ("NO_GAIL");
+
+ if (!should_enable_a11y ())
+ return;
+
+ if (clutter_get_accessibility_enabled () == FALSE)
+ {
+ g_warning ("Accessibility: clutter has no accessibility enabled"
+ " skipping the atk-bridge load");
+ return;
+ }
+
+ bridge_path = get_atk_bridge_path ();
+
+ if (a11y_invoke_module (bridge_path) == FALSE)
+ {
+ g_warning ("Accessibility: error loading the atk-bridge. Although the"
+ " accessibility on the system is enabled and clutter"
+ " accessibility is also enabled, accessibility support on"
+ " GNOME Shell will not work");
+ }
+
+ /* NOTE: We avoid to load gail module, as gail-cally interaction is
+ * not fully supported right now.
+ */
+
+ g_free (bridge_path);
+}
diff --git a/src/shell-a11y.h b/src/shell-a11y.h
new file mode 100644
index 0000000..12e77ae
--- /dev/null
+++ b/src/shell-a11y.h
@@ -0,0 +1,32 @@
+/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*-
+ *
+ * Copyright (C) 2010 Igalia, S.L.
+ *
+ * Author: Alejandro Piñeiro Iglesias <apinheiro igalia com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ */
+
+#ifndef __SHELL_A11Y_H_
+#define __SHELL_A11Y_H_
+
+G_BEGIN_DECLS
+
+void shell_a11y_init (void);
+
+G_END_DECLS
+
+#endif /* __SHELL_A11Y_H_ */
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]