Library change log
------------------


23/5/96

- modified OXObject to have a _client pointer instead of a Display pointer: we
  still have the ability to obtain the X connection structure (_client->GetDisplay,
  inline so optimized by the compilator), and clean the design: graphical objects
  have a lot of work to do with the X client (picture caching, resource handling,
  etc...).

- modified the redraw code to implement Tk delayed redraw idea: it states that
  there is no need to redraw as soon as we get Expose event, but is rather
  preferable to wait for the event queue to be empty (at least it does not contain
  expose event anymore). This implementation is not optimal yet. We have to make a
  lot of window lookup in the SListWindowElt stack, that should be made via a
  hash table algorithm rather than a simple loop. 

- enhanced WaitFor code: a simple (dangerous, because it accesses directly
  OXWindow protected _parent member) loop checks if the event window belongs to
  the hierarchy of the 'wait-for' top level window. If not, it discards the event.
  This is mainly for modal dialog boxes. Popup utility windows don't need to call
  WaitFor if they still want the rest of the application to be active. 

- new OPicture and OPicturePool to load pixmaps, caching implemented (fairly
  easy thanks to the nice Picture.c module in fvwm). On this point I used const
  char * instead of OString. This class is not clean yet. I fear to add a default
  type adaptator between char * and OString. 

- modified Debug routine to accept a 'level' parameter to filter unneeded debug
  display the 'utils.cc' module now contains a _debugMask variable to tune display
  overhead. 

- some tricks to avoid include files problems: forward declarations of some 
  classes in OXClient.h

- problem with the naming convention: should graphical object only have the OX
  prefix, or rather all objects refering to the X connection via _client pointer?
  That is, should we have OPicture, or OXPicture? 


10/7/96

- Frames are now automatically registered/unregisterd on object creation/destruction,
  so it is no longer neccesary for the user to use the Register/Unregister functions.


11/7/96

- Modified (again!) the structure of OXCanvas. Now OXCanvas creates the scrollbars
  and viewport (as before), but the viewport doesn't create automatically the
  container frame (maybe we can use another contructor). Instead is the user
  responsability to create the container and notify the viewport using the
  OXViewPort::SetContainer function (or the equivalent OXCanvas::SetContainer). 

  Before:
  =======

  OXCanvas CanvasWindow(mainWindow, 400, 240, HORIZONTAL_FRAME | SUNKEN_FRAME);

  CanvasWindow.AddFrame(new OXSimpleFrame(CanvasWindow.GetContainer(), 32, 32, 0,
                                          GetColorByName("red")),
                          new OLayoutHints(LHINTS_EXPAND_Y | LHINTS_RIGHT));

  CanvasWindow.AddFrame(new OXSimpleFrame(CanvasWindow.GetContainer(), 32, 32, 0,
                                          GetColorByName("blue")),
                          new OLayoutHints(LHINTS_EXPAND_Y | LHINTS_RIGHT));
  ...

  mainWindow->AddFrame(&CanvasWindow,
                       new OLayoutHints(LHINTS_EXPAND_X | LHINTS_EXPAND_Y,
                                        0, 0, 2, 2));

  Now:
  ====

  OXCanvas CanvasWindow(mainWindow, 400, 240, HORIZONTAL_FRAME | SUNKEN_FRAME);

  OXContainerFrame Container(CanvasWindow.GetViewPort(), 10, 10, HORIZONTAL_FRAME,
                             clientX->GetColorByName("white"));

  CanvasWindow.SetContainer(&Container);


  CanvasWindow.AddFrame(new OXSimpleFrame(CanvasWindow.GetContainer(), 32, 32, 0,
                                          clientX->GetColorByName("red")),
                          new OLayoutHints(LHINTS_EXPAND_Y | LHINTS_RIGHT));

  CanvasWindow.AddFrame(new OXSimpleFrame(CanvasWindow.GetContainer(), 32, 32, 0,
                                          clientX->GetColorByName("blue")),
                          new OLayoutHints(LHINTS_EXPAND_Y | LHINTS_RIGHT));

  ...

  mainWindow->AddFrame(&CanvasWindow,
                       new OLayoutHints(LHINTS_EXPAND_X | LHINTS_EXPAND_Y,
                                        0, 0, 2, 2));

  That way we can specify a different class (derivated form OXContainerFrame) in
  OXCanvas, so we have more control of the events (OXContainerFrame is who
  receives the clicks, and is who decides what to do with it contents), otherwise
  it becomes a nightmare to handle events.

  The OXCanvas::SetContainer function must be called before any OXCanvas::AddFrame,
  of course, otherwise a Segmentation Fault will occur (no checks are made). 

  Implementing VERTICAL_TILE_FRAME and HORIZONTAL_TILE_FRAME could change things 
  in a fashion similar to the OXTab's AddTab.

- OXStatusBar::SetText(OString *s) receives the argument as a pointer to a OString
  class, often as a result of calling statusBar->SetText(new OString("some
  text")). In that case OXStatusBar should be responsible for deleting the
  allocated object (i.e. the OString becomes "property" of OXStatusBar), but what
  if we call with something like statusBar->SetText(MyOString)? MyString must
  exist until is replaced by another call to SetText, in the other hand if we
  destroy MyOString in OXStatusBar, the program could try to make use of it after
  being deleted. 

  I'll stick to the first case (deletion in OXStatusBar), restricting the use in
  the caller program. In any case it would be possible to implement something like
  OXStatusBar(new OString(MyOString)), i.e., to make a copy of the existing string
  for the status bar. 


20/7/96

- OXTab:

  AddTab(OString *text) creates a Tab frame (composite frame + tab window with the
  specified name), the function returns a pointer to the composite frame. That
  pointer must be used to add widgets to the frame and should never be freed. 

  Example:

    OXTab myTab(Parent, x, y);
 
    OXCompositeFrame *tf = myTab.AddTab(new OString("MyTabName"));
    OXCompositeFrame f1(tf, 60, 20, VERTICAL_FRAME);
    f1.AddFrame(new OXTextButton(&f1, new OHotString("&My button")), myButtonLayout);

    tf->AddFrame(&f1, MyFrameLayout);

  etc.


14/8/96

- Changed the function-callback-like method of widget event notification to a
  client-message one, as the callback method horribly breaks the OO design and
  cannot handle a inter-class notifications.

  Now OXFrame and derivates include a SendMessage member function, and the
  HandleClientMessage automatically calls a ProcessMessage virtual member
  function. By overriding this last, the window can process the desired messages. 
  Note that the window processing messages must be associated to the widget by
  calling the Associate member function in order to receive messages, by default
  they are sent to the parent window. 

  A _XC_MESSAGE atom was defined to identify the ClientMessage type. 

- Changed explorer's main.cc file. Now a OXExplorerMainFrame object is created,
  which processes the menu and button commands. Similarly, an OXOptionsDialog
  object is used for the Options dialog. At least it is looking less like a test
  program :-)


15/8/96

- Changed OXClient::NeedRedraw(Window id) to ...(OXWindow *w), and the 'rdw'
  flag moved to the OXWindow class, so we don't have to do a search through
  all the registered windows. 

- Added OPicturePool::FreePicture.


17/8/96

- Added support for drawing wrapped text in OString (is not extended to
  OHotString yet). Experimentally used in OXRadioButton.


18/8/96

- Changed the scrollbar background so it now matches the Win95 one.

- Implemented 3-state buttons.

- Implemented MWM-hints stuff, moved the top-level windows operations from
  OXWindow to OXMainFrame.


24/8/96

- Started implementation of OXListBox class.


5/9/96

- Changed behaviour of the menu bar to match Win95 one (popus appearing as
  mouse is moved)


19/9/96

- Implemented list sort routine, sort-by-name, type, size already selectable
  by menus.


15/10/96

- OXTextEntry widget now accepts proper keyboard input, entered text is stored on
  a OTextBuffer object and can be read from there. Autoscroll and selections are
  still missing.


18/10/96

- OXTab corrected, tabs now have the correct width according to the text length,
  instead of a fixed one.


30/10/96

- OXTextEntry accepts paste from clipboard or cut buffer 0 (mouse button 2)

- Most widgets are now in different files



16/02/97

- Implemented OXSList class using the X context manager. OXClient is now 
  dispatching events to the windows aprox 50% faster.


20/02/97

- OXCompositeFrame::Layout() : The CENTER hints have the same behavior as the
  EXPAND hints. A X-Centered Widget can now be packed in an HORIZONTAL Frame.
  The OXCompositeFrame::Layout() routine now calls separate  OXCompositeFrame
  protected member routines according to the kind of frame.

- OXTab::Layout, OXTab::DefaultWidth and Height : The Tab Widgets are expandable
  now. A new _container was frame added in order to avoid border blinking when
  switching tabs.


21/02/97

- Changed *all* the width and height types from unsigned int to just int. While
  that contradicts XCreateWindow, XResizeWindow, etc., it allows better checking
  when calculating sizes (negative results aren't converted into a huge positive
  number). Checkings are now implemented in the corresponding OXWindow functions.
  Applications can be resized even to a size 1x1 without crashing.


25/02/97

- Implemented OTimer class (by now only single-shot timers) and added HandleTimer
  member function to OXWindow in order to handle timer events. The event loop code
  in OXClient has been rewritten, there is now a ProcessOneEvent member function
  (although not as complete as I wanted).

- OXScrollBar now has autorepeat capabilities (still unfinished, but already
  works).

- OXPopupMenu now implements a small delay before showing a cascaded child menu
  a la Win95.


26/02/97

- Fixed some (but not all) buggy OXScrollBar code.

- Some widget global declarations were moved from the original files to OXClient.cc,
  in order to prevent the linker from including unnecessary widgets in executable
  files (it was including always nearly all the widget set). The size of the clock
  program, for example, was reduced from 119908 bytes to 66544.


28/02/97

- Added code to utils.h (which can be enabled by a compile-time directive) to
  help tracing memory allocation problems. The code just redefines the new/delete
  operators and writes the debug information into a log file. A SIGSEGV is
  forced when an attempt to delete a NULL object is detected (that condition
  was very difficult to trace even with gdb because the program often crashed long
  and ramdomly *after* that, and the stack frame was always screwed up).


05/03/97

- Added code in OXClient (experimental) to support a color server.

- Added primitive support for keyboard shortcuts needed in menus, buttons and
  other widgets containing hotchars. IMPORTANT: When deleting objects which use
  keyboard shortcuts, be sure to delete them *before* deleting any parent
  object(s).

- Text justification mode can be specified for label and button objects.

- DestroyWindow is now called explicitely in OXMainFrame destructor. That way a
  top level window is always destroyed everytime the corresponding object is
  destroyed.


10/03/97

- OXMsgBox added, so there is now an easy way to display short app's messages.

  Use as follows:

    new OXMsgBox(parent, transient_for,
                 new OString ("Window Title"),
                 new OString ("Message... blah blah..."),
                 icon_type [, button_set [, &ret_code]]);

  where:

    OXWindow *parent         -- is usually _client->GetRoot()

    OXWindow *transient_for  -- is the 'transient for' window, normally
                                the app's OXMainFrame

    int icon_type            -- specifies which 'standard' icon to use,
                                and can be one of the following predefined
                                values:
                                  MB_ICONSTOP
                                  MB_ICONQUESTION
                                  MB_ICONEXCALAMTION
                                  MB_ICONASTERISK
                                a custom icon can be specified if an OPicture
                                object is passed in place of icon_type.

    int button_set           -- specifies which buttons should appear, can
                                be one or more of the following values OR'ed
                                together:
                                  ID_YES
                                  ID_NO
                                  ID_OK
                                  ID_RETRY
                                  ID_APPLY
                                  ID_IGNORE
                                  ID_CANCEL
                                  ID_CLOSE
                                  ID_DISMISS
                                if not specified, ID_DISMISS is assumed.

    int *ret_code            -- used to return the code of the button pressed
                                by the user, always one of the above ID_... 
                                if the box was closed by clicking on the close
                                ("X") titlebar button, ID_CLOSE is returned.


  For a quick test, run the wintest app and click the "Click here..." button at
  the bottom, then use the dialog box to change the icons, button sets, message,
  etc.


11/03/97

- OXTextButtons, OXCheckButtons and OXRadioButtons now own the OString passed
  as argument (like OXLabels), so the strings are deleted on button object
  deletion.


12/03/97

- OXListBox can be already used, although is not completely finished.


13/03/97

- OXListBox reimplemented, now there is a OXLBEntry which would allow to
  build custom (trees, pixmaps, etc.) entries. The implementation is
  compatible with the previous one.

- OXDDListBox is now useable. OXTreeDDListBox in explorer already working,
  but is a mere code duplication of the OXDDListBox (there is still a small
  problem to solve in order to be able to implement it as a derivated class).


18/03/97

- OPicturePool does not force anymore a fatal error when a pixmap is not
  found. Instead, it returns NULL to the calling routine, so the checking
  now should be done there.

- Changed the OPicure class to allow it to return a scaled icon.

- Explorer enhancements (see the Explorer.status file).


20/03/97

- Fixed small bug in OXCompositeFrame::HorizontalLayout.


25/03/97

- OXMainFrame::SetWindowName and OXMainFrame::SetClassHints now use 'char *'
  instead of 'OString *'.

- More explorer enhancements and bug corrections (see Explorer.status).


29/03/97

- OPicture now uses width, height instead of xscale, yscale. Fixed also a
  few defects with the scaling algorithm (it allows now xpm files with
  more than one char per pixel).

- Some OXListBox, OXIcon and OXScrollBar changes/corrections.


31/03/97  David Barth <dbarth@alpha-c.net>

- New class tree OLayoutManager: the base abstract class defines an
  interface, OVerticalLayout & OHorizontalLayout implement the old stuff
  previously found in the OXCompositeFrame class. This redesign splits the
  notion of layout and the notion of composite frame. Still, we should
  separate the container code from the rest of the class (see Work in progress
  at the end of OXFrame.cc).

- OXCompositeFrame now holds a _layoutManager parameter. This member is
  used in the Layout method.

- SListFrameElt is defined outside of class OXFrame for compatibility
  reasons. Soon an OListFrameElt class should replace it in a better OO
  manner.

- Read "Inside the C++ Object Model" - Stanley B. Lippman - ADDISON-WESLEY
  1996 Recommended ;-)

- New include files created to group some classes outside of the OXWidgets.h
  bag.

- IS_VISIBLE state defined.

- Commented out the virtual ~OXObject() {} destructor: is it really necessary?


07/04/97

- Fixed a bug in OVerticalLayout and OHorizontalLayout algorithms.

- Commented out some unused arguments in class declarations to avoid lots
  of warnings when using "g++ -Wall -ansi -pedantic"

- Changed the explorer's mime.types format again. Now it allows the use
  of a simplified regular expresion for filename matching.

- When loading a pixmap, OPicture doesn't rescale anymore the ones 
  having already the requested size (1:1).

- Added some member functions to OXMainFrame for a more convenient way of
  setting WM size hints, icon name, initial state, etc. More to come...

- Added two new clients: run (for the start menu) and login (perhaps a
  future xdm replacement?)


08/04/97  David Barth <dbarth@alpha-c.net>

- New ODimension class to group (w,h) dimensions.

- New ORowLayout & OColumnLayout managers. Those are very simple, and are
  in fact, downsized OVerticalLayout & OHorizontalLayout managers.

- New OMatrixLayout: this one is really exciting, as it will simplify
  OXContainer greatly.

- Generalized use of GetDefaultSize(): GetDefaultWidth/Height()
  should not be used anymore: their call is through a GetDefaultSize() now...
  (they can be used, but only GetDefaultSize() should be redefined if
  necessary when deriving classes - H).

- Time for profiling :-) this will help track down the bogus parts of the
  layout code!

- The new layout code triggers a bug in the Scrollbar or Canvas: sadly
  the Explorer seg faults with those changes :-(  (09/04/07 corrected - H).

- Take a look at the "Linux Applications & Utilities" page hosted on RedHat
  site: there are 2 new interesting libraries: JX and Mime++


09/04/97

- Changed the OXCanvas algorithm, so there is no need in having a special
  OXContainerFrame anymore. Instead, any OXCompositeFrame can be used.
  Just set the desired layout manager...


14/04/97

- OXListView partially implemented, still the detail mode (multi-column
  with column headers) is missing, and there are many things duplicated
  in OXFolder. It is temporarily in the explorer's directory.


17/04/97

- Changed the msg/parm structure in SendMessage and ProcessMessage:
     SendMessage:
       msg   -- now is formed as MK_MSG(msg, submsg)
       parm1 -- previously was the submsg type, now mostly the widget ID.
       parm2 -- previously was the widget ID or widget data, now is used
                only for widget data.
     ProcessMessage:
       msg   -- becomes GET_MSG(msg)
       parm1 -- becomes GET_SUBMSG(msg)
       parm2 -- becomes parm1, and parm2 can be used for extra data.

- OXListBox redraw bug corrected.


23/04/97

- OIniFile, OMimeTypes, OXListView objects moved to the core library.
  Still a *lot* of work and rework pending for these, but they can be used
  already by any application.

- New fileview example application in the clients/ directory. Implements
  a very simple OXTextView widget, the code is based on an example found
  in an old Xt programming book.


24/04/97

- Moved more files from the explorer directory to the library core:
    OXFolder       --  now OXFileContainer
    OXTreeListBox  --  now OXFSDDListBox, the redundant OXTreeDDListBox
                       was removed, a new OXFileSystemDDListBox object
                       is implemented instead for filesystem selection 
                       in explorer and OXFileDialog

- New objects: OFileInfo and OXFileDialog for implementing 'Open' and
  'Save as...' dialogs (premiliminary versions, but useable).

- The fileview application now uses the OXFileDialog for opening files.


25/04/97

- Lowered the resource requeriments for OXTreeLBEntry, OXListItem and
  derivates, now they use a single window instead of 3.

- Changed the constructor for OXListBox, OXDDListBox and derivates:
  Like the rest of (almost) other controls they now have an ID:

   before:  OXListBox(parent, w, h [, options, bkgnd])
   now:     OXListBox(parent, ID [, options, bkgnd])


26/04/97

- OXFrame is not anymore an abstract class, now it can be instantiated
  and is used as the base class for simple widgets, making OXSimpleFrame
  obsolete.

- OXScrollbar simplified : there is no need to have a composite frame
  as there will only be 3 items and the layout algorithm is trivial


28/04/97

- OXSimpleFrame removed.


16/05/97

- New OXListTree widget. It uses experimentally a windowless item class
  (OListTreeItem instead of OXListTreeItem), much like the OMenuEntry items
  in OXPopupMenu (perhaps OXListBox should be rewritten in the same way?).
  These "O" objects require less X resources than their corresponding "OX"
  version, but in the other hand they are less flexible. Also, drawing and
  managing routines can become compicated.


20/05/97

- New OXWidget class implemented. Now all widgets should be derivated from
  OXFrame/OXCompositeFrame _and_ OXWidget.

  Widgets actually share many common properties that can be grouped
  together into the OXWidget class. A new set of common properties can be
  added in order to improve the management, for example:

  - user-given ID (currently implemented in many widgets).
  - widget-type ID (some sort of magic number or string? It might be
                    useful for doing run-time typechecking and some
                    other niceties)
  - has focus flag
  - is enabled / is disabled flag
  - is default widget flag (i.e. it grabs the Enter key)
  - is active flag (but this is mostly of interest for some widgets only)
  - want focus flag (for focus traversal)
  - has a hot key attached (i.e. it wants to grab a certain key).

  Normally the key-grab should be managed by the top-level window
  (OXMainFrame or OXTransientFrame). In addition, the top-level window
  grabs the Tab key for itself and uses it for focus traversal. It should
  keep a list of the frames wanting focus (or it could use the available
  frame linked-list and check for the want focus flag), and should
  remember as well which frame has gotten the focus last time, so if the
  window manager changes the focus to another window and then back it
  could restore the focus to the corresponding widget.

  In order to implement the focus traversal, OXMainFrame could analyze the
  list of child frames, but the problem is that only widget classes will
  have the _widgetFlag variable, ordinary frames won't. Also, there might
  be widgets wanting focus which are not direct children of the main
  frame, so it would be necessary to analyze the whole tree.

  A solution could be to include some special function in OXMainFrame
  (something like RegisterFocus(), much like the current BindKey()
  function) and to keep a separate list of only-widgets. This could have
  several advantages, as widgets could be registered in specific order,
  not exactly in the order they were created, making the focus traversal
  more comfortable to the user. Disadvantages: the fact that we have to
  manually register the widgets (in a second thought, they could register
  automatically themselves, but we can finish with a weird focus order). 

  The idea of _widgetName is to put there some identifier, perhaps the
  same class name (e.g. "OXButton"). That way we could do some run-time
  checking when/if required, and it would be helpful for a visual 
  programming environment.

  The OXWidget class is being used experimentally in OXButton and
  OXTextEntry.


07/07/97

- New slider objects implemented (OXHSlider, OXVSlider), thanks to Matzka
  Gerald <matzka@venus.hil.siemens.at>. For a test, run the wintest
  program and select Test / Sliders... menu option.


08/07/97

- Corrected OPicturePool bug which generated a BadPixmap error when
  deleting an OPicture without mask.


12/09/97

- Changed the constructor for the OXGroupFrame class, the options parameter
  moved behind the title parameter, now is easier to create a horizontal
  group frame without having to specify font, gc, etc.


23/09/97

- Added support for .xclassrc ini file in OXClient::OXClient()


11/01/98 (After a BIG pause...)

- Added support for inlined XPM's. Now XPM files can be used for OPictures
  just by #including the image in the source. Usage is:

    GetPicture(char *name, char **data);

  where "name" is the name under which the pixmap will be registered (usually
  the original file name), needed for sharing purposes; "data" is a pointer
  to the pixmap data.

  Some client programs (cdplay, login) were modified in order to make use
  of these.

- Added *experimental* support for background pixmaps. To try it, add the
  following line to the [defaults] section of your ~/.xclassrc file:

    back pixmap = my_background.xpm

  Do not specify a full path to the pixmap, just the filename.xpm and copy
  it to your "icon dir" or "OX_POOL" directory.

  Again, this is just *experimental* and I'm still a bit reluctant to
  keep for future releases, for several reasons.

- Added support for tip-able frames, use OXFrame::SetTip(char *tip_text)
  to enable this feature. This current implementation is generating some
  troubles to widgets like OXButton, OXScrollBar, etc., as these widgets
  relied on events generated by button grabs only, and now the parent
  frame is selecting for additional mouse events. OXButton is almost OK
  now, but some of the derivates (OXRadioButton, etc...) are not.

- Buttons now can be one of the following types:

    BUTTON_NORMAL   - standard push-button
    BUTTON_ONOFF    - on/off type of button
    BUTTON_STAYDOWN - button which can be released only by software, 
                      useful for creating groups of dependent buttons
                      in toolbars, etc.

- Modified OXSliders, as they were a bit too big compared to Win95 ones
  (hope they aren't too small now... ;-) ).

- Moved OXHorizontal3dLine and OXVertical3dLine to the library side. Include
  xclass/OX3dLines to use them.

- Added constructor and destructor for OFileInfo.

- fileinfo.ini_dir is updated now by OXFileDialog. The path to the selected
  file is stored there on output.
        
- DLG_BROWSE option added to OXFileDialog.

- OXTextEntry updates:

   - void OXTextEntry::SetState(int state) was added.

     when state = DISABLED, the widget doesn't react on events anymore,
     and the background color is set to gray. ENABLED is the default,
     the background is set to white.

   - int OXTextEntry::GetState() returns the current state.


28/01/98 (from Wim Delvaux)

Global changes
==============

- OX_DEFAULT_POOL now defaults to /usr/local/xclass-icons

- Added ';' to Makefile in include directory to avoid syntax error
  messages with bash 2.0

Explorer
========

OXListTree

- Behaviour closer to Win95 (click on entry collapses open, double click
  collapes and rereads)

OXOptions

- Options now fully use the mime.types file (this is not finished!)

- Icons are read and text in listbox is either 
        'files matching ...'
        or the NEW but optional description field in the mime.types file

- OMimeTypes now has a methods that returns the OMime entry that
  corresponse to a particular file pattern. This allows for enormous
  speedup because the pointer to this description can be stored when
  modifying the entry. Also with one lookup you now have all information
  (prevous version had to scan through the list several times).

- Modifying and updating to the mime.types file is now supported. 

main.cc

- Children of an opened (not-collapsed) entry in the ListTree are now
  propperly sorted.

- All entries in the subdirectory are processed and not one (removed the
  break).

- Swapped DBLCLICK code with CLICK code and remove the ChangeDirectory in
  the single click to match win95 behaviour.

Xclass library includes
=======================

OIniFile.h

- GetItem now returns a pointer to the value.  This is either the same
  as the value parameter (arg 2) or if the arg 2 is NULL a newly allocated 
  memory buffer (this allows for entries of a undeterimined size in the
  INI files)

OMimeTypes.h

- Added description field (default can be NULL)

- Added description argument to AddType method 

- Added Modify method that updates the values for a mime entry. Arg 1 is
  the OMime* entry returned by next method

- Added NextMime call. This call allows you to iterate over all available
  mime entries (if arg == 0, go to first) returns NULL if at end

- Added GetDescription method, returning description

- Added GetIcon call based on the OMime *Pointer and not on the pattern

OPicture.h

- Added support for system directory. When creating an OPicturePool object,
  it is not strictly necessary to provide a path. The path argument is now
  interpreted as a true PATH value (colon separated directory list like the
  PATH environment variable). If NULL is specified, then OPicturePool looks
  for an OX_POOL environment variable; if not found, the compiled-in
  OX_DEFAULT_POOL is used instead.

- Path is now a pointer (non-fixed length)

- Added LocatePicture private call. This call locates in all given
  directories the requested icon file. It returns the path where the file
  is found. This path can then be used to get the picture.

Xclass library
==============

OIniFile.c

- Offset variable is initialized in constructor (see bug)

- When all keys of a given entry are read, the filepointer was being
  positioned beyond the header of the next entry, causing every second entry
  to be missed. Now the filepointer is propperly repositioned.

- strstr replaced by faster strchr when looking for [ ].

OMimeTypes.cc

- Support for description field

- Support for direct access of OMime information with NextMime API

OPicture.cc

- When getting a picture, the picture is located first in a PAHT-like
  variable.


19/03/98

- OXCompositeFrame does a more complete cleanup on deletion.

- Corrected error in OXFrame::HandleClientMessage which caused it to
  always return True, even if it didn't processed the event.


20/03/98

- Implemented file events in OXClient: new OFileHandler class, and
  a HandleFileEvent member function added to OXWindow. The usage is
  quite similar to OTimer/HandleTimer

  Now applications doing file/pipe/socket I/O can benefit from non-blocking
  operations, without hanging the UI until operation has finished.


21/03/98

- Implemented dispatching of PropertyChange events.


30/03/98

- Added FindEntry and RemoveAllEntries methods to OXListBox.

- Changed OXListBox so it now allows multiple item selection.


31/03/98

- Added RemoveEntry/RemoveAllEntries methods to OXPopupMenu, which can
  be useful when building dynamic menus (AddEntryAfter/AddEntryBefore
  methods will be added soon).


05/04/98

- Some OXListBox bugs corrected. Added AutoUpdate() and Update()
  methods.


06/04/98 (Matzka Gerald)

- Some memory leaks and OMatrixLayout bugs fixed.


08/04/98

- Implemented OXGC object and OGCPool for GC sharing. The interface
  is still not finished, and so far only OXClient uses it for a few GCs.

- OXFileDialog: if specified, the file dialog now starts in the
  OFileInfo.ini_dir directory. The behaviour when selecting a folder
  or typing the name of a valid directory in the entry box and
  clicking Open is now correct: it opens the directory and shows the
  contents.
