[Gtk4] @sigatom

This works in Gtk.jl:

using Gtk
win = GtkWindow("test")
g = GtkGrid()
sb = GtkSpinButton(1, 10, 1)
s = GtkScale(false, 1, 10, 1)
g[1, 1] = sb
g[1, 2] = s
push!(win, g)
showall(win)
signal_connect(s, "value_changed") do widget
    Gtk.@sigatom begin
        GAccessor.value(sb, round(Int64, GAccessor.value(s)))
    end
end
signal_connect(sb, "changed") do widget
    Gtk.@sigatom begin
        GAccessor.value(s,  GAccessor.value(sb))
    end
end

but throws a segmentation fault in Gtk4.jl

using Gtk4
win = GtkWindow("test")
g = GtkGrid()
sb = GtkSpinButton(1, 10, 1)
s = GtkScale(:h, 1, 10, 1)
g[1, 1] = sb
g[1, 2] = s
push!(win, g)
signal_connect(s, "value_changed") do widget
    Gtk4.value(sb, round(Int64, Gtk4.value(s)))
end
signal_connect(sb, "changed") do widget
    Gtk4.value(s, sb.value)
end

since there is no @sigatom in Gtk4.jl

Is there any way to link widgets dynamically using Gtk4?

Oh, I’ve just got it to work :grin:

using Gtk4
win = GtkWindow("test")
g = GtkGrid()
sb = GtkSpinButton(1, 10, 1)
s = GtkScale(:h, 1, 10, 1)
g[1, 1] = sb
g[1, 2] = s
push!(win, g)
id1 = signal_connect(s, "value_changed") do widget
    signal_handler_block(sb, id2)
    Gtk4.value(sb, round(Int64, Gtk4.value(s)))
    signal_handler_unblock(sb, id2)
end
id2 = signal_connect(sb, "changed") do widget
    signal_handler_block(s, id1)
    Gtk4.value(s, sb.value)
    signal_handler_unblock(s, id1)
end
2 Likes

This works too:

using Gtk4
win = GtkWindow("test")
g = GtkGrid()
sb = GtkSpinButton(1, 10, 1)
s = GtkScale(:h, 1, 10, 1)
g[1, 1] = sb
g[1, 2] = s
push!(win, g)
signal_connect(s, "value_changed") do widget
    @idle_add Gtk4.value(sb, round(Int64, Gtk4.value(s)))
end
signal_connect(sb, "changed") do widget
    @idle_add Gtk4.value(s, sb.value)
end

That’s even better, particularly for a larger number of interdependent widgets. Thanks!