mutter/tests/accessibility/cally-examples-util.c
Alejandro Piñeiro e110b35694 Avoid to load cally module on a11y examples
As cally is being integrated on clutter is not required to load
cally module anymore. Anyway, it is still required to load
the atk bridge by hand. The current way to load it could change
in the future, more information here:

https://bugzilla.gnome.org/show_bug.cgi?id=612599
https://bugzilla.gnome.org/show_bug.cgi?id=619946

Part [4/4] of CB#2099
2010-07-05 16:45:43 +01:00

143 lines
3.9 KiB
C

/* CALLY - The Clutter Accessibility Implementation Library
*
* Copyright (C) 2009 Igalia, S.L.
*
* Author: Alejandro Piñeiro Iglesias <apinheiro@igalia.com>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
#include <gmodule.h>
#include <stdlib.h>
#include <clutter/clutter.h>
#include "cally-examples-util.h"
/* Checking the at-spi sources, the module directory is
* $(libdir)/gtk-2.0/modules
*
* It is supposed cally would be installed on the same libdir.
*
* You could use the option atk-bridge-dir to use other directory.
*/
#define ATK_BRIDGE_DEFAULT_MODULE_DIRECTORY PREFIXDIR"/gtk-2.0/modules"
static gchar *
_search_for_bridge_module (const gchar *module_name)
{
/* We simplify the search for the atk bridge, see see the definition
* of the macro for more information*/
return g_strdup (ATK_BRIDGE_DEFAULT_MODULE_DIRECTORY);
}
static gchar*
_a11y_check_custom_bridge (int *argc,
char ***argv)
{
GError *error = NULL;
GOptionContext *context;
static gchar *bridge_dir = NULL;
static GOptionEntry entries [] =
{
{"atk-bridge-dir", 'd', 0, G_OPTION_ARG_STRING, &bridge_dir, "atk-bridge module directory", NULL}
};
context = g_option_context_new ("- cally examples");
g_option_context_add_main_entries (context, entries, NULL);
if (!g_option_context_parse (context, argc, argv, &error))
{
g_print ("%s\n", error->message);
g_print ("Use --help for more information.\n");
exit (0);
}
return bridge_dir;
}
static gboolean
_a11y_invoke_module (const gchar *module_path,
gboolean init)
{
GModule *handle;
void (*invoke_fn) (void);
const char *method;
if (init)
method = "gnome_accessibility_module_init";
else
method = "gnome_accessibility_module_shutdown";
if (!module_path)
return FALSE;
if (!(handle = g_module_open (module_path, G_MODULE_BIND_LAZY)))
{
g_warning ("Accessibility: failed to load module '%s': '%s'",
module_path, g_module_error ());
return FALSE;
}
if (!g_module_symbol (handle, method, (gpointer *)&invoke_fn))
{
g_warning ("Accessibility: error library '%s' does not include "
"method '%s' required for accessibility support",
module_path, method);
g_module_close (handle);
return FALSE;
}
g_debug ("Module %s loaded successfully", module_path);
invoke_fn ();
return TRUE;
}
/**
* This method will initialize the accessibility support provided by cally.
*
* Basically it will load the cally module using gmodule functions.
*
*/
void
cally_util_a11y_init (int *argc, char ***argv)
{
gchar *bridge_dir = NULL;
gchar *bridge_path = NULL;
if (clutter_get_accessibility_enabled () == FALSE)
{
g_warning ("Accessibility: clutter has no accessibility enabled"
" skipping the atk-bridge load");
return;
}
bridge_dir = _a11y_check_custom_bridge (argc, argv);
if (bridge_dir == NULL)
bridge_dir = _search_for_bridge_module ("atk-bridge");
bridge_path = g_module_build_path (bridge_dir, "libatk-bridge");
_a11y_invoke_module (bridge_path, TRUE);
g_free (bridge_dir);
g_free (bridge_path);
}