It seems GetLayout() implementation in dbusmenu-glib is buggy: it ignores the parentId parameter.
Getting first level of items for gedit:
# dbus-send --print-reply --dest=:1.442 /com/canonical/menu/7C000A3 com.canonical.dbusmenu.GetLayout int32:0 int32:1 'array:string:'
method return sender=:1.442 -> dest=:1.455 reply_serial=2 uint32 2 struct { int32 0 array [ dict entry( string "children-display" variant string "submenu" ) ] array [ variant struct { int32 2 array [ dict entry( string "children-display" variant string "submenu" ) dict entry( string "label" variant string "File" ) ] array [ ] } variant struct { int32 3 array [ dict entry( string "children-display" variant string "submenu" ) dict entry( string "label" variant string "Edit" ) ] array [ ] } variant struct { int32 4 array [ dict entry( string "children-display" variant string "submenu" ) dict entry( string "label" variant string "View" ) ] array [ ] } variant struct { int32 5 array [ dict entry( string "children-display" variant string "submenu" ) dict entry( string "label" variant string "Search" ) ] array [ ] } variant struct { int32 6 array [ dict entry( string "children-display" variant string "submenu" ) dict entry( string "label" variant string "Tools" ) ] array [ ] } variant struct { int32 7 array [ dict entry( string "enabled" variant boolean true ) dict entry( string "type" variant string "separator" ) dict entry( string "visible" variant boolean false ) ] array [ ] } variant struct { int32 8 array [ dict entry( string "enabled" variant boolean true ) dict entry( string "type" variant string "separator" ) dict entry( string "visible" variant boolean false ) ] array [ ] } variant struct { int32 9 array [ dict entry( string "children-display" variant string "submenu" ) dict entry( string "label" variant string "Documents" ) ] array [ ] } variant struct { int32 10 array [ dict entry( string "children-display" variant string "submenu" ) dict entry( string "label" variant string "Help" ) ] array [ ] } ] }
Getting content of the "File" submenu (id=2):
# dbus-send --print-reply --dest=:1.442 /com/canonical/menu/7C000A3 com.canonical.dbusmenu.GetLayout int32:2 int32:1 'array:string:'
Returns exactly the same tree.
It seems GetLayout() implementation in dbusmenu-glib is buggy: it ignores the parentId parameter.
Getting first level of items for gedit:
# dbus-send --print-reply --dest=:1.442 /com/canonical/ menu/7C000A3 com.canonical. dbusmenu. GetLayout int32:0 int32:1 'array:string:'
method return sender=:1.442 -> dest=:1.455 reply_serial=2
int32 2
array [
dict entry(
string "children-display"
variant string "submenu"
dict entry(
string "label"
variant string "File"
array [
int32 3
array [
dict entry(
string "children-display"
variant string "submenu"
dict entry(
string "label"
variant string "Edit"
array [
int32 4
array [
dict entry(
string "children-display"
variant string "submenu"
dict entry(
string "label"
variant string "View"
array [
int32 5
array [
dict entry(
string "children-display"
variant string "submenu"
dict entry(
string "label"
variant string "Search"
array [
int32 6
array [
dict entry(
string "children-display"
variant string "submenu"
dict entry(
string "label"
variant string "Tools"
array [
int32 7
array [
dict entry(
string "enabled"
variant boolean true
dict entry(
string "type"
variant string "separator"
dict entry(
string "visible"
variant boolean false
array [
int32 8
array [
dict entry(
string "enabled"
variant boolean true
dict entry(
string "type"
variant string "separator"
dict entry(
string "visible"
variant boolean false
array [
int32 9
array [
dict entry(
string "children-display"
variant string "submenu"
dict entry(
string "label"
variant string "Documents"
array [
int32 10
array [
dict entry(
string "children-display"
variant string "submenu"
dict entry(
string "label"
variant string "Help"
array [
uint32 2
struct {
int32 0
array [
dict entry(
string "children-display"
variant string "submenu"
)
]
array [
variant struct {
)
)
]
]
}
variant struct {
)
)
]
]
}
variant struct {
)
)
]
]
}
variant struct {
)
)
]
]
}
variant struct {
)
)
]
]
}
variant struct {
)
)
)
]
]
}
variant struct {
)
)
)
]
]
}
variant struct {
)
)
]
]
}
variant struct {
)
)
]
]
}
]
}
Getting content of the "File" submenu (id=2):
# dbus-send --print-reply --dest=:1.442 /com/canonical/ menu/7C000A3 com.canonical. dbusmenu. GetLayout int32:2 int32:1 'array:string:'
Returns exactly the same tree.