Closed ghost closed 4 years ago
Reduced a bit more:
type
Control = ref object of RootObj
fOnMouseButtonDown: MouseButtonProc
MouseEvent = ref object
control: Control
button: int
MouseButtonProc = proc(event: MouseEvent)
proc handleMouseButtonDownEvent(control: Control, event: MouseEvent) =
let callback = control.fOnMouseButtonDown
if callback != nil:
callback(event)
proc pDefaultControlButtonPressSignal(widget: Control, event: MouseEvent, data: Control): bool =
let control = data
var evt = MouseEvent()
evt.control = control
case event.button
of 1: evt.button = 1
of 2: evt.button = 2
of 3: evt.button = 3
# Works with else: discard instead
else: return
control.handleMouseButtonDownEvent(evt)
var c = Control()
c.fOnMouseButtonDown = proc(event: MouseEvent) =
echo "click"
discard pDefaultControlButtonPressSignal(c, MouseEvent(control: c, button: 3), c)
Simplified even more:
type
Control = ref object
x: int
MouseEvent = ref object
control: Control
button: int
proc run(data: Control) =
var evt = MouseEvent(button: 1)
evt.control = data
if evt.button == 1:
discard
else:
return
echo data.x
var c = Control()
run(c)
This code works fine with the default GC but SIGSEGV's with ARC. Found in https://github.com/trustable-code/NiGui.
Example
Current Output
Expected Output