-
Notifications
You must be signed in to change notification settings - Fork 622
Open
Milestone
Description
I'm experimenting with libui for the first time using libui-rs and have hit upon an interesting bug which, as far as I can tell from some cursory debugging, is an issue in the underlying C/ObjC libraries.
Adding uiTab
to uiGrid
causes a stack overflow inside the call to uiGridAppend
, as illustrated in the following backtrace from lldb (with a few thousand duplicate entries removed for brevity):
frame #7822: 0x00000001001d1fb8 libui.A.dylib`-[gridView establishOurConstraints] + 7960
frame #7823: 0x00000001001d1fb8 libui.A.dylib`-[gridView establishOurConstraints] + 7960
frame #7824: 0x00000001001d1fb8 libui.A.dylib`-[gridView establishOurConstraints] + 7960
frame #7825: 0x00000001001d219f libui.A.dylib`-[gridView append:] + 127
frame #7826: 0x0000000100001c6f tm155-tool`iui::controls::layout::LayoutGrid::append::hea401a736b5872b2(self=&0x7ffeefbfef40, _ctx=&0x7ffeefbff230, control=TabGroup {
uiTab: &0x10043c190
}, left=0, height=1, xspan=1, yspan=1, expand=Neither, halign=Fill, valign=Fill) at layout.rs:361
frame #7827: 0x0000000100002538 tm155-tool`tm155_tool::MouseWindow::new::h476612a68b1c9009(ui=&0x7ffeefbff230) at main.rs:62
frame #7828: 0x000000010000295a tm155-tool`tm155_tool::main::h3acaee3fc6f51bd5 at main.rs:83
I think I've found what the cause is, but I'm not familiar enough with libui to know how to fix it properly. Here is what I believe is happening:
-[gridView append:]
is called, which adds thegridChild
instance (containing auiTab
) tochildren
and then calls-[gridView establishOurConstraints]
- This calls
uiDarwinControlSetHuggingPriority
for all of its children - For the
uiTab
child, this goes touiTabSetHuggingPriority
, which sets its priority and then callsuiDarwinNotifyEdgeHuggingChanged
on itself - This calls
uiDarwinControlChildEdgeHuggingChanged
on its parent, theuiGrid
, which goes touiGridChildEdgeHuggingChanged
- This function calls
-[gridView establishOurConstraints]
- ... Rinse and repeat
My first guess for a fix would be to store a flag inside the gridView
struct so that establishOurConstraints
can't be recursively called, but I don't know if this would maintain correct behaviour.
Metadata
Metadata
Assignees
Labels
No labels