#### 2026-09-29 *1.54* - **Ctrl-C and SIGTERM exit in order.** The signal handler called `RequestExit()` (which logs and runs a callback) and then `std::exit`, running the static destructors under live threads. It now makes the one call a handler may, `UltraCanvasApplicationBase::RequestExitFromSignal()`, and the main loop turns it into the same shutdown as a closed window. #### 2026-09-29 *1.53* - **A Prolog `.pl` file is coloured as Prolog, a Perl one as Perl.** Both languages use `.pl`, and which highlighting a file got was left to chance. Texter now reads the first lines, as it already does for `.cls` and `.m`. A `#` line, `use`, `my` or POD means Perl; a `%` comment or a `:-` rule means Prolog. A file that gives no clue opens as Perl. #### 2026-09-28 *1.52* - **The version is in the window title** — `UltraTexter 1.52` — so a screenshot or a bug report says which build it came from. The number is this changelog's first line, as everywhere else (`cmake/UltraCanvasVersion.cmake`). With a file open it reads `UltraTexter x.y.z - `. #### 2026-09-27 *1.51* - **The program file is `Texter` (`Texter.exe`, `Texter.app`), no longer `UltraCanvasTexter`.** Update shortcuts and file associations that name the old file. The window title and the name in the splash are still UltraTexter. - **The splash opens in the middle of the editor window.** It used to be centred on the monitor, so it sat off to one side whenever the window was not in the middle of the screen. Both are framework changes, see `Docs/UltraCanvas/changelog.d/splash-centred-on-window.md`. #### 2026-09-25 *1.50* - **A LaTeX `.cls` is no longer coloured as VBA, an Objective-C `.m` no longer as MATLAB.** With R, Scala, MATLAB and VBA switched on in the highlighter, `.cls` and `.m` each belong to two languages. Texter now reads the first lines of such a file to tell them apart: `\ProvidesClass` or a `%` comment is LaTeX, `VERSION 1.0 CLASS` or `Attribute VB_` is VBA, `#import` or `@interface` is Objective-C, a `%` comment or `function` is MATLAB. A LaTeX or Objective-C file opens as Plain Text, since the highlighter has no rules for those two. #### 2026-09-25 *1.49* - **The markdown side toolbar is 40 px wide again, with its separators centred.** It had grown to half the window: the framework's toolbar builder kept an 800 px minimum width on every vertical toolbar (fixed in the framework, see `Docs/UltraCanvas/changelog.d/toolbar-builder-thickness.md`). Showing the toolbar also switched its layout from a flex column to block layout, which put the separators at the left edge while the buttons stayed centred. It stays a flex column now. #### 2026-09-21 *1.48* - **The 1.47 entry below said neither of the two things it meant.** Two branches wrote a 1.47 entry at the same time - the table editing work and the version-number change - and git merged their bullet lists without a conflict, splicing two sentences into each other mid-word ("is greyed's first line is now the", "This changelogds it"). Both bullets are restored from their own commits; no behaviour changed. This is the shared-version collision `scripts/check_changelog.py` refuses at line 1, happening one line further down where nothing checks it. #### 2026-09-20 *1.47* - **Insert Table works in a word-processing document.** The toolbar button was greyed out there because there was nothing behind it; it now inserts a real 2x2 table with a header row and puts the cursor in the first cell, the same thing it means in a Markdown tab. - **A Table submenu on the right-click menu**, offered only when the cursor is in one: insert a row above or below, a column left or right, delete the row or column the cursor is in (named, so "Delete Row 2 of 5" says which), merge with the cell to the right or below, and split a merged cell back up. Merging keeps the text from both cells. - Anything that cannot be done right now is greyed rather than hidden: Split Cell where nothing is merged, Merge With Cell Right in the last column. - **One version number, one place.** This changelog's first line is now the only place Texter's version lives: the build reads it (`cmake/UltraCanvasVersion.cmake`) and passes it to the sources. The `"0.0-dev"` fallback in `UltraCanvasTextEditor.cpp` is gone; a build without the definition now fails at compile time instead of reporting 0.0-dev. `--version` printed a literal `2.0.0` of its own (`main.cpp`); it prints this number now. #### 2026-09-17 *1.46* - **Pictures inside a line of text stay there.** A logo in the middle of a sentence, an icon in a heading or a signature beside a sign-off used to be pulled out of its line and dropped below it as a paragraph of its own, which re-flowed everything around it. Such a picture now stays where the author put it, on opening, on screen and on saving. - A picture on a line of its own is still a standalone image, as before. #### 2026-09-16 *1.45* - **Tables with merged cells open, display and save correctly.** A cell spanning several columns is drawn that wide and the cells beside it sit past it, and a cell spanning rows reaches down over them — previously every cell after a merge was drawn in the wrong place. - **Vertically merged cells are no longer lost when you save.** Opening a `.odt` or `.docx` whose cells were merged downwards and saving it quietly un-merged them; the merge now survives the round trip in both formats. #### 2026-09-16 *1.44* - **Table cells can be edited in a word-processing document.** Click into a cell and type; **Tab** and **Shift+Tab** move between cells. Selecting, bold and the rest of the formatting all work inside a cell, and **Find and Replace now search table content**, which they skipped before. - Enter inside a cell adds a line to that cell rather than breaking the table in two, and Backspace at the start of a cell steps back to the previous one instead of merging cells. - Adding and removing rows and columns, merging cells, and selecting across several cells at once are not available yet — which is also why **Insert Table** stays greyed out in these documents. #### 2026-09-15 *1.43* - **Find, Replace and spell checking work in word-processing documents.** Both were unavailable when `.odt`/`.docx`/`.doc` files moved into the WYSIWYG editor in 1.42; this is the other half of that change. - Ctrl+F and Ctrl+H drive the document itself. Case-sensitive and whole-word both apply, the match counter reads "3 of 12", and **Replace All takes one Ctrl+Z to undo**, not one per match. Replaced text keeps the formatting of what it replaced, so replacing a word inside a bold heading leaves it bold. - Misspelled words get the same red squiggle they do in a text document, and right-clicking one offers the suggestions, **Add to Dictionary** and **Ignore** — inside the editor's own context menu, which now also carries Undo, Redo, Cut, Copy, Paste and Select All in these tabs. - **Go to line** is still not offered for these documents: a word-processing document is made of paragraphs, not lines, and the status bar reports the block the caret is in. - Find does not reach inside table cells yet, for the same reason table cells are not editable in place yet. #### 2026-09-15 *1.42* - **Word-processing documents open as themselves.** A `.odt`, `.docx` or `.doc` file now opens in the WYSIWYG editor (`UltraCanvasRichTextEdit`) instead of being converted to Markdown first. Fonts, sizes, colours, alignment and embedded images are what you see and what you edit, and saving writes the same document back out — so a 14 pt Georgia run in red survives a round trip instead of being flattened to whatever Markdown could spell. Bold is a state of the selection, not two asterisks in the text. - The formatting toolbar works in these tabs too: the same buttons apply the format to the document rather than inserting markup, and they light up from the caret's real formatting. **Checklist** and **Insert Table** are greyed out there, because a word-processing document has no checkbox list item and tables are not yet edited in place. - **Insert Hyperlink** asks for the address, and **Image** picks a file and embeds it in the document, so the picture is still there after a save. - Undo, Redo, Cut, Copy, Paste and Select All (menu and keyboard) act on the document. Copy and paste keep their formatting within UltraTexter. - **Find**, **Replace** and **Go to line** are not available in a word-processing tab yet, and neither is spell checking — the status bar shows the block the caret is in instead of a line and column. - **Save As** from a word-processing tab to `.md`, `.html` or `.txt` converts on the way out; saving to the legacy `.doc` format is still refused with a note to use `.docx`. #### 2026-08-28 *1.41* - **Spell checking.** *Edit → Spelling → Check Spelling* turns it on; misspelled words get a red squiggle as you type. *Dictionary* lists every language installed on the machine, and *Recheck Document* re-runs the check after you have taught it new words. Both the on/off state and the chosen dictionary are remembered between sessions. Nothing is loaded until you first switch it on, so start-up is unchanged if you never use it. - **A context menu in the editor.** Right-clicking the text now opens Undo, Redo, Cut, Copy, Paste and Select All — greyed out when they would do nothing — with the Spelling submenu at the bottom. Right-clicking a misspelled word puts the suggestions, **Add to Dictionary** and **Ignore** at the top of that same menu. The caret follows the right-click unless you clicked inside a selection, so Paste lands where you clicked and Cut/Copy still act on what is highlighted. - Markdown documents are checked as prose, not as markup: fenced and indented code blocks, inline `code`, link and image targets, autolinks, inline HTML, math and YAML front matter are all left alone, while the words around them — link text and image alt text included — are still checked. - Spell checking is skipped for a file opened in Hex/Binary view, and follows the language you pick in the status bar. - Requires a dictionary to be installed on the system (hunspell/myspell data, or whatever enchant finds). If none is present, switching the feature on says so instead of silently doing nothing. #### 2026-07-29 *1.40* - Fixed **Recent Files** losing entries — most visibly the file a document was loaded from before a **Save As**. `recent_files.txt` is shared by every window and every UltraTexter process, but each window rewrote the whole file from the snapshot it read at start-up, discarding everything the others had added since. Add/remove/clear now merge with the file on disk, and the menus re-read it when they open. - Recent file entries are stored as normalized absolute paths, so the same file opened via a relative command-line argument, a symlink or a `..` resource path is one entry instead of several — and no longer silently drops out of the list when the working directory changes. - Recent Files entries that share a file name (what "Save As" into another folder produces) now show their folder next to the name instead of appearing twice as the same item. - Added `Tests/RecentFilesTest.cpp` covering the Save As / multi-window scenarios. #### 2026-06-22 *1.39* - Fix Texter Search. No advance on each typed character #### 2026-06-18 *1.38* - Implemented show inline images in Markdown mode #### 2026-06-17 *1.37* - Merge "PDF support", implemented PDF support in Texter #### 2026-06-15 *1.36* - Merge changes from "Texter inactive icon rendering" #### 2026-06-07 *1.35* - Fix UltraCanvasTextEditorInfoFileStatistics layout (migrate from old layout) - Fixed crash-recovery naming so recovered tabs derive their names from actual content instead of showing stale Recovered1 … RecoveredX. #### 2026-06-03 *1.34* - Make Texter compliant with CSS layout support. #### 2026-05-18 *1.33* - Added an **"Open recent folder"** submenu placed directly under **File → Open...** #### 2026-05-13 *1.32* - Fix focus problem with Texter (new tab/close active tab) - Fix ordered list content offset in MD-mode in TextArea #### 2026-05-12 *1.31* - Implemented OS Recent files support (add opened files to OS Recent files list) #### 2026-05-09 *1.30* - Attempt to fix menu crash on MacOS #### 2026-05-06 *1.29* - Show tooltips with full pathname for Recent files menu items - Set maxWidth=500 for Recent files menu #### 2026-05-05 *1.28* - Fix invalidate all line layouts in TextArea on window size change #### 2026-05-04 *1.0.27* - Another attempt to fix hang with "recover confirmation" dialog - Update UltraCanvas to support MacOS HiDPI #### 2026-05-01 *1.0.26* - Fix hang when Splash and "recover confirmation" dialog shown in same time #### 2026-04-30 *1.0.25* - Fix cursor position in Markdown mode #### 2026-04-28 *1.0.24* - Fix Markdown toolbar (was not received events) - Major rework in the UltraCanvas (implemented optimized rendering) - Fix scroll down beyond the content - Fix font zoom change #### 2026-04-24 *1.0.23* - New: XML syntax highlighting with xml/xsd/xsl/xslt/xhtml extension support. - New: SVG syntax highlighting (inherits XML) with full SVG element and attribute vocabulary. - New: POM (Maven) syntax highlighting (inherits XML) with Maven element vocabulary. - New: RSS/Atom feed syntax highlighting (inherits XML) with feed element vocabulary. - New: KML syntax highlighting (inherits XML) with Google Earth geographic vocabulary. - New: JSON syntax highlighting with JSONC/GeoJSON/WebManifest variants. - New: YAML syntax highlighting with full YAML 1.1/1.2 boolean-spelling constants. - New: Texter "Data / Config" file filter covering JSON/XML/YAML/TOML/INI/POM/RSS/Atom/KML. - New: Texter "Vector Graphics (Text)" file filter for .svg/.svgz. - New: Texter New-Document dialog templates for SVG, POM, RSS, Atom, KML. - Well-known filenames (pom.xml, manifest.json, feed.xml, atom.xml, rss.xml, site.webmanifest) now auto-select their dialect highlighter before falling back to plain extension lookup. #### 2026-04-24 *1.0.22* - Moved Markdown toolbar under the tabs bar so tabs bar deos not moved when Markdown toolbar switched on/off - Implemented local 'Tab' key handling in the search/replace component to switch between 'search' and 'replace' inputs - Fixed search/replace bug when replaced string has content of "search" string - Fix search bar text colors/font size and other minor changes #### 2026-04-24 *1.0.21* - Fix tooltips rendering and file paths - Fix Markdown cursor position on mouse click #### 2026-04-23 *1.0.20* - Some color fixes for Dark mode #### 2026-04-17 *1.0.19* - Fix restore opened tab after load - Tabbed container active tab is not updated currently after load new file #### 2026-04-17 *1.0.18* - Many updates in UltraCanvasTextarea - Disable focus on TextArea in Markdown mode on file load and on tab switch if cursor at 0,0 position - Do RestoreSessionAndRecoverBackups immediately without waiting splash screen to close. - Fixed save all files on exit. #### 2026-04-17 1.0.17 - Change design of Recent files menu. Increase max recent files to 30 - Migrate Texter's Recent Files submenu to the new API. The submenu now regenerates itself on every open from the recentFiles list. - Fix Texter zoom shortcuts #### 2026-04-16 1.0.16 - Full rework of display and rendering the text. Use Pango layout to format text. Allow to use variable height lines #### 2026-04-06 1.0.15 - Fix markdown word-wrap rendering for blockquotes and code blocks #### 2026-04-05 1.0.14 - restore all tabs on relaunch, fix duplicate "Recovered" titles - Cursor line highlighting - Fix splash screen appearing on wrong monitor in multi-monitor setups #### 2026-03-28 *1.0.13* New Features - Inline Search/Replace bar (VS Code-style, UltraCanvasSearchBar) replacing the modal find dialog - Async match counting with background thread and cancel support - Search history and replace history persisted to config file - Match count display ("3 / 12") with live update on text change - Case-sensitive and whole-word toggle in search bar settings popup - "First match" jump button added to search bar Improvements - onHistoryChanged callback persists search/replace history on every change - Hex mode cursor byte offset used as search anchor in hex documents #### 2026-03-25 *1.0.12* New Features - Drag-and-drop file open: HandleDragEnter, HandleDragOver, HandleDragLeave, HandleFileDrop - Drop overlay rendered while external drag is hovering - Recent files list with persistent storage and submenu rebuild - Tab context menu - EOL type dropdown in status bar (LF / CRLF / CR) - Encoding dropdown in status bar with full re-encoding on save (BOM preserved) - Language / syntax dropdown in status bar - Zoom dropdown in status bar with configurable zoom percent steps - TextEditorConfigFile — INI-based config with XDG, %APPDATA%, and macOS paths - Session restore on startup (reopens previously open files + active tab index) Improvements - Encoding detection: BOM check → UTF-8 validation → heuristics (DetectEncoding) - Binary file auto-detection → opens directly in Hex mode - Raw bytes cached per document (up to 10 MB) for lossless re-encoding on save - Windows .rc resource script with version info embedded in EXE (1.0.12) #### 2026-03-17 *1.0.11* New Features - Hex / Binary editor mode (TextAreaEditingMode::Hex) with address panel, hex panel, ASCII panel - Hex undo/redo stack (separate from text undo stack) - Hex cursor navigation (nibble-level, row/column, page up/down, panel toggle) - Hex search (byte-level find/find-next) - Hex selection with mouse - MarkdownHitRect::isAnchorReturn — ↩ backlink icon on {#id} headings scrolls to jump source Improvements - SetBounds() override triggers layout recalculation on resize #### 2026-03-11 *1.0.10* New Features - AutosaveManager — periodic backup every 60 seconds for modified documents - Crash recovery dialog on startup: offers to restore autosaved files - Session + backup restore merged into RestoreSessionAndRecoverBackups() - Legacy autosave path migration (/tmp/UltraTexter/Autosave/) - AutosaveDocument() per-tab with stable backup path derived from file path + tab index #### 2026-03-02 *1.0.09* New Features - Backlink icons (↩) on {#id} headings — click returns to the line that jumped here - Anchor backlink map (markdownAnchorBacklinks) built during prescan - Abbreviation support (*[abbr]: expansion) — hover tooltip, word-boundary aware - Footnote support ([^label]: content) — multi-line continuations, inline rendering - Definition list support (term / : definition pairs, lazy continuation merging) - Emoji shortcode rendering (:fire:, :check:, :computer: etc.) - Table word-wrap: cell text wraps inside columns with markdown-aware font measurement - Code span font switching inside table cells for correct width measurement - sAnchorReturn hit rect type for ↩ backlink icons Improvements - H1–H6 font size clamped to line height with per-level ceiling multipliers (prevents overflow) - Header text vertically centred within fixed row height - Blockquote continuation segments rendered with quote indent - List item continuation segments rendered with list indent - Abbreviation definition lines and footnote definition lines hidden from rendering (except on cursor line) - Definition hidden/continuation lines suppressed from rendering - mdScrollBaseOffset computed from markdownLineYOffsets[firstVisibleLine] for correct table row positioning - Tokenizer cache: re-uses token vector across display lines from the same logical line #### 2026-02-26 *1.0.08* New Features - Initial standalone Markdown plugin component (UltraCanvas::MarkdownElementType enum) - Element types: Text, Header, Bold, Italic, Code, CodeBlock, Link, Image, and more #### 2026-02-21 *1.0.07* New Features - Self-contained inline search/replace bar (embedded panel, not a dialog) - Find mode (single row) and Replace mode (double row) - Settings popup menu (case sensitive, whole word checkboxes) - Search history popup and replace history popup - onFindNext, onFindPrevious, onReplace, onReplaceAll, onSearchTextChanged, onHistoryChanged callbacks - UpdateMatchCount(current, total) display label #### 2026-02-14 *1.0.06* New Features - DetectEncoding() — BOM + UTF-8 validation + heuristics - DetectBOM() — UTF-8 BOM, UTF-16LE/BE BOM detection - ConvertToUtf8() / ConvertFromUtf8() via POSIX iconv - GetSupportedEncodings() — full encoding list for dropdown - MAX_RAW_BYTES_CACHE = 10 MB per document