From 922932d2401e47507dd7f845d66286aaf170f25b Mon Sep 17 00:00:00 2001 From: Padraig O'Briain Date: Fri, 26 Sep 2003 17:04:37 +0000 Subject: [PATCH] Add -DMETACITY_LIBDIR to support loading of modules Add functions 2003-09-26 Padraig O'Briain * src/Makefile.am: Add -DMETACITY_LIBDIR to support loading of modules * src/main.c: Add functions find_accessibility_module, accessibility_invoke_module and accessibility_invoke (main); Check whether GConf accessibility key is true and if so load accessibility modules. This code is based on the libgnome code. src/tabpopup.c (meta_ui_tab_popup_new): Set accessible role of accessible for label containing window name to STATUSBAR so AT can be aware of window name. This fixes bug #120025 --- ChangeLog | 14 +++++++ src/Makefile.am | 2 +- src/main.c | 102 ++++++++++++++++++++++++++++++++++++++++++++++++ src/tabpopup.c | 4 ++ 4 files changed, 121 insertions(+), 1 deletion(-) diff --git a/ChangeLog b/ChangeLog index d527b4678..2a7f5ac78 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,17 @@ +2003-09-26 Padraig O'Briain + + * src/Makefile.am: Add -DMETACITY_LIBDIR to support loading of modules + * src/main.c: Add functions find_accessibility_module, + accessibility_invoke_module and accessibility_invoke + (main); Check whether GConf accessibility key is true and if so + load accessibility modules. This code is based on the libgnome code. + + src/tabpopup.c (meta_ui_tab_popup_new): Set accessible role of + accessible for label containing window name to STATUSBAR so + AT can be aware of window name. + + This fixes bug #120025 + 2003-09-24 Havoc Pennington * src/session.c (io_from_warning_dialog): fix hang when we get diff --git a/src/Makefile.am b/src/Makefile.am index c2863d2f2..ef337d742 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -2,7 +2,7 @@ lib_LTLIBRARIES = libmetacity-private.la SUBDIRS=wm-tester tools themes -INCLUDES=@METACITY_CFLAGS@ -DMETACITY_LIBEXECDIR=\"$(libexecdir)\" -DHOST_ALIAS=\"@HOST_ALIAS@\" -DMETACITY_LOCALEDIR=\"$(prefix)/@DATADIRNAME@/locale\" -DMETACITY_PKGDATADIR=\"$(pkgdatadir)\" -DMETACITY_DATADIR=\"$(datadir)\" -DG_LOG_DOMAIN=\"metacity\" -DSN_API_NOT_YET_FROZEN=1 +INCLUDES=@METACITY_CFLAGS@ -DMETACITY_LIBEXECDIR=\"$(libexecdir)\" -DMETACITY_LIBDIR=\"$(libdir)\" -DHOST_ALIAS=\"@HOST_ALIAS@\" -DMETACITY_LOCALEDIR=\"$(prefix)/@DATADIRNAME@/locale\" -DMETACITY_PKGDATADIR=\"$(pkgdatadir)\" -DMETACITY_DATADIR=\"$(datadir)\" -DG_LOG_DOMAIN=\"metacity\" -DSN_API_NOT_YET_FROZEN=1 EGGFILES= \ eggaccelerators.c \ diff --git a/src/main.c b/src/main.c index 170bc0e3c..3b1523acf 100644 --- a/src/main.c +++ b/src/main.c @@ -29,6 +29,11 @@ #include "prefs.h" #include +#include +#ifdef HAVE_GCONF +#include +#endif + #include #include @@ -76,6 +81,89 @@ version (void) exit (0); } +#define GNOME_ACCESSIBILITY_KEY "/desktop/gnome/interface/accessibility" + +static char * +find_accessibility_module (const char *libname) +{ + char *sub; + char *path; + char *fname; + char *retval; + + fname = g_strconcat (libname, "." G_MODULE_SUFFIX, NULL); + path = g_strconcat (METACITY_LIBDIR"/gtk-2.0/modules", G_DIR_SEPARATOR_S, fname, NULL); + + if (g_file_test (path, G_FILE_TEST_EXISTS)) + retval = path; + + if (path) + retval = path; + else + g_free (path); + + g_free (fname); + + return retval; +} + +static gboolean +accessibility_invoke_module (const char *libname, + gboolean init) +{ + GModule *handle; + void (*invoke_fn) (void); + const char *method; + gboolean retval = FALSE; + char *module_name; + + if (init) + method = "gnome_accessibility_module_init"; + else + method = "gnome_accessibility_module_shutdown"; + + module_name = find_accessibility_module (libname); + + if (!module_name) + { + g_warning ("Accessibility: failed to find module '%s' which " + "is needed to make this application accessible", + libname); + + } + else if (!(handle = g_module_open (module_name, G_MODULE_BIND_LAZY))) + { + g_warning ("Accessibility: failed to load module '%s': '%s'", + libname, g_module_error ()); + + } + else if (!g_module_symbol (handle, method, (gpointer *)&invoke_fn)) + { + g_warning ("Accessibility: error library '%s' does not include " + "method '%s' required for accessibility support", + libname, method); + g_module_close (handle); + + } + else + { + retval = TRUE; + invoke_fn (); + } + + g_free (module_name); + + return retval; +} + +static gboolean +accessibility_invoke (gboolean init) +{ + accessibility_invoke_module ("libgail", init); + accessibility_invoke_module ("libatk-bridge", init); + return TRUE; +} + int main (int argc, char **argv) { @@ -358,6 +446,20 @@ main (int argc, char **argv) if (!meta_display_open (NULL)) meta_exit (META_EXIT_ERROR); + { + gboolean do_init_a11y; + do_init_a11y = FALSE; + +#ifdef HAVE_GCONF + do_init_a11y = gconf_client_get_bool ( + gconf_client_get_default (), + GNOME_ACCESSIBILITY_KEY, NULL); +#endif + + if (do_init_a11y) + accessibility_invoke (TRUE); + } + g_main_run (meta_main_loop); { diff --git a/src/tabpopup.c b/src/tabpopup.c index 843edbfb3..db52343ac 100644 --- a/src/tabpopup.c +++ b/src/tabpopup.c @@ -118,6 +118,7 @@ meta_ui_tab_popup_new (const MetaTabEntry *entries, GList *tmp; GtkWidget *frame; int max_label_width; + AtkObject *obj; popup = g_new (MetaTabPopup, 1); @@ -205,6 +206,9 @@ meta_ui_tab_popup_new (const MetaTabEntry *entries, table); popup->label = gtk_label_new (""); + obj = gtk_widget_get_accessible (popup->label); + atk_object_set_role (obj, ATK_ROLE_STATUSBAR); + gtk_misc_set_padding (GTK_MISC (popup->label), 3, 3); gtk_box_pack_end (GTK_BOX (vbox), popup->label, FALSE, FALSE, 0);