; (local { : view } (require :fennel)) (local { : fdopen } (require :posix.stdio)) (local { : Gtk : OsmGpsMap : Gdk : Gio : GLib } (require :lgi)) (local CSS " label.readout { font: 48px \"Noto Sans\"; margin: 10px; padding: 5px; background-color: rgba(0, 0, 0, 0.2); } ") (fn styles [] (let [style_provider (Gtk.CssProvider)] (Gtk.StyleContext.add_provider_for_screen (Gdk.Screen.get_default) style_provider Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION ) (style_provider:load_from_data CSS))) (local window (Gtk.Window { :title "Map" :name "toplevel" :default_width 720 :default_height 800 :on_destroy Gtk.main_quit })) (fn osm-widget [] (doto (OsmGpsMap.Map {}) (tset :map-source OsmGpsMap.MapSource_t.OPENSTREETMAP) (: :set_center_and_zoom 52.595 -0.1 14) (: :layer_add (OsmGpsMap.MapOsd { :show_copyright true ; :show_coordinates true :show_scale true })) )) (fn readout [text] (doto (Gtk.Label {:label text}) (-> (: :get_style_context) (: :add_class :readout)))) (fn readouts [] (doto (Gtk.Box { :orientation Gtk.Orientation.VERTICAL :halign Gtk.Align.END }) (-> (: :get_style_context) (: :add_class :readouts)) (: :add (readout "21:05:00")) (: :add (readout "00:00")) (: :add (readout "25 km/h")))) (local gnss-socket (let [addr (Gio.UnixSocketAddress { :path "/var/run/gnss-share.sock" })] (: (Gio.SocketClient) :connect addr nil))) (fn read-gnss [socket] (each [l #(socket:read "l")] (print "gnss" l)) true) (let [sock (gnss-socket:get_socket) fd (sock:get_fd) events [ GLib.IOCondition.IN GLib.IOCondition.HUP] channel (GLib.IOChannel.unix_new fd) handle (fdopen fd :r)] (GLib.io_add_watch channel 0 events #(read-gnss handle))) (window:add (doto (Gtk.Overlay {}) (: :add (osm-widget)) (: :add_overlay (readouts)) )) (window:show_all) (styles) (Gtk:main)