REF MOTIF                      Jonathan Meyer, Andreas Schoter, Sep 1991
                                           Revised John Gibson, Apr 1993

        COPYRIGHT University of Sussex 1993. All Rights Reserved.

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
<<<<<<<<<<<<<<<<<<<<<                             >>>>>>>>>>>>>>>>>>>>>>
<<<<<<<<<<<<<<<<<<<<<       THE POPLOG MOTIF      >>>>>>>>>>>>>>>>>>>>>>
<<<<<<<<<<<<<<<<<<<<<          INTERFACE          >>>>>>>>>>>>>>>>>>>>>>
<<<<<<<<<<<<<<<<<<<<<                             >>>>>>>>>>>>>>>>>>>>>>
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

This file provides some programming  details of the Poplog interface  to
the Motif Widget  Set. See HELP * MOTIF  for an overview  of the  Poplog
Motif interface.

         CONTENTS - (Use <ENTER> g to access required sections)

  1   Introduction

  2   Loading Motif Widgets

  3   Motif Widget Classes
      3.1   Widgets
      3.2   Gadgets
      3.3   Objects

  4   Motif Procedures
      4.1   Undocumented Procedures

  5   Include Files: Constants and  Typespecs

  6   Additional Data Structures

  7   Motif String Support

  8   Unsupported Features
      8.1   Pop-11 procedure registration

  9   Associated Documentation



---------------
1  Introduction
---------------

Motif does  not  have any  special  startup requirements,  so  only  the
standard  sysxsetup  (or   XptDefaultSetup)  procedure   is  needed   to
initialise the  toolkit before  creating Motif  widgets. (If  you  start
Pop-11 etc  with the  %x flag  then this  is done  automatically --  see
REF * XT_INIT for details.)




------------------------
2  Loading Motif Widgets
------------------------

To use Motif library files, it is first necessary to extend  popuseslist
to include the Xm  sub-directory of the main  Poplog X library. This  is
done with

        uses Xm;

For  each  Motif  widgetclass,  the  Xm  directory  defines  a  constant
identifier xmFooBazWidget (in a file of that name) which you must  'use'
in order to use the widgetclass, i.e.

        uses xmFooBazWidget;

Thus for example, the Motif C widget class name  xmPushButtonWidgetClass
is mapped onto the Poplog name xmPushButtonWidget:

        uses xmPushButtonWidget;
        xmPushButtonWidget =>
        <Xm WidgetClass PushButtonWidget>

Alternatively, you can use LIB * XmAllWidgets:

        uses XmAllWidgets;

This is an Xm library  file containing a uses  for every widget, and  so
loads them all once.

Loading a Motif widgetclass will  cause any associated procedures to  be
loaded as well.




-----------------------
3  Motif Widget Classes
-----------------------

Each of the widgetclasses below is loaded by a file of the same name  in
the Xm  directory  (the files  use  * XptLoadWidgetClass  to  load  each
class).


XmAllWidgets                                                   [library]
        This library loads all the widgetclasses below in one go.



3.1  Widgets
------------
xmArrowButtonWidget      -> widgetclass                       [constant]
        Consists of a directional arrow  surrounded by a border  shadow.
        It inherits  from  Core  and Primitive  classes.  See  OSF/Motif
        Manual Set: Programmer's Reference for more details.


xmBulletinBoardWidget    -> widgetclass                       [constant]
        A composite widget for providing simple geometry management  for
        its children.  Inherits  from Core,  Composite,  Constraint  and
        Manager widget classes. See  OSF/Motif Manual Set:  Programmer's
        Reference for more details.


xmCascadeButtonWidget    -> widgetclass                       [constant]
        This widget class is used in menu systems to link two  MenuPanes
        or a MenuBar to a MenuPane. It inherits from Core, Primitive and
        Label widget  classes. See  OSF/Motif Manual  Set:  Programmer's
        Reference for more details.


xmCommandWidget          -> widgetclass                       [constant]
        A  special-purpose  composite  widget  for  command  entry  with
        built-in history mechanism.  It inherits  from Core,  Composite,
        Constraint, Manager, BulletinBoard and SelectionBox classes. See
        OSF/Motif Manual Set: Programmer's Reference for more details.


xmDialogShellWidget      -> widgetclass                       [constant]
        Used as the  parent shell  for dialogs. It  inherits from  Core,
        Composite,  Shell,  WMShell,   VendorShell  and   TransientShell
        classes. See OSF/Motif  Manual Set:  Programmer's Reference  for
        more details.


xmDrawingAreaWidget      -> widgetclass                       [constant]
        This is an empty  widget designed to  be easily adaptable  for a
        variety  of  purposes.   It  inherits   from  Core,   Composite,
        Constraint  and  Manager  classes.  See  OSF/Motif  Manual  Set:
        Programmer's Reference for more details.


xmDrawnButtonWidget      -> widgetclass                       [constant]
        This is an empty widget window surrounded by a shadow border. It
        inherits from Core, Primitive  and Label classes. See  OSF/Motif
        Manual Set: Programmer's Reference for more details.


xmFileSelectionBoxWidget -> widgetclass                       [constant]
        This widget provides  utilities for  traversing directories  and
        selcting files. It  inherits from  Core, Composite,  Constraint,
        Manager, BulletinBoard and  SelectionBox classes. See  OSF/Motif
        Manual Set: Programmer's Reference for more details.


xmFormWidget             -> widgetclass                       [constant]
        This is a container widget for managing the layout of  children.
        It  inherits  from  Core,  Composite,  Constraint,  Manager  and
        BulletinBoard classes.  See OSF/Motif  Manual Set:  Programmer's
        Reference for more details.


xmFrameWidget            -> widgetclass                       [constant]
        A simple manager for  enclosing a single child  in a border.  It
        inherits from Core, Composite,  Constraint and Manager  classes.
        See  OSF/Motif  Manual  Set:  Programmer's  Reference  for  more
        details.


xmLabelWidget            -> widgetclass                       [constant]
        An instantiable widget also used  a superclass for other  button
        widgets. It  inherits  from  Core  and  Primitive  classes.  See
        OSF/Motif Manual Set: Programmer's Reference for more details.


xmListWidget             -> widgetclass                       [constant]
        A widget that allows the user to select one or more items from a
        list of choices.  It inherits from  Core and Primitive  classes.
        See  OSF/Motif  Manual  Set:  Programmer's  Reference  for  more
        details.


xmMainWindowWidget       -> widgetclass                       [constant]
        This widget provides  a standard layout  semantics for the  main
        window of  an application.  It  inherits from  Core,  Composite,
        Constraint, Manager  and ScrolledWindow  classes. See  OSF/Motif
        Manual Set: Programmer's Reference for more details.


xmManagerWidget          -> widgetclass                       [constant]
        This is a superclass for many other widget classes. It  inherits
        from Core,  Composite,  and Constraint  classes.  See  OSF/Motif
        Manual Set: Programmer's Reference for more details.


xmMenuShellWidget        -> widgetclass                       [constant]
        This is a custom OverrideShell widget designed to contain  Popup
        or Pulldown MenuPanes. It inheritsd from Core, Composite,  Shell
        and   OverrideShell   classes.   See   OSF/Motif   Manual   Set:
        Programmer's Reference for more details.


xmMessageBoxWidget       -> widgetclass                       [constant]
        This is a dialog widget for simple message dialogs. It  inherits
        from  Core,  Composite,  Constrint,  Manager  and  BulletinBoard
        classes. See OSF/Motif  Manual Set:  Programmer's Reference  for
        more details.


xmPanedWindowWidget      -> widgetclass                       [constant]
        This  is  a  composite  widget  that  lays  out  children   in a
        vertically tiled  format.  It  inherits  from  Core,  Composite,
        Constraint  and  Manager  classes.  See  OSF/Motif  Manual  Set:
        Programmer's Reference for more details.


xmPrimitiveWidget        -> widgetclass                       [constant]
        This widget  class  is used  as  a supporting  superclass  for a
        variety of  other  widget classes.  It  inherits from  the  Core
        class. See OSF/Motif Manual Set: Programmer's Reference for more
        details.


xmPushButtonWidget       -> widgetclass                       [constant]
        This  widget  class  is  used   to  issue  commands  within   an
        application. It inherits from Core, Primitive and Label classes.
        See  OSF/Motif  Manual  Set:  Programmer's  Reference  for  more
        details.


xmRowColumnWidget        -> widgetclass                       [constant]
        A general row-column  manager capable of  containing and  widget
        class instance as  a child.  It inherits  from Core,  Composite,
        Constraint  and  Manager  classes.  See  OSF/Motif  Manual  Set:
        Programmer's Reference for more details.


xmScaleWidget            -> widgetclass                       [constant]
        Used by applications to indicate a value from a range of values,
        allowing user modification of that value. It inherits from Core,
        Composite, Constraint and Manager classes. See OSF/Motif  Manual
        Set: Programmer's Reference for more details.


xmScrollBarWidget        -> widgetclass                       [constant]
        Used to view  data too  large to be  displayed all  at once.  It
        inherits from Core and  Primitive classes. See OSF/Motif  Manual
        Set: Programmer's Reference for more details.


xmScrolledWindowWidget   -> widgetclass                       [constant]
        This widget combines one or  two ScrollbarWidgets and a  viewing
        area. It inherits from  Core, Composite, Constraint and  Manager
        classes. See OSF/Motif  Manual Set:  Programmer's Reference  for
        more details.


xmSelectionBoxWidget     -> widgetclass                       [constant]
        A general dialog widget allowing the selection of a single  item
        from a  list.  It  inherits from  Core,  Composite,  Constraint,
        Manager and  BuletinBoard  classes. See  OSF/Motif  Manual  Set:
        Programmer's Reference for more details.


xmSeparatorWidget        -> widgetclass                       [constant]
        A widget for  separating items  in a display.  It inherits  from
        Core  and   Primitive  classes.   See  OSF/Motif   Manual   Set:
        Programmer's Reference for more details.


xmTextFieldWidget        -> widgetclass                       [constant]
        This widget provides a single-line text editor. It inherits from
        Core  and   Primitive  classes.   See  OSF/Motif   Manual   Set:
        Programmer's Reference for more details.


xmTextWidget             -> widgetclass                       [constant]
        This widget provides  a single  and multi-line  text editor.  It
        inherits from Core and  Primitive classes. See OSF/Motif  Manual
        Set: Programmer's Reference for more details.


xmToggleButtonWidget     -> widgetclass                       [constant]
        This widget controls the display and setting of data withing  an
        application. It inherits from Core, Primitive and Label classes.
        See  OSF/Motif  Manual  Set:  Programmer's  Reference  for  more
        details.



3.2  Gadgets
------------
xmArrowButtonGadget      -> widgetclass                       [constant]
        Consists of a directional arrow  surrounded by a border  shadow.
        Inherits  from  Object,  RectObject  and  Gadget  classes.   See
        OSF/Motif Manual Set: Programmer's Reference for more details.


xmCascadeButtonGadget    -> widgetclass                       [constant]
        This gadget class is  similar to xmCascadeButtonWidget with  the
        additional facility of  being able  to link  an OptionMenu  to a
        MenuPane. It  inherits  from  Object,  RectObject,  Gadget,  and
        LabelGadget classes.  See  OSF/Motif  Manual  Set:  Programmer's
        Reference for more details.


xmGadget                 -> widgetclass                       [constant]
        This widget  class  is a  supporting  superclass for  the  other
        gadget classes. It inherits from Object and RectObject  classes.
        See  OSF/Motif  Manual  Set:  Programmer's  Reference  for  more
        details.


xmLabelGadget            -> widgetclass                       [constant]
        An instantiable widget also used a a superclass for other button
        gadgets. It inherits from Object, RectObject and Gadget classes.
        See  OSF/Motif  Manual  Set:  Programmer's  Reference  for  more
        details.


xmPushButtonGadget       -> widgetclass                       [constant]
        Similar  to   PushButtenWidget.   It   inherits   from   Object,
        RectObject, Gadget and LabelGadget classes. See OSF/Motif Manual
        Set: Programmer's Reference for more details.


xmSeparatorGadget        -> widgetclass                       [constant]
        A gadget for  separating items  in a display.  It inherits  from
        Object, RectObject and Gadget classes. See OSF/Motif Manual Set:
        Programmer's Reference for more details.


xmToggleButtonGadget     -> widgetclass                       [constant]
        This gadget controls the display  and setting of data within  an
        application. It  inherits from  Object, RectObject,  Gadget  and
        LabelGadget classes.  See  OSF/Motif  Manual  Set:  Programmer's
        Reference for more details.



3.3  Objects
------------
xmDesktopObject          -> widgetclass                       [constant]
xmDisplayObject          -> widgetclass                       [constant]
xmExtObject              -> widgetclass                       [constant]
xmScreenObject           -> widgetclass                       [constant]
xmShellExtObject         -> widgetclass                       [constant]
xmVendorShellExtObject   -> widgetclass                       [constant]
xmWorldObject            -> widgetclass                       [constant]
        These objects are  available in  Unix systems, but  not in  VMS.
        They are not documented in the OSF/Motif Manual Set.




-------------------
4  Motif Procedures
-------------------

When any of the Motif widgetclasses are loaded, they automatically  load
a number of Motif  convenience functions (starting  with Xm-), and  also
define  some  additional  procedures  needed  to  use  Motif  in  Poplog
(starting with Xpm-). Additional functions may also be defined when  you
request specific widgets from the Motif widget set.

Procedures starting with Xm- follow the same calling semantics as  their
C equivalents, and do NOT perform any type checking on their  arguments.
Xpm- procedures  on  the  other  hand  do  perform  any  necessary  type
checking.

(The files defining  the Xm- procedures  employ XptPopLoadProcedures  to
load them.)


XmSetColorCalculation(p)                                     [procedure]
XmGetColorCalculation() -> p                                 [procedure]
XmGetColors(screenptr, XID, pixel1, pixel2, pixel3, pixel4,  [procedure]
                                                pixel5)
        These procedures implement the  colour functions of Motif.  They
        are in LIB * Xmgeneral,  which is loaded automatically by  every
        widget class. See OSF/Motif  Manual Set: Programmer's  Reference
        for more details.


XmCvtStringToUnitType(exptr1, cardinalptr, exptr2, exptr3)   [procedure]
        This procedure converts a string to a unit-type value. They  are
        in LIB * Xmgeneral,  which  is  loaded  automatically  by  every
        widget class. See OSF/Motif  Manual Set: Programmer's  Reference
        for more details.


XmCvtCTToXmString(ctext) -> string                           [procedure]
XmCvtXmStringToCT(XmString) -> string                        [procedure]
XmFontListAdd(XmFontList1, fontstruct, XmStringCharSet)      [procedure]
                                            -> XmFontList2
XmFontListCopy(XmFontList1) -> XmFontList2                   [procedure]
XmFontListCreate(fontstruct, XmStringCharSet) -> XmFontList  [procedure]
XmFontListFree(XmFontList)                                   [procedure]
XmFontListFreeFontContext(XmFontContext)                     [procedure]
XmFontListGetNextFont(XmFontContext, XmStringCharSetPtr,     [procedure]
                        XFontStructPtrPtr) -> bool
XmFontListInitFontContext(XmFontContext, XmFontList) -> bool [procedure]
XmStringBaseline(XmFontList, XmString) -> ushort             [procedure]
XmStringByteCompare(XmString1, XmString2) -> bool            [procedure]
XmStringCompare(XmString1, XmString2) -> bool                [procedure]
XmStringConcat(XmString1, XmString2) -> string               [procedure]
XmStringNConcat(XmString1, XmString2, int) -> string         [procedure]
XmStringCopy(XmString) -> string                             [procedure]
XmStringNCopy(XmString, int) -> string                       [procedure]
XmStringCreate(string1, XmStringCharSet) -> string2          [procedure]
XmStringCreateLtoR(string1, XmStringCharSet) -> string2      [procedure]
XmStringCreateSimple(string1) -> string2                     [procedure]
XmStringDirectionCreate(int) -> string                       [procedure]
XmStringDraw(displayptr, window, XmFontList, XmString, GC,   [procedure]
                    position1, position2, int,
                    char1, char2, XRectPtr)
XmStringDrawImage(displayptr, window, XmFontList, XmString,  [procedure]
                    gc, position1, position2, int,
                    char1, char2, XRectPtr)
XmStringDrawUnderline(displayptr, window, XmFontList,        [procedure]
                    XmString1, gc, position1, position2,
                    int, char1, char2, XRectPtr, XmString2)
XmStringEmpty(XmString) -> bool                              [procedure]
XmStringExtent(XmFontList, XmString, intvec1, intvec2)       [procedure]
XmStringFree(XmString)                                       [procedure]
XmStringFreeContext(XmStringContext)                         [procedure]
XmStringGetLtoR(XmString, XmStringCharSet, CharPtrPtr)       [procedure]
                                            -> bool
XmStringGetNextComponent(XmStringContext, CharPtrPtr1,       [procedure]
                    XmStringCharSetPtr, intvec,
                    exptr, shortvec, CharPtrPtr2) -> byte
XmStringGetNextSegment(XmStringContext, CharPtrPtr,          [procedure]
            XmStringCharSetPtr, intvec1, intvec2) -> bool
XmStringHasSubstring(XmString1, XmString2) -> bool           [procedure]
XmStringHeight(XmFontList, XmString) -> ushort               [procedure]
XmStringLength(XmString) -> int                              [procedure]
XmStringWidth(XmFontList, XmString) -> ushort                [procedure]
XmStringInitContext(XmStringContextPtr, XmString) -> bool    [procedure]
XmStringLineCount(XmString) -> int                           [procedure]
XmStringPeekNextComponent(XmStringContext) -> byte           [procedure]
XmStringSegmentCreate(string1, XmStringCharSet, int, byte)   [procedure]
                                            -> string2
XmStringSeparatorCreate() -> string
XmCvtTextToXmString(arg1, ..., arg6) -> bool                 [procedure]
XmCvtXmStringToText(arg1, ... arg6) -> bool                  [procedure]
XmStringLtoRCreate(arg1, arg2) -> string                     [procedure]
        These procedures  implement Motif's  compound string  functions.
        They are in  LIB * Xmgeneral, which is  loaded automatically  by
        every widget  class.  See  OSF/Motif  Manual  Set:  Programmer's
        Reference for more details.


XmSetFontUnit(displayptr, int)                               [procedure]
XmSetFontUnits(displayptr, int1, int2)                       [procedure]
        These procedures implement the  Motif functions for setting  the
        font unit  value for  a display.  They are  in  LIB * Xmgeneral,
        which  is  loaded  automatically  by  every  widget  class.  See
        OSF/Motif Manual Set: Programmer's Reference for more details.


XmTrackingLocate(widget1, XID, byte) -> widget2              [procedure]
XmGetMenuCursor(displayptr) -> cursor                        [procedure]
XmSetMenuCursor(displayptr, cursor)                          [procedure]
XmIsMotifWMRunning(widget) -> bool                           [procedure]
        These procedures implement Motif toolkit functions. They are  in
        LIB * Xmgeneral, which  is  is  loaded  automatically  by  every
        widget class. See OSF/Motif  Manual Set: Programmer's  Reference
        for more details.


XmConvertUnits(widget, int1, int2, int3, int4) -> int5       [procedure]
XmAddTabGroup(widget)                                        [procedure]
XmRemoveTabGroup(widget)                                     [procedure]
XmDestroyPixmap(screenptr, pixmap) -> bool                   [procedure]
XmGetPixmap(screenptr, string, pixel1, pixel2) -> XID        [procedure]
XmInstallImage(ximage, string) -> bool                       [procedure]
XmUninstallImage(ximage) -> bool                             [procedure]
XmProcessTraversal(widget, int) -> bool                      [procedure]
XmGetDestination(displayptr) -> widget                       [procedure]
XmUpdateDisplay(widget)                                      [procedure]
XmResolvePartOffsets(widgetclass, exptr)                     [procedure]
XmResolveAllPartOffsets(widgetclass, exptr1, exptr2)         [procedure]
XmGetSecondaryResourceData(arg1, arg2) -> uint               [procedure]
XmStringCreateFontList(arg1, arg2) -> exptr                  [procedure]
        These   procedures   implement   various   miscellaneous   Motif
        functions. They  are  in  LIB * Xmgeneral, which  is  is  loaded
        automatically by every widget  class. See OSF/Motif Manual  Set:
        Programmer's Reference for more details.


XmCreateBulletinBoard(widget1, string, arglist, cardinal)    [procedure]
                                            -> widget2
XmCreateBulletinBoardDialog(widget1, string, arglist,        [procedure]
                                  cardinal) -> widget2
        These  procedures  implement  Motif  BulletinBoard   convenience
        creation functions, and are loaded by xmBulletinBoardWidget. See
        OSF/Motif Manual Set: Programmer's Reference for more details.


XmCreateCommand(widget1, string, arglist, cardinal)          [procedure]
                                            -> widget2
XmCommandGetChild(widget1, char) -> widget2                  [procedure]
XmCommandSetValue(widget, XmString)                          [procedure]
XmCommandAppendValue(widget, XmString)                       [procedure]
XmCommandError(widget, XmString)                             [procedure]
        These procedures implement the Motif Command functions, and  are
        loaded   by   xmCommandWidget.   See   OSF/Motif   Manual   Set:
        Programmer's Reference for more details.


XmCreateDrawingArea(widget1, string, arglist, cardinal)      [procedure]
                                            -> widget2
        This procedure is a Motif convenience creation function,  loaded
        by xmDrawingAreaWidget. See  OSF/Motif Manual Set:  Programmer's
        Reference for more details.


XmSelectionBoxGetChild(widget1, char) -> widget2             [procedure]
XmCreateSelectionBox(widget1, string, arglist, cardinal)     [procedure]
                                            -> widget2
XmCreateSelectionDialog(widget1, string, arglist, cardinal)  [procedure]
                                            -> widget2
XmCreatePromptDialog(widget1, string, arglist, cardinal)     [procedure]
                                            -> widget2
        These procedures implement the Motif SelectionBox functions, and
        are loaded by  xmSelectionBoxWidget. See  OSF/Motif Manual  Set:
        Programmer's Reference for more details.


XmCreateArrowButton(widget1, string, arglist, cardinal)      [procedure]
                                            -> widget2
XmCreateArrowButtonGadget(widget1, string, arglist,          [procedure]
                                  cardinal) -> widget2
        Convenience  procedures,  loaded   by  xmArrowButtonWidget   and
        xmArrowButtonGadget.  See  OSF/Motif  Manual  Set:  Programmer's
        Reference for more details.


XmCreateCascadeButton(widget1, string, arglist, cardinal)    [procedure]
                                            -> widget2
XmCascadeButtonHighlight(widget, byte)                       [procedure]
XmCreateCascadeButtonGadget(widget1, string, arglist,        [procedure]
                                  cardinal) -> widget2
XmCascadeButtonGadgetHighlight(widget, byte)                 [procedure]
        Convenience  procedures,  loaded  by  xmCascadeButtonWidget  and
        xmCascadeButtonGadget. See  OSF/Motif Manual  Set:  Programmer's
        Reference for more details.


XmCreateDialogShell(widget1, string, arglist, cardinal)      [procedure]
                                            -> widget2
        Convenience  procedure,  loaded   by  xmDialogShellWidget.   See
        OSF/Motif Manual Set: Programmer's Reference for more details.


XmCreateDrawnButton(widget1, string, arglist, cardinal)      [procedure]
                                            -> widget2
        Convenience  procedure,  loaded   by  xmDrawnButtonWidget.   See
        OSF/Motif Manual Set: Programmer's Reference for more details.


XmFileSelectionBoxGetChild(widget1, char) -> widget2         [procedure]
XmFileSelectionDoSearch(widget, XmString)                    [procedure]
XmCreateFileSelectionBox(widget1, string, arglist, cardinal) [procedure]
                                            -> widget2
XmCreateFileSelectionDialog(widget1, string, arglist,        [procedure]
                                  cardinal) -> widget2
        Convenience procedures, loaded by xmFileSelectionBoxWidget,  See
        OSF/Motif Manual Set: Programmer's Reference for more details.


XmCreateForm(widget1, string, arglist, cardinal) -> widget2  [procedure]
XmCreateFormDialog( widget1, string, arglist, cardinal)      [procedure]
                                            -> widget2
        Convenience procedures,  loaded by  xmFormWidget. See  OSF/Motif
        Manual Set: Programmer's Reference for more details.


XmCreateFrame(widget1, string, arglist, cardinal) -> widget2 [procedure]
        Convenience procedures, loaded  by xmFrameWidget. See  OSF/Motif
        Manual Set: Programmer's Reference for more details.


XmCreateLabel(widget1, string, arglist, cardinal) -> widget2 [procedure]
XmCreateLabelGadget(widget1, string, arglist, cardinal)      [procedure]
                                            -> widget2
        Convenience   procedures,    loaded   by    xmLabelWidget    and
        xmLabelGadget. See OSF/Motif Manual Set: Programmer's  Reference
        for more details.


XmCreateList(widget1, string, arglist, cardinal) -> widget2  [procedure]
XmCreateScrolledList(widget1, string, arglist, cardinal)     [procedure]
                                            -> widget2
XmListAddItem(widget, XmStringPtr, int)                      [procedure]
XmListAddItemUnselected(widget, XmString, int)               [procedure]
XmListAddItems(widget, XmString, int1, int2)                 [procedure]
XmListDeleteAllItems(widget)                                 [procedure]
XmListDeleteItem(widget, XmString)                           [procedure]
XmListDeleteItems(widget, XmString, int)                     [procedure]
XmListDeleteItemsPos(widget, int1, int2)                     [procedure]
XmListDeletePos(widget, int)                                 [procedure]
XmListDeselectAllItems(widget)                               [procedure]
XmListDeselectItem(widget, XmString)                         [procedure]
XmListDeselectPos(widget, int)                               [procedure]
XmListGetMatchPos(widget, XmString, intvec1, intvec2)        [procedure]
                                            -> bool
XmListGetSelectedPos(widget, intvec1, intvec2) -> bool       [procedure]
XmListItemExists(widget, XmString) -> bool                   [procedure]
XmListItemPos(widget, XmString) -> int                       [procedure]
XmListReplaceItems(widget, XmStringPtr1, int, XmStringPtr2)  [procedure]
XmListReplaceItemsPos(widget, XmStringPtr, int1, int2)       [procedure]
XmListSelectItem(widget, XmString, byte)                     [procedure]
XmListSelectPos(widget, int, byte)                           [procedure]
XmListSetAddMode(widget, byte)                               [procedure]
XmListSetBottomItem(widget, XmString)                        [procedure]
XmListSetBottomPos(widget, int)                              [procedure]
XmListSetHorizPos(widget, int)                               [procedure]
XmListSetItem(widget, XmString)                              [procedure]
XmListSetPos(widget, int)                                    [procedure]
        These procedures  are  loaded  by  xmListWidget.  See  OSF/Motif
        Manual Set: Programmer's Reference for more details.


XmMainWindowSetAreas(widget1, widget2, widget3, widget4,     [procedure]
                            widget5, widget6)
XmMainWindowSep1(widget1) -> widget2                         [procedure]
XmMainWindowSep2(widget1) -> widget2                         [procedure]
XmMainWindowSep3(widget1) -> widget2                         [procedure]
XmCreateMainWindow(widget1, string, arglist, cardinal)       [procedure]
                                            -> widget2
        These procedures are loaded by xmMainWindowWidget. See OSF/Motif
        Manual Set: Programmer's Reference for more details.


XmCreateMenuShell(widget1, string, arglist, cardinal)        [procedure]
                                            -> widget2
        Convenience procedure loaded by xmMenuShellWidget. See OSF/Motif
        Manual Set: Programmer's Reference for more details.


XmCreateMessageBox(widget1, string, arglist, cardinal)       [procedure]
                                            -> widget2
XmCreateMessageDialog(widget1, string, arglist, cardinal)    [procedure]
                                            -> widget2
XmCreateErrorDialog(widget1, string, arglist, cardinal)      [procedure]
                                            -> widget2
XmCreateInformationDialog(widget1, string, arglist,          [procedure]
                                  cardinal) -> widget2
XmCreateQuestionDialog(widget1, string, arglist, cardinal)   [procedure]
                                            -> widget2
XmCreateWarningDialog(widget1, string, arglist, cardinal)    [procedure]
                                            -> widget2
XmCreateWorkingDialog(widget1, string, arglist, cardinal)    [procedure]
                                            -> widget2
XmMessageBoxGetChild(widget1, char) -> widget2               [procedure]
        These procedures are loaded by xmMessageBoxWidget. See OSF/Motif
        Manual Set: Programmer's Reference for more details.


XmCreatePanedWindow(widget1, string, arglist, cardinal)      [procedure]
                                            -> widget2
        Convenience  procedure   loaded  by   xmPanedWindowWidget.   See
        OSF/Motif Manual Set: Programmer's Reference for more details.


XmCreatePushButton(widget1, string, arglist, cardinal)       [procedure]
                                            -> widget2
XmCreatePushButtonGadget(widget1, string, arglist,           [procedure]
                                  cardinal) -> widget2
        Convenience  procedures   loaded   by   xmPushButtonWidget   and
        xmPushButtonGadget.  See  OSF/Motif  Manual  Set:   Programmer's
        Reference for more details.


XmCreateSimpleMenuBar(widget1, string, arglist, cardinal)    [procedure]
                                            -> widget2
XmCreateSimplePopupMenu(widget1, string, arglist, cardinal)  [procedure]
                                            -> widget2
XmCreateSimplePulldownMenu(widget1, string, arglist,         [procedure]
                                  cardinal) -> widget2
XmCreateSimpleOptionMenu(widget1, string, arglist, cardinal) [procedure]
                                            -> widget2
XmCreateSimpleRadioBox(widget1, string, arglist, cardinal)   [procedure]
                                            -> widget2
XmCreateSimpleCheckBox(widget1, string, arglist, cardinal)   [procedure]
                                            -> widget2
XmVaCreateSimpleMenuBar(widget1, string, argvarargs)         [procedure]
                                            -> widget2
XmVaCreateSimplePopupMenu(widget1, string, callbackproc,     [procedure]
                                argvarargs) -> widget2
XmVaCreateSimplePulldownMenu(widget1, string, int,           [procedure]
                  callbackproc, argvarargs) -> widget2
XmVaCreateSimpleOptionMenu(widget1, string, XmString, XID,   [procedure]
                           int, argvarargs) -> widget2
XmVaCreateSimpleRadioBox(widget1, string, int, callbackproc, [procedure]
                                argvarargs) -> widget2
XmVaCreateSimpleCheckBox(widget1, string, callbackproc,      [procedure]
                                argvarargs) -> widget2
XmCreateRadioBox(widget1, string, arglist, cardinal)         [procedure]
                                            -> widget2
XmCreateRowColumn(widget1, string, arglist, cardinal)        [procedure]
                                            -> widget2
XmCreateWorkArea(widget1, string, arglist, cardinal)         [procedure]
                                            -> widget2
XmCreatePopupMenu(widget1, string, arglist, cardinal)        [procedure]
                                            -> widget2
XmCreatePulldownMenu(widget1, string, arglist, cardinal)     [procedure]
                                            -> widget2
XmCreateOptionMenu(widget1, string, arglist, cardinal)       [procedure]
                                            -> widget2
XmCreateMenuBar(widget1, string, arglist, cardinal)          [procedure]
                                            -> widget2
XmOptionLabelGadget(widget1) -> widget2                      [procedure]
XmOptionButtonGadget(widget1) -> widget2                     [procedure]
XmGetPostedFromWidget(widget1) -> widget2                    [procedure]
XmMenuPosition(widget, XEventPtr)                            [procedure]
        These procedures are loaded by xmRowColumnWidget. See  OSF/Motif
        Manual Set: Programmer's Reference for more details.


XmScaleSetValue(widget, int)                                 [procedure]
XmScaleGetValue(widget, intvec)                              [procedure]
XmCreateScale(widget1, string, arglist, cardinal) -> widget2 [procedure]
        These procedures  are  loaded by  xmScaleWidget.  See  OSF/Motif
        Manual Set: Programmer's Reference for more details.


XmCreateScrollBar(widget1, string, arglist, cardinal)        [procedure]
                                            -> widget2
XmScrollBarGetValues(widget, intvec1, intvec2, intvec3,      [procedure]
                                            intvec4)
XmScrollBarSetValues(widget, int1, int2, int3, int4, byte)   [procedure]
        These procedures are loaded by xmScrollBarWidget. See  OSF/Motif
        Manual Set: Programmer's Reference for more details.


XmScrolledWindowSetAreas(widget1, widget2, widget3, widget4) [procedure]
XmCreateScrolledWindow(widget1, string, arglist, cardinal)   [procedure]
                                            -> widget2
        Convenience procedures  loaded  by  xmScrolledWindowWidget.  See
        OSF/Motif Manual Set: Programmer's Reference for more details.


XmCreateSeparator(widget1, string, arglist, cardinal)        [procedure]
                                            -> widget2
XmCreateSeparatorGadget(widget1, string, arglist, cardinal)  [procedure]
                                            -> widget2
        Convenience   procedures   loaded   by   xmSeparatorWidget   and
        xmSeparatorGadget.  See  OSF/Motif   Manual  Set:   Programmer's
        Reference for more details.


XmCreateScrolledText(widget1, string, arglist, cardinal)     [procedure]
                                            -> widget2
XmCreateText(widget1, string, arglist, cardinal) -> widget2  [procedure]
XmTextClearSelection(widget, ulong)                          [procedure]
XmTextCopy(widget, ulong) -> bool                            [procedure]
XmTextCut(widget, ulong) -> bool                             [procedure]
XmTextGetBaseline(widget) -> int                             [procedure]
XmTextGetEditable(widget) -> bool                            [procedure]
XmTextGetInsertionPosition(widget) -> long                   [procedure]
XmTextGetLastPosition(widget) -> long                        [procedure]
XmTextGetMaxLength(widget) -> int                            [procedure]
XmTextGetSelection(widget) -> string                         [procedure]
XmTextGetSelectionPosition(widget, intvec1, intvec2) -> bool [procedure]
XmTextGetSource(widget) -> exptr                             [procedure]
XmTextGetString(widget) -> string                            [procedure]
XmTextGetTopCharacter(widget) -> long                        [procedure]
XmTextInsert(widget, long, string)                           [procedure]
XmTextPaste(widget) -> bool                                  [procedure]
XmTextPosToXY(widget, long, intvec1, intvec2) -> bool        [procedure]
XmTextRemove(widget) -> bool                                 [procedure]
XmTextReplace(widget, long1, long2, string)                  [procedure]
XmTextScroll(widget, int)                                    [procedure]
XmTextSetAddMode(widget, byte)                               [procedure]
XmTextSetEditable(widget, byte)                              [procedure]
XmTextSetHighlight(widget, long1, long2, int)                [procedure]
XmTextSetInsertionPosition(widget, long)                     [procedure]
XmTextSetMaxLength(widget, int)                              [procedure]
XmTextSetSelection(widget, long1, long2, ulong)              [procedure]
XmTextSetSource(widget, exptr, long1, long2)                 [procedure]
XmTextSetString(widget, string)                              [procedure]
XmTextSetTopCharacter(widget, long)                          [procedure]
XmTextShowPosition(widget, long)                             [procedure]
XmTextXYToPos(widget, position1, position2)                  [procedure]
XmTextGetAddMode(arg1) -> bool                               [procedure]
XmTextGetBaseLine(arg1) -> int                               [procedure]
XmTextGetCursorPosition(arg1) -> long                        [procedure]
XmTextSetCursorPosition(arg1, arg2)                          [procedure]
        These procedures  are  loaded  by  xmTextWidget.  See  OSF/Motif
        Manual Set: Programmer's Reference for more details.


XmCreateTextField(widget1, string, arglist, cardinal)        [procedure]
                                            -> widget2
XmTextFieldClearSelection(widget, ulong)                     [procedure]
XmTextFieldCopy(widget, ulong) -> bool                       [procedure]
XmTextFieldCut(widget, ulong) -> bool                        [procedure]
XmTextFieldGetBaseline(widget) -> int                        [procedure]
XmTextFieldGetEditable(widget) -> bool                       [procedure]
XmTextFieldGetInsertionPosition(widget) -> long              [procedure]
XmTextFieldGetLastPosition(widget) -> long                   [procedure]
XmTextFieldGetMaxLength(widget) -> int                       [procedure]
XmTextFieldGetSelection(widget) -> string                    [procedure]
XmTextFieldGetSelectionPosition(widget, intvec1, intvec2)    [procedure]
                                            -> bool
XmTextFieldGetString(widget) -> string                       [procedure]
XmTextFieldInsert(widget, long, string)                      [procedure]
XmTextFieldPaste(widget) -> bool                             [procedure]
XmTextFieldPosToXY(widget, long, intvec1, intvec2) -> bool   [procedure]
XmTextFieldRemove(widget) -> bool                            [procedure]
XmTextFieldReplace(widget, long1, long2, string)             [procedure]
XmTextFieldSetAddMode(widget, byte)                          [procedure]
XmTextFieldSetEditable(widget, byte)                         [procedure]
XmTextFieldSetHighlight(widget, long1, long2, int)           [procedure]
XmTextFieldSetInsertionPosition(widget, long)                [procedure]
XmTextFieldSetMaxLength(widget, int)                         [procedure]
XmTextFieldSetSelection(widget, long1, long2, ulong)         [procedure]
XmTextFieldSetString(widget, string)                         [procedure]
XmTextFieldShowPosition(widget, long)                        [procedure]
XmTextFieldXYToPos(widget, position1, position2) -> long     [procedure]
XmTextFieldGetAddMode(arg1) -> bool                          [procedure]
XmTextFieldGetBaseLine(arg1) -> int                          [procedure]
XmTextFieldGetCursorPosition(arg1) -> long                   [procedure]
XmTextFieldSetCursorPosition(arg1, arg2)                     [procedure]
        These procedures are loaded by xmTextFieldWidget. See  OSF/Motif
        Manual Set: Programmer's Reference for more details.


XmCreateToggleButton(widget1, string, arglist, cardinal)     [procedure]
                                            -> widget2
XmCreateToggleButtonGadget(widget1, string, arglist,         [procedure]
                                  cardinal) -> widget2
XmToggleButtonGadgetGetState(widget) -> bool                 [procedure]
XmToggleButtonGadgetSetState(widget, byte1, byte2)           [procedure]
XmToggleButtonGetState(widget) -> bool                       [procedure]
XmToggleButtonSetState(widget, byte1, byte2)                 [procedure]
        These  procedures   are  loaded   by  xmToggleButtonWidget   and
        xmToggleButtonGadget. See  OSF/Motif  Manual  Set:  Programmer's
        Reference for more details.


XmInternAtom(displayptr, string, byte) -> ulong              [procedure]
XmGetAtomName(displayptr, ulong) -> string                   [procedure]
        These procedures are in LIB * XmAtomMgr (which is also loaded by
        LIB * XmProtocols).  See  OSF/Motif  Manual  Set:   Programmer's
        Reference for more details.


XmAddProtocols(widget, ulong1, ulong2, cardinal)             [procedure]
XmRemoveProtocols(widget, ulong1, ulong2, cardinal)          [procedure]
XmAddProtocolCallback(widget, ulong1, ulong2,                [procedure]
                                    callbackproc, uint)
XmRemoveProtocolCallback(widget, ulong1, ulong2,             [procedure]
                                    callbackproc, uint)
XmActivateProtocol(widget, ulong1, ulong2)                   [procedure]
XmDeactivateProtocol(widget, ulong1, ulong2)                 [procedure]
XmSetProtocolHooks(widget, ulong1, ulong2, callbackproc,     [procedure]
                            uint1, callbackproc, uint2)
        These procedures are in LIB * XmProtocols. See OSF/Motif  Manual
        Set: Programmer's Reference for more details.



4.1  Undocumented Procedures
----------------------------
_XmInstallProtocols(arg1)                                    [procedure]
_XmSetEtchedSlider(arg1)                                     [procedure]
_XmCallFocusMoved(arg1, arg2, arg3) -> bool                  [procedure]
_XmChangeNavigationType(arg1, arg2) -> bool                  [procedure]
_XmClearFocusPath(arg1)                                      [procedure]
_XmClearKbdFocus(arg1)                                       [procedure]
_XmClearRect(arg1) -> int                                    [procedure]
_XmClearTabGroup(arg1)                                       [procedure]
_XmCreateFocusData()                                         [procedure]
_XmCreateVisibilityRect(arg1, arg2) -> bool                  [procedure]
_XmDestroyFocusData(arg1)                                    [procedure]
_XmEmptyRect(arg1) -> int                                    [procedure]
_XmFindNextTabGroup(arg1) -> widget                          [procedure]
_XmFindPrevTabGroup(arg1) -> widget                          [procedure]
_XmFindTabGroup(arg1) -> widget                              [procedure]
_XmFindTopMostShell(arg1) -> widget                          [procedure]
_XmFindTraversablePrim(arg1) -> bool                         [procedure]
_XmFocusIsHere(arg1) -> bool                                 [procedure]
_XmFocusModelChanged(arg1, arg2, arg3)                       [procedure]
_XmGetActiveItem(arg1) -> widget                             [procedure]
_XmGetFocusPolicy(arg1) -> byte                              [procedure]
_XmGetManagedInfo(arg1) -> bool                              [procedure]
_XmGetTabGroup(arg1) -> widget                               [procedure]
_XmGrabTheFocus(arg1, arg2) -> bool                          [procedure]
_XmIntersectRect(arg1, arg2, arg3) -> int                    [procedure]
_XmManagerEnter(arg1, arg2)                                  [procedure]
_XmManagerFocusIn(arg1, arg2)                                [procedure]
_XmManagerFocusInInternal(arg1, arg2)                        [procedure]
_XmManagerFocusOut(arg1, arg2)                               [procedure]
_XmManagerUnmap(arg1, arg2)                                  [procedure]
_XmMgrTraversal(arg1, arg2) -> bool                          [procedure]
_XmNavigDestroy(arg1)                                        [procedure]
_XmNavigInitialize(arg1, ... arg4)                           [procedure]
_XmNavigSetValues(arg1, ... arg5) -> bool                    [procedure]
_XmPrimitiveEnter(arg1, arg2)                                [procedure]
_XmPrimitiveFocusIn(arg1, arg2)                              [procedure]
_XmPrimitiveFocusInInternal(arg1, arg2)                      [procedure]
_XmPrimitiveFocusOut(arg1, arg2)                             [procedure]
_XmPrimitiveLeave(arg1, arg2)                                [procedure]
_XmPrimitiveUnmap(arg1, arg2)                                [procedure]
_XmProcessTraversal(arg1, arg2, arg3)                        [procedure]
_XmSetActiveTabGroup(arg1, arg2)                             [procedure]
_XmSetRect(arg1, arg2) -> int                                [procedure]
_XmTestTraversability(arg1, arg2) -> bool                    [procedure]
_XmVirtKeysInitialize(arg1)                                  [procedure]
        These procedures are in LIB * XmTraversal, but no  documentation
        is available for them.




------------------------------------------
5  Include Files: Constants and  Typespecs
------------------------------------------

The following include files are available for Motif; you can include  or
loadinclude them:

    # INCLUDE * XmConstants
    # INCLUDE * XmMisc
    # INCLUDE * XmMwmUtil
    # INCLUDE * XmVirtKeys

All Motif constants are  declared as Pop-11  iconstants in these  files,
most of them in  INCLUDE * XmConstants. In  addition, typespecs for  all
Motif structures are provided, so that it is possible to access data  in
these structures using exacc. All such  typespecs have the same name  as
their     C     counterparts.     For     example,     the      typespec
XmScrollBarCallbackStruct can  be  used to  access  the call  data  of a
callback attached to a ScrollBarWidget:

       include XmConstants;

       define scrollbar_callback(widget, client_data, call_data);
           lvars widget, client_data, call_data;
           l_typespec call_data :XmScrollBarCallbackStruct;

           ;;; print out the location
           exacc call_data.new_location =>
       enddefine;


XmFontContext                                                 [typespec]
        This type  specifies  the  context  through  which  applications
        access fonts. See OSF/Motif  Manual Set: Programmer's  Reference
        for more details.


XmFontList                                                    [typespec]
        This type refers to a Motif font list. See OSF/Motif Manual Set:
        Programmer's Reference for more details.


XmString                                                      [typespec]
        This type  refers  to a  Motif  compound string.  See  OSF/Motif
        Manual Set: Programmer's Reference for more details.


XmStringCharSet                                               [typespec]
        This type specifies the character set identifier for a font. See
        OSF/Motif Manual Set: Programmer's Reference for more details.


XmStringContext                                               [typespec]
        This type  specifies  the context  for  a compound  string.  See
        OSF/Motif Manual Set: Programmer's Reference for more details.


XpmAnyCallbackStruct                                          [typespec]
        Defined as

            i_typespec XpmAnyCallbackStruct
                {
                    XpmACSReasonn   :int,
                    XpmACSEvent     :XptXEventPtr,
                    XpmACSPad       :ulong[7],
                };




-----------------------------
6  Additional Data Structures
-----------------------------

Additional datastructure support is provided by shadowclass definitions.
These are used in situations where  you need to build datastructures  in
Poplog to pass out  to Motif, and follow  similar naming conventions  to
the shadowclasses  defined  by  the Poplog  X  Toolkit.  Currently,  the
following shadowclass definitions are provided:


XpmStringTable                                             [shadowclass]
        Loaded by all widgetclasses, this is defined as

            include XmConstants;
            shadowclass XpmStringTable :XmString[];

        Used to build arrays of command Motif strings (XmStrings),  such
        as are passed to the Motif ListWidget.


XpmAnyCallbackStructPtr                                    [shadowclass]
        Loaded by all widgetclasses, this is defined as

          include XmConstants;
          shadowclass XpmAnyCallbackStructPtr {:XpmAnyCallbackStruct};

        Shadowclass definition for a  generic Motif Callback  structure.
        This allows programmers  to build callback  structures that  are
        suitable  for  passing  to  Motif  callback  procedures,   using
        XtCallCallbackList.




-----------------------
7  Motif String Support
-----------------------

These procedures are provided as an interface to Motif strings (and  are
all autoloadable from the main Poplog X autoloadable directory).

The XmString  typespec calls  the XpmImportString  converter to  convert
between external pointers and XmString descriptors. As a convenience, in
update mode,  this  converter will  accept  Pop-11 strings  as  well  as
XmString datatypes; This allows you to do things like:

        'hello' -> XptVal button(XtN label:XmString);

Note however that  the reverse operation  will produce an  XptDescriptor
with a datatype of "XmString":

        XptVal button(XtN label:XmString) =>
        ** <XmString>

You can convert Pop-11 strings  both from and to "XmString"  descriptors
using the XpmCoerceString procedure:

       ;;; make a motif compound string mstring:
       vars mstring;
       'hello' -> XpmCoerceString() -> mstring;
       mstring =>
       ** <XmString>

       ;;; convert a compound string to a Pop-11 string:
       XpmCoerceString(mstring) =>
       ** hello

Thus, you can do:

      XptVal button(XtN label:XmString#XpmCoerceString) =>

To get the value of an XmString  resource as a Pop-11 string. This  will
work in update mode as well.


XpmCheckString(XmString)                                     [procedure]
        Mishaps unless XmString is an XmString descriptor.


XpmImportString(XmString_exptr) -> XmString                  [procedure]
XmString_or_string -> XpmImportString() -> XmString_exptr
        Creates an  XmString descriptor  from the  given pointer  to  an
        XmString XmString_exptr.

        The updater checks  for an XmString  descriptor and returns  it.
        Alternatively, if given  a Pop string  it will coerce  it to an
        XmString.


XpmCoerceString(XmString_or_string) -> string                [procedure]
string_or_XmString -> XpmCoerceString() -> XmString_exptr
        This procedure  takes  a  Motif  compound  string  XmString  and
        converts it into an ordinary Poplog string (or just returns  the
        ordinary string if that is given).

        The updater takes a Poplog string string and converts it  into a
        Motif compound  string  (or just  returns  XmString if  that  is
        given).


XpmCoerceCopiedString(XmString_or_string) -> string          [procedure]
string_or_XmString -> XpmCoerceCopiedString() -> XmString_exptr
        Similar  to  XpmCoerceString,  but   the  base  procedure   uses
        XmStringFree to  free  the underlying  XmString  argument  after
        coercing it to a Pop string.

        The updater sets  up a destroy  action on the  given Pop  string
        argument so that  the XmString  it creates will  be freed  (with
        XmStringFree) when the Pop string becomes garbage.

        (This is used for XmN labelString resources, since these  always
        copy the XmString that the application passes in/gets out.)




-----------------------
8  Unsupported Features
-----------------------

8.1  Pop-11 procedure registration
----------------------------------
Several Motif  procedures,  for  example  XmAddProtocolCallback,  take C
procedures as arguments.  Some widget resources  are also C  procedures.
Currently there is no support  for supplying Pop-11 procedures  instead.
Procedures written in C using the Pop-11 callback mechanism can be  used
in situations where such functionality  is essential. See REF  *EXTERNAL
for details on the external callback mechanism.




---------------------------
9  Associated Documentation
---------------------------

HELP * MOTIF
    Overview of Poplog Motif WidgetSet interface.



--- C.x/x/pop/ref/motif
--- Copyright University of Sussex 1993. All rights reserved.
