From e0773d6438a7553a5d248ef137755fd45fec4a1d Mon Sep 17 00:00:00 2001 From: Tim Holy Date: Tue, 10 May 2016 15:22:04 -0500 Subject: [PATCH] Use more laborious signal_connect for destroy callback This prevents segfaults upon closing a window, see Gtk #161 --- src/guidata.jl | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/src/guidata.jl b/src/guidata.jl index 7254354..d680bab 100644 --- a/src/guidata.jl +++ b/src/guidata.jl @@ -38,15 +38,7 @@ function Base.setindex!(wd::GUIData, val, w, s::Symbol; raw::Bool=false) if d == empty_guidata d = wd.data[w] = Dict{Symbol,Any}() if isa(w, Gtk.GtkWidget) - signal_connect(w, "destroy") do widget - dct = wd.data[widget] - for (k,v) in dct - if isa(v, AbstractState) - disconnect(v) - end - end - delete!(wd.data, widget) - end + signal_connect(destroy_callback, w, "destroy", Void, (), false, (w,wd)) end end if !raw @@ -59,6 +51,18 @@ function Base.setindex!(wd::GUIData, val, w, s::Symbol; raw::Bool=false) d[s] = val end +@guarded function destroy_callback(widgetptr::Ptr, user_data) + widget, wd = user_data + dct = wd.data[widget] + for (k,v) in dct + if isa(v, AbstractState) + disconnect(v) + end + end + delete!(wd.data, widget) + nothing +end + Base.setindex!{T}(wd::GUIData, val, ws::@compat(Tuple{T,Symbol})) = wd.data[ws[1],ws[2]] = val Base.haskey(wd::GUIData, key) = haskey(wd.data, key)