Notes for Hackers
     See HACKING.md for architecture details (SCREENCELL buffer model,
double-buffer rendering, popup save/restore, X11 extbyte system).
     The codebase uses C89/K&R style compiled with -std=gnu17.  POSIX
functions (poll, openpty, sigaction) are used for all new code.  All DOS
and djgpp support was removed in the Payne era.  German documentation
from the Kruse era is preserved in the archive repository at
https://codeberg.org/mendezr/xwpe-archives


Known Bugs (Payne era, verified 2026-06-01)

Confirmed present:
* (none currently tracked)

Cannot reproduce:
* Changing the maximum column and using cut & paste can crash xwpe
     (no crash; fixed by the SCREENCELL migration in 1.6.0, now guarded
     by tests/test_maxcol_paste.py: Max Columns=8 + block-copy/paste/typing
     past the limit stays alive).

Bugs fixed in 1.6.x:
* Options > Editor: checkboxes and radio buttons could not be ticked in xwpe
  (X11) -- fixed (1.6.3).  Space, mouse-click and the Alt-<letter> hotkey all
  flipped the option's value, but in X11 nothing was drawn, so the box looked
  unchanged ("I can't mark it").  Root cause: with NEWSTYLE the dialog redrew
  the marks via e_make_xrect_abs -- a 3D bevel in the extbyte overlay whose
  checked vs unchecked states differ only by one highlight bit, visually
  imperceptible.  wpe (ncurses) was never affected because it took the text
  path.  Fix: draw the Borland-style 'X' / '*' glyph in every mode, matching
  the dialog's initial draw and the ncurses path; it renders clearly under
  Xft.  Diagnosed with a real xwpe under Xvfb+matchbox driven by xdotool
  (instrumentation showed the value flipped but the redraw branch drew the
  bevel, not the glyph).  Regression test: tests/x11/test_editor_options.py.
* Options > Editor: the "WordStar block" checkbox was one column wider than
  its siblings, so the Display-column boxes did not line up -- fixed (1.6.3)
  by padding the "Show Endmark" and "Old Style" labels to equal width.
* Block marking: the "WordStar block" option had no effect from the keyboard
  -- fixed (1.6.3).  The keyboard Begin-Mark (^K B) set mark_begin inline in
  e_ctrl_k, bypassing e_blck_begin where the ED_BLOCK_WORDSTAR mode logic
  lives, so both modes behaved identically (only the Block menu honoured the
  flag).  ^K B now routes through e_blck_begin: modern (default) resets begin
  AND end so re-marking leaves no stale block; WordStar keeps the end marker
  (independent begin/end).  Test: tests/x11/test_block_marking.py.
* New headless X11 GUI test suite (tests/x11/): drives a real xwpe under
  Xvfb + matchbox-window-manager via xdotool and asserts on screenshots
  (Pillow).  Covers the Xft rendering and X11 key/mouse path that the pyte
  (VT100) suite cannot reach.  Run with `tests/run-tests.sh --x11`; it skips
  cleanly when the X tools are absent.  A window manager is required because
  xwpe relies on one to own its window geometry (it never calls
  XResizeWindow); under bare Xvfb the X11 size handling otherwise oscillates.
* Debugging leaks memory (documented "location unknown" since 2000) -- fixed
  (1.6.3).  e_close_view() freed the window backing buffer only for sw < 2,
  so the default repaint path (sw == 2) leaked a full-screen SCREENCELL
  buffer (~19 KB) on every window-tree repaint; a debugger step repaints
  repeatedly, hence the symptom.  Now the PIC is always freed (it is always
  allocated by e_open_view); e_firstl passes the existing view so it is
  closed before the new one opens.  Found with valgrind driven through gdb
  sessions by a headless pyte VT100 harness; ~940 KB/2-sessions -> 3 bytes.
  Provenance (git archaeology in the ancestry repo): the "if (sw < 2)" guard
  is byte-for-byte identical back to Fred Kruse's 1.4.2 -- the leak is
  original to the 1990s code.  Payne only documented it ("location unknown",
  2000); the SCREENCELL migration (1.6.0) carried the same guard forward.
* Double-free regression from the leak fix -- fixed (1.6.3).  Because the
  leak fix made the repaint close each window's view, three places that
  bulk-released the views and then repainted the tree -- e_switch_window
  (Alt-<n>/F6 switch, and the F9 project path), e_ed_cascade (Window >
  Cascade) and e_ed_tile (Window > Tile) -- freed each 19 KB SCREENCELL
  block without clearing cn->f[i]->pic, so the repaint double-freed it and
  aborted with "free(): invalid pointer".  All three now route through a
  single e_free_view() helper that always NULLs the pointer, making that
  class of double-free impossible by construction.
  Test: tests/test_window_views.py.
* SIGSEGV in the X11 desktop repaint -- fixed (1.6.3).  A fourth instance
  of the same free-without-NULL bug lived in e_x_repaint_desk (we_xterm.c):
  it freed every window's view in a loop without clearing cn->f[i]->pic,
  then repainted (e_ed_kst -> e_change_pic -> e_close_view), which read the
  freed-and-reused PIC -- a use-after-free that crashed xwpe during normal
  X11 use (e.g. on a window-configure repaint).  Found from a user core
  dump (coredumpctl -> gdb: e_close_view at we_wind.c:468 with a garbage
  PIC).  Now routed through e_free_view() like the other three sites.
* Memory leaks at window close -- fixed (1.6.3).  e_close_window freed the
  window's SCHIRM but not two arrays hanging off it: s->brp (the per-screen
  breakpoint-line list, grown by the debugger) and c_sw (the per-line syntax-
  continuation state).  Both were "definitely lost" at exit, one per window.
  Found by running a full gdb trace session under valgrind, driven headless
  through a pty with a clean Alt-X exit; both are now freed in the window
  teardown, and the session reports 0 bytes definitely/indirectly lost,
  0 errors.
* X11 scrollbar bled through overlapping windows -- fixed (1.6.3).  With
  three windows stacked so one is covered by two others at once, the
  covered window's vertical/horizontal scrollbar reappeared in the
  triple-overlap band.  The fluid scrollbar chrome (we_render_cairo.c)
  clipped each window to "its rect minus the covers" with a Cairo
  even-odd path, which is XOR, not set-difference: a point under two
  higher windows lies in three rectangles -> odd -> kept.  Now subtracts
  the covers with cairo_region_t (true set algebra) via
  e_chrome_visible_region().  Also re-indexed the chrome by window
  z-level (f[w], active = f[mxedt]) to match the cell compositor, so a
  mouse click that raises a covered window no longer leaves the chrome
  drawing the wrong window's scrollbars.  Regression test:
  tests/x11/test_window_zoom_redraw.py.
* X11 no longer exits when the legacy "8x13" core font is missing -- fixed
  (1.6.3).  With Xft built in, the "8x13" bitmap font (Debian: xfonts-base)
  is only used to seed the initial point size; Xft then overrides the metrics
  and does all the drawing.  But xwpe still called exit(-1) if 8x13 (or any
  core font) could not be opened, so it would not start on a minimal X server
  with no core fonts installed.  The core font is now optional under Xft: the
  baseline offset comes from WpeXInfo.font_descent (the Xft descent when there
  is no core font), and the renderer guards the now-optional core XFontStruct.
  exit(-1) remains only in the no-Xft build, where the core font is the
  renderer.
* Heap-buffer-overflow in block Move (Ctrl-K V) -- fixed (1.6.3).  The
  multi-line block-move path (e_move_block, we_block.c) reshuffles line
  buffers by raw struct aliasing and could leave the destination line's
  length field smaller than its real content and the buffer without a NUL
  within bounds.  e_ins_nchar then trusted the stale length, its capacity
  check was fooled, and e_str_len() ran strlen one byte past the
  e_new_line()-allocated line buffer.  Fixed defensively at the insertion
  primitive: e_ins_nchar now pins a terminator at the b->mx.x capacity
  limit and recomputes the length on entry, so no caller can drive a line
  buffer overflow.  Found with the AddressSanitizer build during the soak
  test (heap-buffer-overflow READ in e_ins_nchar at we_edit.c).
  Provenance (git archaeology): the e_move_block aliasing and the
  unnormalised e_ins_nchar entry are byte-for-byte identical back to Fred
  Kruse's 1.4.2 and unchanged through Payne 1.5.30a -- a ~30-year latent
  memory-corruption bug in the original text-buffer code, not a regression
  from our refactors (the SCREENCELL migration touched the screen buffer,
  not these char line buffers).  It was silent undefined behaviour until
  AddressSanitizer made it deterministic.  Two further sites of the same
  class were then fixed: e_move_block's own e_str_len() on the split tail
  (triggered by block Move after an Undo), the identical -- and still
  unbounded -- line split in e_copy_block (block Copy), and e_copy_block's
  per-line deep-copy loop (which wrote 1-2 bytes past a full, soft-wrapped
  block line).  The block engine was then refactored to remove the
  duplication behind all of these: the line-table grow, the gap-opening
  shift, the line split, the single-line span extraction, and the per-line
  deep-copy are now five named, documented helpers (e_blk_grow_lines,
  e_blk_open_gap, e_blk_split_line, e_blk_dup_chars, e_blk_dup_line) shared
  by e_move_block and e_copy_block, so each memory-safe primitive exists in
  exactly one place and cannot drift between the two paths again.  Both
  functions now read as prose.  Guarded by tests/test_block.py and
  tests/test_block_asan.py (block Copy/Move/Undo under AddressSanitizer).
* Documentation hasn't been updated -- 12-chapter Texinfo manual (1.6.2).
* Compilers are assumed to have a -c and -o -- GNU/Other distinction (1.6.2).
* Cursor keys don't work in xterms or telnet sessions -- fixed (1.6.0).
* Certain file names like 'Messages' aren't handled -- fixed (1.6.3).
* 'make install' installs x versions even if not compiled in -- fixed (1.6.3).
* --without-x build failed (unguarded X11 symbols) -- fixed (1.6.3).
* No error for disk full (silent failure on save) -- fixed (1.6.3).
* Open Project with nonexistent .prj opened blank editor -- fixed (1.6.3).
* Add Item with no project open silently did nothing -- fixed (1.6.3).
* Shift-Tab not detected in terminal emulators -- fixed (1.6.3).
* Esc key required several presses -- fixed (1.6.3), a 20+ year bug.
  e_t_getch issued a blocking second read after Esc to detect Alt-<key>
  combos; it is now time-limited (ESC_ALT_DELAY_MS, 25 ms) so a lone Esc
  registers on the first press while Alt-<key> still works.  Verified on
  both terminal emulators and the Linux text console (outside X).
  Test: tests/test_esc_key.py.
* Dialog colors illegible on modern terminals -- fixed (1.6.3).
* Check headers ignores // comments, #if 0 blocks -- fixed (1.6.3).
  Parser rewritten with named functions: e_chk_skip_whitespace_and_comments,
  e_chk_track_conditional, e_chk_extract_include, e_chk_next_directive.
  Unit test: tests/test_checkheader.c (10 cases, make check).
* Compiler/linker output went to editor buffer instead of Messages
  -- fixed (1.6.3).  e_p_exec now routes output to Messages via
  e_find_or_create_messages.
* Cursor jumped to Messages when nothing needed recompiling
  -- fixed (1.6.3).  e_new_message moved inside compilation-needed block.
* gdb assumes program starts in "main" -- fixed (1.6.3).
  Configurable start_symbol field (default "main") in Compiler-Options
  dialog (Alt-Y).  All debugger backends (gdb, sdb, dbx, jdb) use
  e_get_start_symbol().  Ctrl-G R now sets breakpoint before running.
* X11 debugger xterm eliminated -- fixed (1.6.3).
  openpty() replaces xterm for program I/O in X11 mode (same as
  terminal mode).  No focus stealing, no external window.  Program
  output appears in Messages via pty drain after each debug step.
* Radio buttons and checkboxes invisible in X11 dialogs -- fixed (1.6.3).
  NEWSTYLE code replaced ( ) and [ ] with spaces.  Initial selection
  marker (*) was not drawn on dialog open.
* gdb "Can't find file" error when stepping into libc -- fixed (1.6.3).
  Auto-skip system frames via tbreak main + continue.
* gdb error popups after program exit -- fixed (1.6.3).
  e_read_output detects "exited" and quits debugger cleanly.
* Leaked file descriptor on named pipe (30-year Kruse bug) -- fixed.


Changes

1.6.3 (event-driven debugger, dead key compose, Perl/COBOL)

  Event-driven I/O (X11 and terminal debugger):
* Interactive program input during debugging.  When the debugged
  program blocks on fgets/scanf, the user types in the IDE and
  characters appear in Messages.  Backspace works (pty VERASE).
  Architecture: wpe_fd_poll multiplexes display fd + gdb pipe + pty
  master (same pattern as st, cgdb, foot terminals).  Works in both
  X11 (xwpe) and terminal (wpe) modes.  Terminal mode uses
  e_t_getch_poll with timeout(50) for ncurses escape sequence
  compatibility.  UTF-8 input via e_t_utf8_assemble (multi-byte
  codepoint decoding from ncurses getch).
* Incremental gdb response parser (e_d_accum_t) processes one line
  per callback instead of looping synchronously in e_read_output.
  The UI never freezes during debug stepping.
* Program output appears in Messages via e_d_pty_read_to_messages
  (char-by-char buffer append, no line-flush artifacts).
* Ctrl-G P (Program Output) accumulates during interactive sessions.
* Ctrl-G P (Program output) is now uniform across backends: the program's
  output is captured into the Messages window in both the terminal and X11
  builds, so Ctrl-G P raises and focuses that integrated panel and scrolls
  to the latest output (e_p_show_program_output) -- the way a modern IDE
  focuses its output panel.  No modal popup (X11) and no full-screen switch
  (terminal); the same key does the same thing everywhere.  The classic
  full-screen "user screen" (for programs that paint with cursor
  positioning / ANSI colour) is preserved as e_t_user_screen(), not yet
  bound to a key -- a faithful version (an integrated VT terminal shared by
  both backends, the Borland Alt-F5 "User Screen") is planned for 1.6.4.
  The Messages cursor is placed at the end of the last output line (the
  stream write position), like a tailing terminal, not at column 0.
* printf without \n now visible after each step: e_d_flush_inferior_stdout
  sends "call (void)fflush(0)" to gdb (same technique as Eclipse CDT).

  Dead key compose and UTF-8 input:
* X11 dead key composition for accented characters: acute, grave,
  diaeresis, tilde, circumflex, cedilla.  Works in the editor, the
  debug console, and all dialog text fields.  Fallback compose table
  (same approach as xterm/GTK) when XIM does not compose natively.
* UTF-8 in dialog text fields: e_schr_nchar decodes multi-byte
  sequences for rendering.  Cursor movement, backspace, and delete
  are codepoint-aware (e_utf8_prev, e_utf8_next, e_utf8_charlen).
* UTF-8 multi-byte insertion in editor (e_codepoint_to_utf8).
* UTF-8 encoding for debug console pty input (e_d_pty_write_utf8).
* XIM robustness: NULL XIM guard, Status parameter, XNFocusWindow.

  Dialog usability:
* Tab/Shift-Tab navigation through all dialog fields, including
  Ok/Cancel buttons.  Wraps around at the end.  Works in xterm, SSH,
  tmux, gnome-terminal -- everywhere, not just the Linux console.
* Radio buttons now show ( ) instead of [ ] to distinguish from
  checkboxes.  Selected radio shows (*).
* Fixed illegible colors for focused elements and shortcut letters
  on modern terminals.  Default palette updated from 1993 CGA/VGA
  assumptions to readable contrast on 256-color terminals.
* Dialog focus indicator: magenta background for focused fields,
  switches, and radio buttons.  Red background for focused Ok/Cancel
  buttons.  Passive buttons use cyan.  No element shares a color
  with the dialog background.
* Syntax highlighting: string constants changed from bright yellow
  to bright magenta (color 14 renders greenish on many terminals).
* Status bar hitbox: clicking empty space to the right of "Alt-X
  Quit" no longer triggers quit.

  Compiler integration:
* Perl: syntax highlighting (46 keywords), F9 (perl -c), Ctrl-F9 run.
* COBOL: syntax highlighting (50 keywords), F9 (cobc), GNU style.
* 9 compilers supported: gcc, g++, gfortran, fpc, javac, python3,
  pdflatex, perl, cobc.
* Error navigation (Alt-T/Alt-V) is now cursor-relative with
  wrap-around: jumps to the next error below the cursor, wraps to
  the first error when past the last.

  Mouse and window management:
* ncurses mouse drag: window move and resize by dragging title bar
  and borders.  xterm mouse mode 1002 (\033[?1002h) enables motion
  tracking while button held -- same protocol as Midnight Commander
  and tmux.
* g_mouse_buttons: global bitmask tracks physical button state across
  the entire event loop, replacing the shared e_mouse.k field that
  desynchronised when popups consumed PRESSED/RELEASED pairs.
* e_mouse_flush(): drains stale ncurses mouse events, re-enables
  mode 1002, and resets g_mouse_buttons after popup or menu close.
  Prevents drag hang after F9 compilation or any dialog.
* Proportional window relayout on terminal resize (SIGWINCH):
  e_relayout_windows() scales all editor windows using edge-attachment
  detection -- windows touching screen edges stay attached, interior
  coordinates scale proportionally with round-to-nearest to prevent
  ratio drift across incremental resize steps.
* Dialog resize safety: SCHIRM_INBOUNDS macro bounds-checks all
  schirm[] access.  Dialogs that exceed terminal size are clipped
  cleanly.  On terminal grow, dialogs restart centered.
* Fix SIGSEGV on terminal resize during dialog: block SIGWINCH with
  sigprocmask during e_t_refresh, clamp iteration to ncurses stdscr
  dimensions to prevent race with concurrent SIGWINCH.
* Fix F9 hang after dialog resize: e_free_all_pics() invalidates
  stale FENSTER PICs before e_repaint_desk creates fresh ones with
  correct post-resize coordinates.
* Dialog clipping: when the terminal is smaller than the dialog, the
  interactive loop is bypassed (only Esc and resize accepted).
  e_opt_element_visible() checks both axes before drawing each
  element.  Prevents floating character artifacts from dialog content
  drawn outside the PIC save area.
* Messages window auto-positioning: 2/3 + 1/3 vertical split when
  Messages is created by F9.  e_position_messages_window() places
  Messages to fill available space below editor windows.
* Modernised window-control keys.  Close window is now Ctrl-W -- the
  universal browser/VSCode/IntelliJ "close tab" -- decodable in both the
  terminal and X11.  The historic Alt-F3 was dropped: the window manager
  (X11) and the kernel VT layer (console) intercept it, so it never reached
  xwpe and users had no working close-window shortcut.  Show Buffer moved to
  Alt-Y (emacs M-y, "browse the paste buffer").  Status bar, the Window >
  Close item and the Edit menu were relabelled to match.  Tests:
  tests/test_close_buffer_keys.py.
* Title-bar close box [X] works again in wpe and xwpe.  It handed back Alt-F3
  in the default key style, which became a no-op once Alt-F3 was dropped; it
  now returns Ctrl-W and is hit-tested at the glyph it actually paints (e.x-2,
  top-right).  Document/editor windows keep their zoom box.  Tests:
  tests/test_window_close_button.py.
* File-Manager dialogs (Open / Save As / search) are close-only, like a
  Borland TDialog: the maximize box is gone (meaningless for a fixed-size
  picker) and the close [X] now dismisses the dialog.  The picker had drawn a
  zoom box and hit-tested the close at the historic top-left cell while the
  glyph is painted top-right, so clicking the visible X only started a window
  move.  New e_draw_dialog_close_button paints just the close glyph; the click
  routes through e_hit_close_button.  Tests: tests/test_file_manager_close.py
  and tests/x11/test_file_manager_close.py.

  Ctrl-F9 Run:
* Interactive program execution via pty in Messages window.  User
  types input during fgets/scanf, output appears in real time.
  Ctrl-C sends SIGINT.  UTF-8 input and output with proper
  backspace handling.  No xterm dependency, no screen switching.
  Falls back to popen for systems without openpty.

  Bug fixes:
* Fix emoji rendering in ncurses: removed artificial U+FFFF limit
  in e_t_refresh.  Emoji codepoints (U+1F389 etc.) now display
  correctly in terminals that support them (kitty, gnome-terminal).
* Fix mouse in kitty: SGR mode 1006 only enabled when terminal is
  wider than 223 columns (X10 encoding overflow).  kitty's terminfo
  lacks XM capability so ncurses cannot parse SGR mouse events;
  X10 format works correctly for normal terminal widths.
* CVE-2016-20037: the original CVE is bogus (confirmed by Debian
  Security Tracker -- no vulnerable code path exists in argv handling).
  As defense-in-depth, all sprintf calls that receive user-supplied
  filenames (f->datnam) are converted to snprintf with sizeof bounds
  in we_wind.c, we_debug.c, we_fl_unix.c, and we_prog.c.
* Fix global buffer overflow on a long library name: LIBNAME= from the
  .prj, the LiBrary dialog field, and project member names were copied
  into the fixed library[80] with strcpy; now snprintf-bounded
  (we_prog.c).  Defense-in-depth beyond CVE-2016-20037.
* Fix silent data loss on disk full: e_write now checks ferror/fclose.
* Fix link/run using Messages window instead of source file.
* Fix Open Project with nonexistent .prj opening a blank editor.
* Fix Add Item with no project open silently doing nothing.
* Fix --without-x build: guard X11 symbols, conditional symlinks.
* Fix syntax_def keyword counts (Perl 46, COBOL 50).
* Add 9 syntax-highlighting definitions from Payne's extrasyntax
  collection (shell, HTML, Makefile, SQL and more).  Verifier test:
  tests/test_syntax_def.c.
* Fix intermittent X11 crash/black-hang: call XInitThreads() before the
  first Xlib call.  Cairo/Pango/fontconfig spawn helper threads, so Xlib
  must be told it is in a threaded program or _XEventsQueued races during a
  refresh (segfault inside XRenderFillRectangle).
* Fix double-free (SIGABRT "free(): invalid pointer") when reopening Show
  Buffer after the clipboard window had been closed.  The persistent
  clipboard window's view (pic) was freed on close but left dangling;
  e_show_clipboard now NULLs it before e_firstl re-opens the window, matching
  e_firstl's contract that a fresh window has pic == NULL.  Latent since the
  Kruse 1.4.2 era (1993); only surfaced once the 1.6.2 SCREENCELL migration
  made the repaint path always free the pic.

  Project management (Borland audit):
* New Project and Open Project are now separate menu entries.  New
  Project (Alt-P N) creates a skeleton .prj; Open Project (Alt-P P)
  strictly opens an existing one -- a missing name reports "Project
  file not found" instead of silently creating a blank project.
* The project file list is written to disk on every Add and Delete,
  not only on window close, so an interrupted session no longer loses
  members.
* Delete now removes the last (and the single remaining) project member.
  The old guard in e_p_del_df (nf > anz-2) silently refused to delete the
  highlighted entry whenever it was the last one, so a project could never
  be emptied.
* A new .prj is pre-filled (EXENAME from the project name, compiler
  defaults); the project window's exit button saves on close.
* Project, Options, Message and File-Manager window titles and borders
  were invisible (white-on-white frame colour) and are now legible.
* Window->Project with no project open reports "No project open"
  instead of opening an empty window.
* The project window's status bar packs its buttons compactly and keeps
  the "Project: <name>" indicator without overwriting the Quit button.
* Window drag and resize stopped working after an F9 compile (mouse
  motion tracking was left disabled when returning from the
  sub-process) -- fixed: e_t_rearm_mouse re-arms it after the screen is
  restored.  Regression tests in tests/test_mouse_tracking.py and
  tests/test_project_windows.py.

  Maintainability (1993 codebase cleanup):
* Duplicated project-window lookups and the project-open guard replaced
  by named helpers (e_find_project_window, e_find_dirty_project_window,
  e_project_is_open), status-bar layout by e_pack_button_bar, and the
  File-Manager hint colour boilerplate by e_fm_key_hint.  Window-picker
  modes use named constants (FM_PRJ_*).  Public helpers documented in
  Doxygen/kernel-doc style.

  X11 mode:
* Unicode box-drawing glyphs for window borders (U+250x) and
  scrollbar (U+2591 light shade, U+2588 full block) when Xft active.
* Fix covered-window scrollbar bleed-through.  Zooming a window over another
  (Window -> Zoom / Alt-Z), or dragging one over another, left the COVERED
  window's scrollbar bleeding through as a dark bar across the middle of the
  window on top.  X11 only -- the ncurses build composites a single cell grid
  (last-writer-wins) and never had it.  Cause: the modern fluid scrollbars are
  painted directly to the Cairo surface by wpe_render_chrome(), once per window
  every frame, after the cell render and with no z-order clipping, so a covered
  window's scrollbar drew on top of the window covering it (invisible to the
  SCREENCELL/extbyte diff renderer).  Fix: clip each window's scrollbars to its
  visible region -- its rectangle minus the windows stacked above it -- with a
  Cairo even-odd fill-rule clip, the same z-order contract ncurses panels
  (update_panels, bottom-to-top, topmost-wins) and Turbo Vision (clip every
  write to the exposed region) use.  Test: tests/x11/test_window_zoom_redraw.py.

  Terminal / console mode:
* Borland "User Screen" (Alt-F5) restored on the console.  After Ctrl-F9 Run
  (or a debug session) a program that PAINTS -- cursor positioning, ANSI
  colour, a TUI, a progress bar -- cannot be shown in the line-oriented
  Messages window.  Alt-F5 (and Window -> User Screen) now leaves the editor
  and shows the program's own full screen: e_t_user_screen replays the
  captured output VERBATIM (no headers, no \n rewriting), so it renders
  exactly as the program left it.  The Ctrl-F9 run path now accumulates the
  raw byte stream into the same buffer the debugger uses (e_d_prog_output),
  so the User Screen is populated however the program was launched.  Press
  any key to return to the editor.  Console (wpe) only for now; the xwpe
  (X11) integrated terminal panel is the 1.6.4 path.  Demo: tests/samples/
  paint.c (F9, Ctrl-F9, Alt-F5).
* Console mouse (GPM) restored in wpe.  On a bare Linux VT the mouse pointer
  stopped moving and clicks stopped registering: wpe opens the GPM connection
  itself (so ncurses does not), but the event-driven input rewrite left GPM's
  fd out of the poll set, so nothing ever drained it -- WpeGpmHandler never
  ran, so GPM_DRAWPOINTER never drew the pointer and e_mouse was never filled.
  The fix registers gpm_fd in the wpe_fd_poll multiplexer (the same one the
  debugger uses): WpeGpmReadable drains each event, draws the pointer and fills
  e_mouse, and a button event makes the input loop return a mouse keycode.
  Terminal emulators are unaffected (no GPM there, so the fd is not registered;
  ncurses' xterm-sequence mouse path is unchanged).
* A 3-byte buffer overread in the signal handler that disables xterm mouse
  modes (WpeSignalUnknown) -- the write length counted 27 for a 24-byte
  string -- fixed (flagged by -Wstringop-overread).
* Scrollbar glyphs fixed on the Linux console.  The ncurses sp_chr[] table
  drew the track with ACS_S9 (a thin scan line) and the thumb with
  ACS_DIAMOND; the `linux` terminfo does not map those to good glyphs, so on
  a real VT the track fell back to a column of 's'/'_' and the thumb to a
  poor diamond -- the worst-looking part of the console UI.  Now the track
  uses ACS_CKBOARD (the CP437 shaded board, 0xB1) and the thumb ACS_BLOCK
  (solid block, 0xDB); both are in the linux acsc and in every VGA/console
  font, so the scrollbar reads as a shaded gutter with a solid slider,
  matching the X11/Xft look -- with no special console font.  (Terminal
  emulators, which have a full acsc, also get the nicer shaded/solid look.)

  User interface (Borland fidelity):
* Message and dialog popups (e.g. "String not found", the Options dialogs)
  no longer carry a maximize/zoom box.  Borland's TDialog message boxes
  never had one -- a popup is fixed-size, so the control was inert and
  non-authentic.  Popups keep a single close box, modernized to the
  top-right corner, and clicking it now dismisses the popup, the same as
  pressing Esc (e_opt_mouse / e_error).  Document (editor) windows are
  unaffected and keep their zoom box.

  Testing:
* Per-menu regression suites for every menu-bar section (System, File,
  Edit, Search, Block, Options, Window, Project, Run, Debug) in BOTH
  front-ends -- pyte/VT100 for wpe and the headless Xft suite for xwpe --
  because shared code can behave differently in each (the WordStar block
  fix above was found exactly this way).  Added coverage for the contextual
  bottom hint bar (it swaps its function-key set with the focused window),
  Toggle Breakpoint, and the popup close box.  The X11 suite runs by
  default in tests/run-tests.sh and skips cleanly without an X stack.
* Double coverage: every menu item is now exercised BOTH through the menu and
  through its advertised KEYBOARD SHORTCUT, in both front-ends.  The shortcut
  path is a separate decode (e_prog_switch / e_tst_dfkt for the terminal,
  we_xterm.c for X11) and is where mapping bugs hide -- an item can work from
  the menu while its accelerator is dead.  Covers Cut/Copy/Paste/Undo/Redo,
  Show Buffer (Alt-Y), Save (F2), Find (F4), Search again (^L), Go to Line
  (Alt-G), Run (Ctrl-F9 and Alt-U), Make (F9), Toggle Breakpoint (^G B), Zoom
  (Alt-Z), Next (Alt-N), List All (Alt-0) and the close box.
* Window chrome regression tests: tests/x11/test_window_zoom_redraw.py asserts a
  covered window's scrollbar does not bleed through the window stacked over it
  (the X11 z-order chrome-clip fix above).  Four scenarios: a full zoom-cover, a
  diagonal cascade, a click-to-raise that re-orders the stack (guards indexing
  the chrome by z-level, not window number), and a 3-window double-cover built
  via Size/Move that guards the cairo_region_t set-difference clip -- the case
  an even-odd path got wrong, where window 1's scrollbar reappeared in the band
  it shares with two windows above it.
* Block menu WordStar chords double-covered (tests/test_block.py +
  tests/x11/test_block_marking.py): every Block op is driven through both the
  Alt-B menu and its ^K chord (^K X/^K Y/^K I/^K U), the separate decode where
  the ^K B mode bug hid.
* Mouse interaction tests (tests/x11/test_mouse_scroll.py,
  test_mouse_menu.py): the mouse wheel (WPE_SCROLL_UP/DOWN), the fluid
  scrollbar-thumb drag (vertical and horizontal, e_scroll_drag_v/h driven via
  real X11 button/motion events), and menu-bar access by click (open a menu,
  invoke an item).  New conftest drag()/wheel() helpers.
* Console input regression-tested: Ctrl-F9 Run, the Esc meta-prefix
  (Esc-<letter> = Alt-<letter>) and the Alt-F5 User Screen
  (tests/test_user_screen.py, test_menu_run.py).
* Headless X11 harness: function keys are now injected by keycode, working
  around an xdotool keysym-resolver bug (issue #491) that delivered Alt-Fn
  instead of bare Fn; this unblocked the F2/F3/F4/F9 shortcut tests.

  Build and portability:
* The --without-x build compiles and links again.  The fluid-scrollbar-drag
  feature had placed Xlib-using helpers (e_scroll_drag_v/h) and Cairo chrome
  hit-tests (wpe_chrome_hit_vthumb/hthumb) in the shared mouse code without
  NO_XWINDOWS guards.  Now the X11-only helpers are guarded and the header
  provides no-op stubs for the hit-tests under NO_XWINDOWS.
* Removed the ad-hoc /tmp debug probes left across the source during
  bug-fixing (the gated jdb_trace facility and the crash handler are kept).

  Documentation:
* Help -> Info now opens xwpe's OWN manual (the installed xwpe.info), not the
  system-wide Info directory listing every package: e_read_xwpe_info loads its
  Top node and keeps in-manual navigation inside it, falling back to the system
  directory only when xwpe.info is not installed.
* Texinfo manual updated for 9 compilers, pdb debugger, Messages
  buffer, cursor-relative error navigation.
* New tutorial examples in docs/examples (shipped via EXTRA_DIST) and
  documented in the manual: headers_test.c (automatic header-dependency
  recompilation, ignoring // and #if 0 includes), debug_constructor.c
  (debugger start symbol, breaking before main), interactive_test.c
  (interactive stdin in the Messages window).  Also added the previously
  undistributed debug_test.{java,py}, debug_test_long_output.py and
  compile_error_test.{py,tex} to EXTRA_DIST.
* CHANGELOG Known Bugs section reorganized: verified, fixed, or
  confirmed present with reproduction steps.

1.6.2 (Xft rendering, debugger resurrection, UTF-8 everywhere)

  SCREENCELL migration completion:
* Fixed display artefacts after closing menus, dialogs, and compile
  popups. calloc'd SCREENCELL buffers + altschirm invalidation.
* Fixed SEGFAULT in e_t_refresh with negative SCREENCELL int values.

  Compiler integration:
* Error navigation (Alt-T/Alt-V) updated for modern GCC file:line:col:.
* print_to_end_of_buffer no longer drops output after blank lines.
* Updated defaults: gfortran, fpc, javac, python3, pdflatex.
* Cursor returns to source file after successful F9 compile.
* Compiling popup has visible borders (was white-on-white).

  Debugger:
* Fixed gdb unable to start (WpeSignalChild, spurious e_p_exec calls).
* Program output capture via pty + fflush(0) after each step.
* Restored Ctrl-G P (User Screen), broken since Payne era.
* jdb (Java Debugger) as 5th backend. Auto-selects for .java.
* pdb (Python Debugger) as 6th backend. Auto-selects for .py.
  Breakpoints, F8 stepping, auto-skip of internal <string> frames.
* Fixed 30-year-old pipe fd leak in e_exec_deb (caused busy loops).
* Fixed SIGPIPE crash on debugger exit.
* Ctrl-G P now appends program output to Messages buffer with scroll,
  replacing the old endwin/popup/xterm design. Works in both wpe and
  xwpe without context switching.

  Mouse:
* ncurses mouse for terminal emulators (xterm protocol).
* GPM migrated from direct Gpm_Open() to ncurses-managed GPM.

  Languages:
* Python: syntax highlighting (35 keywords), F9 (py_compile), pdb.
* LaTeX: syntax highlighting (31 keywords), F9 (pdflatex).
* Ctrl-F9 Run for interpreted languages: runs interpreter directly
  via popen, output captured to Messages (no xterm in X11 mode).

  X11 mode -- Cairo+Pango rendering (Wayland-ready):
* Cairo+Pango replaces Xft for all text rendering. The rendering
  pipeline (schirm model -> diff -> draw -> Pixmap -> window) is
  backend-agnostic: same Cairo calls work on X11 (cairo_xlib_surface)
  and Wayland (cairo_image_surface). WpeRenderBackend abstraction
  following Kruse's function pointer pattern.
* cairo_ft for ASCII (FreeType via Cairo, zero-alloc per glyph) during
  scrollbar drag. Pango for Unicode fallback (emoji, CJK). Prevents
  Pango heap corruption under sustained heavy load.
* System monospace font detection (gsettings org.gnome.desktop.interface
  monospace-font-name). Uses the same font as the user's terminal.
* Modern scrollbars: thin proportional track (4-5px), proportional
  thumb, triangular Cairo arrows. Both vertical and horizontal.
* Fluid scrollbar drag: MotionNotify events with XGrabPointer +
  XCheckTypedWindowEvent coalescing. Text scrolls in real time.
  Cursor visible at file position during drag, repositions to
  viewport center when scrolled off-screen (Emacs-style).
* Mouse wheel scroll (Button4/Button5): 3 lines per tick, same
  viewport-independent cursor behavior as drag.
* Title bar buttons: Unicode ◻ maximize and ✕ close, right-aligned,
  replacing the Motif-era [◆] close from the left side.
* Resize flicker prevention: _NET_WM_SYNC_REQUEST protocol,
  StaticGravity, BackgroundPixmap None, ConfigureNotify compression,
  Expose skip during pending resize.
* Window move flicker elimination: e_move_window_recompose() replaces
  the old e_close_view/e_open_view cycle that caused two flushes per
  drag step (one showing desktop without window, one showing window at
  new position). Full compositor-style recomposition: restore old
  background, save new background, draw borders + content, single
  flush_all. WpeRender.blit added for future Pixmap-to-Pixmap copy
  optimization at 4K resolutions.
* Single-flush architecture: fk_show_cursor no longer flushes per cell.
  All rendering (content + chrome + cursor) composes into the Pixmap,
  one XCopyArea per frame. Same pattern for Wayland (wl_surface.commit).
* Previous Xft rendering preserved as fallback (--without-cairo).
* Color emoji via Noto Color Emoji (libXft 2.3.5+ BGRA support).
  Font fallback uses fontconfig with FC_COLOR for emoji codepoints.
* Pixmap double-buffering: all rendering goes to an off-screen Pixmap,
  copied to window with XCopyArea.
* CELL_WIDE buffer model: SCREENCELL gains a flags field with
  CELL_WIDE and CELL_WIDE_SPACER. Wide characters (emoji, CJK) are
  rendered across 2 cells, cursor skips spacer cells, delete removes
  both cells, mouse click on spacer maps to the wide char. Same
  pattern used by st, vim, and alacritty.
* UTF-8 in syntax highlighting (e_pr_c_line): multi-byte characters
  are decoded and rendered correctly with CELL_WIDE flags.
* Fixed crash on startup (uninitialised y, 81MB writev to X server).
* Fixed ACS characters as squares (e_x_map_char).
* Fixed extbyte garbage (calloc for border arrays).
* Fixed Ctrl-G P crash (e_u_deb_out was NULL in X11 mode).
* Fixed popup/menu/File Manager border echoes: extbyte interior
  clearing in e_x_refresh prevents hidden windows' borders from
  bleeding through. Full repaint on window close and switch.
* Fixed e_x_system prepending "./" to interpreter commands.
* XSetInputFocus returns focus to xwpe after debug xterm opens.
* Window resize support via ConfigureNotify + Pixmap recreation.

  Other fixes:
* Fixed 33-year-old Redo crash (SIGSEGV) after search/replace undo.
* Fixed menu bar not redrawn after Ctrl-F9 Run.
* Fixed File Manager Tab cycling and panel scroll.
* Fixed System Info dialog overflow (e_pr_str_wrap, e_pr_text).
* Fixed e_show_error basename fallback for relative paths.
* Fixed gdb compiling "Messages" instead of source file.
* Integrated Texinfo manual into help system.
* 33 automated pyte tests.
  (Juan Manuel Mendez Rey)

1.6.1 (Modern autotools build system)
* Replaced 1998 hand-written configure.in + Makefile.in + 1500-line custom
  aclocal.m4 (T.E.Dickey macros for SCO/HP-UX/AIX portability) with
  standard configure.ac + Makefile.am (automake).
* ncursesw detection via PKG_CHECK_MODULES instead of fragile AC_CHECK_LIB
  cascade. All required flags (-std=gnu17, -DNCURSES, -DNCURSES_WIDECHAR,
  -D_XOPEN_SOURCE_EXTENDED) are set automatically by configure.
* Optional X11 (--without-x) and GPM (--without-gpm) configure flags.
* AC_CONFIG_HEADERS generates config.h, force-included via -include so no
  source files need modification.
* Compatible with dh_autoreconf (autoconf 2.69+), eliminating the need to
  skip autoreconf in Debian builds.
* Dropped legacy portability defines: NOSTRSTR, NOTPARM, DEFTPUTS, DEFPGC,
  RANDLIB, CC_HAS_PROTOS, NOSYMLINKS, TERMCAP, XDB.
  (Juan Manuel Mendez Rey)

1.6.0 (Gold Standard: UTF-8, terminal resize, modern keyboard)
* SCREENCELL buffer model: replaced the 1993 byte-based screen buffer
  (1 byte = 1 cell) with a structured SCREENCELL type (int ch + int attr
  per cell). Each cell now holds one complete character, including wide
  characters (accented Latin, Cyrillic, CJK, emoji). Multi-byte UTF-8 is
  decoded via mbrtowc() in the display loop and stored as a single value.
  This is the first change to the screen buffer model since Fred Kruse's
  original 1993 design, building on Dennis Payne's 12 years of
  continuation work (X11 support, GPM mouse, autoconf, and numerous
  bug fixes through 2006).
* Terminal refresh rewritten: e_t_refresh() uses add_wch() for wide
  characters and wcwidth() for characters that occupy 2 visual columns
  (emoji, CJK). Borders and scrollbar use fixed screen positions via
  move(j, i), ensuring correct alignment regardless of UTF-8 content.
* Terminal resize support: handle ncurses KEY_RESIZE to detect terminal
  size changes. Reallocate screen buffers, expand windows to fill new
  size, and repaint. Works in tiling window managers, tmux, and any
  terminal that supports resize.
* Keyboard mapping fixed for modern PC keyboards: PageUp, PageDown,
  Home, End, Insert, Delete now map correctly. The original mapping was
  designed for VT100/Sun terminals from the 1990s.
* Link against libncursesw (wide character ncurses) instead of libncurses.
  Build with -I/usr/include/ncursesw, -D_XOPEN_SOURCE_EXTENDED,
  -DNCURSES_WIDECHAR=1.
* Scrollbar aesthetic: track uses ACS_S9 (scan line) and thumb uses
  ACS_DIAMOND instead of ASCII '+' and '0'.
* GPM mouse: check for /dev/gpmctl before calling Gpm_Open() to avoid
  "gpm: not found" error when gpm daemon is not installed.
* Full screen refresh via e_abs_refr() in e_schirm() prevents stale
  content when switching between windows.
* Test suite: 20 automated tests using pyte (VT100 terminal emulator)
  and pytest. Tests cover border alignment, UTF-8 display, emoji/wide
  chars, scrollbar during scroll, resize, and keyboard mapping.
  (Juan Manuel Mendez Rey)
* Compatibility note: xwpe 1.6.0 requires libncursesw (wide character
  ncurses) instead of libncurses. On Debian/Ubuntu: libncursesw5-dev.
  All major Linux distributions have shipped libncursesw as standard
  since at least 2010. Terminals without UTF-8 support still work for
  ASCII content; characters above 127 display as '?' instead of the
  previous '@' escaping.

1.5.31 (Mendez-era rescue release)
* Project resumed under new upstream maintainer Juan Manuel Mendez Rey
  <juan.mendezr@proton.me>, with the explicit blessing of Dennis Payne.
  Project home moved from identicalsoftware.com to
  https://codeberg.org/mendezr/xwpe
* Fix link error: rename WpeGpmInit prototype in edit.h to the actual
  function name WpeGpmMouseInit. (Guus Bonnema, via github.com/amagnasco)
* Fix segfault on startup when MALLOC fails before the screen subsystem
  is initialised. (Guus Bonnema, via github.com/amagnasco)
* xwpe.1_eng: escape hyphens (-r, -1, ...) so groff renders them as
  ASCII hyphens; correct .TH section field from "alpha" to "1".
  (Jari Aalto, from Debian NMU)
* we_debug: disable conflicting K&R prototype for tparm() that broke
  compilation against modern <term.h>. (Francesco P. Lovergine, Debian)
* we_wind: parenthesise strcpy() to defeat unsafe glibc macro expansion
  in e_schr_lst_wsv(). (Jari Aalto, from Debian NMU)
* we_fl_unix, we_prog: fix -Werror=format-security in printf calls that
  passed e_msg[ERR_HITCR] directly as the format argument.
  (Francesco P. Lovergine, Debian)
* we_debug, we_prog: add missing prototype for print_to_end_of_buffer
  so the package compiles under -Werror=implicit-function-declaration
  (GCC 14+, hard error in GCC 15). (Francesco P. Lovergine, Debian,
  Closes: Debian #1066254)
* we_unix: restore termios and emit terminal reset on clean exit so the
  user's terminal is left usable after wpe quits. (Juan Manuel Mendez Rey)
* we_opt: clamp mouse-derived index in colour dialog to prevent OOB
  read on the FARBE colour array. (Juan Manuel Mendez Rey,
  Closes: Debian #228820, a 22-year-old upstream bug)
* This release also resolves Debian #1098180 (FTBFS with GCC 15) since
  the patch stack that triggered the FTBFS is now fully integrated.

After this release, the Debian package can ship with zero local patches.

1.5.30a
* Some additional comments
* Fedora core 4 compile fix

1.5.29a
* Fixed regression of XLookupString.

1.5.28a
* Corrected e_quit to properly quit the debugger.
* Corrected function help bug.
* Changed X11 colors to correspond to curses order.
* Disabled different pointers under X11 and add file manager menu item.
* Added Paulo C�sar Pereira de Andrade's partial i18n patch.

1.5.27a
* More modifications from Roman Levenstein.  Not enabled by default; use
     -DNCURSES.
* Fixed bzipped man pages.
* Added Arjan van Dijk's XLookupString bug fix.
* Fixed some syntax coloring problems.
* Use mkdtemp if available.
* Changed compiler message strings to use "\n" instead of putting in a
     return character directly.
* Added Harry Berman's minor memory bug fixes.

1.5.26a
* Spent more time fixing path limits.
* Fixed blank project executable bug.
* Fixed "../" bug introduced in 1.5.25a.
* Autosaves no longer create backup files.
* Apply Martin's translations.  No more german comments.

1.5.25a
* Fixed copy and paste bug.
* Removed some of the path and file name limits.
* Fixed seg fault when no X paste information.

1.5.24a
* Fix for using gdb with ncurses 5.
* Changed to use _POSIX_PATH_MAX instead of 80 in some case.  Needs work.
* Fixed options saving so that it doesn't save colors incorrectly.
* Cleanup use of dtmd variable.
* Fixed the loading and saving of MSDOS text files (no conversion to Unix
     format yet).

1.5.23a
* Added another zoom fix by Mark Spieth
* XSelection was added to 1.5.22a but forgot to get mentioned in the
     CHANGELOG.
* Added Fritz's Y2K patch.
* Converted info reader to use zlib.  Zlib may be required in the future.
* Allow tempnam() to create the temporary directory name if available.
     This function may also be required in future releases.

1.5.22a
* Made the makefile once again check for existence of directories
     because SCO's mkdir -p spits out an error.
* Changed keyboard commands back to Turbo C bindings.  (Previous
     information was wrong.)
* Added Guido Draheim's patch to optionally use ~ for backup files.
* Did away with the NEWSTYLE colors.  (Still need to make the colors more
     pleasant for NEWSTYLE.  Ideally I like to be able to choose new or
     original style at the command line.)
* Added Martin's patch for max column problems.

1.5.21a
* Added Mark Spieth's patch to fix some zoom stuff and remove the file
     handle leak.
* Added Matej Vela's patches to the makefile and fix for e_mk_info_path.
* Fixed the bug in running the debugger and executable.
* Heavily modified Brian's path to make projects store relative paths.
* Modified compile, make, and run keyboard commands to Turbo C bindings.
* Added part of Brian White's SCO man page fix.

1.5.20a
* Fixed until end of line comment to allow for characters beginning with
     alphanumeric characters.
* Fixed bugs in search and replace.
* Fixed stop on error bug when compiling.
* Heavily modified German Garcia's patch for multiple extensions for a
     compiler.
* Fixed delete redo bug.

1.5.19a
* Fix for mouse resize window/zoom bug based on Pedro's patch.
* Made the print command an editor option.
* Fixed gpm bug with a modification of Sebastiano's patch.
* Modified Mark Spieth's patch for new titling method.  (Editor option to
     use the old style.)
* Added Mark's patch to read xwperc from local directory if it exists.

1.5.18a
* Pedro's fix for Option->Editor bug
* Checks file system for the ability to do autosave/emergency save files.
* Supports multiple extensions per language syntax.
* More of Pedro's file-manager massage.
* Added Alexander's change case dialog.
* Hopefully fixed all AIX and OSF compile problems.

1.5.17a
* Fixed X windows argument bug.
* Now defaults to 8x13 font when non-fixed width used.
* Incorporated Pedro's memory bug fixes and menue code cleanup.
* Also incorporated Pedro's file-manager cleanup.

1.5.16a
* Fixed configure script bug.

1.5.15a
* Changed xwpe to compile X11 and term code into shared libraries.  However
     the configure script has yet to be changed to build it.
* Fixed a leaky file descriptor and memory bug in we_debug.c code.
* Added Brian's patch for inserting selected text into search and replace
     dialogs.
* Incorporated Roman's goto cursor and finish function debugger features.
     (Only gdb support.)

1.5.14a
* Changed local variable reg to regz because some systems defined this to
     register.
* Added private colormap option.
* Fixed slackware compile problem.
* Partially fixed the maximum column and cut & paste problem.

1.5.13a
* Added Alex Buell's patch for the new glibc.
* Removed support for editing binary files.
* Added Brian's patch to Search and Replace.
* Added Martin Zampach's patch to adjust breakpoints when new lines added and
     to load/save the breakpoints/watches with the project.
* Started incorporating Roman Levenstein's changes.  POSIX regular
     expressions for matching and replacing.  Ctrl-F1 now looks up the
     current function.

1.5.12a
* Added Brian's patch to only allow a file to be loaded once in an earlier
     version but forgot to record it.  This version includes some fixes
     to that since it wasn't working.
* Added Yarick Rastrigin's tab patch.  Doesn't allow tabbing through
     buttons but a welcome improvement (particularly for the replace dialog).
* Incorporated some of James M.'s man page update.

1.5.11a
* Added Brian O'Donnell's changes to projects.  Includes loading projects
     from file manager and the "edit" now loads the file for editing.
* Chaged xwperc into a text file.  Removed ability to load only color info.
* Some DJGPP ifdefs have been removed since it seems unlikely xwpe will
     support DJGPP in the near future.

1.5.10a
* Fixed long filenames from crashing xwpe when the window is shrunk.
* Added Duane Penzien's wastebasket delete bug fix.  Should probably display
     some message when this occurs.  It currently does nothing.
* Added Anthony Barbachan's patch for newer terminfo.
* Repaint the desktop no longer resizes all windows.

1.5.9a
* Fixed compilation problem on older curses systems.
* Added Brian O'Donnell's save patch.  When a file is modified an asterisk
     now appears near the bottom left.  The asterisk disappears when the file
     is saved instead of poping up a message box.

1.5.8a
* Fixed gzipped man page bug.
* Directory can no longer be loaded as files but it doesn't display an error
     message.
* Incorporated Sebastiano Suraci's Linux and gpm patch.  (Mostly)
* Xterm define and uninitialized strings fixed by Mark Loftis.
* Some spelling fixes.
* Lots of formating changes.
* German comments converted to English thanks to Ronald Holzloehner.

1.5.7a
* Fixed watch window segmentation fault problem.
* Fixed NO_XWINDOWS compilation.
* Fixed autosave bug.
* Fixed configure script.
* Incorporated Stefan Hille's remaining changes.

1.5.6a
* New configure script.  aclocal.m4 is taken from lynx 2.8.1 dev 4.
* Fixed remove bug (working mouse cursor stayed after removing file).
* Fixed some cut and paste bugs.
* Fixed no windows zoom bug.
* Fixed up prototypes in edit.h and progr.h.
* Incorporated some of Alexander Neundorf's changes.
* Incorporated Kenn Flynn's file manager patch.
* Incorporated Alexei Pavlov's changes to autoindenting.

1.5.5a
* Added Mark Loftis's changes to scrolling functionality.
* Incorporated more changes from Stefan Hille.
* Removed some warnings.

1.5.4a
* Changed naming from ALPHA-x to 1.5.xa.  The change from 1.4 to 1.5a does
     not represent a great change in functionality instead marks the change
     of maintainers
* Removed all remenents of dos support.
* Added some changes from Stefan Hille such as messages.h.
* Changed handling of expose event under X Window so that it only redraws
     part of the screen.
* Added Java syntax to the syntax definition file.
* Deciphered purpose of the help.key (formally we_help_str) file.  This file
     gives the section of help that should be loaded while xwpe is in
     different states.  Each line corresponds to a mode.  The modes are as
     follows:
       1  - Standard file                14 - Project menu
       2  - Watch window                 15 - Option menu
       3  - Stack window                 16 - Window menu
       4  - Message window               17 - Help menu
       5  - Most file-manager windows    18 - Function-Index window
       6  - Execute file-manager window  19 - Grep window
       7  - System (#) menu              20 - Find window
       8  - File menu                    21 - Project window
       9  - Edit menu                    22 - Variables window
       10 - Search menu                  23 - Install window
       11 - Block menu                   24 - Windows window
       12 - Run menu                     25 - Top menu bar
       13 - Debug menu                   26 - Help window

ALPHA-3
* Fixed bug in WeExpArr.c
* Fixed debugging problem found by Oliver Wilson.
* Several other minor cleanups throughout the code.
* Some documentation fixes as well.
* Removed support for encrypted files (if enough people request it, the
     encrypted file support could be added again but for the time being we
     feel this is not needed in a development environment).

ALPHA-2
* Fixed bug in syntax highlighting for FORTRAN.
* Lots of old code that had been commented out were removed.
* Some functions from we_progn.c have been renamed and moved to WeSyntax.c
* Renamed all configuration files.
* Changed format of syntax_def (formerly we_synt_def).  This will almost
     certainly change again since the current format is difficult to use.
* Documentation plan:
     1) INSTALL - all compiling instructions and installation needs (not
          started)
     2) README - simply states what the program does (not started)
     3) xwpe.1 - describes configuration files and command line options
          (mostly done)
     4) help.xwpe - on-line documentation describing all use (command line
           options updated but not configuration files and anything else)

ALPHA-1
* All patches were applied except the gpm patch.
* SWAP and NOWEUNDO have been removed since they don't work.
* Some other defines have been removed as well.
* Some functions from we_hfkt.c have been renamed and moved to WeString.c
* Some functions from we_xterm.c have been renamed and moved to WeXterm.c
* Modified X resources a lot making the documentation incorrect.

