*** Upcoming release ***
- 3.2.2: ABI compatible, no new API

*** Later releases ***
- BUG: libualloc *_api.h are not installed
- BUG: make sure tests compile with -DNDEBUG in production, else it fails in alpine packaging (-fomit-frame-pointer brings in fortify headers for some reason which fail with use-librnd #defines in config.h) [report: aron]
- 4.0.0: ABI incompatible (feature removal)
	- HID API for mbtk: pixmaps require a one-time registration and an unique ID
		- check how pcb-rnd layersel would work with this
		- canvas:
			- opengl clipping: hidgl_expose_init() may need am x,y origin; glscissor may conflict with stencil?
	- move rnd_long64_t into the poly lib; nothing else should depend on this
	- DEL?: HID API: clipboard format is always text; remove format and length (SDL and glfw don't support non-text anyway)
		- get() should return an allocated string
		- there should be a free() to be used by the caller after get()
	- DEL?: rethink hid api beep() - sounds like a real bad idea - gabor's idea: configurable external command
	- DEL: remove hidlib->name - only pcb-rnd should use it and only as legacy feature
	- centralize hid API's ->busy - just set the cursor
	- move over pcb-rnd's rnd_inclib/font
	- *FEATURE: sch-rnd critical: more flexilble unit system where apps can register new units - remove k from librnd, revise sch-rnd grid menu
		- split the unit table in two, one librnd, one app
		- families should be registered
		- remove switch on families, use callback functions instead
		- upgrade rnd_printf(): %m should deal with librnd units, %a (oslt) with app units
		- make freq units pcb-rnd app specific, retest the openems exporter
	- BUG: check all librnd calls to rnd_conf_get_project_conf_name(); hidlib->filename should be renamed and split to a load_name and a real_name, for project file use load_name (because of symlink designs)
	- *BUG: sch-rnd critical: hid->attr_dlg_new() needs to get a void **hid_ctx_out argument so it can set hid_ctx before return; this is important because non-gtk HIDs will call back in sync during creating the dialog while core hid_dad will set hid_ctx only after this function returns (and the whole dialog is created); test: tree dialog {w t} in sch-rnd segfaults
	- *BUG: sch-rnd critical: rnd_app.expose_main needs to get the rnd_hidlib_t to draw (multisheet GUI needs this, as a dialog may draw non-current-GUI)
	- CLEANUP/BUG: revise rnd_dad_tree_modify_cell() - previous cell[] should be free'd...
		- apply librnd core patch TODO.hid_dad_tree
		- make sure all callers strdup() all cells
		- user implemented ->user_free_cb() should never free cell values, the lib does that
	- hidlib_init1() should rnd_conf_set() "rc/path/exec_prefix" at the end so the host app doesn't need to
	- bug_files/TODO/L4.patch: -I include/librnd4/librnd and changing installation path to avoid collision with librnd3; also requires apps to change -I
	- *FEATURE: sch-rnd critical: hid->draw_pixmap should pass the original object as void, so that the high level export plugin can embed hints in the output (e.g. sch-rnd embedding text to make the drawing searchable)
	- BUG: camv-rnd old dep workaround: remove trunk/src/Makefile.in TODO#GENHT part and test with system installed fungw+genht and camv-rnd
	- *BUG: sch-rnd critical: in the installed .mak LIBRND_LIBDIR shall include /librnd4 suffix, librnd's scconfig templates depend on this! (sch-rnd has scconfig template dups because of this)
	- *BUG: sch-rnd critical: hid export API doesn't pass hidlib when needed (->do_export and friends)
	- cleanup: rnd_pref_tab_hook_s calls need hidlib arg: open_cb, board_changed_cb, meta_changed_cb
	- feature: rnd_pref_tab_hook_s ->open should deliver extra action arguments because some tabs may have optional args to specify how exactly it should be open
	- move rnd_gtk_conf_hid.plugins.hid_gtk.global_grid.sparse and "local grid" from gtk to global config,make sure all HIDs do it
	- cleanup: remove separate RND_DAD_SET_PANE_NAME() and require every pane named in RND_DAD_BEGIN_[HV]PANE
	- remove /local/pcb/* scconfig vars
	- remove rnd_hid_cfg_keys_input_() and rnd_hid_cfg_keys_input(), rename rnd_hid_cfg_keys_input2_() and rnd_hid_cfg_keys_input2()
	- remove code marked with REMOVE_4.0.0
	- rename conf_board_ignore - it also ignores project
	- rename RND_EVENT_BOARD_CHANGED to _REPLACED
	- rename events RND_EVENT_BOARD_* to RND_EVENT_DESIGN_*
	- revise events: move anything not used by librnd to apps
	- rename textual event names from pcbev_* in event.c
	- move RND_HATT_SUBDIALOG within the enum to under RND_HATT_TEXT
	- hid_t spares: some function ptrs are spent, move them, refill spares
	- rnd_app_t spares: conf_ignore lists (two void *), new func conf_dont_merge_node(), new long multi_design
	- remove unused flags from rnd_hid_fsd_flags_t
		- remove RND_HID_FSD_IS_TEMPLATE
		- remove RND_HID_FSD_MAY_NOT_EXIST and RND_HID_FSD_IS_TEMPLATE (replace them with 0 in code)
	- remove rnd_hid_t->fileselect (code should use rnd_hid_fileselect() instead, which should call lib_hid_common's fileselect through a global pointer hook, plug_ style)
	- remove rnd_hid_t->heavy_term_layer_ind and figure how to substitute it in a portable way
	- remove rnd_hid_t->set_draw_faded and figure how to substitute
	- make HID_SC_ an enum
	- remove rnd_hid_t->point_cusror in favor of rnd_hid_t->set_mouse_cursor
	- check what's the diff between rnd_hid_t-> user_context and hid_data; maybe it is enough to keep only one
	- there are no spare fields in:
		- rnd_hid_tree_t (calloced from macro so calloc is on app side!)
		- rnd_hid_dad_subdialog_s
	- simplify menu code, remove unused features:
		- core: RND_MF_ACTIVE, RND_MF_BACKGROUND, RND_MF_FOREGROUND, RND_MF_FONT
		- check in all HIDs as well
	- scconfig: remove /local/pcb/ from templates and hooks.c on librnd side
		- remove /local/pcb from librnd central scconfig
		- for plugin control rename /local/pcb to /local/plugin/
		- search for TODO:pcb1 in *: replace with /local/rnd/ (and make sure in librnd we also set /local/rnd/ for these few, besides /local/librnd)
		- switch over librnd published templates, see TODO.template
			- use /local/mod/ for module temps instead of /local/pcb/mod
			- use /local/plugin for plugin states, like /local/pcb/hid_batch
	- conf: plugins/hid_gtk/history_size should be non-gtk-specific
		- apps may refer to it through preferences dialog
	- allow no-drawing-area mode for camv-rnd for negative coordinate gerbers
	- rename hidlib_conf.[ch] to librnd_conf.[ch]
	- multi design (multides.html):
		- problem: rnd_conf_fields
			- it hosts native (merged) config data
			- thus it needs to be per design
			- but if a new plugin registers a new field, that needs to be done in every existing design!
			- if a shared tree (project, user, sys) changes, we need to re-merge all design's rnd_conf_fields
		- mark each event [local] or [global]
		- rename rnd_hidlib_t to rnd_design_t (or to something better)
		- cleanup: extend callbacks in rnd_conf_hid_callbacks_t to pass hidlib (multiple callbacks with different designs if multiple open designs are changed!)
		- rnd_conf_hid_callbacks_t needs a void *user_data so code that registers an event can save context for the callback; get callbacks to get rnd_conf_hid_callbacks_t, see mbtk menu.c librnd4 TODO
		- rnd_hidlib_t must contain:
			- real file name (realpath'd)
			- original file name (short name, as the user called it)
		- switch over from rnd_conf and conf_core to per design conf
		- implement user file name and realpath file name
		- implement project list and pointing back
		- conf: implement a way to make sure design file list is coming from the project file only
		- implement every little detail of the new project file handling as specified
		- rnd_app.single_design setting for single design mode
		- make sure the batch HID maintains set/get_hidlib()
		- rnd_hid_parse_command_line() doesn't allow multiple filenames (but somehow it still works in sch-rnd!)
		- remove rnd_hid_enable_per_dialog_hidlib, assuming it is always 1
		- rnd_main_loop_interactive() shouldn't receiver a hidlib arg (assume it's already set in the gui earlier in main)
		- RND_EVENT_BOARD_CHANGED doesn't make sense in a multi-design env; replace it with an PRE_UNLOAD event
			- double test: pcb-rnd, load board, open propedit on an object, select a row, start new board (or rather, unload board) -> propedit should close
		- multi preview widget:
			- gtk preview widget locality: add a HID API to set local bit (see r34242, TODO "multi:")
			- bind unload event and invalidate local previews' hidlib (see r34242) so they don't crash if the caller doesn't do that
			- lesstif: implement gtk's r34242 and test with sch-rnd tree view (depends on hid_ctx return fix)
		- DAD API: think over and document if ->set_val() hv.str needs to be strdupped; probably best if the lib strdups it (revise callers)
		- export API for exporting a whole project at once (instead of exporting a single sheet); pass on project ptr, not sheet ptr

*** Low prio ***
	- BUG: use libualloc for rtree stack instead of static allocation [report: Vuokko]
	- BUG: hid_lesstif potential bug: bug_files/TODO/lesstif.txt [report: Fuz]
	- bitmap object export in png, ps, eps, svg
	- FEATURE: font -v2 support:
		- baseline?
		- optional kerning table: a single dx value for combiation of 2 glyphs; second glyph usually needs to moved in the negative direction
		- save and load ->height, check calls to rnd_font_fix_v1() and don't call it if ->height is loaded
		- unicode translation table so that the upper 127 chars can be used for mu, degree and similar

*** Unsorted ***
	- lesstif: vertical text, truncated text support
