atspi: Fix collecting states

This is somewhat embarrassing.
This commit is contained in:
Matthias Clasen 2020-10-12 21:16:03 -04:00
parent 8f63443393
commit 61474b5a94

View File

@ -98,17 +98,17 @@ static GParamSpec *obj_props[N_PROPS];
G_DEFINE_TYPE (GtkAtSpiContext, gtk_at_spi_context, GTK_TYPE_AT_CONTEXT)
static void
set_atspi_state (guint64 states,
AtspiStateType state)
set_atspi_state (guint64 *states,
AtspiStateType state)
{
states |= (G_GUINT64_CONSTANT (1) << state);
*states |= (G_GUINT64_CONSTANT (1) << state);
}
static void
unset_atspi_state (guint64 states,
AtspiStateType state)
unset_atspi_state (guint64 *states,
AtspiStateType state)
{
states &= ~(G_GUINT64_CONSTANT (1) << state);
*states &= ~(G_GUINT64_CONSTANT (1) << state);
}
static void
@ -122,55 +122,56 @@ collect_states (GtkAtSpiContext *self,
widget = GTK_WIDGET (gtk_at_context_get_accessible (ctx));
set_atspi_state (states, ATSPI_STATE_VISIBLE);
set_atspi_state (&states, ATSPI_STATE_VISIBLE);
if (ctx->accessible_role == GTK_ACCESSIBLE_ROLE_TEXT_BOX)
set_atspi_state (states, ATSPI_STATE_EDITABLE);
if (ctx->accessible_role == GTK_ACCESSIBLE_ROLE_TEXT_BOX ||
ctx->accessible_role == GTK_ACCESSIBLE_ROLE_SEARCH_BOX)
set_atspi_state (&states, ATSPI_STATE_EDITABLE);
if (gtk_at_context_has_accessible_property (ctx, GTK_ACCESSIBLE_PROPERTY_READ_ONLY))
{
value = gtk_at_context_get_accessible_property (ctx, GTK_ACCESSIBLE_PROPERTY_READ_ONLY);
if (gtk_boolean_accessible_value_get (value))
{
set_atspi_state (states, ATSPI_STATE_READ_ONLY);
unset_atspi_state (states, ATSPI_STATE_EDITABLE);
set_atspi_state (&states, ATSPI_STATE_READ_ONLY);
unset_atspi_state (&states, ATSPI_STATE_EDITABLE);
}
}
if (gtk_widget_get_focusable (widget))
set_atspi_state (states, ATSPI_STATE_FOCUSABLE);
set_atspi_state (&states, ATSPI_STATE_FOCUSABLE);
if (gtk_widget_has_focus (widget))
set_atspi_state (states, ATSPI_STATE_FOCUSED);
set_atspi_state (&states, ATSPI_STATE_FOCUSED);
if (gtk_at_context_has_accessible_property (ctx, GTK_ACCESSIBLE_PROPERTY_ORIENTATION))
{
value = gtk_at_context_get_accessible_property (ctx, GTK_ACCESSIBLE_PROPERTY_ORIENTATION);
if (gtk_orientation_accessible_value_get (value) == GTK_ORIENTATION_HORIZONTAL)
set_atspi_state (states, ATSPI_STATE_HORIZONTAL);
set_atspi_state (&states, ATSPI_STATE_HORIZONTAL);
else
set_atspi_state (states, ATSPI_STATE_VERTICAL);
set_atspi_state (&states, ATSPI_STATE_VERTICAL);
}
if (gtk_at_context_has_accessible_property (ctx, GTK_ACCESSIBLE_PROPERTY_MODAL))
{
value = gtk_at_context_get_accessible_property (ctx, GTK_ACCESSIBLE_PROPERTY_MODAL);
if (gtk_boolean_accessible_value_get (value))
set_atspi_state (states, ATSPI_STATE_MODAL);
set_atspi_state (&states, ATSPI_STATE_MODAL);
}
if (gtk_at_context_has_accessible_property (ctx, GTK_ACCESSIBLE_PROPERTY_MULTI_LINE))
{
value = gtk_at_context_get_accessible_property (ctx, GTK_ACCESSIBLE_PROPERTY_MULTI_LINE);
if (gtk_boolean_accessible_value_get (value))
set_atspi_state (states, ATSPI_STATE_MULTI_LINE);
set_atspi_state (&states, ATSPI_STATE_MULTI_LINE);
}
if (gtk_at_context_has_accessible_state (ctx, GTK_ACCESSIBLE_STATE_BUSY))
{
value = gtk_at_context_get_accessible_state (ctx, GTK_ACCESSIBLE_STATE_BUSY);
if (gtk_boolean_accessible_value_get (value))
set_atspi_state (states, ATSPI_STATE_BUSY);
set_atspi_state (&states, ATSPI_STATE_BUSY);
}
if (gtk_at_context_has_accessible_state (ctx, GTK_ACCESSIBLE_STATE_CHECKED))
@ -179,10 +180,10 @@ collect_states (GtkAtSpiContext *self,
switch (gtk_tristate_accessible_value_get (value))
{
case GTK_ACCESSIBLE_TRISTATE_TRUE:
set_atspi_state (states, ATSPI_STATE_CHECKED);
set_atspi_state (&states, ATSPI_STATE_CHECKED);
break;
case GTK_ACCESSIBLE_TRISTATE_MIXED:
set_atspi_state (states, ATSPI_STATE_INDETERMINATE);
set_atspi_state (&states, ATSPI_STATE_INDETERMINATE);
break;
case GTK_ACCESSIBLE_TRISTATE_FALSE:
default:
@ -194,19 +195,19 @@ collect_states (GtkAtSpiContext *self,
{
value = gtk_at_context_get_accessible_state (ctx, GTK_ACCESSIBLE_STATE_DISABLED);
if (!gtk_boolean_accessible_value_get (value))
set_atspi_state (states, ATSPI_STATE_SENSITIVE);
set_atspi_state (&states, ATSPI_STATE_SENSITIVE);
}
else
set_atspi_state (states, ATSPI_STATE_SENSITIVE);
set_atspi_state (&states, ATSPI_STATE_SENSITIVE);
if (gtk_at_context_has_accessible_state (ctx, GTK_ACCESSIBLE_STATE_EXPANDED))
{
value = gtk_at_context_get_accessible_state (ctx, GTK_ACCESSIBLE_STATE_EXPANDED);
if (value->value_class->type == GTK_ACCESSIBLE_VALUE_TYPE_BOOLEAN)
{
set_atspi_state (states, ATSPI_STATE_EXPANDABLE);
set_atspi_state (&states, ATSPI_STATE_EXPANDABLE);
if (gtk_boolean_accessible_value_get (value))
set_atspi_state (states, ATSPI_STATE_EXPANDED);
set_atspi_state (&states, ATSPI_STATE_EXPANDED);
}
}
@ -218,7 +219,7 @@ collect_states (GtkAtSpiContext *self,
case GTK_ACCESSIBLE_INVALID_TRUE:
case GTK_ACCESSIBLE_INVALID_GRAMMAR:
case GTK_ACCESSIBLE_INVALID_SPELLING:
set_atspi_state (states, ATSPI_STATE_INVALID);
set_atspi_state (&states, ATSPI_STATE_INVALID);
break;
case GTK_ACCESSIBLE_INVALID_FALSE:
default:
@ -232,10 +233,10 @@ collect_states (GtkAtSpiContext *self,
switch (gtk_tristate_accessible_value_get (value))
{
case GTK_ACCESSIBLE_TRISTATE_TRUE:
set_atspi_state (states, ATSPI_STATE_PRESSED);
set_atspi_state (&states, ATSPI_STATE_PRESSED);
break;
case GTK_ACCESSIBLE_TRISTATE_MIXED:
set_atspi_state (states, ATSPI_STATE_INDETERMINATE);
set_atspi_state (&states, ATSPI_STATE_INDETERMINATE);
break;
case GTK_ACCESSIBLE_TRISTATE_FALSE:
default:
@ -248,9 +249,9 @@ collect_states (GtkAtSpiContext *self,
value = gtk_at_context_get_accessible_state (ctx, GTK_ACCESSIBLE_STATE_SELECTED);
if (value->value_class->type == GTK_ACCESSIBLE_VALUE_TYPE_BOOLEAN)
{
set_atspi_state (states, ATSPI_STATE_SELECTABLE);
set_atspi_state (&states, ATSPI_STATE_SELECTABLE);
if (gtk_boolean_accessible_value_get (value))
set_atspi_state (states, ATSPI_STATE_SELECTED);
set_atspi_state (&states, ATSPI_STATE_SELECTED);
}
}