Revert "a11y: Remove AtkSelection implementation from combobox"
This reverts commit 7cecc8e524
.
It is impossible to use the selection object of the menu while it is
collapsed (collapsed menus deselect everything for a start), so even
though the original patch was correct, the followup issues are too big
to solve this quickly to a release.
https://bugzilla.gnome.org/show_bug.cgi?id=707786
This commit is contained in:
parent
1b93b55b60
commit
45d896a6b5
@ -29,10 +29,12 @@ struct _GtkComboBoxAccessiblePrivate
|
||||
};
|
||||
|
||||
static void atk_action_interface_init (AtkActionIface *iface);
|
||||
static void atk_selection_interface_init (AtkSelectionIface *iface);
|
||||
|
||||
G_DEFINE_TYPE_WITH_CODE (GtkComboBoxAccessible, gtk_combo_box_accessible, GTK_TYPE_CONTAINER_ACCESSIBLE,
|
||||
G_ADD_PRIVATE (GtkComboBoxAccessible)
|
||||
G_IMPLEMENT_INTERFACE (ATK_TYPE_ACTION, atk_action_interface_init))
|
||||
G_IMPLEMENT_INTERFACE (ATK_TYPE_ACTION, atk_action_interface_init)
|
||||
G_IMPLEMENT_INTERFACE (ATK_TYPE_SELECTION, atk_selection_interface_init))
|
||||
|
||||
static void
|
||||
changed_cb (GtkWidget *widget)
|
||||
@ -51,6 +53,7 @@ changed_cb (GtkWidget *widget)
|
||||
{
|
||||
accessible->priv->old_selection = index;
|
||||
g_object_notify (G_OBJECT (obj), "accessible-name");
|
||||
g_signal_emit_by_name (obj, "selection-changed");
|
||||
}
|
||||
}
|
||||
|
||||
@ -327,3 +330,106 @@ atk_action_interface_init (AtkActionIface *iface)
|
||||
iface->get_localized_name = gtk_combo_box_accessible_action_get_localized_name;
|
||||
iface->get_description = gtk_combo_box_accessible_action_get_description;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
gtk_combo_box_accessible_add_selection (AtkSelection *selection,
|
||||
gint i)
|
||||
{
|
||||
GtkWidget *widget;
|
||||
|
||||
widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (selection));
|
||||
if (widget == NULL)
|
||||
return FALSE;
|
||||
|
||||
gtk_combo_box_set_active (GTK_COMBO_BOX (widget), i);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
gtk_combo_box_accessible_clear_selection (AtkSelection *selection)
|
||||
{
|
||||
GtkWidget *widget;
|
||||
|
||||
widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (selection));
|
||||
if (widget == NULL)
|
||||
return FALSE;
|
||||
|
||||
gtk_combo_box_set_active (GTK_COMBO_BOX (widget), -1);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static AtkObject *
|
||||
gtk_combo_box_accessible_ref_selection (AtkSelection *selection,
|
||||
gint i)
|
||||
{
|
||||
GtkComboBox *combo_box;
|
||||
GtkWidget *widget;
|
||||
AtkObject *obj;
|
||||
gint index;
|
||||
|
||||
widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (selection));
|
||||
if (widget == NULL)
|
||||
return NULL;
|
||||
|
||||
if (i != 0)
|
||||
return NULL;
|
||||
|
||||
combo_box = GTK_COMBO_BOX (widget);
|
||||
|
||||
obj = gtk_combo_box_get_popup_accessible (combo_box);
|
||||
index = gtk_combo_box_get_active (combo_box);
|
||||
|
||||
return atk_object_ref_accessible_child (obj, index);
|
||||
}
|
||||
|
||||
static gint
|
||||
gtk_combo_box_accessible_get_selection_count (AtkSelection *selection)
|
||||
{
|
||||
GtkWidget *widget;
|
||||
|
||||
widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (selection));
|
||||
if (widget == NULL)
|
||||
return 0;
|
||||
|
||||
return (gtk_combo_box_get_active (GTK_COMBO_BOX (widget)) == -1) ? 0 : 1;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
gtk_combo_box_accessible_is_child_selected (AtkSelection *selection,
|
||||
gint i)
|
||||
{
|
||||
GtkWidget *widget;
|
||||
gint j;
|
||||
|
||||
widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (selection));
|
||||
|
||||
if (widget == NULL)
|
||||
return FALSE;
|
||||
|
||||
j = gtk_combo_box_get_active (GTK_COMBO_BOX (widget));
|
||||
|
||||
return (j == i);
|
||||
}
|
||||
|
||||
static gboolean
|
||||
gtk_combo_box_accessible_remove_selection (AtkSelection *selection,
|
||||
gint i)
|
||||
{
|
||||
if (atk_selection_is_child_selected (selection, i))
|
||||
atk_selection_clear_selection (selection);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static void
|
||||
atk_selection_interface_init (AtkSelectionIface *iface)
|
||||
{
|
||||
iface->add_selection = gtk_combo_box_accessible_add_selection;
|
||||
iface->clear_selection = gtk_combo_box_accessible_clear_selection;
|
||||
iface->ref_selection = gtk_combo_box_accessible_ref_selection;
|
||||
iface->get_selection_count = gtk_combo_box_accessible_get_selection_count;
|
||||
iface->is_child_selected = gtk_combo_box_accessible_is_child_selected;
|
||||
iface->remove_selection = gtk_combo_box_accessible_remove_selection;
|
||||
}
|
||||
|
@ -69,6 +69,7 @@ window1
|
||||
action 0 name: press
|
||||
action 0 description: Presses the combobox
|
||||
action 0 keybinding: <Alt>c
|
||||
<AtkSelection>
|
||||
unnamed-GtkMenuAccessible-0
|
||||
"menu"
|
||||
parent: combo1
|
||||
@ -91,6 +92,7 @@ window1
|
||||
<AtkAction>
|
||||
action 0 name: press
|
||||
action 0 description: Presses the combobox
|
||||
<AtkSelection>
|
||||
unnamed-GtkMenuAccessible-1
|
||||
"menu"
|
||||
parent: combo2
|
||||
@ -154,6 +156,7 @@ window1
|
||||
<AtkAction>
|
||||
action 0 name: press
|
||||
action 0 description: Presses the combobox
|
||||
<AtkSelection>
|
||||
unnamed-GtkMenuAccessible-2
|
||||
"menu"
|
||||
parent: combo3
|
||||
@ -176,6 +179,7 @@ window1
|
||||
<AtkAction>
|
||||
action 0 name: press
|
||||
action 0 description: Presses the combobox
|
||||
<AtkSelection>
|
||||
unnamed-GtkMenuAccessible-3
|
||||
"menu"
|
||||
parent: combo4
|
||||
|
@ -58,6 +58,7 @@ window1
|
||||
<AtkAction>
|
||||
action 0 name: press
|
||||
action 0 description: Presses the combobox
|
||||
<AtkSelection>
|
||||
unnamed-GtkMenuAccessible-0
|
||||
"menu"
|
||||
parent: button1
|
||||
|
Loading…
Reference in New Issue
Block a user