diff options
author | Matthias Clasen <mclasen@redhat.com> | 2022-09-09 16:06:02 -0400 |
---|---|---|
committer | Matthias Clasen <mclasen@redhat.com> | 2022-09-09 16:07:24 -0400 |
commit | 4c1bc93f6fb9d2636e41baba45d44506bdd2bce3 (patch) | |
tree | 797f2610da1218dd1145055cc47d9eab12609838 | |
parent | 7dd3289837041056590c0915a3a8bfc22e1a10f5 (diff) | |
download | gtk+-4c1bc93f6fb9d2636e41baba45d44506bdd2bce3.tar.gz |
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
-rw-r--r-- | gtk/a11y/gtkatspicontext.c | 69 |
1 files changed, 43 insertions, 26 deletions
diff --git a/gtk/a11y/gtkatspicontext.c b/gtk/a11y/gtkatspicontext.c index a0086365c4..7b62a1ea81 100644 --- a/gtk/a11y/gtkatspicontext.c +++ b/gtk/a11y/gtkatspicontext.c @@ -953,22 +953,30 @@ gtk_at_spi_context_state_change (GtkATContext *ctx, { 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, "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) { 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, "indeterminate", TRUE); - break; - case GTK_ACCESSIBLE_TRISTATE_FALSE: - emit_state_changed (self, "pressed", FALSE); - emit_state_changed (self, "indeterminate", FALSE); - break; - default: - break; } } |