Skip to content

gtk_tristate_accessible_value_get warning due to g_lo_action_group_remove on "check" entry

In LibreOffice using gtk4 I get frequent:

(soffice:2054897): Gtk-CRITICAL **: 19:56:51.490: gtk_tristate_accessible_value_get: assertion 'value->value_class == &GTK_TRISTATE_ACCESSIBLE_VALUE' failed

warnings on navigating toplevel menus. Debugging I see that gtk_tristate_accessible_value_get fails because the value for GTK_ACCESSIBLE_STATE_CHECKED is GTK_UNDEFINED_ACCESSIBLE_VALUE when queried.

the issue seems to be:

  1. libreoffice has a checkbox menu entry
  2. sometimes g_action_group_action_removed is called on a "checked" item
  3. gtk_menu_tracker_item_action_removed is called and changes the "role" from GTK_MENU_TRACKER_ITEM_ROLE_CHECKED to GTK_MENU_TRACKER_ITEM_ROLE_NORMAL
  4. gtk_model_button_set_role calls update_accessible_properties which does gtk_accessible_reset_state(..., GTK_ACCESSIBLE_STATE_CHECKED) because the role is no longer GTK_BUTTON_ROLE_CHECK.
  5. GTK_ACCESSIBLE_STATE_CHANGE_CHECKED is set because the state changed, but the value of the checked state is now GTK_UNDEFINED_ACCESSIBLE_VALUE, triggering the Gtk-CRITICAL

not sure why the role is changed when the item is removed, in this speculative commit if the role is left unchanged then the warning doesn't happen anymore as expected.

 #2  0x00007fffd8b5b3a7 in gtk_tristate_accessible_value_get (value=<optimized out>) at ../gtk/gtkaccessiblevaluestatic.c:205
 #3  gtk_at_spi_context_state_change
     (ctx=<optimized out>, changed_states=<optimized out>, changed_properties=<optimized out>, changed_relations=<optimized out>, states=<optimized out>, properties=0xa939a00, relations=0xa939b80) at ../gtk/a11y/gtkatspicontext.c:956
 #4  0x00007fffd88c3733 in gtk_at_context_update (self=0x99478c0) at ../gtk/gtkatcontext.c:699
 #5  gtk_at_context_update (self=0x99478c0) at ../gtk/gtkatcontext.c:686
 #6  0x00007fffd89b7470 in update_accessible_properties (button=0x992fb00) at ../gtk/gtkmodelbutton.c:583
 #7  0x00007fffd89b78a8 in gtk_model_button_set_role (role=<optimized out>, self=0x992fb00) at ../gtk/gtkmodelbutton.c:615
 #8  gtk_model_button_set_property (object=0x992fb00, prop_id=<optimized out>, value=<optimized out>, pspec=<optimized out>) at ../gtk/gtkmodelbutton.c:949
 #9  0x00007ffff25c4ab5 in object_set_property () at /lib64/libgobject-2.0.so.0
 #10 0x00007ffff25c6c71 in g_object_setv () at /lib64/libgobject-2.0.so.0
 #11 0x00007ffff25c6d4f in g_object_set_property () at /lib64/libgobject-2.0.so.0
 #12 0x00007ffff25b63c3 in on_source_notify () at /lib64/libgobject-2.0.so.0
 #13 0x00007ffff25b4db0 in g_closure_invoke () at /lib64/libgobject-2.0.so.0
 #14 0x00007ffff25e14d6 in signal_emit_unlocked_R.isra.0 () at /lib64/libgobject-2.0.so.0
 #15 0x00007ffff25d1a2e in g_signal_emit_valist () at /lib64/libgobject-2.0.so.0
 #16 0x00007ffff25d1cb3 in g_signal_emit () at /lib64/libgobject-2.0.so.0
 #17 0x00007ffff25bf204 in g_object_dispatch_properties_changed.lto_priv () at /lib64/libgobject-2.0.so.0
 #18 0x00007ffff25b539c in g_object_notify_queue_thaw.lto_priv () at /lib64/libgobject-2.0.so.0
 #19 0x00007ffff25c302b in g_object_thaw_notify () at /lib64/libgobject-2.0.so.0
 #20 0x00007fffd8ad5afe in gtk_action_muxer_action_removed (muxer=0x9930410, action_name=0xb60bfd0 "win.window-154879424-572") at ../gtk/gtkactionmuxer.c:558
 #21 0x00007fffd8ad5afe in gtk_action_muxer_action_removed (muxer=0x9930010, action_name=0xb60bfd0 "win.window-154879424-572") at ../gtk/gtkactionmuxer.c:558
 #22 0x00007fffd8ad5afe in gtk_action_muxer_action_removed (muxer=0x9926290, action_name=0xb60bfd0 "win.window-154879424-572") at ../gtk/gtkactionmuxer.c:558
 #23 0x00007fffd8ad5afe in gtk_action_muxer_action_removed (muxer=0x993fc10, action_name=0xb60bfd0 "win.window-154879424-572") at ../gtk/gtkactionmuxer.c:558
 #24 0x00007fffd8ad5afe in gtk_action_muxer_action_removed (muxer=0x983e530, action_name=0xb60bfd0 "win.window-154879424-572") at ../gtk/gtkactionmuxer.c:558
 #25 0x00007fffd8ad5afe in gtk_action_muxer_action_removed (muxer=0x9835bc0, action_name=0xb60bfd0 "win.window-154879424-572") at ../gtk/gtkactionmuxer.c:558
 #26 0x00007fffd8ad5afe in gtk_action_muxer_action_removed (muxer=0x982cf40, action_name=0xb60bfd0 "win.window-154879424-572") at ../gtk/gtkactionmuxer.c:558
 #27 0x00007fffd8ad5afe in gtk_action_muxer_action_removed (muxer=muxer@entry=0x9314440, action_name=action_name@entry=0xb60bfd0 "win.window-154879424-572")
     at ../gtk/gtkactionmuxer.c:558
 #28 0x00007fffd8ad5b43 in gtk_action_muxer_action_removed_from_group
     (action_group=<optimized out>, action_name=0xb431760 "window-154879424-572", user_data=<optimized out>) at ../gtk/gtkactionmuxer.c:572
 #29 0x00007ffff25b4db0 in g_closure_invoke () at /lib64/libgobject-2.0.so.0
 #30 0x00007ffff25e14d6 in signal_emit_unlocked_R.isra.0 () at /lib64/libgobject-2.0.so.0
 #31 0x00007ffff25d1a2e in g_signal_emit_valist () at /lib64/libgobject-2.0.so.0
 #32 0x00007ffff25d1cb3 in g_signal_emit () at /lib64/libgobject-2.0.so.0
 #33 0x00007fffd92e3630 in g_lo_action_group_remove(GLOActionGroup*, gchar const*) (group=0x419b940, action_name=0xb60bd40 "window-154879424-572")
     at vcl/unx/gtk4/../gtk3/gloactiongroup.cxx:384
 #34 0x00007fffd92ce4a9 in GtkSalMenu::NativeSetItemCommand(unsigned int, unsigned int, unsigned short, char const*, MenuItemBits, bool, bool)
      (this=0x93b45c0, nSection=0, nItemPos=0, nId=572, aCommand=0xb60bd40 "window-154879424-572", nBits=MenuItemBits::CHECKABLE, bChecked=true, bIsSubmenu=false)
     at vcl/unx/gtk4/../gtk3/gtksalmenu.cxx:1330
 #35 0x00007fffd92cce3c in GtkSalMenu::ImplUpdate(bool, bool) (this=0x93b45c0, bRecurse=false, bRemoveDisabledEntries=false)
     at vcl/unx/gtk4/../gtk3/gtksalmenu.cxx:308
 #36 0x00007fffd92cf4e0 in GtkSalMenu::Update() (this=0x93b45c0) at vcl/unx/gtk4/../gtk3/gtksalmenu.cxx:400
 #37 0x00007fffedf7d438 in Menu::UpdateNativeMenu() (this=0x93b4480) at vcl/source/window/menu.cxx:2180
 #38 0x00007fffd92d3975 in GtkSalMenu::Activate(char const*) (pCommand=0xb5fb0f4 "window-154872880-571") at vcl/unx/gtk4/../gtk3/gtksalmenu.cxx:1489
Edited by Emmanuele Bassi

Merge request reports