GTK 3 Hello World Example
The SML version of the C code for Example 1 from the GTK 3 reference manual.
Download
See Using Make for build instructions.
Library dependencies
GLib 2.0 (GObject, Gio)
GTK 3.0 (Gtk)
File listings
example-1.sml
fun printHello () = print "Hello World\n"
fun activate app () =
let
open Gtk
val window = ApplicationWindow.new app
val () = Window.setTitle window "Window"
val () = Window.setDefaultSize window (200, 200)
val buttonBox = ButtonBox.new Orientation.HORIZONTAL
val () = Container.add window buttonBox
val button = Button.newWithLabel "Hello World"
val _ = Signal.connect button (Button.clickedSig, printHello)
val _ = Signal.connect button (Button.clickedSig, fn () => Widget.destroy window)
val () = Container.add buttonBox button
val () = Widget.showAll window
in
()
end
fun main () =
let
val app = Gtk.Application.new (SOME "org.gtk.example", Gio.ApplicationFlags.FLAGS_NONE)
val id = Signal.connect app (Gio.Application.activateSig, activate app)
val argv = Utf8CPtrArrayN.fromList (CommandLine.name () :: CommandLine.arguments ())
val status = Gio.Application.run app argv
val () = Signal.handlerDisconnect app id
in
Giraffe.exit status
end
handle e => Giraffe.error 1 ["Uncaught exception\n", exnMessage e, "\n"]
mlton-main.sml
val () = main ()
mlton.mlb
local
$(SML_LIB)/basis/basis.mlb
$(SML_LIB)/basis/mlton.mlb
$(GIRAFFE_SML_LIB)/general/mlton.mlb
$(GIRAFFE_SML_LIB)/gobject-2.0/mlton.mlb
$(GIRAFFE_SML_LIB)/gio-2.0/mlton.mlb
$(GIRAFFE_SML_LIB)/gtk-3.0/mlton.mlb
in
example-1.sml
mlton-main.sml
end
polyml-libs.sml
use "$(GIRAFFE_SML_LIB)/general/polyml.sml";
use "$(GIRAFFE_SML_LIB)/ffi/polyml.sml";
use "$(GIRAFFE_SML_LIB)/gir/polyml.sml";
use "$(GIRAFFE_SML_LIB)/glib-2.0/polyml.sml";
use "$(GIRAFFE_SML_LIB)/gobject-2.0/polyml.sml";
use "$(GIRAFFE_SML_LIB)/gio-2.0/polyml.sml";
use "$(GIRAFFE_SML_LIB)/gmodule-2.0/polyml.sml";
use "$(GIRAFFE_SML_LIB)/cairo-1.0/polyml.sml";
use "$(GIRAFFE_SML_LIB)/pango-1.0/polyml.sml";
use "$(GIRAFFE_SML_LIB)/pangocairo-1.0/polyml.sml";
use "$(GIRAFFE_SML_LIB)/gdkpixbuf-2.0/polyml.sml";
use "$(GIRAFFE_SML_LIB)/atk-1.0/polyml.sml";
use "$(GIRAFFE_SML_LIB)/gdk-3.0/polyml.sml";
use "$(GIRAFFE_SML_LIB)/xlib-2.0/polyml.sml";
use "$(GIRAFFE_SML_LIB)/gtk-3.0/polyml.sml";
polyml-app.sml
(* For each line of the form
*
* use "<file>";
*
* <file> is taken as a build dependency.
*)
use "example-1.sml";
app.mk
################################################################################
# Application-specific values
NAME := example-1
# MLton target
#
# Define:
# SRC_MLTON - the SML source files for MLton
# TARGET_MLTON - the binary to be built with MLton
ifdef MLTON_VERSION
SRC_MLTON := $(shell $(MLTON_MLTON) -mlb-path-var 'GIRAFFE_SML_LIB $(GIRAFFE_SML_LIBDIR)' -stop f mlton.mlb)
TARGET_MLTON := $(NAME)-mlton
endif
# Poly/ML target
#
# Define:
# SRC_POLYML - the SML source files for Poly/ML
# TARGET_POLYML - the binary to be built with Poly/ML
ifdef POLYML_VERSION
SRC_POLYML := $(shell cat polyml-app.sml | sed -n 's|^use "\([^"]*\)";$$|\1|p')
TARGET_POLYML := $(NAME)-polyml
endif
# Library dependencies
#
# Define:
# LIB_NAMES - list of the libraries that the application references
LIB_NAMES := \
gobject-2.0 \
gio-2.0 \
gtk-3.0
# Note that LIB_NAMES does _not_ contain pkg-config names but GIR namespace
# names, which are also the directory names in $(GIRAFFEHOME)/lib/sml.
#
# One method to determine the list is as follows: for each instance of
#
# $(GIRAFFE_SML_LIB)/$(LIB_NAME)/mlton.mlb
#
# in mlton.mlb, the list should include $(LIB_NAME).