forked from AuroraMiddleware/gtk
a11y: Be safe against state type changes
For some of the a11y states, calling gtk_accessible_reset_state can change the type of the state value from boolean or tristate to undefined. Handle that, instead of throwing criticals. Related: !4910
This commit is contained in:
parent
7dd3289837
commit
4c1bc93f6f
@ -953,22 +953,30 @@ gtk_at_spi_context_state_change (GtkATContext *ctx,
|
|||||||
{
|
{
|
||||||
value = gtk_accessible_attribute_set_get_value (states, GTK_ACCESSIBLE_STATE_CHECKED);
|
value = gtk_accessible_attribute_set_get_value (states, GTK_ACCESSIBLE_STATE_CHECKED);
|
||||||
|
|
||||||
switch (gtk_tristate_accessible_value_get (value))
|
if (value->value_class->type == GTK_ACCESSIBLE_VALUE_TYPE_TRISTATE)
|
||||||
|
{
|
||||||
|
switch (gtk_tristate_accessible_value_get (value))
|
||||||
|
{
|
||||||
|
case GTK_ACCESSIBLE_TRISTATE_TRUE:
|
||||||
|
emit_state_changed (self, "checked", TRUE);
|
||||||
|
emit_state_changed (self, "indeterminate", FALSE);
|
||||||
|
break;
|
||||||
|
case GTK_ACCESSIBLE_TRISTATE_MIXED:
|
||||||
|
emit_state_changed (self, "checked", FALSE);
|
||||||
|
emit_state_changed (self, "indeterminate", TRUE);
|
||||||
|
break;
|
||||||
|
case GTK_ACCESSIBLE_TRISTATE_FALSE:
|
||||||
|
emit_state_changed (self, "checked", FALSE);
|
||||||
|
emit_state_changed (self, "indeterminate", FALSE);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
{
|
{
|
||||||
case GTK_ACCESSIBLE_TRISTATE_TRUE:
|
|
||||||
emit_state_changed (self, "checked", TRUE);
|
|
||||||
emit_state_changed (self, "indeterminate", FALSE);
|
|
||||||
break;
|
|
||||||
case GTK_ACCESSIBLE_TRISTATE_MIXED:
|
|
||||||
emit_state_changed (self, "checked", FALSE);
|
emit_state_changed (self, "checked", FALSE);
|
||||||
emit_state_changed (self, "indeterminate", TRUE);
|
emit_state_changed (self, "indeterminate", TRUE);
|
||||||
break;
|
|
||||||
case GTK_ACCESSIBLE_TRISTATE_FALSE:
|
|
||||||
emit_state_changed (self, "checked", FALSE);
|
|
||||||
emit_state_changed (self, "indeterminate", FALSE);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1011,22 +1019,31 @@ gtk_at_spi_context_state_change (GtkATContext *ctx,
|
|||||||
if (changed_states & GTK_ACCESSIBLE_STATE_CHANGE_PRESSED)
|
if (changed_states & GTK_ACCESSIBLE_STATE_CHANGE_PRESSED)
|
||||||
{
|
{
|
||||||
value = gtk_accessible_attribute_set_get_value (states, GTK_ACCESSIBLE_STATE_PRESSED);
|
value = gtk_accessible_attribute_set_get_value (states, GTK_ACCESSIBLE_STATE_PRESSED);
|
||||||
switch (gtk_tristate_accessible_value_get (value))
|
|
||||||
|
if (value->value_class->type == GTK_ACCESSIBLE_VALUE_TYPE_TRISTATE)
|
||||||
|
{
|
||||||
|
switch (gtk_tristate_accessible_value_get (value))
|
||||||
|
{
|
||||||
|
case GTK_ACCESSIBLE_TRISTATE_TRUE:
|
||||||
|
emit_state_changed (self, "pressed", TRUE);
|
||||||
|
emit_state_changed (self, "indeterminate", FALSE);
|
||||||
|
break;
|
||||||
|
case GTK_ACCESSIBLE_TRISTATE_MIXED:
|
||||||
|
emit_state_changed (self, "pressed", FALSE);
|
||||||
|
emit_state_changed (self, "indeterminate", TRUE);
|
||||||
|
break;
|
||||||
|
case GTK_ACCESSIBLE_TRISTATE_FALSE:
|
||||||
|
emit_state_changed (self, "pressed", FALSE);
|
||||||
|
emit_state_changed (self, "indeterminate", FALSE);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
{
|
{
|
||||||
case GTK_ACCESSIBLE_TRISTATE_TRUE:
|
|
||||||
emit_state_changed (self, "pressed", TRUE);
|
|
||||||
emit_state_changed (self, "indeterminate", FALSE);
|
|
||||||
break;
|
|
||||||
case GTK_ACCESSIBLE_TRISTATE_MIXED:
|
|
||||||
emit_state_changed (self, "pressed", FALSE);
|
emit_state_changed (self, "pressed", FALSE);
|
||||||
emit_state_changed (self, "indeterminate", TRUE);
|
emit_state_changed (self, "indeterminate", TRUE);
|
||||||
break;
|
|
||||||
case GTK_ACCESSIBLE_TRISTATE_FALSE:
|
|
||||||
emit_state_changed (self, "pressed", FALSE);
|
|
||||||
emit_state_changed (self, "indeterminate", FALSE);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user