Skip to content

phil294/gtk3.cr

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

GTK3 Crystal Bindings

This is a fork of hugopl/gtk4.cr, but with GTK3. Please see that other repo for details.

There's also the more popular and more battle-tested jhass/crystal-gobject for GTK3. Both bindings are not compatible, but migrating is not hard. I made this very alternative because when I used the other one, there were rare different rare crashes which I couldn't resolve.

If you need AT-SPI, you can use https://github.com/phil294/atspi.cr.

GC-related problems

Crystal's garbage collector [GC] normally runs in somewhat unpredictable intervals. This can lead to crashes, sometimes. The following precautions seem to resolve them (entirely?). Maybe they only occur with -Dpreview_mt only anyway.

You'll see a lot of GLib-GObject-CRITICAL **: etc. error messages in the console all the time. I guess they're not avoidable for now.

  1. Call GC manually before and after running Gtk code. Example: Instead of
    GLib.idle_add do { gtk code... }
    do
    GC.collect
    GLib.idle_add do { gtk code...}
    GC.collect
    Those Glib error messages mentioned above will still show up, but now exactly when you instruct it to, so it doesn't interfere with the Gtk thread.
  2. Avoid begin/rescue inside destroy handlers. Example:
    window.destroy_signal.connect do
      begin
        raise "asdf"
      rescue e
        STDERR.puts e
    end
    this will somehow lead to crashes
  3. When you have many invocations of idle_add in a short timeframe (e.g. 1000 within 1 second), you should wait for each of those to complete before querying the next to avoid crashes. Example: Instead of
    def my_gtk_act_function(&block : -> nil)
        GC.collect
        GLib.idle_add do
            block.call
            false
        end
        GC.collect
    end
    1000.times { my_gtk_act_function { ... } }
    do
    def my_gtk_act_function(&block : -> nil)
        channel = Channel(Nil).new
        GC.collect
        GLib.idle_add do
            block.call
            channel.send(nil)
            false
        end
        channel.receive
        GC.collect
    end
    1000.times { my_gtk_act_function { ... } }
    Where the second method also offers the capability of error handling or returning values as well, at the expense of speed.

About

GTK3 bindings for Crystal

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • Crystal 97.6%
  • Makefile 2.4%