Version 6.1.1

vk_progress: inline caption only with solid (or absent) trough
* [Bryan Christ] The centred value read-out is reverse video over the cell it
  lands on.  That requires a solid colour under each glyph.  A STIPPLE trough
  is a shade character, not a solid field -- reverse of its pair never matches
  the shaded body (same reason sub-cell fill already refuses stipple).
  vk_progress_set_value_text() now returns -1 for non-empty text when the bar
  is UNDERBAR, vertical, or has a STIPPLE trough; set_trough(STIPPLE) and
  set_style(UNDERBAR) clear any stored caption.  Callers that want an inline
  read-out must use UNICODE/ASCII fill with VK_TROUGH_SOLID or VK_TROUGH_NONE.

Version 6.1.0

vk_progress: optional value read-out centred in the bar
* [Bryan Christ] Add vk_progress_set_value_text(progress, text) -- an optional
  string drawn centred on the bar's fill axis, in reverse video, over whichever
  cells it covers.  Each glyph inverts the cell beneath it, so the read-out
  reads as a knockout that flips as the fill sweeps past, and its colour tracks
  the fill (a vk_meter's zone colour) for free.  Block styles only (UNICODE /
  ASCII) and horizontal bars -- UNDERBAR's thin baseline has nothing to knock
  out; "" (the default) disables it.  Additive API -- SOVERSION stays 6.

Version 6.0.0

API BREAK: relief-style setters renamed to border-style (SOVERSION 5 -> 6)
* [Bryan Christ] Rename vk_button_set_relief_style, vk_dropdown_set_relief_style,
  vk_spinbutton_set_relief_style and vk_input_set_relief_style to their
  vk_*_set_border_style equivalents.  These four select a BOX style
  (VK_BORDER_SINGLE / VK_BORDER_ASCII / VK_BUTTON_BASIC), not a relief
  direction -- the "_relief_style" name invited passing a VK_RELIEF_* constant
  by mistake.  The convention is now unambiguous:
    - _set_relief(VK_RELIEF_RAISED|SUNKEN)  -- direction (vk_progress,
      vk_spinbutton field/button)
    - _set_border_style(VK_BORDER_*|VK_BUTTON_BASIC) -- which box (vk_frame,
      vk_scroller, vk_window, vk_popup, and now vk_button, vk_dropdown,
      vk_spinbutton, vk_input)
    - _set_style(...) -- unchanged; widget content style (vk_progress fill,
      vk_selectbox, vk_activity)
  The private per-widget "relief_style" field is renamed "border_style" to
  match.  Four public symbols removed, four added: SOVERSION bumps to 6.

New widgets: vk_progress and vk_meter
* [Bryan Christ] Add vk_progress -- a progress-bar widget.  Horizontal or
  vertical, configurable thickness, sunken or no relief, and a trough that is a
  stipple, a solid block of another colour, or absent.  Three fill styles
  (vk_progress_set_style): UNICODE fills with the full block (U+2588) and, with
  a solid/absent trough, at 1/8-cell resolution; ASCII fills with '#'; UNDERBAR
  fills with a reverse-video underscore -- a flat, un-bevelled bar for
  single-row meters drawn without relief.  Value / range are doubles.
* [Bryan Christ] Add vk_meter -- derives from vk_progress and adds
  value-dependent fill colours: vk_meter_add_threshold(at, fg, bg), where the
  highest threshold <= the current value wins.  The colour breakpoints are
  independent of the fill range, so symmetric voltage/temperature bands (low
  and high both bad) and monotone ramps are both expressible.  It overrides
  only the fill-colour virtual; all geometry is inherited.  SOVERSION stays 5.

Relief drawing centralised (and fixed) in vdk_private
* [Bryan Christ] vk_progress/vk_meter render into their own canvas via the
  _update path and inherit the base compositing _draw, per the toolkit
  convention -- the first cut rendered from _draw and never composited, so
  the widgets drew nothing when attached to a screen.
* [Bryan Christ] All 3D relief drawing now lives in one internal helper unit,
  vdk/vdk_private.c: vdk_relief_wch() is the single relief-cell primitive
  (recolours a WACS_ glyph; neutralises window attrs, which wadd_wch would
  otherwise merge into the cell) and vdk_draw_relief() draws a full relief
  box over a caller-supplied background.  vk_frame, vk_input, vk_button,
  vk_progress, vk_dropdown and vk_spinbutton drop their private copies.
  Shading is uniform via VDK_RELIEF_HI/SH_ATTRS: the highlight edge is
  always bold (bright white), the shadow edge never is (black, not washed-out
  grey).  Fixes two long-standing filedialog artifacts: the path input's
  highlight rendered dull, and the list frame's bold border attrs leaked
  onto its shadow edge, turning it grey.
* [Bryan Christ] Dropdown and spinbutton arrow boxes are now flat (face
  colour): a tee cell is shared by two regions and cannot satisfy two relief
  directions, so any shading choice reads as a glitch from one side.  The
  main control carries the 3D (raised dropdown field; sunken spinbutton
  value field) and the arrow region stays flat.  The spinbutton's
  button_relief defaults to flat; the raised/sunken per-region API remains.

Version 5.6.0

Extended-colour surface backgrounds (API change)
* [Bryan Christ] vk_screen_set_surface_bkgd() now takes (wchar_t wch, attr_t
  attrs, short pair) and stores the background as a cchar_t applied via
  wbkgrndset(), instead of a chtype via wbkgdset().  The chtype/COLOR_PAIR form
  truncated the pair into ncurses' 8-bit A_COLOR field, so a bright (bg 12-15)
  or 256-colour desktop background rendered in the wrong colour in the cells the
  terminal's hardware-scroll optimisation exposes.  API break: callers pass the
  decomposed background instead of a chtype (see vwm 4.9.2).  SOVERSION unchanged.

Version 5.5.1

vk_object event/input safety fixes
* [Bryan Christ] vk_object_emit() now walks the handler list with the _safe
  iterator (as unregister_event and destroy already do).  A handler that
  unregisters itself -- or another handler -- during dispatch frees its list
  node; the non-safe walk then dereferenced the freed node via pos->next
  (confirmed use-after-free under ASan).  Destroying the emitting object inside
  its own handler remains unsupported -- callers must defer it (as vwm does).
* [Bryan Christ] vk_object_push_keystroke() no longer returns an uninitialized
  int when the target widget has no kmio -- e.g. a label or filler in a focused
  box/grid slot, which routes the keystroke through push_keystroke.  Now returns
  -1 in that case.

Version 5.5.0

Deck member visibility, finalize event + menubar label updates
* [Bryan Christ] vk_deck_get_top() now returns the topmost VISIBLE member --
  hidden (minimized) members are skipped, so focus and keyboard input hand off
  to the next real window (callers that must walk every member regardless of
  visibility use vk_deck_get_widget()).  The deck draw also skips a hidden
  member's drop-shadow (previously painted before the per-widget visibility
  gate).  With the existing vk_widget_hide() / vk_widget_show(), this is enough
  to minimize a window in place.
* [Bryan Christ] Add the VK_EVENT_ON_FINALIZE deck event.  vk_deck_add_widget(),
  vk_deck_remove_widget(), vk_deck_set_top() and vk_deck_cycle() emit it once
  the deck's membership or stacking has changed; the public vk_deck_finalize()
  lets a consumer fire it after a change the deck can't observe itself (a
  member's visibility).  A consumer can then re-evaluate every member in
  z-order (vk_deck_count() / vk_deck_get_widget()) from a single handler --
  e.g. to repaint focus decorations -- instead of hand-rolling the "who was top
  / who is top now" dance at each call site.  A per-deck re-entrancy guard
  prevents a handler from triggering a nested emit.  Additive; SOVERSION stays 5.
* [Bryan Christ] vk_frame_t now also emits VK_EVENT_ON_FINALIZE at the end of
  its update, once the border, scrollers and child are all in the canvas.  A
  consumer can register a handler (vk_object_register_event) to decorate the
  finished frame at the last minute -- e.g. paint a caption onto the top
  border via vk_widget_get_canvas() -- without subclassing.  Additive.
* [Bryan Christ] vk_frame_t now paints its interior in its own background
  before erasing, so a childless (decorative / grouping-box) frame reads as an
  opaque panel instead of punching the surface's default (black) through its
  interior.  A frame with a child is unaffected -- the child draws over the
  interior.  vk_window keeps its own update path and is untouched.
* [Bryan Christ] Add vk_menubar_set_item_label() -- replace a menu-bar item's
  label in place and re-render, for a live-updating label such as a count.
  Additive; SOVERSION stays 5.

Version 5.4.1

Compositor scroll flicker
* [Bryan Christ] Stop ncurses' doupdate from scroll-optimizing the composited
  screen.  A scroll inside one surface (an embedded terminal reaching a bound)
  was realized with a physical scroll region + reverse index, which act on the
  full row width and dragged every other surface's cells in those rows along
  with it -- a screen-wide flicker on the static desktop.  vk_screen now hands
  newterm() a variant of $TERM with the scroll / insert-delete-line caps
  cancelled, so doupdate composes each frame with direct cell writes instead.
  No API change; SOVERSION stays 5.

Version 5.4.0

Proportional scroller thumb
* [Bryan Christ] vk_scroller draws a proportional-length thumb whose size
  encodes the visible fraction of the content, instead of a single cell --
  a full-height thumb means everything fits, and it shrinks as content
  grows.  Adds vk_scroller_set_always_visible() to keep the trough on screen
  (with a full thumb) instead of hiding when content fits.  Default behavior
  is unchanged; additive API only, SOVERSION stays 5.

Version 5.3.0

High-color pair rendering
* [Bryan Christ] Widgets applied their ncurses color pair through the
  COLOR_PAIR() macro, which packs the pair into the 8-bit A_COLOR field
  (max pair 255).  vdk_color_pair() returns pairs 256-319 for the
  16-color range whenever a component is bright (8-15), so bright
  foreground or background colors truncated to a different pair and
  rendered the wrong color.  Apply the pair as a separate short via
  wattr_set() / setcchar() / the new vk_widget_fill_pair() across every
  widget (label, color, box, filler, popup, filedialog, window, scroller,
  frame, grid, table, activity, marquee, textbox, listbox, selectbox,
  menubar, dropdown, button, input, spinbutton, calendar) and the
  vk_color focus overlay.  The list / select / menubar highlight carried
  a second truncation -- mvwchgat(PAIR_NUMBER(COLOR_PAIR(p))) -- now the
  short pair is passed to mvwchgat directly.  Adds vk_widget_fill_pair();
  additive API only, SOVERSION stays 5.

Version 5.2.1

Mouse-tracking teardown
* [Bryan Christ] vk_kmio_shutdown now resets the full mouse-tracking
  family (?1000l ?1002l ?1003l ?1006l) instead of only the single mode
  it set.  ?1003l stops motion reports but leaves button / wheel
  tracking armed on many terminals, so after the host (vwm) exits the
  shell showed clicks and wheel ticks as garbage glyphs -- simple
  movement stayed clean, the tell that button tracking, not motion,
  was left on.  The teleport walk-away in vk_screen.c carried the same
  ?1003l-only gap on the outgoing terminal and got the same full reset.
  SOVERSION stays 5.

Version 5.2.0

vk_spinbutton widget
* [Bryan Christ] Add vk_spinbutton, a numeric value field with increment /
  decrement arrows.  The value is a double clamped to [min, max] with a
  configurable step and display precision; manual text entry is opt-in.
  The value field and the arrow controls carry independent 3D relief
  (sunken field / raised buttons by default), split by a vertical
  separator, with a second separator between the inc / dec arrows.
  Keyboard is self-contained (Up/Down step plus an inline editor); mouse
  is parent-assisted via vk_spinbutton_click(), since a leaf widget does
  not know its absolute position.  A value change emits the new
  VK_EVENT_ON_CHANGE (16) and invokes an optional on_change callback.
  Additive API only; SOVERSION stays 5.

Version 5.1.2

Terminal restore (dtach / abduco reattach)
* [Bryan Christ] vk_screen_resize: re-arm application keypad mode on
  reattach by writing smkx directly to the screen fd.  keypad(stdscr,
  TRUE) at startup put the terminal in application cursor key mode, so
  arrow keys arrived as \EOA/\EOB/... -- the form getch translates to
  KEY_UP/KEY_DOWN/...  A dtach reattach binds a fresh terminal that is
  in normal cursor mode (\E[A/\E[B/...), which no key_* terminfo entry
  binds, so the focused widget received raw escape-sequence bytes
  instead of cursor-key events.  ncurses gates smkx emission on its
  internal _keypad_on flag, and a keypad(FALSE)/keypad(TRUE) toggle on
  an unchanged SCREEN does not reliably re-emit the capability across
  ncurses versions.  Write smkx straight to fd_out instead -- same
  pattern kmio uses for the mouse-enable escapes that already survive
  reattach.  No API/ABI change; SOVERSION stays 5.

Version 5.1.1

Terminal restore (dtach / abduco reattach)
* [Bryan Christ] vk_screen_resize: force a full repaint and re-assert
  the hidden cursor when the resize cascade runs.  A detach/reattach --
  and a `reset` on the detached tty -- leaves ncurses' model of the
  physical terminal stale: the optimized wrefresh emits a diff against a
  screen state that no longer holds, so the reattached terminal shows
  garbage until something forces a repaint; and curs_set(0) is
  suppressed on the unchanged SCREEN, so the freshly attached terminal
  comes up with the cursor visible.  clearok(stdscr, TRUE) plus a
  curs_set(1)/curs_set(0) toggle re-sync both on the next refresh -- the
  same path a SIGWINCH-driven reattach (dtach -r winch) travels.  No
  API/ABI change; SOVERSION stays 5.

Version 5.1.0

I/O, keyboard, mouse
* [Bryan Christ] vk_kmio: parse SGR mouse reports (1006h) in-library
  instead of letting ncurses decode them.  ncurses masks the motion bit
  (0x20) off the SGR button code, so it surfaces motion as
  BUTTON1_RELEASED and drag as BUTTON1_PRESSED -- which broke
  hover-highlight and made drags misfire over SSH (windows raised on
  hover, dragged windows stuck to the cursor).  vk_kmio now arms
  mousemask(0): ncurses still returns KEY_MOUSE for the \033[<
  introducer but leaks the Cb;Cx;Cy(M|m) body as raw bytes, which
  vk_kmio_fetch accumulates and decodes itself (resuming across a split
  read).  The wire is self-describing -- motion is the 0x20 bit, release
  is the lowercase 'm' terminator -- so the decode needs no held-state
  tracking, timestamps, or heuristics: press -> BUTTONn_PRESSED, release
  -> BUTTONn_RELEASED, any motion -> REPORT_MOUSE_POSITION, wheel ->
  BUTTON4/5_PRESSED.  1003h (hover) or 1000h (button-only) selects the
  tracking level; both disabled in reverse order at shutdown.
  ABI/SONAME unchanged; consumers only need to drop in the new libvdk.so.

Version 5.0.0

Project structure
* [Bryan Christ] Retire the entire legacy viper_* / w_* cluster:
  viper_msgbox, viper_wdecorate, viper_kmio, viper_wcreate, viper_wfind,
  viper_wresize, plus userptr/wtraits/keyboard/wclose and the rest of
  the W_* layer.  libvdk is now the only library this project ships.
* [Bryan Christ] Extract VDK widget toolkit as standalone libvdk (static
  and shared).  vdk.h is the single public header; vkmio.h ships
  alongside for keyboard / mouse I/O.  Sources moved into the vdk/
  subdirectory; vdk_color.h consolidated into vdk.h.
* [Bryan Christ] Unify version: PROJECT_VERSION drives libvdk's
  VERSION and pkg-config; SOVERSION advances to 5 to reflect the ABI
  break from the klass-system overhaul.

vk_object framework
* [Bryan Christ] Add vk_object_t base klass with RTTI,
  constructor/destructor chaining, and demote pattern for safe
  polymorphic destruction.
* [Bryan Christ] Add generic event system on vk_object_t; restrict
  vk_object_assert to destructors and remove redundant wrappers.
* [Bryan Christ] Add convenience macros for inherited APIs in vdk.h,
  interleaved into their klass API sections.

Screen / surfaces / teleport
* [Bryan Christ] Add vk_screen_t for terminal migration and virtual
  surfaces.  Supports wallpaper callback (refresh composites: erase,
  wallpaper, widget blit, refresh), screen overlay, surface change
  event, active-surface and surface-count getters, and per-surface
  bkgd persistence with stdscr propagation.
* [Bryan Christ] Add vk_screen_evict_pty to SIGSTOP the session leader
  before teleport.
* [Bryan Christ] Add _on_recreate hook so widgets auto-repaint after
  teleport.  vk_label override of _recreate rerenders label->text after
  the canvas is reallocated (previously blank after teleport).
* [Bryan Christ] Add vk_screen_get_fd(vk_screen_t *) -> int.  Returns
  fileno(screen->fd_out), letting consumers write raw terminal-mode
  escapes directly to the active SCREEN's output instead of stdout
  (which is wrong after teleport).
* [Bryan Christ] vk_screen_teleport writes \033[?1003l to the OLD
  output before endwin, disabling any-event mouse tracking on the
  terminal we are walking away from.  Without it the launching shell
  saw raw \033[M mouse-report bytes for every cursor movement.

Widgets
* [Bryan Christ] Add vk_widget_t base widget with canvas, surface,
  draw/move/resize/recreate pipeline, state flags, and scroller
  attachment slots.
* [Bryan Christ] Add vk_container_t with add/remove/vacate/rotate for
  child widget management.
* [Bryan Christ] Add vk_frame_t bordered single-child container with
  VK_BORDER_SINGLE, VK_BORDER_DOUBLE, VK_BORDER_ASCII, and
  VK_BORDER_NONE styles.  Border style symbols were renamed from
  VK_FRAME_* during this cycle; legacy names are removed.  Adds
  VK_BORDER_REVERSE modifier and VK_RELIEF_RAISED / VK_RELIEF_SUNKEN
  relief modifiers.
* [Bryan Christ] Add vk_scroller_t as an attachment widget (derives
  from vk_widget_t).  Draws scrollbar strip on host widget canvas.
  Supports vertical and horizontal axes.
* [Bryan Christ] Add vk_window_t derived from vk_frame_t with title
  rendering and VkWindowDecorateFunc callback.
* [Bryan Christ] Add vk_box_t layout container with horizontal /
  vertical orientation, homogeneous and non-homogeneous modes.
* [Bryan Christ] Add vk_label_t single-line text widget with left /
  right / center justification.
* [Bryan Christ] Add vk_marquee_t derived from vk_label_t with
  scroll-left, scroll-right, and continuous loop modes.
* [Bryan Christ] Add vk_listbox_t with items, separators, highlight,
  scroll support, and scroller host pattern.  Configurable highlight
  attribute API.
* [Bryan Christ] Add vk_selectbox_t derived from vk_listbox_t with
  checkbox (multi-select) and radio (single-select) modes, ASCII and
  Unicode glyph styles, and scroller attachment support.
* [Bryan Christ] Add vk_textbox_t multi-line read-only text display
  with word wrap, keyboard scrolling, and scroller attachment support.
* [Bryan Christ] Add vk_deck_t z-order manager.  Canvas-less widget
  that composites children directly onto its surface during draw.
  Supports add-to-top/bottom, set-top, cycle, optional drop shadows,
  and vk_deck_count / vk_deck_get_widget accessors.
* [Bryan Christ] Add vk_button_t push button with 3D beveled style
  (VK_BORDER_SINGLE, VK_BORDER_ASCII) and Links-style basic relief
  (VK_BUTTON_BASIC).  Press / release states, callback, UTF-8 text.
* [Bryan Christ] Add vk_input_t single-line text input widget.
  Supports sunken and basic relief.  Full editing API with dynamic
  text buffer, optional max length, horizontal scrolling, and cursor
  toggle.
* [Bryan Christ] Add vk_filler_t: a minimal 1x1 blank widget born with
  VK_STATE_EXPAND.  Useful as a spacer in non-homogeneous boxes.
* [Bryan Christ] Add vk_filedialog_t composite widget derived from
  vk_box_t.  File browser with path input, scrollable file/directory
  list (listbox or checkbox selectbox for multiselect), vertical
  scrollbar, OK/Cancel button bar, extension filter, built-in sunken
  file_list frame, and built-in keyboard navigation.  Supports
  VK_BORDER_SINGLE, VK_BORDER_ASCII, and VK_BUTTON_BASIC styles.
  vk_filedialog_set_wrap() enables wrap-around navigation.
* [Bryan Christ] Add vk_popup_t composite widget: bordered dialog with
  configurable client area and auto-laid-out button bar.  Buttons can
  be specified at create time (va_args, NULL-terminated) or added
  later.  Button press emits VK_EVENT_ON_CLOSE with the button index
  as result.  Supports VK_BORDER_SINGLE, VK_BORDER_ASCII, and
  VK_BUTTON_BASIC styles.  All window APIs available via convenience
  macros.
* [Bryan Christ] Add vk_viewport_t widget: a scrollable window into a
  logical canvas served by a consumer-supplied get_row callback.
  Source config is POD (vk_viewport_src_t) and the viewport asks for
  one row at a time when it repaints.  Pairs with vk_scroller via
  vk_viewport_scroll_info.
* [Bryan Christ] Add vk_grid_t layout primitive: 2D sister to vk_box.
  Per-column and per-row natural sizing + expand bits.  Hybrid mode --
  any cell can hold a slot widget (composited like vk_box) OR be a
  paint area (consumer paints into the grid's canvas using
  vk_grid_get_cell_rect).  Configurable gap reserves space between
  cells and around the outer edge for subclass decorations.
* [Bryan Christ] Add vk_table_t (vk_grid subclass): renders dividers
  between cells and around the outer edge in single / double / ASCII
  line styles.  Reuses vk_grid's gap as the divider channel and
  exposes internal helpers (_vk_table_update, _vk_table_pick_junction,
  _vk_table_compute_lines) so subclasses can overlay per-cell
  decorations.
* [Bryan Christ] Add vk_color_t (vk_table subclass): 16-cell ANSI
  color picker.  Cells are paint-mode (no slot widget overhead);
  layout is any cols*rows == 16 (1x16, 2x8, 4x4, 8x2, 16x1).  Built-in
  arrow / Tab / Shift-Tab / Enter navigation; the focused cell's
  surrounding dividers are re-drawn in a configurable highlight color
  via the same junction glyphs vk_table uses.
* [Bryan Christ] Add vk_menubar_t widget with dropdown management.
* [Bryan Christ] Add vk_dropdown_t widget with frame border attrs.
* [Bryan Christ] Add vk_calendar_t widget.
* [Bryan Christ] Add vk_activity_t widget; listbox item padding;
  scroller background fill.
* [Bryan Christ] Remove vk_menu_t (replaced by vk_listbox_t in VDK).

Widget state and styling
* [Bryan Christ] Replace bool hidden with a uint32_t state bitfield on
  vk_widget_t (STATE_VISIBLE, STATE_FROZEN, STATE_NORESIZE,
  STATE_EXPAND).  Implement STATE_FROZEN via composer snapshot.
* [Bryan Christ] Add widget visibility API (show / hide / is_visible).
* [Bryan Christ] Use WACS_* wide chars for borders and separators
  instead of ACS_* and hardcoded Unicode codepoints.
* [Bryan Christ] Add inline keyword to all public API functions; add
  convenience macros for widget state.

I/O, keyboard, mouse
* [Bryan Christ] Make VDK widgets I/O-agnostic.  Remove built-in kmio
  handlers from all klasses (except vk_filedialog_t).  Add
  vk_object_set_kmio() so applications install their own keystroke
  handlers at runtime.
* [Bryan Christ] Add default kmio forwarding handlers to vk_frame_t
  (forwards to child), vk_box_t (forwards to focused slot widget),
  and vk_deck_t (forwards to top widget).  vk_window_t inherits
  frame's handler.  All overridable via vk_object_set_kmio().
* [Bryan Christ] vk_kmio: vk_kmio_init / vk_kmio_shutdown now take an
  int fd and write mouse-mode escapes through it via write(2) instead
  of printf/fflush(stdout).  Keeps the keyboard/mouse layer
  independent of stdio and lets callers re-bind kmio to a new fd after
  teleport.  Pass vk_screen_get_fd(screen) at every call site.
* [Bryan Christ] Route mouse-mode escapes through caller-supplied fd.
* [Bryan Christ] Add vkmio zone, double-click, and drag utilities.
* [Bryan Christ] Add vk_kmio_mouse_drain to coalesce queued mouse
  events.
* [Bryan Christ] Add vk_kmio_get_mouse_event and GPM wheel button
  mapping.
* [Bryan Christ] Bypass the ncurses mouse queue for GPM and take over
  the GPM connection directly.
* [Bryan Christ] Enable xterm mode 1003 (any-event mouse tracking).
* [Bryan Christ] Restrict window move/resize to frame border clicks;
  add Shift bypass.
* [Bryan Christ] Fix GPM wheel detection for exps2/imps2 mice.

Color
* [Bryan Christ] Add vdk_color_init() and vdk_color_pair() color
  system.  VDK source files have no dependency on viper.h.
* [Bryan Christ] Add 16x16 ANSI color pair tier for accurate bright
  color mapping.
* [Bryan Christ] Add extended 256-color pair registration and lookup.
* [Bryan Christ] Add configurable relief colors and shadow colors,
  plus filedialog button APIs.

Fixes
* [Bryan Christ] Fix scroller blank canvas overwriting host border
  when content fits viewport (skip-draw semantics).
* [Bryan Christ] Fix vk_box_t initial layout not sizing last slot to
  absorb remainder pixels.
* [Bryan Christ] Fix vdk_color_init() pair 0 swap to match ncurses
  default pair semantics.
* [Bryan Christ] Fix vk_button_t width calculation to use display
  width (wcswidth) instead of byte length so UTF-8 labels size
  correctly.
* [Bryan Christ] Fix vk_widget_resize corrupting canvas when size is
  unchanged.
* [Bryan Christ] Redraw screen on focus change to fix stale border
  agents.
* [Bryan Christ] Fix label UTF-8 rendering; skip hidden box children
  when painting.
* [Bryan Christ] Honor widget attrs when painting listbox item text.
* [Bryan Christ] Initialize widget list node at construction so
  list_del is safe.
* [Bryan Christ] Add missing listbox public API wrappers: set_selected,
  exec_selected, item_is_separator, get_item_count, get_selected,
  get_item, set_item.
* [Bryan Christ] Add selectbox wrappers for the full listbox-inherited
  API: add_separator, remove_item, get_item_count, get_selected,
  set_selected, exec_selected, get_item, set_item, item_is_separator.

Demos
* [Bryan Christ] Multi-desktop demo, dialog demo, filedialog demo;
  new vk_viewport_demo.

Version 3.1.1

* [Sergei Trofimovich] User "%s" specifier for safety in a couple
  of printf-style functions.

Version 3.1.0

* [Bryan Christ] Create a FASTCOLOR interface which is equivalent
  to pair_content() but avaialbe externally.

Version 3.0.1

* [Bryan Christ] Fixed FASTCOLOR mode which was broken.

Version 3.0.0

* [Bryan Christ] Require ncursesw.  First step in UTF-8 encoding
  for Unicode support.

Version 2.1.8

* [Bryan Christ] Fix color mapping for terminals that support more
  than 64 colors.

Version 2.1.7

* [Bryan Christ] Partial framework for multiple screens.

Version 2.1.6

* [Bryan Christ] Init UTF-8 locale in viper_init(). 

Version 2.1.5

* [Bryan Christ] Removed obsolete kmio hooks because unmanaged windows
  can accompish the same thing more-or-less.

Version 2.1.4

* [Bryan Christ] Fixed a logic bug in resizing of fullscreen windows.
  Cause unmanaged windows to be blitted after doing a recursive window
  blit redraw.

Version 2.1.3

* [Bryan Christ] Allow unmanaged windows to be resized by default.

Version 2.1.2

* [Bryan Christ] Added an API to get metrics of a widget.  Fixed a
  calculation error in menus with frames.

Version 2.1.1

* [Bryan Christ] Added API to get optimum metrics of listbox
  width and height.

Version 2.1.0

* [Bryan Christ] Added vk_menu_t klass.

Version 2.0.4

* [Bryan Christ] Improved window focus behavior on X terms.

Version 2.0.3

* [Bryan Christ] Fix NULL pointer segfault in viper_window_get_top API.

Version 2.0.2

* [Bryan Christ] Created API to get screen_id from a vwnd_t.

Version 2.0.1

* [Bryan Christ] Added external API for vk_widget_resize() which was
  accidentally overlooked.

Version 2.0.0

* [Bryan Christ] Major rewrite with new VK object classes.
  Removed dependencies on FORM and MENU libraries which are
  Ncurses specific.  Revised API uses vwnd_t instead of WINDOW*
  for standard interface handle.  Added framework for multi-screen
  support.

Version 1.7.1

*  [Bryan Christ] Cause GCC to make to strip symbols to produce
   a smaller binary.

Version 1.7.0

*  [Bryan Christ] Make API more intuitive and simplify deck logic.

Version 1.6.1

*  [Bryan Christ] Moved build system to cmake.

Version 1.6.0

*  [Bryan Christ] Completely removed Glib requirements and replaced
   them with Linux linked list and libc analogs.

Version 1.5.0

*  [Bryan Christ] Removed GSList from window event system
   and replaced it with Linux linked list implemenation. 

Version 1.4.6

*  [Bryan Christ] Added workaround to suppress character echo
   which happens over remote (ssh) connections.

Version 1.4.5

*  [Bryan Christ] Added viper_end() function which gracefully
   releases allocated resources

Version 1.4.4

*  Removed BUTTON4* references from viper_gpm.def because
   some older system don't have these defined.

Version 1.4.3

*  Added version string LIBVIPER_VERSION
*  Added custom hook support for viper_kmio_dispatch()
   facilities. 

Version 1.4.2.2

*  Makefile fix

Version 1.4.2.1

*  Makefile fix

Version 1.4.2

*  Added is_cursor_at* function family.
*  Hide cursor when not using GPM or GPM is running
   in a xterm-like emulator.

Version 1.4.1

*  Makefile patch from Ben Sittler to build parallel
	versions of the library (libviper.so/libviper_wide.so)

Version 1.4.0

*  Major rewrite of the keyboard and mouse facilities.
*  The changes to the mouse facilities should enable
   sysmouse on *BSD should anyone care to do the porting
   work.  The sysmouse functionailty is leveraged from 
   ncurses directly.
  
Version 1.3.2

*  fixed some minor build warnings.

Version 1.3.1

*  code testing on x86-64.
*  displaced several screen initialization and screen
   referencing functions and macros in favor of a
   external global called SCREEN_WINDOW.  viper_init() must
   now be explicitly called to initialize the internal
   structures.
*  enabled gcc -O2 optimizations in Makefile and moved to
   C99 standard (mostly for long long int).

Version 1.3.0

*  retooling of several functions to better support feature like
   fullscreen specifiers and NORESIZE state.
*  new windows are created by default with the NORESIZE flag.
*  setting the ground work for (possibly) multiple workspaces.
*  implemented new callback agents for border manipulation.
   the default agents replace the predefined "window-focus" and
   "window-unfocus" events.  it is now safe to override these
   event functions without consequence.
*  much needed code clean-up.
*  setting ground work to move predefined window managment out
   of library and replace with better event framework. 

Version 1.2.3

*  added viper_menu_bind() to aide in reparenting and reshaping
   a standard menu.
*  changed default behavior of msgbox windows and added some
   much needed bugfixes.

Version 1.2.2

*  fixed a bug in viper_form_driver() which cause the cursor to be
   rendered at a incorrect location.
*  fixed a bug in viper_event_del() which caused a segfault.
*  simplified Makefile cflags to _GNU_SOURCE


Version 1.2.1

*  fixed a minor build warning for file dialog source file.

Version 1.2.0

*  added support for a file dialog box
*  added functions to colorize and normalize forms
*  added cursor support to forms
*  fixed a small bug in the viper_forms_destroy() helper
*  added a subwin_move_realign() to help move a nested subwin.  this is
   currently _not_ supported in any curses implementation nor is it
   likely to ever be.
*  bug fix for window_fill() which unfortuately triggered an API change.
*  added API function viper_form_driver() to support forms cursor support.

Version 1.1.1

*  fixed a small, but critical bug which caused viper_menu_destroy() to
   leak memory and crash applications (namely VWM).

Version 1.1

*  moved the support for hotkeys out of libviper and in to VWM (because it
   made more sense :)

*  made GPM functionality optional.  compling libviper with support for GPM
   is now controlled by the definition _VIPER_MOUSE_GPM.  by default, the
   make script enables this flag.  manually edit Makefile to change.

Version 1.0

*  initial release.
