Note: I just released an update to 0.99.2. Now included are Widgets for getting environment vars and command line args and the EData type has been extracted from Event to be separate.
People seem to like the idea so far, so I’m releasing the thing I posted about yesterday on Hackage and we’ll see who uses it. I’m calling it Buster for now, because I’m bad at naming my own projects. Haddock documentation is here. The following is a brief example of how to use the library:
module Main where import App.Widgets.GtkMouseKeyboard import App.Behaviours.PrintEvents import App.EventBus import Control.Concurrent import qualified Graphics.UI.Gtk as Gtk import qualified System.Glib.MainLoop as Gtk main = do Gtk.unsafeInitGUIForThreadedRTS -- buster is multithreaded, so you will need this. window <- Gtk.windowNew -- create a window to bind the mouse keyboard widget to Gtk.windowSetDefaultSize window 800 600 Gtk.widgetShowAll window let mk = bindMouseKeyboardWidget (Gtk.castToWidget window) -- bind the widget -- bus is our main loop bus [mk] -- add the widget to the bus (Gtk.mainContextIteration Gtk.mainContextDefault True) -- the bus executes this thunk to collect data from widgets, if necessary (to support the various main loops out there, like GLUT and Gtk) printEventsBehaviour -- add the behaviour to the bus
Compiling this after install buster will get you a single Gtk window which tracks your mouse position, scroll wheel direction, button press releases and keyboard and outputs it via the printEventsBehaviour, which is pretty useful overall for debugging. Output looks like this:
name: Position source: GtkWindow.KeyboardMouseWidget group: Mouse ttl: Iterations 1 emitTime: 20:10:26 580.0 85.0
By inspecting the source of GtkMouseKeyboard and PrintEvents you can see in a pretty straightforward manner (I think anyway) how to code your own behaviours and widgets. I reccommend sticking to the various default datatypes and not depending on the “a” of “Event a” to be anything in particular, because that means that your widgets will be compatible with everyone else’s. I intend the “a” to be determined by the actual application developer to do special purpose things. If people are interested, I’ll open up a space on here where you can upload your own widgets (as cabalized source dists) and I will compile them into one library called buster-widgets-community which I’ll update whenever other people add widgets. If not, there will be some basic support for GL and XML-RPC webservices that i’ll add as I need it for The Big Board.