Skip to content

v0.22.0

Choose a tag to compare

@github-actions github-actions released this 27 Oct 12:25
· 146 commits to main since this release
f5cb9b0

Added

cargo-teksilo

  • cargo teksilo init says when an app does not ask Windows for a larger
    main-thread stack
    , and prints the build.rs that does. Windows gives the
    main thread 1 MiB, against 8 MiB on Linux and macOS, and a large app's debug
    build can overflow it while building its first window. The app guide's
    Adding Teksilo has the same snippet.

Settings

  • AppPaths::runtime_dir() and AppPaths::create_runtime_dir(): a short,
    per-user directory for an application's sockets and lock files.
    It is
    $XDG_RUNTIME_DIR/<app> on Linux and the macOS per-user temporary
    directory (under /var/folders/) with the bundle id on macOS; Windows has
    none. A Unix socket's path holds 104 bytes on macOS, which the data
    directory under Application Support can leave too little of.
    create_runtime_dir makes it private to the user and refuses a symbolic
    link, a file, or a directory another user owns.

Widgets

  • Shift+Enter in RichTextEditor breaks the line inside a paragraph,
    list item or quotation, for verse, a letter or song lyrics, as in
    LibreOffice, Word and Qt. It used to start a new paragraph, as Enter does.
    RichTextEditor::insert_line_break and EditorHandle::insert_line_break
    insert one from a menu row. In a table cell and a code block Shift+Enter
    still does what Enter does. Copied or dragged to another program, the break
    is a new line. A host that claims Enter in on_key_preview, such as a chat
    composer, now gets a line break from Shift+Enter instead of a paragraph.
    Needs text-document 1.14 and text-typeset 2.1.

Changed

Widgets

  • EditCommandKind has a new variant, InsertLineBreak, so a match
    over it needs an arm for it.

Settings

  • On macOS, settings and data now live in ~/Library/Application Support,
    and are moved there.
    AppPaths::new gave the Linux directories on macOS
    (~/.config/<app> and ~/.local/share/<app>), where its documentation
    promised Application Support. They are now
    ~/Library/Application Support/<bundle id>/config and .../data, the
    bundle id being <qualifier>.<organization in lower case>.<Application>.
    The first start moves an application's existing settings and data there,
    once; from another volume it copies them and leaves the originals. Linux
    and Windows are unchanged.

Fixed

Core

  • A click outside an in-window modal reaches the control beneath again.
    Since 0.21.0 a click outside a modal presented from the page (from the
    window's root, for instance) closed the modal and went nowhere, so the user
    had to click twice. It closes the modal and reaches the control under the
    pointer, as in 0.20.0; a click on the control that opened the modal still
    only closes it.

App

  • Releasing Alt no longer puts a window into menu-bar mode when the Alt
    press happened elsewhere.
    After Alt+F4 closed a window, or Alt+Tab
    brought one forward, the window that took the focus read the release of
    Alt as a bare Alt tap and moved the keyboard focus to its menu bar, so the
    next key typed went nowhere. On Windows, Alt+Tab away from a window did the
    same to the window left behind. A tap now counts only when the window saw
    both the press and the release of Alt, with no other key between.
  • Alt+F4, or a window's close button, with an in-window modal open closes
    the modal, not the window.
    The window's close guard ran over the open
    modal ("Save changes before closing?" over a settings dialog). A close the
    user asks for now does what Escape would in the modal, as Alt+F4 closes a
    dialog window and not the window behind it; a modal Escape cannot close
    stays, and nothing closes. The next request reaches the window, and the
    Alt of that Alt+F4 does not put its menu bar in keyboard mode.
    ctx.close_window() and a quit still ask the window's guard.
  • A restored window comes back on its own monitor, and inside the
    screen.
    A window saved on a second monitor came back centred on the
    primary one, and a restored window could hang under the taskbar or past
    the edge of a smaller screen: its saved size was checked against the
    primary monitor's whole area, title bar not counted. It now comes back on
    the monitor it was on, moved into that monitor's work area (the screen
    less the taskbar, the Dock and the menu bar, the panels) and shrunk to fit
    if it must be, title bar included. Wayland still places windows itself.

Widgets

  • A custom title bar stays live under an in-window modal. The modal's
    scrim covered it: while a dialog was open in the window, the window could
    not be moved, minimised or maximised, and its close button did nothing.
    It now drags by its title bar, a double click maximises it, its buttons
    and WindowFrame edges work, and the close button closes the modal as
    Escape would, whatever TitleBar::close_action it was given. What the app
    put in the title bar stays behind the modal.

  • Typing in a text field no longer takes the Snap layouts from a custom
    title bar on Windows.
    A key, an edit command or an accessibility request
    in a TextInputField, RichTextEditor or CodeEditor mounted the
    window-wide layer that holds the touch selection handles, with no handle
    to show, and it stayed for the editor's life. A custom title bar counted
    it as covering its caption, so on Windows the whole bar answered as client
    area: no Snap layouts, and the caption buttons and drag worked only through
    the app. An embedded WebView hid under it too. The layer now mounts only
    once a finger raises a handle, and the title bar and a WebView count it,
    and any overlay that lets presses through, only where its handles are: the
    empty layer a finger leaves behind no longer hides a WebView either.

  • In RichTextEditor, a key pressed in the same frame as typing comes
    after the typing.
    Typed characters wait for the next frame, and Enter,
    Backspace, the arrows, an edit command such as Ctrl+Z, a paste (by key,
    from the context menu or from the application) and a format command acted
    before them: typing "ab" and pressing Enter quickly
    gave a new paragraph holding "ab". Fast typing, automation and remote
    desktops could hit it.

  • Text from another program keeps its paragraphs and line breaks in
    RichTextEditor.
    Text dropped from another program, and text an
    assistive technology writes (dictation, a braille display), went into one
    paragraph with its newlines inside it. Each paragraph break (\n, \r\n,
    U+2029) now starts a paragraph, as in a paste, and a line break (U+2028, or
    the vertical tab Word writes for one) is a line break inside the
    paragraph, in a paste too. A typed U+2029 starts a paragraph.

  • A single-line field keeps out a line or paragraph separator (U+2028,
    U+2029) typed or pasted from another program, as it keeps out a \n.
    text-typeset 2.1 breaks the line at either, so the field showed two lines.
    Applies to TextInput, PasswordField, SpinBox and everything else
    built on TextInputField.

Platform

  • A window with a menu of its own keeps the Window and Help menus on
    macOS.
    Its bar showed only its own menus, so a window minimised while it
    was in front came back only from the Dock. A window's menu that declares
    no Window or Help menu now shows the application menu's.
  • macOS no longer merges an application's windows into tabs by default.
    The Window menu loses the tab rows (Show Previous Tab, Merge All Windows
    and the rest). TeksiloAppBuilder::window_tabbing(true) turns tabbing back
    on.
  • A menu titled like the standard Window or Help menu shows once in the
    macOS menu bar.
    A model with its own Window menu, for the in-window bar,
    and StandardMenu::window() showed two Window menus on macOS. The own
    menu's rows now go into the standard one, below Zoom; the in-window bar is
    unchanged.
  • A custom-chrome window has the size it asks for on Windows, and no longer
    grows on every launch.
    A window with DecorationsMode::CustomChrome
    opened larger than its configured size by the Windows frame (16 x 39 px at
    100 %), and its minimum and maximum sizes and a size set through
    WindowState::size() were off by the same amount. With saved window
    state, the larger size was saved and grew again at each launch. A size
    already saved that way is kept, not shrunk back.

Security

  • Cargo.lock moves rustls, rustls-webpki, webpki-roots,
    webpki-root-certs, ctutils, crypto-bigint, zstd, zstd-safe and zstd-sys
    past their RustSec advisories
    , which matters to the binaries installed
    with cargo install --locked (cargo-teksilo,
    teksilo-automation-mcp). The zip advisories remain: zip 6 and 8 come
    from text-document's EPUB and DOCX exporters.

Full Changelog: v0.21.0...v0.22.0