[GUI] CGA-Example 1.1

David J. Sankel camio@yahoo.com, gui@haskell.org
Fri, 18 Apr 2003 17:35:58 -0400


This is a MIME-formatted message.  If you see this text it means that your
mail software cannot handle MIME-formatted messages.

--=_0_28972_1050701758
Content-Type: text/plain; format=flowed; charset=iso-8859-1
Content-Transfer-Encoding: 7bit

=====================
CGA-example version 1.1
===================== 

=====================
Overview :: 

 This is an example of a low-level binding to a c++ GUI library
and a mid-level CGA 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. 

=====================
Changes :: 

v1.1 -- Using Heiarchy extention for module naming.  Completed CGA version 
of
 Box, Button, Window, and Widget.  Now using the agreed callback format.
 Initial child handeling support.  Using class-per-function naming.  Using
 MVar's in example CGA application for simplicity. 

=====================
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) 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 ideas on how to handle this? 

3) How should children be handled?  I used both an attribute and a seperate
 function in this implementation. 

4) What do you think is important to have in the next version of 
CGA-example? 

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

Fl-stubs/* -- 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
Fl/* -- These contain the bindings to the stub files.  They also provide
 a low-level interface for the fltk 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. 

CGA.hs
CGA/* -- This is the Midlevel, CGA code wrapping the low-level Fl interface. 

CGA/CommonAttributes.hs
CGA/CommonMembers.hs
CGA/CommonSignals.hs  -- these are the support files for the
 one-class-per-function style as proposed on gui@haskell.org. 

Test_midlevel.hs -- This is the same simple program as Test_lowlevel.hs 
except
 it uses CGA instead of Fl. 

=====================
Cheers, 

David J. Sankel 

--=_0_28972_1050701758
Content-Disposition: attachment; filename=CGA-example-1.1.tar.bz2
Content-Type: application/octet-stream; name=CGA-example-1.1.tar.bz2
Content-Transfer-Encoding: base64

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

--=_0_28972_1050701758--