
obm/marker.c:markerGetVertices()					MF001
    When called without specifying the number of points the for loop
    wouldn't execute and so no points were being returned.  Changed to
    loop over the ngot value to return all points found by the widget
    code.  (7/14/98)

obm/marker.c:markerGetVertices()					MF002
    Change the inner while loop to use *op to avoid infinite loop when
    returning points.  (7/14/98)

obm/marker.c:markerGetRegion()						MF003
    Change the inner while loop to use *op to avoid infinite loop
    causing getRegion to hang for polygon markers.  (7/29/98)

obm/ObmW/Gterm.c:GtRefreshMapping() 					MF004
obm/ObmW/Gterm.c:refresh_source()
obm/ObmW/Gterm.c:refresh_destination()
obm/ObmW/Gterm.c:GetCachedXImage()	+
obm/ObmW/Gterm.c:DestroyCachedXImage()	+
obm/ObmW/Gterm.c:NewCachedXImage()	+
    Merged in image cache code from SAORD for speeding up the magnifier
    marker.  This doesn't appear to have any major impact on the memory
    requirements, but still it can be disabled via a #define CacheXImage
    at the top of the file.  Corresponds to SAOMOD_CACHE (7/31/98)

obm/ObmW/Gterm.c:GtExtractPixmap() 					MF005
    Added a missing GtermWidget arg to GtDestroyRaster call (7/31/98)

obm/ObmW/Gterm.c:GtExtractPixmap() 					MF006
obm/ObmW/Gterm.c:GtInsertPixmap()
    Added a missing RasterDepth arg to GtCreateRaster call (7/31/98)

obm/ObmW/Gterm.c:GtCopyRaster() 					MF007
    Changed declaration for sv_mp, p_mp from Mapping to 'struct mapping'
    so the agree with argument declaration type. Pre- viously routines
    were being called with struct mapping ** instead of struct mapping *
    (7/31/98)

obm/ObmW/Gterm.c:Destroy() 						MF008
    Changed arg to GtRasterInit from 'gw' to 'w' so types agree.
    (7/31/98)

obm/ObmW/Gterm.c:gm_refocus() 						MF009
    Added an event type.  This was the SAOMOD_PURIFY change, seemed
    harmless.

obm/ObmW/Gterm.c:M_set() 						MF010
    Removed XtArgVal cast of arg 2 for GmSetAttribute to agree with
    function declaration.

obm/ObmW/Gterm.c:GtSetMapping()						MF011
    Not sure I should have changed this, but Eric claims it fixes a bug
    although he can't remember the details.  SAOMOD_BUG.

obm/ObmW/Gterm.c:Initialize()						MF012
    Added an initialization for gterm.n_wmWindows.  According to Eric
    this was done to fix a segvio that was never completely understood.
    Even though the procedure doesn't initialize the variable it appears
    to be properly set the first time the window gets a focus request so
    the problem must be elsewhere, this seemed harmless so it was added
    anyway.   SAOMOD_MAYBE_FOCUS

obm/ObmW/Gterm.c:GmSetVertices()					MF013
    Changed the test to be an inequality rather than a greater than. 
    What would happen is that if a call was made with fewer points than
    currently in the struct the gm->npoints value would be wrong.  (e.g.
    polygon markers are initialized with 4 points in a unit box, creating
    a triangle marker causes a getVertices OBM call to return the wrong
    number of points).

obm/ObmW/Gterm.c:gm_select()						MF014
obm/ObmW/Gterm.c:gm_circ_init()						MF015
obm/ObmW/Gterm.c:gm_circ_updatePolygon()				MF015
obm/ObmW/Gterm.c:gm_elip_init()						MF015
obm/ObmW/Gterm.c:gm_elip_updatePolygon()				MF015
    Two connected bugs:  The symptom was that when changing a marker
    back and forth between shapes, e.g. a rect and a circle, the marker
    would lose the ability to determine focus when the mouse was moved
    into it when going from a rect->circle->rect.  The first bug was
    that the value of ptop in gm_select() was pointing out of bounds
    for the point array.  Initially this would be a zero point and the
    algorithm would coincidentally trap this and exit as expected, but
    when you go from a circle back to a rect the point array still con-
    tains the circle vertices so the algorithm was checking an invalid
    line segment and finding a second crossing point and thus failing.
    When ptop was set to point at the last element correctly the circle
    marker suddenly lost focus: this was because the polygon points 
    computed for a circle is already closed, the updatePolygon and init
    routines were defining an extra point to close the poly which wasn't
    needed, in gm_select this produced another erroneous crossing
    causing the selection to fail.  Modified to use only GM_NPTSCIRCLE
    points.

obm/widget.c:widgetGet() 						MF016
obm/widget.c:widgetGetFontName() 	+				MF016
    To help with finding portable font settings I added some new code
    to return an XLFD font string allowing the user to now do a "get
    font" on a widget and return a readable font string.

obm/ObmW/Gterm.c:gm_elip_updatePolygon()				MF017
    The ellipse vertices were being calculated with too few points 
    causing a "stray" line segment when drawing a rotated ellipse. 
    Connected to MF015

obm/ObmW/Gterm.c:GmSetVertices()					MF018
    When a polygon marker is created the pgon_points array is init-
    ialized to a unit box, this array isn't updated with a setVertices
    call later so when the marker visibility is turned on the marker
    still appears as the unit box.

obm/ObmW/Gterm.c:							MF019
    Big change involving the rotation of markers:  Previously when a
    marker was rotated by grabbing a knot the rotation angle would 
    be the angle of the knot being used.  This means that a square
    marker with an initial zero rotation would suddenly have a rot-
    angle of 45 if the user grabbed and then released the upper-right
    corner, but the marker is still drawn at an angle that looks close
    to zero.  This could be corrected once the button is released but
    not without adding another procedure (or by muddling up the markpos
    procedure) and requiring it to be called on a BtnUp event. Rot-
    ations were also defined in a clockwise direction and angles had
    to be specified in radians.
	The changes made are that 1) angles are now read/written by
    the GUI in (a more natural) degrees, angles are converted inter-
    nally for computation.  2) Rotation is now defined such that zero
    degrees is to the right, 90 degrees is up.  3) Marker rotation is
    done using the model that the user is dragging the zero axis about
    the marker (x,y) pos.  When the rotation is begun the marker rotates
    so that the zero axis is pointing at the knot chosen, thereafter the
    is set as before.  This means that w/ a square marker selecting the
    upper-right knot and releasing would leave the marker drawn at what
    looks like the correct 45 degrees.

obm/ObmW/Gterm.h:							MF020
obm/ObmW/GtermP.h:							MF020
obm/ObmW/Gterm.c:gm_rotate_indicator()  +				MF020
    Added a new 'rotIndicator' marker attribute as an option to draw
    a little clock-hand indicator showing the previous and current
    rotation angle.  Added a gm_rotate_indicator() procedure.

obm/ObmW/HTML.c:							MF021
    Changed the declaration of the in_anchor_cursor so it's no longer
    static.  Previously repeated invocations of a GUI would cause the
    cursor to not change shapes when entering an anchor because it was
    not being initialized properly.

obm/ObmW/Gterm.c:GmSetAttribute()					MF022
obm/ObmW/Gterm.c:GmGetAttribute()
    Changed the rotangle input to automatically convert from degrees
    to radians, which is what's used internally.  Previously setting
    any angle would be interpreted initially to be in radians and the
    resulting display would be wrong.  Similarly the output angle was
    converted from radians to degrees for readability.

obm/ObmW/HTML.c:HTMLAnchorToId()					MF023
    Modified so that internal links can be of the form "name=foo" or
    "name=#foo".

obm/html.c:htmlIdToPosition() 						MF024
obm/html.c:htmlAnchorToPosition()
obm/html.c:htmlGetHRefs()
obm/html.c:htmlGetImageSrcs()
obm/html.c:htmlGetLinks()
obm/html.c:htmlSearchText()
    The Tcl_SetVar calls had arguments reversed preventing the result
    from being returned correctly.

obm/Imakefile 								MF025
    Typo was preventing libobm.a from being updated correctly when not
    building form pure source.

obm/ObmW/HTML.c:setScrollbar()						MF026
    Changed the size of the 'topPosition' arg from Position to int.  
    Position is typedef'd as short and for very long HTML docs the 
    position exceeds the 32K short and you get a negative value which
    incorrectly positions the scrollbar.

obm/ObmW/Gterm.c:Gm[SG]etVertices()					MF027
    The set/getVertices and getRegions functions were changed so that
    in the case of a polygon the setVertices call will close the polygon
    regardless of whether the user has alread done so.  To be consitent
    the 'get' routines will not return the closing point, i.e. N points
    in and N points out.

obm/ObmW/Gterm.c:gm_circ_updatePolygon() 				MF028
    The points array for a circle was being fully populated so when 
    searching through all points you would come across (0,0) values
    while was throwing off the gm_select routine.  Also added an abs()
    call to the edge detection for safe measure.

obm/ObmW/Gterm.c:Initialize() 						MF029
    Added a XSetGraphicsExposures() call to the exposeGC to disable 
    expose events.  It was noticed in the CTIO guider project that
    there was a memory leak in ximtool.  The leak was traced to an
    XCopyArea call in refresh_destination.  This was noticed because
    the application is displaying many thousands of images in an anim-
    ation sequence.  With each refresh an Expose/NoExpose event was being
    generated which was building up in the event queue (which was never
    read) at a cost of ~100 bytes each.  Adding the call disables the
    events which are normally on by default.

obm/ObmW/Gterm.c:Initialize() 						MF030
    Commented out the XRecolorCursor calls for the idle and busy cursors.
    There was a problem with xgterm blowing itself away when doing many
    gflushes in a short time span.  This was traced to a buildup of
    BadCursor errors that eventually hit the limit in xerror() and the
    program died.  It's not clear why this is happening but the benefits
    of these calls were minimal ....

obm/html.c:htmlSetSelection() 						MF031
obm/html.c:htmlSearchText()
obm/ObmW/HTML.c:HTMLSearchText()
    Minor bug fixes to the HTML text search code.  The searchText routine
    now will incrementally find the next occurrence of the pattern in the
    text and wrap around the page if necessary.  The start location
    automatically resets if the pattern changes.

obm/ObmW/Gterm.c 							MF032
    Added a return to the blink_cursor() procedure so that when not in
    ginmode no new timer would be started.  This was necessary to avoid
    having multiple timers running which would apparently make the cursor
    blink faster and gradually put an increasing load on the process.

obm/ObmP.h 								MF033
    Added definitions for the MenuBar widget which was defined but not
    recognized as an object for receiving messages.

obm/ObmP.h								MF034
obm/obmres.c
obm/obmres.dat
obm/widget.c
obm/ObmW/Tabs.c		+
obm/ObmW/Tabs.h		+
obm/ObmW/TabsP.h	+
obm/ObmW/Gcs.c		+
obm/ObmW/Gcs.h		+
obm/ObmW/Imakefile
obm/listres/AllWidgets.c
guidemos/tabs.gui
    Added a new Tabs widget which creates index tabs on widgets similar to
    what's seen on many PC configuration panels.   Basically each child
    widget would be something like a Layout/Group or Frame and as each index
    tab is selected that child is brought to the top and displayed.  Each
    child defines a new 'tabLabel' resource string to give the label to be
    written to the Tab for that widget.  See tabs.gui for an example in the
    x11iraf$guidemo directory.

obm/ObmW/Gterm.c 			 				MF035
    Added an initialize_mapping for the sv_mp struct in various routines.
    This was first noticed as a failure in the GtCopyRaster routine which
    would fail with a "cannot malloc" error because the sv_mp->datalen and
    sv_mp->update elemets contained garbage.  Once the struct was saved
    GtCopyRaster would subsequently call get_pixel_mapping() which then
    did the fatal alloc.  It was only in GtCopyRaster that the update flag
    was explicitly set where this would be a problem.   (2/29/00)

obm/geom.c	 			 				MF036
    Commented out a call to XGetVisualInfo.  The results weren't being used
    and the pointer returned was never freed causing a small memory leak.
    (3/2/00)

obm/server.c	 			 				MF037
obm/ObmW/icon.c
    Added an XtFree() to free the resource list.  Another memory leak.
    (3/2/00)

obm/ObmW/Label.c 							MF038
    Added an XDestroyRegion to free space allocated in the expose call.
    (3/2/00)

xaw3d/Text.c								MF039
xaw3d/TextTr.c
    Modified the code to make _XawDefaultTextTranslations a static array
    rather than one allocated and never freed.   Required changes to the
    array declaration in TextTr.c, and textClassRec definition and 
    ClassInitialize() procedure.  (3/2/00)

obm/ObmW/Gterm.c 							MF040
    Added an XFree for the visual info struct in get_colormap. (3/2/00)

obm/ObmW/Gterm.c 							MF041
    Added a check for raster=0 when setting the logical resolution. This
    is the fix for the cursor positioning bug where the frame buffer is
    larger than the screen image.  (3/2/00)

obm/Tcl/Imakefile 							MF042
    Removed some warning flags requested for Linux. (3/3/00)

obm/ObmW/Gterm.c
    Removed the comment chars for XRecolorCursor first done for MF030.
    While these do trigger BadCursor errors these will now be ignored by
    the xgterm error handler.  (4/7/00)

obm/server.c
    Changed a malloc to a calloc call for the timer struct.  Also deleted
    an XtFree for the callback in serverTimedProc() which would corrupt
    memory if the timer callback were later deleted. (7/28/00)

obm/ObmP.h
obm/Obm.c
    Added support for a new environent variable OBMOBJECTS which will help
    restrict the messages printed during debugging.  For example, it can be
    set as

	setenv OBMOBJECTS "client imagewin"

    to have OBMDEBUG print only messages for the 'client' and 'imagewin'
    objects.  (8/3/00)

obm/widget.c
    Added a new 'setTop' command for the Tabs widget that can be used to
    raise a particular tab from within the GUI.  (8/29/00)

obm/server.c
    Commented out an XtFree() on a static array ('table')  (03/05/01)

obm/ObmP.h                                                              MF043
obm/obmres.c
obm/obmres.dat
obm/widget.c
obm/ObmW/ListTree.c	+
obm/ObmW/ListTree.h     +
obm/ObmW/ListTree.h     +
obm/ObmW/Imakefile
obm/listres/AllWidgets.c
    Added a new ListTree widget which creates an indented list of items
    in a user defined hierarchy.  Selecting an item "opens" it to reveal
    lower level lists.  The selection callback returns the selected item
    label, it's level, and a full path of all parent items.  The widget
    can used for things like directory browsers, or organizing documentation
    into sections, subsections, etc. (8/26/02)


obm/ObmP.h
obm/obmres.c
obm/obmres.dat
obm/widget.c
obm/OBMW/Table.c
obm/OBMW/Table.h
obm/OBMW/color.c
obm/OBMW/TableP.h
obm/OBMW/Table3d.c
obm/OBMW/Table3d.h
obm/OBMW/TableUtil.c
obm/OBMW/TableUtil.h
    Added a new Table widget and support code.  The Table widget supports a
    grid layout of data items with col/row selection and cell editing.  It
    is a bit primitive so additional code was added to improve functionality.
    (09/10/02)
