DEV Community

Luis Ángel Méndez Gort
Luis Ángel Méndez Gort

Posted on

F# đŸ€ GTK4

#r "nuget: GirCore.Gtk-4.0,0.5.0"

open System
open Gtk

let label () =
  let label = new Label()
  label.SetText "hello"
  label

let button (label: Label) =
  let button = new Button()
  button.SetLabel "click me"
  let mutable counter = 0

  let clickHnd (_: Button) (_: EventArgs) =
    label.SetText $"hello {counter}"
    counter <- counter + 1

  button.add_OnClicked (new GObject.SignalHandler<Button>(clickHnd))
  button

let box () =
  let box = new Box()
  box.SetOrientation Orientation.Vertical
  box.SetHomogeneous true

  let l = label ()
  box.Append l
  button l |> box.Append
  box

let onActivateApp (sender: Gio.Application) (_: EventArgs) =
  let window = ApplicationWindow.New(sender :?> Application)
  window.Title <- "Gtk4 Window"
  window.SetDefaultSize(300, 300)
  window.SetChild(box ())
  window.Show()

let application = Application.New("org.gir.core", Gio.ApplicationFlags.FlagsNone)
application.add_OnActivate (new GObject.SignalHandler<Gio.Application>(onActivateApp))
application.RunWithSynchronizationContext(null)
Enter fullscreen mode Exit fullscreen mode

The above code does the following:

  • creates a 300px × 300px window with GTK4
  • the window title is "Gtk4 Window"
  • it has a button and a label controls
  • when clicking the button the label text changes to show the value of a counter that increases with each click

Notice the code is an F# script, which means it doesn't need a main function and can run by putting the code in an .fsx file and then running it with dotnet fsi your_file.fsx

Top comments (2)

Collapse
 
giullianosep profile image
Giulliano Ferreira

Is there any advantage of using GTK instead of something like Avalonia?

Collapse
 
lamg profile image
Luis Ángel Méndez Gort

A simple window in GTK seems to be more resource efficient than one in Avalonia. On the other hand Avalonia has functional wrappers that might be more appealing to some people.