# HG changeset patch # User Mark Doliner # Date 1074397900 0 # Node ID 4971193f761dae66af2d3b59dfc8bdb140036afb # Parent fab67640b59f503ddb961f90a32530d00482aa87 [gaim-migrate @ 8842] The easy parts of Marc Mulcahy accessibility patch. Basically set a label for a lot of widgets so screen readers and stuff have something useful to read. committer: Tailor Script diff -r fab67640b59f -r 4971193f761d ChangeLog --- a/ChangeLog Sat Jan 17 22:02:14 2004 +0000 +++ b/ChangeLog Sun Jan 18 03:51:40 2004 +0000 @@ -2,6 +2,7 @@ version 0.76cvs: * WYSIWYG text input (with scrollbars, too!) + * Improved accessibility support pretty much everywhere (Marc Mulcahy) * Improved accessibility in conversation windows (Nathan Fredrickson) * Chatroom List support (thanks, Tim Ringenbach) * TCL Plugin API changed diff -r fab67640b59f -r 4971193f761d src/buddy_chat.c --- a/src/buddy_chat.c Sat Jan 17 22:02:14 2004 +0000 +++ b/src/buddy_chat.c Sun Jan 18 03:51:40 2004 +0000 @@ -123,6 +123,7 @@ gtk_widget_set_size_request(spin, 50, -1); gtk_box_pack_end(GTK_BOX(rowbox), spin, FALSE, FALSE, 0); gtk_label_set_mnemonic_widget(GTK_LABEL(label), GTK_WIDGET(spin)); + gaim_set_accessible_label (spin, label); } else { GtkWidget *entry = gtk_entry_new(); @@ -143,6 +144,7 @@ gtk_box_pack_end(GTK_BOX(rowbox), entry, TRUE, TRUE, 0); gtk_label_set_mnemonic_widget(GTK_LABEL(label), GTK_WIDGET(entry)); + gaim_set_accessible_label (entry, label); } g_free(pce); @@ -262,6 +264,7 @@ join_chat_check_account_func, data); gtk_box_pack_start(GTK_BOX(rowbox), data->account_menu, TRUE, TRUE, 0); gtk_label_set_mnemonic_widget(GTK_LABEL(label), GTK_WIDGET(data->account_menu)); + gaim_set_accessible_label (data->account_menu, label); } data->entries_box = gtk_vbox_new(FALSE, 5); diff -r fab67640b59f -r 4971193f761d src/dialogs.c --- a/src/dialogs.c Sat Jan 17 22:02:14 2004 +0000 +++ b/src/dialogs.c Sun Jan 18 03:51:40 2004 +0000 @@ -578,6 +578,7 @@ gtk_table_attach_defaults(GTK_TABLE(table), info->entry, 1, 2, 0, 1); gtk_entry_set_activates_default (GTK_ENTRY(info->entry), TRUE); gtk_label_set_mnemonic_widget(GTK_LABEL(label), GTK_WIDGET(info->entry)); + gaim_set_accessible_label (info->entry, label); g_signal_connect(G_OBJECT(info->entry), "changed", G_CALLBACK(gaim_gtk_set_sensitive_if_input), window); @@ -594,6 +595,7 @@ gtk_table_attach_defaults(GTK_TABLE(table), info->account, 1, 2, 1, 2); gtk_label_set_mnemonic_widget(GTK_LABEL(label), GTK_WIDGET(info->account)); + gaim_set_accessible_label (info->account, label); } g_signal_connect(G_OBJECT(window), "response", G_CALLBACK(do_im), info); @@ -653,6 +655,7 @@ gtk_table_attach_defaults(GTK_TABLE(table), info->entry, 1, 2, 0, 1); gtk_entry_set_activates_default (GTK_ENTRY(info->entry), TRUE); gtk_label_set_mnemonic_widget(GTK_LABEL(label), GTK_WIDGET(info->entry)); + gaim_set_accessible_label (info->entry, label); g_signal_connect(G_OBJECT(info->entry), "changed", G_CALLBACK(gaim_gtk_set_sensitive_if_input), window); @@ -669,6 +672,7 @@ gtk_table_attach_defaults(GTK_TABLE(table), info->account, 1, 2, 1, 2); gtk_label_set_mnemonic_widget(GTK_LABEL(label), GTK_WIDGET(info->account)); + gaim_set_accessible_label (info->account, label); } g_signal_connect(G_OBJECT(window), "response", G_CALLBACK(do_info), info); @@ -784,6 +788,7 @@ a->url = gtk_entry_new(); gtk_table_attach_defaults(GTK_TABLE(table), a->url, 1, 2, 0, 1); gtk_label_set_mnemonic_widget(GTK_LABEL(label), GTK_WIDGET(a->url)); + gaim_set_accessible_label (a->url, label); gtk_widget_grab_focus(a->url); gtk_entry_set_activates_default (GTK_ENTRY(a->url), TRUE); @@ -797,6 +802,7 @@ a->text = gtk_entry_new(); gtk_table_attach_defaults(GTK_TABLE(table), a->text, 1, 2, 1, 2); gtk_label_set_mnemonic_widget(GTK_LABEL(label), GTK_WIDGET(a->text)); + gaim_set_accessible_label (a->text, label); gtk_entry_set_activates_default (GTK_ENTRY(a->text), TRUE); gtkconv->dialogs.link = a->window; @@ -1257,6 +1263,7 @@ ca->entry = gtk_entry_new(); gtk_box_pack_start(GTK_BOX(hbox), ca->entry, TRUE, TRUE, 0); + gaim_set_accessible_label (ca->entry, label); gtk_widget_grab_focus(ca->entry); /* Away message text */ diff -r fab67640b59f -r 4971193f761d src/gtkaccount.c --- a/src/gtkaccount.c Sat Jan 17 22:02:14 2004 +0000 +++ b/src/gtkaccount.c Sun Jan 18 03:51:40 2004 +0000 @@ -188,6 +188,7 @@ gtk_box_pack_start(GTK_BOX(hbox), widget, TRUE, TRUE, 0); gtk_widget_show(widget); + gaim_set_accessible_label (widget, label); return hbox; } @@ -554,6 +555,7 @@ gtk_editable_set_editable(GTK_EDITABLE(dialog->buddy_icon_entry), FALSE); gtk_box_pack_start(GTK_BOX(hbox), dialog->buddy_icon_entry, TRUE, TRUE, 0); gtk_widget_show(dialog->buddy_icon_entry); + gaim_set_accessible_label (dialog->buddy_icon_entry, label); button = gtk_button_new_with_mnemonic(_("_Browse")); gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0); diff -r fab67640b59f -r 4971193f761d src/gtkblist.c --- a/src/gtkblist.c Sat Jan 17 22:02:14 2004 +0000 +++ b/src/gtkblist.c Sun Jan 18 03:51:40 2004 +0000 @@ -805,10 +805,10 @@ GtkWidget *menuitem; if (prpl_info && prpl_info->get_info) { - gaim_new_item_from_stock(menu, _("_Get Info"), GAIM_STOCK_INFO, + gaim_new_item_from_stock(menu, _("Get _Info"), GAIM_STOCK_INFO, G_CALLBACK(gtk_blist_menu_info_cb), b, 0, 0, NULL); } - gaim_new_item_from_stock(menu, _("_IM"), GAIM_STOCK_IM, + gaim_new_item_from_stock(menu, _("I_M"), GAIM_STOCK_IM, G_CALLBACK(gtk_blist_menu_im_cb), b, 0, 0, NULL); gaim_new_item_from_stock(menu, _("Add Buddy _Pounce"), NULL, G_CALLBACK(gtk_blist_menu_bp_cb), b, 0, 0, NULL); @@ -2699,7 +2699,7 @@ gtk_box_pack_start(GTK_BOX(gtkblist->vbox), gtkblist->bbox, FALSE, FALSE, 0); gtk_widget_show(gtkblist->bbox); - button = gaim_pixbuf_button_from_stock(_("IM"), GAIM_STOCK_IM, GAIM_BUTTON_VERTICAL); + button = gaim_pixbuf_button_from_stock(_("I_M"), GAIM_STOCK_IM, GAIM_BUTTON_VERTICAL); gtk_box_pack_start(GTK_BOX(gtkblist->bbox), button, FALSE, FALSE, 0); gtk_button_set_relief(GTK_BUTTON(button), GTK_RELIEF_NONE); gtk_size_group_add_widget(sg, button); @@ -2708,7 +2708,7 @@ gtk_tooltips_set_tip(GTK_TOOLTIPS(gtkblist->tooltips), button, _("Send a message to the selected buddy"), NULL); gtk_widget_show(button); - button = gaim_pixbuf_button_from_stock(_("Get Info"), GAIM_STOCK_INFO, GAIM_BUTTON_VERTICAL); + button = gaim_pixbuf_button_from_stock(_("Get _Info"), GAIM_STOCK_INFO, GAIM_BUTTON_VERTICAL); gtk_box_pack_start(GTK_BOX(gtkblist->bbox), button, FALSE, FALSE, 0); gtk_button_set_relief(GTK_BUTTON(button), GTK_RELIEF_NONE); gtk_size_group_add_widget(sg, button); @@ -2717,7 +2717,7 @@ gtk_tooltips_set_tip(GTK_TOOLTIPS(gtkblist->tooltips), button, _("Get information on the selected buddy"), NULL); gtk_widget_show(button); - button = gaim_pixbuf_button_from_stock(_("Chat"), GAIM_STOCK_CHAT, GAIM_BUTTON_VERTICAL); + button = gaim_pixbuf_button_from_stock(_("_Chat"), GAIM_STOCK_CHAT, GAIM_BUTTON_VERTICAL); gtk_box_pack_start(GTK_BOX(gtkblist->bbox), button, FALSE, FALSE, 0); gtk_button_set_relief(GTK_BUTTON(button), GTK_RELIEF_NONE); gtk_size_group_add_widget(sg, button); @@ -2725,7 +2725,7 @@ gtk_tooltips_set_tip(GTK_TOOLTIPS(gtkblist->tooltips), button, _("Join a chat room"), NULL); gtk_widget_show(button); - button = gaim_pixbuf_button_from_stock(_("Away"), GAIM_STOCK_ICON_AWAY, GAIM_BUTTON_VERTICAL); + button = gaim_pixbuf_button_from_stock(_("_Away"), GAIM_STOCK_ICON_AWAY, GAIM_BUTTON_VERTICAL); gtk_box_pack_start(GTK_BOX(gtkblist->bbox), button, FALSE, FALSE, 0); gtk_button_set_relief(GTK_BUTTON(button), GTK_RELIEF_NONE); gtk_size_group_add_widget(sg, button); @@ -3500,6 +3500,7 @@ gtk_entry_set_text(GTK_ENTRY(data->entry), username); gtk_entry_set_activates_default (GTK_ENTRY(data->entry), TRUE); + gaim_set_accessible_label (data->entry, label); label = gtk_label_new(_("Alias:")); gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5); @@ -3513,6 +3514,7 @@ gtk_entry_set_text(GTK_ENTRY(data->entry_for_alias), alias); gtk_entry_set_activates_default (GTK_ENTRY(data->entry_for_alias), TRUE); + gaim_set_accessible_label (data->entry_for_alias, label); label = gtk_label_new(_("Group:")); gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5); @@ -3521,6 +3523,7 @@ data->combo = gtk_combo_new(); gtk_combo_set_popdown_strings(GTK_COMBO(data->combo), groups_tree()); gtk_table_attach_defaults(GTK_TABLE(table), data->combo, 1, 2, 2, 3); + gaim_set_accessible_label (data->combo, label); /* Set up stuff for the account box */ label = gtk_label_new(_("Account:")); @@ -3531,6 +3534,7 @@ G_CALLBACK(add_buddy_select_account_cb), NULL, data); gtk_table_attach_defaults(GTK_TABLE(table), data->account_box, 1, 2, 3, 4); + gaim_set_accessible_label (data->account_box, label); /* End of account box */ @@ -3662,6 +3666,7 @@ gtk_widget_set_size_request(spin, 50, -1); gtk_box_pack_end(GTK_BOX(rowbox), spin, FALSE, FALSE, 0); gtk_label_set_mnemonic_widget(GTK_LABEL(label), spin); + gaim_set_accessible_label (spin, label); } else { @@ -3687,6 +3692,7 @@ g_signal_connect(G_OBJECT(entry), "activate", G_CALLBACK(add_chat_cb), data); gtk_label_set_mnemonic_widget(GTK_LABEL(label), entry); + gaim_set_accessible_label (entry, label); } g_free(pce); @@ -3813,6 +3819,7 @@ G_CALLBACK(add_chat_select_account_cb), add_chat_check_account_func, data); gtk_box_pack_start(GTK_BOX(rowbox), data->account_menu, TRUE, TRUE, 0); + gaim_set_accessible_label (data->account_menu, label); data->entries_box = gtk_vbox_new(FALSE, 5); gtk_container_set_border_width(GTK_CONTAINER(data->entries_box), 0); @@ -3832,6 +3839,7 @@ if (alias != NULL) gtk_entry_set_text(GTK_ENTRY(data->alias_entry), alias); gtk_box_pack_end(GTK_BOX(rowbox), data->alias_entry, TRUE, TRUE, 0); + gaim_set_accessible_label (data->alias_entry, label); rowbox = gtk_hbox_new(FALSE, 5); gtk_box_pack_start(GTK_BOX(vbox), rowbox, FALSE, FALSE, 0); @@ -3850,6 +3858,7 @@ gtk_entry_set_text(GTK_ENTRY(GTK_COMBO(data->group_combo)->entry), group->name); } + gaim_set_accessible_label (data->group_combo, label); g_signal_connect(G_OBJECT(data->window), "response", G_CALLBACK(add_chat_resp_cb), data); diff -r fab67640b59f -r 4971193f761d src/gtklog.c --- a/src/gtklog.c Sat Jan 17 22:02:14 2004 +0000 +++ b/src/gtklog.c Sun Jan 18 03:51:40 2004 +0000 @@ -307,6 +307,7 @@ G_CALLBACK (search_cb), lv); gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0); + gaim_set_accessible_label (lv->treeview, label); gtk_widget_show_all(lv->window); } diff -r fab67640b59f -r 4971193f761d src/gtkpounce.c --- a/src/gtkpounce.c Sat Jan 17 22:02:14 2004 +0000 +++ b/src/gtkpounce.c Sun Jan 18 03:51:40 2004 +0000 @@ -370,6 +370,7 @@ gtk_box_pack_start(GTK_BOX(hbox), dialog->account_menu, FALSE, FALSE, 0); gtk_widget_show(dialog->account_menu); + gaim_set_accessible_label (dialog->account_menu, label); /* Buddy: */ hbox = gtk_hbox_new(FALSE, 6); @@ -388,6 +389,7 @@ g_signal_connect(G_OBJECT(dialog->buddy_entry), "changed", G_CALLBACK(buddy_changed_cb), dialog); + gaim_set_accessible_label (dialog->buddy_entry, label); if (cur_pounce != NULL) { gtk_entry_set_text(GTK_ENTRY(dialog->buddy_entry), diff -r fab67640b59f -r 4971193f761d src/gtkprefs.c --- a/src/gtkprefs.c Sat Jan 17 22:02:14 2004 +0000 +++ b/src/gtkprefs.c Sun Jan 18 03:51:40 2004 +0000 @@ -139,6 +139,8 @@ gtk_misc_set_alignment(GTK_MISC(label), 0, 0); } + gaim_set_accessible_label (spin, label); + return label; } @@ -254,6 +256,7 @@ gtk_option_menu_set_menu(GTK_OPTION_MENU(dropdown), menu); gtk_box_pack_start(GTK_BOX(hbox), dropdown, FALSE, FALSE, 0); gtk_widget_show(dropdown); + gaim_set_accessible_label (dropdown, label); return label; } @@ -605,6 +608,9 @@ g_signal_connect(G_OBJECT(sel), "changed", G_CALLBACK(smiley_sel), NULL); gtk_widget_show_all(ret); + + gaim_set_accessible_label (view, label); + return ret; } @@ -1127,6 +1133,7 @@ hbox = gtk_hbox_new(TRUE, 5); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); + gaim_set_accessible_label (entry, label); label = gtk_label_new_with_mnemonic(_("_Port:")); gtk_misc_set_alignment(GTK_MISC(label), 1.0, 0.5); @@ -1145,6 +1152,7 @@ gtk_entry_set_text(GTK_ENTRY(entry), buf); } + gaim_set_accessible_label (entry, label); label = gtk_label_new_with_mnemonic(_("_User:")); gtk_misc_set_alignment(GTK_MISC(label), 1.0, 0.5); @@ -1162,6 +1170,7 @@ hbox = gtk_hbox_new(TRUE, 5); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); + gaim_set_accessible_label (entry, label); label = gtk_label_new_with_mnemonic(_("Pa_ssword:")); gtk_misc_set_alignment(GTK_MISC(label), 1.0, 0.5); @@ -1177,6 +1186,7 @@ if (proxy_info != NULL && gaim_proxy_info_get_password(proxy_info) != NULL) gtk_entry_set_text(GTK_ENTRY(entry), gaim_proxy_info_get_password(proxy_info)); + gaim_set_accessible_label (entry, label); gtk_widget_show_all(ret); return ret; @@ -1294,6 +1304,7 @@ label = gaim_gtk_prefs_checkbox(_("Open new _window by default"), "/gaim/gtk/browsers/new_window", vbox); } + gaim_set_accessible_label (entry, label); gtk_widget_show_all(ret); return ret; @@ -1425,6 +1436,8 @@ #endif /* _WIN32 */ gtk_widget_show_all(ret); + gaim_set_accessible_label (entry, label); + return ret; } @@ -1525,6 +1538,8 @@ gtk_widget_set_sensitive(GTK_WIDGET(prefs_away_menu), FALSE); } + gaim_set_accessible_label (prefs_away_menu, label); + gtk_widget_show_all(ret); return ret; diff -r fab67640b59f -r 4971193f761d src/gtkprivacy.c --- a/src/gtkprivacy.c Sat Jan 17 22:02:14 2004 +0000 +++ b/src/gtkprivacy.c Sun Jan 18 03:51:40 2004 +0000 @@ -404,6 +404,7 @@ check_account_func, dialog); gtk_box_pack_start(GTK_BOX(hbox), dropdown, FALSE, FALSE, 0); gtk_widget_show(dropdown); + gaim_set_accessible_label (dropdown, label); /* Add the drop-down list with the allow/block types. */ dialog->type_menu = gtk_option_menu_new(); diff -r fab67640b59f -r 4971193f761d src/gtkrequest.c --- a/src/gtkrequest.c Sat Jan 17 22:02:14 2004 +0000 +++ b/src/gtkrequest.c Sun Jan 18 03:51:40 2004 +0000 @@ -324,6 +324,7 @@ gtk_entry_set_visibility(GTK_ENTRY(entry), FALSE); } + gaim_set_accessible_label (entry, label); data->u.input.entry = entry; /* Show everything. */ diff -r fab67640b59f -r 4971193f761d src/gtkutils.c --- a/src/gtkutils.c Sat Jan 17 22:02:14 2004 +0000 +++ b/src/gtkutils.c Sun Jan 18 03:51:40 2004 +0000 @@ -455,6 +455,7 @@ gtk_widget_add_accelerator(menuitem, "activate", accel, str[0], GDK_MOD1_MASK, GTK_ACCEL_LOCKED); */ + gaim_set_accessible_label (menuitem, label); return menuitem; } @@ -531,6 +532,7 @@ gtk_label_set_text_with_mnemonic(GTK_LABEL(label), text); gtk_label_set_mnemonic_widget(GTK_LABEL(label), button); gtk_box_pack_start(GTK_BOX(lbox), label, FALSE, FALSE, 0); + gaim_set_accessible_label (button, label); } gtk_widget_show_all(bbox); @@ -600,6 +602,7 @@ gtk_misc_set_alignment(GTK_MISC(label), 0, 0); gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0); gtk_widget_show(label); + gaim_set_accessible_label (vbox, label); hbox = gtk_hbox_new(FALSE, 6); gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0); @@ -718,6 +721,7 @@ gtk_menu_shell_append(GTK_MENU_SHELL(menu), item); gtk_widget_show(item); + gaim_set_accessible_label (item, label); if (!strcmp(plugin->info->id, id)) selected_index = i; @@ -858,6 +862,7 @@ gtk_menu_shell_append(GTK_MENU_SHELL(menu), item); gtk_widget_show(item); + gaim_set_accessible_label (item, label); if (default_account != NULL && account == default_account) selected_index = i; @@ -1348,3 +1353,39 @@ return valid; } + +void +gaim_set_accessible_label (GtkWidget *w, GtkWidget *l) +{ + AtkObject *acc, *label; + AtkObject *rel_obj[1]; + AtkRelationSet *set; + AtkRelation *relation; + const gchar *label_text; + const gchar *existing_name; + + acc = gtk_widget_get_accessible (w); + label = gtk_widget_get_accessible (l); + + /* If this object has no name, set it's name with the label text */ + existing_name = atk_object_get_name (acc); + if (!existing_name) { + label_text = gtk_label_get_text (GTK_LABEL(l)); + if (label_text) + atk_object_set_name (acc, label_text); + } + + /* Create the labeled-by relation */ + set = atk_object_ref_relation_set (acc); + rel_obj[0] = label; + relation = atk_relation_new (rel_obj, 1, ATK_RELATION_LABELLED_BY); + atk_relation_set_add (set, relation); + g_object_unref (relation); + + /* Create the label-for relation */ + set = atk_object_ref_relation_set (label); + rel_obj[0] = acc; + relation = atk_relation_new (rel_obj, 1, ATK_RELATION_LABEL_FOR); + atk_relation_set_add (set, relation); + g_object_unref (relation); +} diff -r fab67640b59f -r 4971193f761d src/gtkutils.h --- a/src/gtkutils.h Sat Jan 17 22:02:14 2004 +0000 +++ b/src/gtkutils.h Sun Jan 18 03:51:40 2004 +0000 @@ -346,4 +346,13 @@ char **ret_protocol, char **ret_username, char **ret_alias); +/** + * Sets an ATK name for a given widget. Also sets the labelled-by + * and label-for ATK relationships. + * + * @w The widget that we want to name. + * @l A GtkLabel that we want to use as the ATK name for the widget. + */ +void gaim_set_accessible_label (GtkWidget *w, GtkWidget *l); + #endif /* _GAIM_GTK_UTILS_H_ */ diff -r fab67640b59f -r 4971193f761d src/server.c --- a/src/server.c Sat Jan 17 22:02:14 2004 +0000 +++ b/src/server.c Sun Jan 18 03:51:40 2004 +0000 @@ -156,6 +156,7 @@ gc->idle_timer = g_timeout_add(20000, check_idle, gc); serv_touch_idle(gc); + /* Move this hack into toc.c */ if (prpl_info->options & OPT_PROTO_CORRECT_TIME) serv_add_buddy(gc, gaim_account_get_username(gaim_connection_get_account(gc)),