[gtk+] Add sufficient API to make gail work
- From: Matthias Clasen <matthiasc src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk+] Add sufficient API to make gail work
- Date: Fri, 24 Dec 2010 01:12:50 +0000 (UTC)
commit 7650482e468ee6f01cc5f7f3b161406fabc56bae
Author: Matthias Clasen <mclasen redhat com>
Date: Thu Dec 23 20:11:38 2010 -0500
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...
docs/reference/gtk/gtk3-sections.txt | 2 +
gtk/gtk.symbols | 2 +
gtk/gtkmenushell.c | 39 +++++++++++++++++++++++++
gtk/gtkmenushell.h | 3 ++
modules/other/gail/gail.c | 26 ++++++++++-------
modules/other/gail/gailmenushell.c | 52 ++++++++++++++++++++-------------
modules/other/gail/gailsubmenuitem.c | 48 +++++++++++++++++++------------
7 files changed, 122 insertions(+), 50 deletions(-)
---
diff --git a/docs/reference/gtk/gtk3-sections.txt b/docs/reference/gtk/gtk3-sections.txt
index 32357c2..51d5f63 100644
--- a/docs/reference/gtk/gtk3-sections.txt
+++ b/docs/reference/gtk/gtk3-sections.txt
@@ -2116,6 +2116,8 @@ gtk_menu_shell_activate_item
gtk_menu_shell_cancel
gtk_menu_shell_set_take_focus
gtk_menu_shell_get_take_focus
+gtk_menu_shell_get_selected_item
+gtk_menu_shell_get_parent_shell
GtkMenuDirectionType
<SUBSECTION Standard>
GTK_MENU_SHELL
diff --git a/gtk/gtk.symbols b/gtk/gtk.symbols
index f1690d2..b9937bd 100644
--- a/gtk/gtk.symbols
+++ b/gtk/gtk.symbols
@@ -1501,6 +1501,8 @@ gtk_menu_shell_append
gtk_menu_shell_cancel
gtk_menu_shell_deactivate
gtk_menu_shell_deselect
+gtk_menu_shell_get_selected_item
+gtk_menu_shell_get_parent_shell
gtk_menu_shell_get_take_focus
gtk_menu_shell_get_type G_GNUC_CONST
gtk_menu_shell_insert
diff --git a/gtk/gtkmenushell.c b/gtk/gtkmenushell.c
index 20e12dc..d72670a 100644
--- a/gtk/gtkmenushell.c
+++ b/gtk/gtkmenushell.c
@@ -1869,3 +1869,42 @@ gtk_menu_shell_set_take_focus (GtkMenuShell *menu_shell,
g_object_notify (G_OBJECT (menu_shell), "take-focus");
}
}
+
+/**
+ * gtk_menu_shell_get_selected_item:
+ * @menu_shell: a #GtkMenuShell
+ *
+ * Gets the currently selected item.
+ *
+ * Returns: the currently selected item
+ *
+ * Since: 3.0
+ */
+GtkWidget *
+gtk_menu_shell_get_selected_item (GtkMenuShell *menu_shell)
+{
+ g_return_if_fail (GTK_IS_MENU_SHELL (menu_shell));
+
+ return menu_shell->priv->active_menu_item;
+}
+
+/**
+ * gtk_menu_shell_get_parent_shell:
+ * @menu_shell: a #GtkMenuShell
+ *
+ * Gets the parent menu shell.
+ *
+ * The parent menu shell of a submenu is the #GtkMenu or #GtkMenuBar
+ * from which it was opened up.
+ *
+ * Returns: the parent #GtkMenuShell
+ *
+ * Since: 3.0
+ */
+GtkWidget *
+gtk_menu_shell_get_parent_shell (GtkMenuShell *menu_shell)
+{
+ g_return_if_fail (GTK_IS_MENU_SHELL (menu_shell));
+
+ return menu_shell->priv->parent_menu_shell;
+}
diff --git a/gtk/gtkmenushell.h b/gtk/gtkmenushell.h
index 9e7d97d..0b6d571 100644
--- a/gtk/gtkmenushell.h
+++ b/gtk/gtkmenushell.h
@@ -111,6 +111,9 @@ gboolean gtk_menu_shell_get_take_focus (GtkMenuShell *menu_shell);
void gtk_menu_shell_set_take_focus (GtkMenuShell *menu_shell,
gboolean take_focus);
+GtkWidget *gtk_menu_shell_get_selected_item (GtkMenuShell *menu_shell);
+GtkWidget *gtk_menu_shell_get_parent_shell (GtkMenuShell *menu_shell);
+
G_END_DECLS
#endif /* __GTK_MENU_SHELL_H__ */
diff --git a/modules/other/gail/gail.c b/modules/other/gail/gail.c
index 7094d9f..cb12163 100644
--- a/modules/other/gail/gail.c
+++ b/modules/other/gail/gail.c
@@ -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;
/*
diff --git a/modules/other/gail/gailmenushell.c b/modules/other/gail/gailmenushell.c
index b31fe5b..04228ee 100644
--- a/modules/other/gail/gailmenushell.c
+++ b/modules/other/gail/gailmenushell.c
@@ -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;
-
- 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));
+ {
+ g_list_free (kids);
+ return FALSE;
+ }
+
+ 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
diff --git a/modules/other/gail/gailsubmenuitem.c b/modules/other/gail/gailsubmenuitem.c
index a2fb239..a571f98 100644
--- a/modules/other/gail/gailsubmenuitem.c
+++ b/modules/other/gail/gailsubmenuitem.c
@@ -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
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]