[GUI] Common GUI API : What would the code look like?

David Sankel camio@yahoo.com
Tue, 4 Mar 2003 19:08:16 -0800 (PST)


--0-551715676-1046833696=:79350
Content-Type: text/plain; charset=us-ascii
Content-Id: 
Content-Disposition: inline

Overview :: 

  This is an example of a low-level binding to a c++
GUI library 
and a mid-level abstraction over it.  This was created
primarily to spark 
discussion in the gui@haskell.org mailing list and
secondarily to provide a 
simple example that can be compiled using ghc without
any language extensions.

  I encourage those who code, to implement their ideas
for the Common GUI API
using this simple framework.  This would allow all
reviewers to understand
exactly what you are talking about by running your
examples.

  Fltk was chosen for its simplicity and portability. 
I didn't use an existing 
library because I wanted a short example where the
source code is easy to 
comprehend at all levels.

Questions ::
1) How does the interface look in Test_midlevel.hs? 
Is there any critiques in
  regard to using this style in CGA (Common GUI API)?

2) What drastic or minor changes would have to be made
to the Test_midlevel.hs
  file to make it CGA compatible?  Yes, this is a
completely subjective 
  question.  In your opinion, what should
Test_midlevel.hs look like?

3) There has been some discussion about using
non-standard Haskell extensions
  in CGA.  No extensions have been used in this
example.  Exactly what 
  extensions would be useful in this example or in CGA
as a imaginary whole?
  Is it worth it to use said extensions and allow CGA
to be incompatible with
  Haskell98?

4) Haskell has one namespace, the global one.  Since
there would be a lot of 
  function names and attributes in CGA, their names
should be well thought out.
  Is there any initial ideas on how to handle this?

5) I am willing to implement more stuff like this. 
What other stuff would you like to see with this?

Running ::
To run the examples, one needs a standard Haskell
compiler with ffi (ghc) and 
fltk installed (http://www.fltk.org).  run make.  If
necessary, change the 
makefile to modify for your configuration.

f_*_stub.cpp -- These are the stubs that are used to
bind the c++ library to 
  c functions.  This is required because the Haskell
ffi standard does not 
  specify any conventions for C++.

Fl.hs
Box.hs
Button.hs
Window.hs -- These contain the bindings to the stub
files.  They also provide 
  a low-level interface for the GUI toolkit.

Test_lowlevel.hs -- This is a simple program
demonstrating use of the low-level
  binding.

Attributes.hs -- This code was taken from the htoolkit
cvs server.  Simple 
  modifications were made to suit our purposes.

A_Button.hs -- This is an abstraction over the
low-level Button interface.  It 
  uses the Attributes module for the mid-level
interface.

Test_midlevel.hs -- This is the same simple program as
Test_lowlevel.hs except
  it uses A_Button instead of Button to demonstrate
use of the Attributes
  abstraction.


Cheers,

David J. Sankel
--0-551715676-1046833696=:79350
Content-Type: application/octet-stream; name="CGA-example-1.0.tar.bz2"
Content-Transfer-Encoding: base64
Content-Description: CGA-example-1.0.tar.bz2
Content-Disposition: attachment; filename="CGA-example-1.0.tar.bz2"

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
yIA=

--0-551715676-1046833696=:79350--