librnd 4.4.0 (r38095)
~~~~~~~~~~~~~~~~~~~~~
	[doc]
		-Update: why-use-ringdove: UNIX mindset is top prio now; remove excellent user support (not true for passive users anymore)
		-Add: document action rnd_toolbar_page()
		-Add: FAQ: gtk4 vs. opengl init issue (old gpu)
		-Add: gcc-15 workaround in faq, for earlier version of librnd needs to be compiled with newer version of gcc for whatever reason

	[hid]
		-Fix: keyboard handling: indicate failed (broken) key sequences using a dummy '\0' that produces <unknown> in the printout by default (old behavior was no visual feedback)
		-Fix: nogui message box: check answer for NULL before evaluating its value to avoid a crash (on EOF on stdin)
		-Fix: hid_nogui MessageBox: memory leak
		-Fix: hid_nogui MessageBox: CANCEL was not recognized properly
		-Add: explain what the user_selected_cb does
		-Add: rnd_hid_free_defaults() that frees the allocation made by rnd_hid_load_defaults() (setting those fields to NULL)

	[hid_batch]
		-Fix: memory leak (prompt string on exit)

	[hid_gtk2_gdk]
		-Fix: potential off-by-one bug in grid point temporary allocation
		-Fix: integer overflow on global grid when x1 is a large negative number and x2 is a large positive number

	[import_pixmap_pnm]
		-Fix: P4 bit padding bug
		-Fix: return value is -1 on load error so caller won't proceed trying to insert NULL pixmap in the hash
		-Fix: false positive EOF error on P5
		-Fix: need to scale up values to header's max-pixel-value when loading P5 that has maximum lower than 255 (or 65535)
		-Add: write reason of refusal in error log when pnm dimensions are too small or too large
		-Add: support for 16 bit P5

	[lesstif]
		-Fix: potential off-by-one bug in grid point temporary allocation
		-Fix: integer overflow on global grid when x1 is a large negative number and x2 is a large positive number
		-Cleanup: remove dead code: UUNIT
		-Cleanup: remove dead code: autofade - it's already implemented in core, works the same across all HIDs (while this dead code was never enabled)
		-Cleanup: remove XRENDER/XINERAMA stuff from xincludes - these are render.c internal now
		-Cleanup: simplify and update render trace messages
		-Split: X render code from main.c to a separate render.c (to be reused in hid_mbtk_xlib later)
		-Split: main window scrollbar widget set code from the generic pan-fixup code; move generic part of the pan-fixup call to render.c (to be reused in miniboxtk)
		-Add: make render.c's HID API rendering functions public and prefixed with xrnd_ instead of lesstif_
		-Add: make render.c's zoom/pan/view_get HID API public and properly prefixed
		-Add: save hidlib design ptr in render context struct, it's used by the render code
		-Add: comment on why clipboard functions are not moved to render.c
		-Add: compile render.[ch] into a separate compilation unit, in preparation of full split from lesstif internals
		-Add: render: announce when xrender had to be disabled
		-Add: announce when xrender initialized succesfully
		-Move: low level render code from preview widget to render.c (will be reused in mbtk) and rename prefixes accordinly
		-Move: xrnd render states into a struct
		-Move: move "draw marks" low level code from main to render
		-Move: generic part of crosshair move, enter and leave to render code
		-Move: move generic part od work_area_first_expose() to render.c
		-Move: move notify_crosshair_change() to the render layer
		-Move: generalize and move notify_mark_change() to render.c
		-Move: generalize and move set_crosshair() code to render.c
		-Fix: render.c: X11/Intrinsic.h needs to be included in the .h because the API uses Pixel

	[lib_exp_text]
		-Fix: ps inverted export did not draw anything because the inversion filled rectangle was not drawn properly
		-Fix: memory leak on rnd_hid_load_defaults() allocating a string
		-Add: ps: option to draw drawing outline frame in non-inverted mode

	[lib_gensexpr]
		-Change: don't hide the module in ./configure summary

	[lib_hid_common]
		-Fix: generic GUI implementation of PromptFor(): let the text entry widget expand to the right on window resize so long text can be entered without scrolling
		-Add: up and down arrow xpm graphics
		-Add: configurable toolbar paging to retain small screen support despite of the growing number of toolbar icons
		-Add: rnd_toolbar_page() action to query and change toolbar page
		-Add: tooltip explaining what the toolbar page selector buttons are for and how to config/disable them
		-Add: preferences, window tab: window geometry load: tooltip to explain the feature won't work on Wayland

	[lib_hid_gl]
		-Fix: potential off-by-one bug in grid point temporary allocation

	[polybool2]
		-Fix: special handling of degenerate cases in rnd_poly_from_line() for thickness too small for properly rendering round caps
		-Fix: rnd_poly_from_line() degenerate cases: don't produce inverted polyline
		-Fix: don't attempt to invert invalid pline (with too few corners)
		-Fix: step 1: use the new, stack-less genrtree iterator for isc mapping, to evade "stack being too small"
		-Fix: step 1: arc-line and line-arc offsets coming from gengeo2d need to be scaled up to dist^2 to match the unit of line-line offsets; all line-* offsets need to be on the same scale for cmp/qsort to work properly
		-Fix: arc: pb2_arc_angles_from() computes both ->angle and ->angle2 using the precise center x;y of the arc to avoid topological problem caused by inaccuracy of the input spec integers
		-Fix: arc: "close" bbox (increase x2 and y2)
		-Fix: arc: when splitting up arc at top/bottom, use properly rounded endpoints computed from precise (non-input-integer) center and radius to avoid rounding errors
		-Fix: debug svg: scale font-size with annotation size/magnitude so that large drawings don't have unreadably tiny labels
		-Fix: wrong behavior of right-curving-arc detection on corner cases
		-Add: implement RND_POLY_FCT_REAL_ARC in rnd_poly_frac_circle_to(), to use real arcs instead of approximations
		-Add: expose generic edge-edge intersection code through pa API
		-Add: expose new rtree iterator API (from 4.4.0)
		-Add: experimental, disabled by default: new implementation for positive offset round offset
		-Add: pa_calc_angle_n0_dbl(): convert a vector (specified as doubles) into [0..4) angle
		-Add: arc: text debug trace prints both angles for a segment
		-Add: centralize raw offset code and make it more robust against redundant and coaxial nodes
		-Add: offset2: central raw offset code also returns whether the pline shape is convex or not - we could run a cheaper solver for the convex case and that's rather common for padstacks
		-Add: pb2_geo wrapper function for gengeo2d's iscp_cline_cline_o()
		-Add: new round offset code: avoid negative loops on concave corners
		-Add: experimental code for incremental operation without having to convert back to contour
		-Add: refine svg dump autoscale so that mid-range drawings also have readable line thickness
		-Add: extra comment on what "right curving arc" means

	[scconfig]
		-Fix: generate missing explicit Makefile rules for the old font lib objects
		-Add: disable c23 if that's the default for the C compiler; works around gcc-15 problems

	[script]
		-Fix: memleak on script lang field not being freed on script unload
		-Fix: memory leak on cached engine name when multiple engines on the same name are registered

	[util/adt]
		-Add: devhelper script for testing attribute dialogs - aid in HID development

librnd 4.3.2 (r37791)
~~~~~~~~~~~~~~~~~~~~~
	[doc]
		-Update: web IRC pointing to our own implementation
		-Add: list new download options (distrib packages, repology link)
		-Add: 'why use' section on main page

	[hid]
		-Add: over-allocate temporary argv[] to make room for shuffling filenames around

	[lib_hid_common]
		-Fix: fileselect dialog "get_path" poke: set res string to NULL on failure, just to be on the safe side

	[libuirc]
		-Fix: trace to stderr, not stdout
		-Fix: don't start polling or reading the socket if the socket is invalid (disconnected)
		-Fix: set irc socket to -1 after closing it so that no further polling or reading happens on it
		-Add: API for bypassing local poll()
		-Add: API comments; mention that ->nick needs to be malloc()'d
		-Add: optional on_rawin callback to let the client implementation do custom command processing for extra commands

	[polybool]
		-Change: make pa_pline_is_vnode_inside() compatible with the API of polybool2

	[polybool2]
		-Fix: sharp corner offset2: detect and evade corner case of short edge swapping sides near long edge (test case: offset03)
		-Fix: step 6: don't crash if there's no wrapper found for whatever reason
		-Fix: uninitialized memory in pa check debug draw
		-Cleanup: remove unused 'isected' arg from pb2_1_map_seg_line() in internal API
		-Cleanup: move seg-create-from-copy to pb2_admin so the code is simpler at caller side
		-Cleanup: move seg bbox computation from admin to geo (as it depends on segment shape geometry only)
		-Cleanup: rename pb2_1_seg_bbox() to pb2_seg_bbox() - it's not in step 1's code
		-Cleanup: rename _seg functions to _curve() fuctions for a terminology consistent with the old poly lib
		-Clenaup: simpify pb2_2_prelim_face_area_bbox() by not going vertex by vertex but segment by segment; this also makes possible to introduce curve area compensation later
		-Cleanup: remove tweak_isc: it was a workround in polybool that never got any use in polybool2
		-Add: implement low level arc support in bool code
		-Add: arc spec needs one more bit CW/CCW to avoid ambiguity
		-Add: make offset output optional in gengeo2d intersection glue
		-Add: segment tangential vector function (implemented for both line and arc)
		-Add: rewrite pb2_3_face_find_polarity_pt() so it uses tangent vectors and works with arcs
		-Add: step 3 debug trace: announce segment hit on polarity point ray tracing
		-Add: expose pb2_raw API through a .h that is also included from the implementation to ensure fucntion prototypes match
		-Add: step 2: extra check on face area: can not be zero because overlapping segments are removed
		-Add: implement pa_is_node_on_line()
		-Add: expose svg debug draw (pa will need it)
		-Change: checker's debug draw is in svg format, not in animator format, because of better arc support

	[tests]
		-Fix: typo in librnd build test Makefile dependencies broke the build with -j; introduced in r34364 (2 years ago)
		-Fix: flatten the rule for installing includes and binaries to avoid parallel installations
		-Fix: typo caused a missing dependency that in turn ruined parallel build
		-Fix: missing explicit rule on librnd_includes.o - might be a problem with non-gnu-make


librnd 4.3.1 (r37514)
~~~~~~~~~~~~~~~~~~~~~
	[core]
		-Fix: rnd_rmtree() failed to remvoe files and subdirs because of a path build bug (path separator not added)
		-Fix: move rnd_w32_* from hid/hid_init to core/paths because some of the core functionality depend on it and 'core' shall not depend on 'hid'
		-Fix: implicit declaration on win32 because of missing #include
		-Fix: implicit function declaraiton on win32 rand_s()
		-Fix: move rnd_exec_prefix() from hid/ to core/ as path init of core depends on it
		-Fix: merge old path_init and rnd_exec_prefix logics so they do the same; on win32 don't even look at argv[0] but directly go for the wndows-specific exe resolver call
		-Fix: don't hardwire "pcb-rnd" when rendering rnd_w32_* in paths init, use rnd_app's package name
		-Fix: potential fclose(NULL) on error handling
		-Change: make rnd_w32_* depent on RND_WANT_FLOATING_FHS, not on __WIN32__ (it'll be used for binpack on any platform)
		-Change: call path_init() from rnd_exec_prefix() instead of rnd_fix_locale_and_env() becaue argv[0] will be required on non-windows systems and that's where argv[0] is available
		-Cleanup: rename and make rnd_path_init() internal now that rnd_exec_prefix is in the same compilation unit and calls it directly
		-Add: comment on why rnd_exec_prefix() needs to be called early
		-Add: rnd_exec_prefix() bin_dar fallback resolves ~/ prefix to $HOME/

	[hid]
		-Fix: restore rnd_w32_* externs in hid_init.h for compatibility
		-Fix: don't hardwire compile-time prefix for librnd plugins in floating-fhs mode
		-Fix: floating fhs: build libdir using a shorter, relative description and detected exec root
		-Fix: freq spinbox: implement conversions; the value field used shall be .dbl
		-Fix: freq spinbox: unit change uses the ->dbl field instead of the ->crd field because freqs are floating point
		-Add: freq spinbox: default implicit unit is Hz on widget creation
		-Add: allow core plugins to access rnd_hid_dlg_gui_inited

	[import_pixmap_pnm]
		-Add: error handling for P5 premature eof (fgets() returning NULL)

	[lib_exp_text]
		-Fix: lpr_ps_init() allocated and copied more data from the ps option table than required for filling up its own config table

	[lib_hid_common]
		-Fix: conf tree hlist value edit: disable only the entry buttons for read-only conf node, not the whole dialog box (so that the close button and warning text widgets are not disabled)
		-Fix: Zoom() shall fail if GUI is not yet inited (rnd_hid_dlg_gui_inited)

	[poly]
		-Fix: comment highly surprising API detail of rnd_polyarea_touching(): it's dealing with the first islands only

	[polybool2]
		-Fix: don't use const struct * in free()
		-Fix: pa_reinstall_hole() should reinstall holes into the smallest positive island they fit into - in a pos-neg-pos stacking case it's the bottom pos, not the top pos
		-Fix: step 6: don't insert child face if it shares curve with parent (this is a typical case of redundant fill)
		-Fix: frac_circle_to corner case: rotating vector leaves dq just when passing the coord of end
		-Fix: don't accidentally discard new segments split off from intersected ones just because previous sections of the same segment are marked discarded (fixes pcb03)
		-Fix: make sure pline edge trees are built at least for the outer contour before figuring which hole goes into which contour in the put-back part of the input optimization
		-Fix: remove reference to the original polybool paper - this code implements a differet algorithm
		-Fix: C89 violation on htvlist invalid value declaration
		-Fix: polyarea.h needs to #include math.h because local inline functions use sin/cos
		-Fix: don't #include from old polybool
		-Fix: polyarea.h depends on types from global_typedefs, include it
		-Fix: missing #includes so that files are self-contained
		-Fix: Pcoord() used the wrong printer
		-Fix: split seg's non0 count into two separate counters, one for poly A and one for poly B because the query will be done for on a per poly basis
		-Fix: dicer: do not start a walk on a hole, that may lead to misinterpreting a hole as solid; if the hole intersects the outer contour of the box, it shall be found coming from another point on the box; shall trigger only if the hole is not intersected by the clip box elsewhere (in whichcase the hole will become part of the contour)
		-Fix: dicer: rounding error when computing intersection point for creating the temporary node
		-Fix: round offset: when offset is negative, round approx for concave corners need to be done in reverse orientation
		-Fix: round offset with negative offset value needs to do the reached-end check inverted
		-Fix: typo: pa_dic_pt_on_box_edge() point's y against bottom horizontal check used the x coord instead of the y of the point
		-Fix: debug output: typo in pa_debug_dump_() caused subsequent islands getting the holes of the first island duplicated
		-Fix: pa_pline_is_vnode_inside() builds pl->tree if it is NULL (else it couldn't run the raytrace)
		-Fix: rnd_polyarea_touching() needs to check only first islands, that's the original API and that's what pcb-rnd is depending on
		-Fix: validation shall figure island-island overlap
		-Del: compile time config setting PA_USE_NEW_DICER: the old dicer doesn't work at all with polybool2, it always needs to use the new dicer
		-Cleanup: repurpose RND_POLY_ENDP_EPSILON: it's only for the validation and only for local +-1 rounding errors - rename and decrease it to 2^2 units
		-Cleanup: rewrite polyarea.h copyright banner, keeping copyright reference of the original
		-Cleanup: remove unnecessary long jump leftovers; the code doesn't use long jump anywhere
		-Cleanup: remove unused segment task infra
		-Cleanup: remove unused functions originally copied from polybool
		-Cleanup: avoid using rnd_fprintf() where plain old fprintf() would do
		-Cleanup: use RND_MIN/RND_MAX instead of MIN/MAX (safer, avoiding naming clashes)
		-Cleanup: remove old debug dump that used gEDA/pcb format (line objects)
		-Cleanup: remove old debug helpers used in polybool but unused in polybool2
		-Cleanup: macro pa_swap(), a local copy of rnd_swap() to break ties with librnd
		-Cleanup: decouple debug code from safe_fs
		-Cleanup: remove librnd dependency on mm-to-coord in poly generation
		-Cleanup: remove math_helper.h dependency
		-Add: svg debug output: automatically scale up thickness and font size when seg tree is large enough to assume the export is from pcb-rnd
		-Add: also dump resulting poly of boolops when boolop debug dump is enabled
		-Add: missing copyright banners
		-Add: switch over from rnd_trace to genprints so polybool2 is less dependent on librnd core
		-Add: centrally defined initial/default values for debug control
		-Add: comment explaining rnd_polybool_assert_on_error_code
		-Add: centrally defined initial/default value for the face polarity debug control
		-Add: make default/initial valueof step debug dump/draw set from pa_config
		-Add: move error reporting behind a pa_* API so it can be different when outside of librnd
		-Add: implement pa_dump_pl() for dumping a single pline as a poly debug file
		-Add: debug option to dump input and output poly of offset_round calls
		-Add: pb2 context struct for configurable rule (non-zero or even-odd)
		-Add: round offset: don't add arc if it would be too short, just use a straight line between start and endpoint instead
		-Add: debug: split out pa_debug_dump_single_pa() from pa_debug_dump_() so it is possible to dump a single island of a polyarea
		-Change: switch over default rule from even-oddto non-zero, required for pcb-rnd clearances to work properly

	[scconfig]
		-Cleanup: const correctness on handing get() result
		-Add: --floating-fhs option (for win32 and binpack, runtime detection of $PREFIX would be decoupled from win32)

librnd 4.3.0 (r37300)
~~~~~~~~~~~~~~~~~~~~~
	[build]
		-Add: #define RND_HAS_INLINE if keyword 'inline' is availble to ease optimization

	[core]
		-Fix: rnd_rmtree() failed to remvoe files and subdirs because of a path build bug (path separator not added)

	[gtk]
		-Fix: cast preview widget's custom pointer to GTK_WIDGET for compatibility-binding the destroy function - this avoids an incompatible pointer warning with recent versions of gtk4 (which in turn can become an error on some systems)

	[gtk4]
		-Cleanup: warning on incompatible ptr types on gtkc_bind_win_destroy(): first arg is always cast to G_OBJECT so it can accept any widget type; removes a warning
		-Fix: safer mechanism for closing a submenu: in some cases gtk4 may destroy open-menu list items synchronously in other cases asynchronously; make sure not to access elements of the list potentially destroyed by gtk4 during the loop

	[hid_lesstif]
		-Fix: passed the wrong pixmap ID to xrender (when xrender is enabled and present)

	[lesstif]
		-Fix: r34636 (adding user data ptr to config change callbacks) missed a function ptr type passed in argument
		-Fix: missing cast: X API too old to be const-correct

	[poly]
		-Add: publish rnd_pline_isect_line() and rnd_pline_isect_circ()

	[polybool]
		-Fix: passing wrong poitner type to angle cmp
		-Fix: dicer: don't perform any clipping if clip box is outside of the box of the contour pline
		-Fix: dicer: don't perform clipping if clipbox has a zero or negative size
		-Cleanup: C89 violations
		-Cleanup: const correctness, remove unused vars
		-Cleanup: missing/implicit function return type
		-Cleanup: suppress warning on intentionally unused result
		-Add: point-in-poly: SEGs are taken in arbitrary order
		-Add: publish rnd_pline_isect_line() and rnd_pline_isect_circ()
		-Merge: port r37277 from polybool2 (higher resolution isc)
		-Merge: port r37278 from polybool2 (inverted island in slice output)

	[polybool2]
		-Add: rewrite of polybool in an area based approach (immune to self-intersection problems)

	[test]
		-Fix: conftest shouldn't use the old API for conf callbacks (wrong number of args in function pointers)


librnd 4.2.0 (r36857)
~~~~~~~~~~~~~~~~~~~~~
	[build]
		-Cleanup: move scconfig distclean file list into a make variable to make it easier to handle (the list is getting long)
		-Fix: make clean removes src/*.so.4
		-Fix: make clean shall remove alternative API objs (old font and new polybool)
		-Fix: make distclean should remove all files generated by scconfig during ./configure, including aru, lib_hid_gl headers and poly conf
		-Fix: make clean removes test-rnd.o
		-Fix: make distrclean should remove generated conf header in polybool

	[core]
		-Add: editor.min_zoom config node to make gtk's minimum zoom coord-per-pix (max zoom level) configurable
		-Add: config node for unlimited pan (for osm-rnd)
		-Add: config node editor.hide_hid_crosshair so that the crosshair is not drawn (useful in osm-rnd)

	[doc]
		-Fix: missing conf tree doc from svn: editor/global_grid and editor/local_grid
		-Update: conf node list for hide_hid_crosshair
		-Import: support page from pcb-rnd

	[gtk]
		-Add: support for config node editor.hide_hid_crosshair

	[lesstif]
		-Add: implement unlimited pan option (for osm-rnd)
		-Add: support for config node editor.hide_hid_crosshair
		-Fix: initial view setup still executes under unlimited pan
		-Fix: implicit declarations

	[lib_exp_pixmap]
		-Add: pixmap object export option in the API (not yet implemented)

	[lib_exp_text]
		-Fix: memory leak on lpr options
		-Add: colorspace option in draw_svg (so that non-color svg can be exported)
		-Add: pixmap object export option in the API (not yet implemented)

	[lib_gtk_common]
		-Add: use editor.min_zoom config node to make gtk's minimum zoom coord-per-pix (max zoom level) configurable
		-Add: implement unlimited pan option: remove scrollbars (for osm-rnd)

	[lib_hid_common]
		-Fix: don't print log messages to the log window once the main loop has exited (the GUI is defunct already)
		-Fix: close the export dialog if the design is switched away; stale dialog states may cause problems

	[lib_hid_gl]
		-Fix: GLfloat related precision issues when rendering large coordinates (e.g. 64 bit coords in pcb-rnd, very large sheets of sch-rnd or pretty much anything in osm-rnd); the fix is to do the translation on CPU side with rnd_coord_t, not on GPU side with GLfloat
		-Fix: solder mask cover triangles should be translated on CPU side as well

	[polybool]
		-Fix: various fixes on corner cases
		-Add: dicer: rewrite the dicer (more efficient algroithm, new API)


librnd 4.1.1 (r36382)
~~~~~~~~~~~~~~~~~~~~~
	[build]
		-Fix: soname for polybool so

	[doc]
		-Change: use mibbit for web irc client

	[hid_remote]
		-Fix: old event name

	[lib_hid_common]
		-Fix: FSD: 'save as dialog ok button bug': if neither edit nor selection is available but the 'ok' button was clicked, do return with the file name built from entry (if that's not NULL)

	[polybool]
		-Fix: various fixes on corner cases


librnd 4.1.0 (r35983)
~~~~~~~~~~~~~~~~~~~~~
	[core]
		-Move: xform_mx from font to core - these are generic 2x matrix transformations
		-Add: generic temp dir create/remove (imported from sch-rnd)
		-Add: basename(), parent_dir_name() and relative path calculator imported from libcschem
		-Add: rnd_printf allows applications to override human coord conversion via an optional rnd_app hook (useful for sch-rnd so that %mH prints in k)

	[dad]
		-Add: tree widget multisel flag
		-Add: wrapper/helper inline rnd_dad_tree_get_selected_multi(); when HID backend doesn't implement multiple selections, it uses the single-selection API and builds a list-of-1 so the caller doesn't need to deal with this

	[doc]
		-Add: anatomy of font v2 with field names
		-Add: polybool: figures for documenting the self-intersection cases

	[font]
		-Import: matrix reverse transformations from camv-rnd

	[font2]
		-Add: new font engine with support for baseline, kerning, multiline text, horizontal and vertical alignment, tabs, &entity;

	[fsd]
		-Add: enum bit for multi-select

	[gtk]
		-Fix: typo: widget hide shouldn't call widget focus on composite
		-Add: implement widget focus hid call
		-Add: fill in preview expose coord-per-pix field
		-Add: set expose ctx coord_per_pix for main draw
		-Add: xflip and yflip poke calls on preview widgets
		-Add: make minimum zoom level configurable for the preview widget (using the widget poke API)
		-Add: multisel tree: enable multiple selection in gtk, return cursor as the first selection
		-Add: implement multi-select support for tree tables

	[hid]
		-Fix: ambigous naming of the first argument of RND_DAD_STRING_SELECT_REGION() - it's a hid_ctx, not a table
		-Add: rnd_hid_export_using() - direct export plugin execution (imported from sch-rnd)
		-Add: export action (imported from pcb-rnd) so other apps (e.g. sch-rnd) can have the same code
		-Add: rnd_hid_expose_ctx_t has a coord_per_pix field so that preview callbacks canfigure zoom level in a reentrant way

	[irc]
		-Fix: set focus to the input widget after connection established and input widget is enabled

	[lesstif]
		-Add: implement widget focus hid call
		-Add: fill in preview expose coord-per-pix field
		-Add: set expose ctx coord_per_pix for main draw
		-Add: xflip and yflip poke calls on preview widgets

	[lib_hid_common]
		-Fix: dlg_fileselect: text entered in the file name edit line always has precedence over tree selection when pressing enter or clicking "ok"
		-Add: generic timed change helper inlines for implementing dialog boxes (imported from sch-rnd)
		-Add: dlg_fileselect supports multiple path selection for read (optional)

	[poly]
		-Add: rnd_poly_from_contour_nochk(): same as rnd_poly_from_contour() but doesn't assert on invalid poly (useful if the caller is goign to clean it up or throw it away)

	[polybool]
		-Add: new API, largely compatible with the original poly API, for the new polygon library that features high precision coords and proper handling of self intersections

	[tests]
		-Workaround: printf test: linking static libs is just too advanced for OSX's linker - work it around by dropping the hid .a and manually doing the init sequence

librnd 4.0.3 (r35593)
~~~~~~~~~~~~~~~~~~~~~
	[core]
		-Fix: human coord print: if coordinate ends in .99999999 to the last digit, that means rounding error in conversion; detect and correct it
		-Fix: action registration: NULL pointer deref when a redundant action is refused to register

	[font]
		-Fix: memory overrun on font glyph rendering for simplepoly; verify number of points and fall back to thin draw mode if polygon is too large
		-Fix: off-by-one error in thin poly rendering "last point index" in simplepoly
		-Fix: simplepoly "numpts" is really number of coords in the array, so allow twice as many while keeping compatibility

	[gtk]
		-Fix: when closing all dialogs at quit, prepare for the case of a dialog closing subsequent dialogs automatically

	[lesstif]
		-Fix: when closing all dialogs at quit, prepare for the case of a dialog closing subsequent dialogs automatically

	[lib_hid_common]
		-Add: pressing enter on the string for conf tree value edit should accept new value and close the dialog


librnd 4.0.2 (r35546)
~~~~~~~~~~~~~~~~~~~~~
	[build]
		-Fix: use $(MAKE) instead of make from central Makefile
		-Fix: separate static and dynamic cflags/ldflags so that app executables compiled with a specific librnd configuration won't have stale -l's with a different librnd later

	[core]
		-Cleanup: use portable RND_INLINE instead of inline
		-Add: ConfGet() action to provide access to the native conf nodes for user scripts
		-Add: SafeFs actions for: system, rename, unlink, remove and mkdir (for scripting)
		-Add: SafeFs actions for querying file stat()s, mirroring discrete calls of safe_fs.h
		-Add: SafeFsPathSep() action for returning system-dependent path separator char (e.g. slash)
		-Add: SafeFsRealPath() action for exposing librnd's lrealpath() implementation
		-Add: SafeFsReadFile() action
		-Add: SafeFs actions: fopen, fgets, fclose, fread, feof, fputs for scripting
		-Add: SafeFs binding for fseek, ftell and rewind
		-Add: SafeFs helper action to read a file from separator to separator
		-Add: SafeFs bindings for ferror() and clearerr() (for scripting)

	[doc]
		-Fix: packager's doc: main description did not have gtk4 support
		-Add: recommend --debug when compilation fails of mac, because of -Dinline
		-Add: refine dependencies in INSTALL: mention glu for opengl; mention libepoxy for gtk4

	[gtk]
		-Fix: sign flip on pixmap rotated bbox calculation
		-Fix: enfroce rnd_render point to gtk when rendering from callbacks
		-Add: make gtk text markup foreground colors configurable for <red>, <green> and <blue> (may be useful on the dark theme)

	[hid_gtk2_gdk]
		-Optimize: draw a single point instead of an arc when radius is smaller than a pixel

	[lesstif]
		-Fix: sign flip on pixmap rotated bbox calculation
		-Fix: enfroce rnd_render point to lesstif when rendering from callbacks
		-Cleanup: use portable RND_INLINE instead of inline

	[lib_hid_common]
		-Add: extend the tooltip for auto_place to mention it enables window placement in the first place
		-Add: FsdSimple(): simplified API to the file selection dialog (for scripting)
		-Add: dad() iterate subcommand
		-Add: dad() raise subcommand
		-Add: dad() close subcommand

	[lib_hid_gl]
		-Cleanup: use portable RND_INLINE instead of inline

	[poly]
		-Cleanup: use portable RND_INLINE instead of inline

	[tests]
		-Fix: printf cli testers shall init/uninit rnd units else some rnd_printf internals may crash


librnd 4.0.1 (r35417)
~~~~~~~~~~~~~~~~~~~~~
	[build]
		-Add: unsigned coord type generated from scconfig (would be part of the 4.1.0 API later on)

	[conf]
		-Fix: conf_del on list, which sets the list value to NULL, should get the list removed

	[core]
		-Fix: refine project file creatioin failure error messages so it's more clear what's happening and why
		-Cleanup: internal vairable naming terminology: use design instead of pcb
		-Add: API comment to clarify that design->loadname shall be overwritten by the app on save-as

	[font]
		-Fix: matrix transformation macros should wrap mx in parenthesis because it is a macro argument

	[gtk]
		-Fix: when top window is resized while zoomed out a lot make sure 32 bit coords won't overflow; if they would, zoom in enough to avoid that

	[hid]
		-Fix: do not leave registered temporary tools after switching on the busy-cursor (unreg that tool during uninit)
		-Add: if enum values are available, "--help plugin" prints them

	[hid_lesstif]
		-Fix: update current design pointers within subdialogs of top window when design changes

	[lib_exp_text]
		-Fix: reset transformation matrix for every single page in ps so that ps files can be cat'd together

	[lib_gtk_common]
		-Fix: generalize the zoom overflow detection and clamping code and apply it after any zoom change
		-Fix: update current design pointers within subdialogs of top window when design changes

	[lib_hid_common]
		-Fix: "remove selected" in the preferences config tab right side should be able to remove a whole list/array and update the dialog
		-Add: preferences dialog: explain "save window geometry in design file" limitations in a tooltip

	[util]
		-Add: awk_on_formats: allow plugin type detection override awk script injection so the script is less pcb-rnd-specific
		-Add: accept -i for import and -e for export in awk_on_formats when picking up features from pups


librnd 4.0.0 (r34958)
~~~~~~~~~~~~~~~~~~~~~
	[build]
		-Change: rename librnd3 to librnd4 in all paths
		-Change: rename incldue path to librnd4/librnd (e.g. /usr/include/librnd4/librnd) to avoid clash with librnd3 and future versions
		-Cleanup: clarify the c89/c99 split in .c->.o compile makefile templates
		-Move: rnd_long64_t from central config to the poly lib - only the poly lib needs this type and nothing else should start depending on it
		-Fix: LIBRND_LIBDIR in installed librnd.mak should include the /librnd4 suffix (where non-so binaries are installed)
		-Fix: make sure detected/configure cflags, including -NDEBUG are used when compiling tests
		-Fix: install all headers of libualloc
		-Add: LIBRND_SODIR in installed librnd.mak that points to the libdir that has the .so files
		-Add: installed librnd.mak declares SPHASH and CQUOTE so apps don't need to
		-Add: installed librnd.mak should set GENCONF
		-Add: comment to explain while librnd.mak doesn't need to have LIBRND_SHAREDIR
		-Add: LIBRND_PLUGDIR in installed librnd.mak
		-Add: scconfig template for cdep offers an option to change outpit file name (sch-rnd needs that)
		-Add: define FONT2C in librnd.mak
		-Add: install build_ps.sh and include it in librnd.mak
		-Add: install util/keylist.sh and publish it in librnd.mak
		-Add: install util/menu2svg.sh and publish it in librnd.mak for the apps

	[core]
		-Fix: uninitialized local vars on Log(export)
		-Fix: rnd_printf: refuse more formats when RND_SAFEPRINT_COORD_ONLY is active and the format is not strictly a single coord
		-Fix: rnd_printf: potential memory leak: goto error label instead of returning -1 directly on any error condition
		-Fix: rnd_printf: don't choose between imperial and metric if target unit is outside of these
		-Fix: need to set current desing in GUI before executing any other design-switch event (some parts of the GUI, like the menu system, will use GUI's current)
		-Fix: make rnd_conf_list_foreach_path_first() safe to call with a callback that changes the conf
		-Cleanup: rename RND_EVENT_BOARD_CHANGED to RND_EVENT_BOARD_REPLACED because it's not really a change in the board but the whole board replaced
		-Cleanup: rename RND_EVENT_BOARD_ to RND_EVENT_DESIGN_ to make terminolofy portable accross apps
		-Cleanup: rename DAD redraw-with-board concept to redraw-with-design (app agnostic terminology)
		-Cleanup: rename event names from board to design
		-Cleanup: rename pcbev_ to rndev_ in event names
		-Cleanup: reorder enum rnd_hid_attr_type_t and add spare values for later binary compatibility
		-Cleanup: remove suppress_duplicate_action() - it was a workaround for a librnd 3.x.x transition
		-Cleanup: fix up field ordering of the struct and restore rnd_hid_t spares
		-Cleanup: struct field ordering in rnd_app_t, restore spares
		-Cleanup: rename HID_SC_ to RND_SC_ to keep namespace clean
		-Cleanup: move RND_SC_ from amcros to enum for code clarity
		-Cleanup: rename rnd_hid_cfg_keys_input2*() to rnd_hid_cfg_keys_input*() - this is the new and only official API for input key handling now
		-Cleanup: rename conf_board_ignore to reflect it also operates on project level (and board is design)
		-Cleanup: remove unused context pointer from the hid struct
		-Cleanup: move hid-specific call get_coords from actions to hid
		-Cleanup: actions.h shouldn't include hid.h: actions are generic (core)
		-Cleanup: move hid initialization internals from hidlib.h to hid_init
		-Cleanup: do not include hid_init.h where not needed
		-Cleanup: rename rnd_hidlib_t to rnd_design_t to reflect the real purpose of the struct
		-Cleanup: rename RND_ACT_HIDLIB to RND_ACT_DESIGN to better reflect the purpose
		-Cleanup: rename hidlib_conf.[ch] to rnd_conf.[ch] for clarity
		-Cleanup: rename hidlib argument names to design in public API, for clarity
		-Cleanup: rename path API struct field from ->hidlib to ->design for consistency
		-Cleanup: rename rnd_pcbhl_conf_postproc to rnd_conf_postproc - the pcbhl prefix is legacy from the hidlib times
		-Cleanup: unit: rename unit allow/family/suffix prefixes to rnd_unit
		-Cleanup: unit: create typedefs for the unit enums using unsigned long int to guarantee extra bits for dynamic registration
		-Cleanup: rename unit get functions to have rnd_ prefix
		-Cleanup: remove cschem-specific units (libcschem should register them runtime)
		-Cleanup: rename design ->filename to ->loadname (file name as specified by the user) and introduce ->fullpath for the resolved file name
		-Cleanup: rename project ->filename to ->fullpath for clarity and uniformity with rnd_design_t
		-Cleanup: finalize the new multi-conf support, keep global var copying because of plugin confs, rename the implementation to remove the _temp suffix from the file name
		-Cleanup: remove/fix pcb references in code comments
		-Cleanup: remove pcb-rnd-specific constants from globalconst.h, these should be #defined in pcb-rnd
		-Del: obsolete API rnd_hid_cfg_keys_input()
		-Del: RND_MF_FONT, RND_MF_ACTIVE, RND_MF_BACKGROUND and RND_MF_FOREGROUND from menu system to simplify HID implementation
		-Del: RND_EVENT_DESIGN_META_CHANGED_LIB in favor of RND_EVENT_DESIGN_META_CHANGED - it wasn't called only for lib and there's no library path list on librnd level anyway
		-Change: design struct (rnd_hidlib_t, rnd_design_t): store the bbox of drawing area instead of width and height, to allow editing at negative coords
		-Move: rnd_hidcore_crosshair_move_to() to gui_act.c in preparation of moving gui_act.c out to the hid helper plugin
		-Move: gui_act to lib_hid_common: not needed in non-gui setup
		-Move: Help() back to core, useful in cli
		-Move: rnd_hid_in_main_loop to hidlib.[ch] as it should remain in core among with anyload
		-Split: move hid-specific actions out from conf_act into hid_act for a hid split
		-Split: anyload action to a separate file because it depends on hid
		-Split: librnd-hid.so is only the hid part, librnd-core.so is the core (conf, unit, utils, helpers) without any HID infra
		-Split: code that frees a config role lihata doc from reset() into rnd_conf_free() as it'd be reused in project conf binding
		-Add: rnd_conf_hid_callbacks_t callbacks get a void *user_data argument coming from a rnd_conf_hid_callbacks_t field optionally set at registration; this lets the registrar pass on context to the callbacks
		-Add: better section comments for the long switch in rnd_printf format string processor
		-Add: rnd_printf: optional hook for apps to render %r format strings
		-Add: comment to explain unit suffix print options
		-Add: unit: prepare unit families for dynamic extension
		-Add: explicit field for indicating if a unit is an alias so aliasing can be decoupled from order of units in the vector later on
		-Add: unit: dynamic registration of units and unit families
		-Add: make rnd_get_value()'s fallback unit configurable
		-Add: project support infra
		-Add: project free()
		-Add: project remove_design() call
		-Add: import rnd_project_update_filename() from libcschem
		-Add: API call to append a design to a project's list safely
		-Add: rnd_design_t links back to parent project using a ->project field maintained by project.c
		-Add: import multi-design support from sch-rnd
		-Add: mark each event as [a] or [d] (for per-app or per-design)
		-Add: central hash of projects
		-Add: rnd_app API comment: example when conf dont_mege is used
		-Add: prepare the conf system for checking its own conf error ignores for the gtk grid conf transition
		-Add: extend conf ignores table with a custom error message option
		-Change: rnd_get_n_units() doesn't have arguments anymore: there's only one "number of units", aliases are marked explicitly
		-Change: rnd_units is a vector instead of a static table, to make room for dynamic unit allocation
		-Optimize: rnd_printf() should use static allocation buffer on stack for printf spec strings to save on malloc()/free() calls - no spec string should be longer than 128

	[dad]
		-Cleanup: remove obsolete usage of RND_HID_FSD_* bits
		-Cleanup: simplify enum spares, not forcing switch cases to list them
		-Change: mandate naming HPANE and VPANE widgets on creation (insteadof providing an optional post-creation pane name macro) so any pane position can be remembered
		-Add: API for creating preview widget tied to a specific rnd_design_t

	[doc]
		-Cleanup: switch over pcb-rnd referneces
		-Cleanup: replace the [hidlib] marking with [librnd] marking in conf tree doc
		-Del: pcb-rnd-specific subtrees from the conf doc
		-Del: there's no such config type "CFN_INCREMENTS" (was an old leftover from geda/pcb)
		-Add: final mutli-conf support
		-Update: conf tree for pcb-removal
		-Update: made contact info more librnd-specific
		-Update: fungw action doc for the current API

	[font]
		-Add: import pcb-rnd's font rendering engine

	[gkt4]
		-Fix: missing #include after the API renames

	[gtk]
		-Fix: proper drawing area scrollbar limitats with negative drawing area coords
		-Add: multi design: save and restore zoom+pan when switching between designs
		-Update: "special color" handing for invocation from ->set_design()
		-Move: local_grid and global_grid config subtrees from under the gtk plugin conf tree to editor/ to be shared with other plugins

	[hid]
		-Cleanup: use unit index instead of offset within rnd_units
		-Cleanup: switch over to using rnd_unit_get_idx() instead of direct addressing of rnd_units
		-Cleanup: dad_spin: rename custom integer coord type to reflect it uses the .crd field
		-Cleanup: rename rnd_hidlib_set_grid and rnd_hidlib_set_unit, replacing "hidlib" with "hid"
		-Cleanup: do not call hid ->set_design directly, use multi for that
		-Cleanup: terminology in API comments: we are librnd, not pcb-rnd
		-Cleanup: remove/fix pcb references in code comments
		-Del: per HID ->fileselect in favor of centralized API and implementation, either served lib_hid_common or hid_batch (for CLI)
		-Del: rnd_hid_enable_per_dialog_hidlib (assume it's always 1)
		-Del: ->heavy_term_layer_ind (was pcb-rnd specific)
		-Del: beep() from the hid API - nothing uses it anymore
		-Del: clipboard formats: clipboard is always set and retrieved as a (char *) string
		-Del: ->point_cursor API; replaced by centralized mouse cursor override API
		-Del: ->busy() from the HID API and HID implementations: handled centrally
		-Del: API for faded drawing; this should be done by app's draw code by simply setting lighter colors
		-Del: HID ->get_design API in favor of multi's rnd_multi_get_current()
		-Fix: remember exec prefix after conf internal is loaded
		-Fix: make exec_prefix avialable even before the first real config merge
		-Fix: don't crash if preferred GUI is NULL
		-Fix: hid->attr_dlg_new should set hid_ctx as soon as possible; HID gui operations may trigger callbacks during dialog creation which already depend on hid_ctx
		-Fix: call HID's crosshair notification only if the current render HID wants that (avoids calling crosshair functions while export)
		-Fix: reset tool states when switching designs so tool logic doesn't get confused
		-Rename: "hidlib" args to "design" for clarity
		-Add: ->do_export() should pass on a pointer to the design (so that simple exporters don't need to implement ->set_design) and an optional app-specific config void *
		-Add: hid->set_layer_group() passes on (rnd_design_t *) as well so exporters don't need to remember current design
		-Add: expose_main()'s rnd_hid_expose_ctx_t has an (rnd_design_t *) field to remember which design is being exposed (usefule in multi-design apps, like sch-rnd)
		-Add: explain the gui-printer-exporter flag set better
		-Add: spare fields in DAD structures for binary compatibility
		-Add: generalize dad_spin: introduce a new unit type for custom integer coords
		-Add: hidlib_init1() gets exec_prefix as arg and sets it in the config
		-Add: more detailed explanation on the mouse cursor reg/set API
		-Add: centralized mouse cursor set and override calls
		-Add: all hids should declare a mouse curosr named "busy" for the centralized handlong of busy state
		-Add: centralize rnd_hid_busy() - per HID implementation is removed
		-Add: extend the get_export_options() API so it gets the design and the same app-specific context ptr the actual export gets, so it can calculate field defualts with all export info known
		-Add: keep mainloop_interactive()'s dsg param, mark it "the design we initially switch to"
		-Add: more explanation to HID->set_design()
		-Add: optional API to ask an exporter whether a given design with a given appspec cookie can be exported
		-Add: comments to clarify the new policy on DAD TREE cell[] allocation
		-Change: preview expose callback can't have expose context const, callee needs to fill in ->design
		-Change: tree-table cells need to be malloc'd (strdup'd) on caller's side and are free'd by the lib

	[hid_batch]
		-Cleanup: terminology (hidlib->design)
		-Cleanup: code formatting

	[hid_lesstif]
		-Del: long disabled Xaw-compatible pan mode
		-Fix: don't crash in tree-table widget click event handler if there's no dialog box ptr (happens in subdialog)
		-Add: support for sparse global grid

	[lib_exp_pixmap]
		-Fix: page fit bug with negative coords

	[lib_exp_text]
		-Cleanup: decouple draw_ps from HID API's global faded call, use a hackish global variable specific to the ps export and pcb-rnd (as this is a legacy special case and we are not going to support HID-operated faded draw in any other exporter or for any other app)
		-Fix: ps: wrong centering of negative coords
		-Fix: eps: wrong centering with negative coords
		-Fix: svg bbox calculation with negative coord drawing areas
		-Fix: svg bbox on negative dwg area coords when used with --true-size
		-Change: lpr API: export-to-file gets rnd_design_t * as argument
		-Add: pass on appsepc to the ps exportplugin from the lpr exporter

	[lib_gtk_common]
		-Cleanup: terminology in zoompan: hidlib -> design
		-Fix: allow scrolling/panning to negative coords if drawing area extends to negative
		-Fix: a preview that is neither locally nor globally flipped should be set to local flip with flips kept 0 so it's always displayd in neutral
		-Fix: always update all "special" colors on ->set_design(), the config may have changed and may bring new color
		-Add: set initial preview design depending on preview widget locality
		-Tune: allow zooming out a lot more (sch-rnd may have large sheets)

	[lib_hid_common]
		-Cleanup: rename preferences board-changed concept to design-replaced to follow event rename
		-Cleanup: use unit index instead of offset within rnd_units
		-Cleanup: switch over to using rnd_unit_get_idx() instead of direct addressing of rnd_units
		-Fix: preferences conf tab: update nat's pointer on design switch because in a multi-design setup each design will have a different set of natives
		-Fix: export dialog passes on appspec pointer to the plugin
		-Fix: preferences, key tab: uninitialized ram on table row termination
		-Fix: plugin dialog tree table handling: uninitialized row terminator
		-Add: publish rnd_dlg_export() so non-standard export dialogs can be implemented (e.g. project export in sch-rnd)
		-Add: preferences dialog hook callbacks get current design as argument (provision: just in case we won't operate the preferences dialog for the current design in the far future)
		-Add: preferences dialog tab open callback: pass on optional tab data request from the user to direct initial state when a specific tab is requested to open
		-Add: implement UNIT spin box creation in dad() action

	[lib_hid_gl]
		-Cleanup: passing the wrong string type to standard calls
		-Add: hidgl_expose_init() doesn't assume starting coords at 0;0 but gets them in arguments to make the API more flexible (hid_mbtk may need this)

	[multi]
		-Del: remove RND_EVENT_DESIGN_REPLACED in favor of RND_EVENT_DESIGN_SET_CURRENT (better terminology for multi-design)
		-Fix: most conf lihata docs are shared and shouldn't be copied per design; exceptions are CRF_DESIGN and CFR_PROJECT
		-Add: API to support multiple designs (mostly imported from sch-rnd)
		-Add: refine event comments on which event is called when (meta change vs. fn change)

	[scconfig]
		-Cleanup: rename /local/pcb to /local/rnd in public templates
		-Cleanup: get rid of hidlib leftover in public templates
		-Cleanup: rename _PCB_DEP_ to _RND_DEP_in public templates
		-Cleanup: get rid of unused /local/pcb/fungw_system from public API; fungw is detected and used only in librnd, apps rely on script plugin provided with librnd
		-Fix: error messages used in apps don't hardwire "pcb-rnd"
		-Change: host applications must define APP in their scconfig hooks.c; not defining APP is an #error

	[script]
		-Fix: perma script conf loader: accept root node if it's either pcb-rnd-perma-script-v1 or librnd-perma-script-v1 (typo caused every root look invalid)

	[tests]
		-Add: include fontlib in the testing

	[util]
		-Del: devhelpers/subst - mainline-to-pcb-rnd converter; keep a copy in pcb-rnd only, just in case some hidden gem plugin pops up
		-Del: deblist.sh - not used by anything anymore
		-Fix: 404.sh: exclude releases, can't fix past doc broken links
		-Fix: gen_formats prints $APP instead of hardwired pcb-rnd
		-Add: 404.sh crawls all Ringdove projects not only pcb-rnd
		-Add: install devhelper awk_on_formats.sh, apps need it for packager's doc and datasheet
		-Add: import pcb-rnd's list_dialogs that features reusable shell functions and the html generator
		-Add: install list_dialogs.sh
		-Add: import font2c from pcb-rnd (now that the font engine is in librnd)
		-Add: import action compiler from pcb-rnd (all Ringdove apps need this for their doc)
		-Add: convert action_compiler.sh into a shell lib so the configuration can be provided from a per project wrapper
		-Add: import dump_actions_to_html from pcb-rnd
		-Add: convert dump_actions_to_html.sh to a reusable, app-agnostic shell lib
		-Add: import file format list generator from pcb-rnd
		-Add: missing copyright header in gen_formats; explain the API
		-Add: install gen_formats
		-Add: devhelper: gimp-exported xmc to C source converter (for mouse cursors)
		-Change: generalize list_dialogs more: function for generating table header but do not close html (caller may embed the table in some more complex page)
		-Change: keylist.sh: we do not have per HID menus anymore but plugin supplied menu extras; instead of listing them in columns, have a single "source" column
