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)