Hello Guile/G-Golf users,

I am slowly figuring things out with G-Golf and trying to build my own examples for how to do things with it. (repo: https://codeberg.org/ZelphirKaltstahl/guilt-gtk-g-golf-examples, or most recent branch: https://codeberg.org/ZelphirKaltstahl/guilt-gtk-g-golf-examples/src/branch/feature/add-menu-bar)

I have a few questions:

(Q1) Using G-Golf, does one ever have to call `g-object-unref`, or does G-Golf take care of that? For example it is explicitly shown in the GTK example at: https://docs.gtk.org/gtk3/class.ApplicationWindow.html#a-gtkapplicationwindow-with-a-menubar, where the reference for the "builder" is reduced, if I understand it correctly. I am wondering, whether G-Golf abstracts from this and maybe saves me from having to do that kind of stuff. It might prevent me from encapsulating things like in the following function: https://codeberg.org/ZelphirKaltstahl/guilt-gtk-g-golf-examples/src/commit/465d0a3263c36b46ff828544a353397c15103ba5/examples/menu-bar/main.scm#L88:

~~~~
;; A UI XML string can be processed by a GtkBuilder. Then one can get
;; a specific UI element from that builder. The builder has some
;; internal state, it seems, after processing the XML. To get a
;; specific UI element from the builder, one uses
;; `gtk-builder-get-object` and the id of the element, which must be
;; mentioned in the XML. One then gets a `GObject`, an instance of the
;; base widget class.
(define ui-xml-string->g-object
  (λ (ui-xml-string ui-elem-id)
    "Takes a UI XML string and an id of the element selected inside that
XML and returns a GtkBuilder."
    ;; for now ignore length and pass -1 as shown in example at
    
;;https://docs.gtk.org/gtk3/class.ApplicationWindow.html#a-gtkapplicationwindow-with-a-menubar
    (let ([ui-string-length -1])
      (gtk-builder-get-object (gtk-builder-new-from-string ui-xml-string 
ui-string-length)
                              ui-elem-id))))
~~~~

(Q2) What does `next-method` do in an `initialize` method? For example: https://codeberg.org/ZelphirKaltstahl/guilt-gtk-g-golf-examples/src/commit/465d0a3263c36b46ff828544a353397c15103ba5/examples/menu-bar/main.scm#L121:

~~~~
;; Create a window inheriting from <gtk-application-window>. Currently
;; serves no purpose other than being a placeholder for future
;; specialization of the window.
(define-class <menu-bar-demo-window> (<gtk-application-window>))


;; Define the `initialize` method for the Gtk.ApplicationWindow
;; class. This method will be called by GTK itself, when the window is
;; created apparently.
(define-method (initialize (self <menu-bar-demo-window>) initargs)
  ;; No idea what `next-method` does.
  (next-method))
~~~~

It took me a long time to get the menu bar added to the application. The examples show a way how to do things, but this is not always easily adapted or understood. Specifically with the menu bar I experienced the following issues in getting it to work:

(1) The adwaita example renders the _whole_ window from a template, not only the menu bar. (2) The adwaita example does not show you how to add a menu bar that is dynamically built from a string to an application. (3) The example does not show how to only load parts of the UI from a file. One can have a Gtk ApplicationWindow and use the #:template keyword arg. But what if you want to populate or create another widget, like in my case the menu? Then you will need to search a lot and try a lot, before you can make it work.
(4) The examples have almost zero explanatory comments in them.
(5) I did not understand at all, why there is an SXML representation of the UI templates in the code, but also those ".ui" files, with basically the same info in them, just that the formatting of the ".ui" files makes them utterly unreadable. At first I assumed, that some kind of GUI tool must have been used to output the XML in those ".ui" files. I tried to understand how that SXML is used in the code to actually make the menu, but I failed. That is because the actual example doesn't even reference the SXML anywhere. It uses the ".ui" files. But then why is the SXML there ... And only then it dawned on me ... The SXML is used in some kind of preparation step, to generate the ".ui" files! And that is also, why the function `|sxml->ui|` is not actually a function, that returns a value, but merely `display`s the XML string. I think the name of that procedure is misleading. Fortunately Guile / Scheme provides means to still get the string: `|with-output-to-string|` as seen in https://codeberg.org/ZelphirKaltstahl/guilt-gtk-g-golf-examples/src/commit/465d0a3263c36b46ff828544a353397c15103ba5/examples/menu-bar/main.scm#L39.

I think the examples could greatly benefit from actual explanation, also regarding the UI files and how the workflow of the developer working on the examples, instead of just the code.

While I want to make an application, I think I should continue putting examples into my repo, for myself, and for future readers, so that they don't have to figure out the same things I had to figure out. I will try to provide more examples in my repo, as long as I have motivation and energy to continue with this project.

(Q3) Maybe in the future I could contribute the examples to the G-Golf repo?

I think to get this little bit of code, one window with a dynamically created menu bar, I have spent around 4-6h. It is not a problem, since it is a free time project, but compared to any more mainstream way of making a GUI application, this is a long time to figure out the basics.

Keep in mind though, that I have never used GOOPS before. So that might also be part of the reason, why I don't get some ideas of the example code.

Also I probably still need to read more of the docs of Gio and Gtk (still not so clear to me what is what) and also G-Golf.

(Q4) In the past using JavaFX I have had the experience, that rendering UI from template files was adding noticeable delay when opening for example a dialog for the first time. That is why in that project I switched to writing classes and methods to build up the UI, which did not introduce such delay. I am not as far yet with G-Golf. I don't even have the main window figured out yet. But in your experience, how fast is rendering UI from those UI XML files? Is there a similar slowdown/delay? Or is GTK so good at parsing those UI files, that it is not noticeable?

Anyway, great to have gained the power of menu bar now! Menu bar items are still disabled, but I am guessing, that that is due to me not having any `GAction`s registered. `GAction`s I have already in another example, so if I marry those 2 examples ... I should get working menu items!

Best regards,
Zelphir

--
repositories:https://codeberg.org/ZelphirKaltstahl

Reply via email to