Add sufficient API to make gail work

The accessible implementations should really be folded into
gtk proper. Until that happens, we need some more guts exposed...
This commit is contained in:
Matthias Clasen
2010-12-23 20:11:38 -05:00
parent 2ed81aa57c
commit 7650482e46
7 changed files with 121 additions and 49 deletions

View File

@ -250,7 +250,7 @@ gail_focus_watcher (GSignalInvocationHint *ihint,
{
if (GTK_IS_MENU_SHELL (child))
{
if (GTK_MENU_SHELL (child)->active_menu_item)
if (gtk_menu_shell_get_selected_item (GTK_MENU_SHELL (child)))
{
/*
* We have a menu which has a menu item selected
@ -349,10 +349,12 @@ gail_finish_select (GtkWidget *widget)
if (GTK_IS_MENU_ITEM (widget))
{
GtkMenuItem* menu_item;
GtkWidget *submenu;
menu_item = GTK_MENU_ITEM (widget);
if (menu_item->submenu &&
!gtk_widget_get_mapped (menu_item->submenu))
submenu = gtk_menu_item_get_submenu (menu_item);
if (submenu &&
!gtk_widget_get_mapped (submenu))
{
/*
* If the submenu is not visble, wait until it is before
@ -360,7 +362,7 @@ gail_finish_select (GtkWidget *widget)
*/
gulong handler_id;
handler_id = g_signal_handler_find (menu_item->submenu,
handler_id = g_signal_handler_find (submenu,
G_SIGNAL_MATCH_FUNC,
g_signal_lookup ("map",
GTK_TYPE_WINDOW),
@ -369,11 +371,10 @@ gail_finish_select (GtkWidget *widget)
(gpointer) gail_map_submenu_cb,
NULL);
if (!handler_id)
g_signal_connect (menu_item->submenu, "map",
g_signal_connect (submenu, "map",
G_CALLBACK (gail_map_submenu_cb),
NULL);
return;
}
/*
* If we are waiting to report focus on a menubar or a menu item
@ -422,8 +423,11 @@ gail_map_submenu_cb (GtkWidget *widget)
{
if (GTK_IS_MENU (widget))
{
if (GTK_MENU (widget)->parent_menu_item)
gail_finish_select (GTK_MENU (widget)->parent_menu_item);
GtkWidget *parent_menu_item;
parent_menu_item = gtk_menu_get_attach_widget (GTK_MENU (widget));
if (parent_menu_item)
gail_finish_select (parent_menu_item);
}
}
@ -454,12 +458,12 @@ gail_deselect_watcher (GSignalInvocationHint *ihint,
{
GtkWidget *parent_menu_shell;
parent_menu_shell = GTK_MENU_SHELL (menu_shell)->parent_menu_shell;
parent_menu_shell = gtk_menu_shell_get_parent_shell (GTK_MENU_SHELL (menu_shell));
if (parent_menu_shell)
{
GtkWidget *active_menu_item;
active_menu_item = GTK_MENU_SHELL (parent_menu_shell)->active_menu_item;
active_menu_item = gtk_menu_shell_get_selected_item (GTK_MENU_SHELL (parent_menu_shell));
if (active_menu_item)
{
gail_focus_notify_when_idle (active_menu_item);
@ -661,7 +665,7 @@ gail_deactivate_watcher (GSignalInvocationHint *ihint,
g_return_val_if_fail (GTK_IS_MENU_SHELL(widget), TRUE);
shell = GTK_MENU_SHELL(widget);
if (!shell->parent_menu_shell)
if (! gtk_menu_shell_get_parent_shell (shell))
focus = focus_before_menu;
/*

View File

@ -88,8 +88,8 @@ static gboolean
gail_menu_shell_add_selection (AtkSelection *selection,
gint i)
{
GtkMenuShell *shell;
GList *item;
GList *kids;
GtkWidget *item;
guint length;
GtkWidget *widget;
@ -100,16 +100,18 @@ gail_menu_shell_add_selection (AtkSelection *selection,
return FALSE;
}
shell = GTK_MENU_SHELL (widget);
length = g_list_length (shell->children);
kids = gtk_container_get_children (GTK_CONTAINER (widget));
length = g_list_length (kids);
if (i < 0 || i > length)
return FALSE;
{
g_list_free (kids);
return FALSE;
}
item = g_list_nth (shell->children, i);
g_return_val_if_fail (item != NULL, FALSE);
g_return_val_if_fail (GTK_IS_MENU_ITEM(item->data), FALSE);
gtk_menu_shell_select_item (shell, GTK_WIDGET (item->data));
item = g_list_nth_data (kids, i);
g_list_free (kids);
g_return_val_if_fail (GTK_IS_MENU_ITEM(item), FALSE);
gtk_menu_shell_select_item (GTK_MENU_SHELL (widget), item);
return TRUE;
}
@ -139,6 +141,7 @@ gail_menu_shell_ref_selection (AtkSelection *selection,
GtkMenuShell *shell;
AtkObject *obj;
GtkWidget *widget;
GtkWidget *item;
if (i != 0)
return NULL;
@ -151,10 +154,11 @@ gail_menu_shell_ref_selection (AtkSelection *selection,
}
shell = GTK_MENU_SHELL (widget);
if (shell->active_menu_item != NULL)
item = gtk_menu_shell_get_selectec_item (shell);
if (item != NULL)
{
obj = gtk_widget_get_accessible (shell->active_menu_item);
obj = gtk_widget_get_accessible (item);
g_object_ref (obj);
return obj;
}
@ -182,7 +186,7 @@ gail_menu_shell_get_selection_count (AtkSelection *selection)
/*
* Identifies the currently selected menu item
*/
if (shell->active_menu_item == NULL)
if (gtk_menu_shell_get_selected_item (shell) == NULL)
{
return 0;
}
@ -197,8 +201,10 @@ gail_menu_shell_is_child_selected (AtkSelection *selection,
gint i)
{
GtkMenuShell *shell;
GList *kids;
gint j;
GtkWidget *widget;
GtkWidget *item;
widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (selection));
if (widget == NULL)
@ -208,12 +214,15 @@ gail_menu_shell_is_child_selected (AtkSelection *selection,
}
shell = GTK_MENU_SHELL (widget);
if (shell->active_menu_item == NULL)
item = gtk_menu_shell_get_selected_item (shell);
if (item == NULL)
return FALSE;
j = g_list_index (shell->children, shell->active_menu_item);
return (j==i);
kids = gtk_container_get_children (GTK_CONTAINER (shell));
j = g_list_index (kids, item);
g_list_free (kids);
return (j==i);
}
static gboolean
@ -222,6 +231,7 @@ gail_menu_shell_remove_selection (AtkSelection *selection,
{
GtkMenuShell *shell;
GtkWidget *widget;
GtkWidget *item;
if (i != 0)
return FALSE;
@ -235,8 +245,8 @@ gail_menu_shell_remove_selection (AtkSelection *selection,
shell = GTK_MENU_SHELL (widget);
if (shell->active_menu_item &&
GTK_MENU_ITEM (shell->active_menu_item)->submenu)
item = gtk_menu_shell_get_selected_item (shell);
if (item && gtk_menu_item_get_submenu (GTK_MENU_ITEM (item)))
{
/*
* Menu item contains a menu and it is the selected menu item

View File

@ -120,10 +120,11 @@ gail_sub_menu_item_add_selection (AtkSelection *selection,
gint i)
{
GtkMenuShell *shell;
GList *item;
GList *kids;
guint length;
GtkWidget *widget;
GtkWidget *submenu;
GtkWidget *child;
widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (selection));
if (widget == NULL)
@ -133,15 +134,18 @@ gail_sub_menu_item_add_selection (AtkSelection *selection,
submenu = gtk_menu_item_get_submenu (GTK_MENU_ITEM (widget));
g_return_val_if_fail (GTK_IS_MENU_SHELL (submenu), FALSE);
shell = GTK_MENU_SHELL (submenu);
length = g_list_length (shell->children);
kids = gtk_container_get_children (GTK_CONTAINER (shell));
length = g_list_length (kids);
if (i < 0 || i > length)
return FALSE;
{
g_list_free (kids);
return FALSE;
}
item = g_list_nth (shell->children, i);
g_return_val_if_fail (item != NULL, FALSE);
g_return_val_if_fail (GTK_IS_MENU_ITEM(item->data), FALSE);
gtk_menu_shell_select_item (shell, GTK_WIDGET (item->data));
child = g_list_nth_data (kids, i);
g_list_free (kids);
g_return_val_if_fail (GTK_IS_MENU_ITEM(child), FALSE);
gtk_menu_shell_select_item (shell, GTK_WIDGET (child));
return TRUE;
}
@ -173,6 +177,7 @@ gail_sub_menu_item_ref_selection (AtkSelection *selection,
AtkObject *obj;
GtkWidget *widget;
GtkWidget *submenu;
GtkWidget *item;
if (i != 0)
return NULL;
@ -185,10 +190,11 @@ gail_sub_menu_item_ref_selection (AtkSelection *selection,
submenu = gtk_menu_item_get_submenu (GTK_MENU_ITEM (widget));
g_return_val_if_fail (GTK_IS_MENU_SHELL (submenu), NULL);
shell = GTK_MENU_SHELL (submenu);
if (shell->active_menu_item != NULL)
item = gtk_menu_shell_get_selected_item (shell);
if (item != NULL)
{
obj = gtk_widget_get_accessible (shell->active_menu_item);
obj = gtk_widget_get_accessible (item);
g_object_ref (obj);
return obj;
}
@ -217,7 +223,7 @@ gail_sub_menu_item_get_selection_count (AtkSelection *selection)
/*
* Identifies the currently selected menu item
*/
if (shell->active_menu_item == NULL)
if (gtk_menu_shell_get_selected_item (shell) == NULL)
return 0;
else
return 1;
@ -231,6 +237,8 @@ gail_sub_menu_item_is_child_selected (AtkSelection *selection,
gint j;
GtkWidget *widget;
GtkWidget *submenu;
GtkWidget *item;
GList *kids;
widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (selection));
if (widget == NULL)
@ -241,12 +249,15 @@ gail_sub_menu_item_is_child_selected (AtkSelection *selection,
g_return_val_if_fail (GTK_IS_MENU_SHELL (submenu), FALSE);
shell = GTK_MENU_SHELL (submenu);
if (shell->active_menu_item == NULL)
item = gtk_menu_shell_get_selected_item (shell);
if (item == NULL)
return FALSE;
j = g_list_index (shell->children, shell->active_menu_item);
return (j==i);
kids = gtk_container_get_children (GTK_CONTAINER (shell));
j = g_list_index (kids, item);
g_list_free (kids);
return (j==i);
}
static gboolean
@ -256,6 +267,7 @@ gail_sub_menu_item_remove_selection (AtkSelection *selection,
GtkMenuShell *shell;
GtkWidget *widget;
GtkWidget *submenu;
GtkWidget *item;
if (i != 0)
return FALSE;
@ -269,8 +281,8 @@ gail_sub_menu_item_remove_selection (AtkSelection *selection,
g_return_val_if_fail (GTK_IS_MENU_SHELL (submenu), FALSE);
shell = GTK_MENU_SHELL (submenu);
if (shell->active_menu_item &&
GTK_MENU_ITEM (shell->active_menu_item)->submenu)
item = gtk_menu_shell_get_selected_item (shell);
if (item && gtk_menu_item_get_submenu (GTK_MENU_ITEM (item)))
{
/*
* Menu item contains a menu and it is the selected menu item