can-lehmann / owlkettle

A declarative user interface framework based on GTK 4
https://can-lehmann.github.io/owlkettle/README
MIT License
375 stars 13 forks source link

SIGSEGV with ListBox under some circumstances #56

Closed silenc3r closed 1 year ago

silenc3r commented 1 year ago

Here's a simple program:

import std/sets
import owlkettle

viewable App:
  rows: seq[string] = @["one", "two", "three"]

method view(app: AppState): Widget =
  gui:
    Window:
      ListBox:
        selectionMode = SelectionSingle

        proc select(pages: HashSet[int]) =
          discard

        for r in app.rows:
          Label:
            text = r
            xAlign = 0
            margin = 5

brew(gui(App()))

When closing the window it crashes with SIGSEGV

Traceback (most recent call last)
/home/dawid/scratch/nim_stuff/simple_gtk/list_box.nim(22) list_box
/home/dawid/.asdf/installs/nim/1.6.12/nimble/pkgs/owlkettle-2.2.0/owlkettle.nim(180) brew
/home/dawid/.asdf/installs/nim/1.6.12/nimble/pkgs/owlkettle-2.2.0/owlkettle/mainloop.nim(55) runMainloop
/home/dawid/.asdf/installs/nim/1.6.12/nimble/pkgs/owlkettle-2.2.0/owlkettle/widgets.nim(2015) selectedRowsChanged
/home/dawid/.asdf/installs/nim/1.6.12/nimble/pkgs/owlkettle-2.2.0/owlkettle/widgetutils.nim(30) redraw
/home/dawid/.asdf/installs/nim/1.6.12/nimble/pkgs/owlkettle-2.2.0/owlkettle/widgetdef.nim(79) redraw
/home/dawid/.asdf/installs/nim/1.6.12/nimble/pkgs/owlkettle-2.2.0/owlkettle/widgetdef.nim(52) update
/home/dawid/.asdf/installs/nim/1.6.12/nimble/pkgs/owlkettle-2.2.0/owlkettle/widgetdef.nim(525) update
/home/dawid/.asdf/installs/nim/1.6.12/nimble/pkgs/owlkettle-2.2.0/owlkettle/widgets.nim(121) updateState
/home/dawid/.asdf/installs/nim/1.6.12/nimble/pkgs/owlkettle-2.2.0/owlkettle/widgetutils.nim(111) updateChild
/home/dawid/.asdf/installs/nim/1.6.12/nimble/pkgs/owlkettle-2.2.0/owlkettle/widgetutils.nim(83) updateChild
/home/dawid/.asdf/installs/nim/1.6.12/nimble/pkgs/owlkettle-2.2.0/owlkettle/widgetdef.nim(52) update
/home/dawid/.asdf/installs/nim/1.6.12/nimble/pkgs/owlkettle-2.2.0/owlkettle/widgetdef.nim(525) update
/home/dawid/.asdf/installs/nim/1.6.12/nimble/pkgs/owlkettle-2.2.0/owlkettle/widgets.nim(2023) updateState
/home/dawid/.asdf/installs/nim/1.6.12/nimble/pkgs/owlkettle-2.2.0/owlkettle/widgetutils.nim(160) updateChildren
/home/dawid/.asdf/installs/nim/1.6.12/nimble/pkgs/owlkettle-2.2.0/owlkettle/widgetdef.nim(52) update
/home/dawid/.asdf/installs/nim/1.6.12/nimble/pkgs/owlkettle-2.2.0/owlkettle/widgetdef.nim(525) update
/home/dawid/.asdf/installs/nim/1.6.12/nimble/pkgs/owlkettle-2.2.0/owlkettle/widgets.nim(1969) updateState
/home/dawid/.asdf/installs/nim/1.6.12/nimble/pkgs/owlkettle-2.2.0/owlkettle/widgetutils.nim(111) updateChild
/home/dawid/.asdf/installs/nim/1.6.12/nimble/pkgs/owlkettle-2.2.0/owlkettle/widgetutils.nim(83) updateChild
/home/dawid/.asdf/installs/nim/1.6.12/nimble/pkgs/owlkettle-2.2.0/owlkettle/widgetdef.nim(52) update
/home/dawid/.asdf/installs/nim/1.6.12/nimble/pkgs/owlkettle-2.2.0/owlkettle/widgetdef.nim(525) update
/home/dawid/.asdf/installs/nim/1.6.12/nimble/pkgs/owlkettle-2.2.0/owlkettle/widgets.nim(353) updateState
/home/dawid/.asdf/installs/nim/1.6.12/nimble/pkgs/owlkettle-2.2.0/owlkettle/widgets.nim(59) updateState
SIGSEGV: Illegal storage access. (Attempt to read from nil?)
fish: Job 1, './list_box' terminated by signal SIGSEGV (Address boundary error)

Commenting out either select proc or margin from label widget fixes the issue.

can-lehmann commented 1 year ago

I am unable to reproduce the SIGSEGV, but I do get the following warnings when closing the application. I believe they might be caused by the same issue. I will take a closer look soon.

(process:20354): Gtk-CRITICAL **: 22:08:29.323: gtk_widget_set_margin_top: assertion 'GTK_IS_WIDGET (widget)' failed

(process:20354): Gtk-CRITICAL **: 22:08:29.324: gtk_widget_set_margin_bottom: assertion 'GTK_IS_WIDGET (widget)' failed

(process:20354): Gtk-CRITICAL **: 22:08:29.324: gtk_widget_set_margin_start: assertion 'GTK_IS_WIDGET (widget)' failed

(process:20354): Gtk-CRITICAL **: 22:08:29.324: gtk_widget_set_margin_end: assertion 'GTK_IS_WIDGET (widget)' failed
can-lehmann commented 1 year ago

I think this bug should be fixed in https://github.com/can-lehmann/owlkettle/commit/6916014eb382622f11a99794847d95f31836b7bd. Could you check if you still get a SIGSEGV?

silenc3r commented 1 year ago

Yes, that fixes the issue. Thanks.