Toaster — version history
Toast notifications in a corner of the window or of the screen: a message that appears, informs and goes away without blocking the user or interrupting their typing. Non-visual object, introduced in 1.0, free.
4.0 — October 2026 #
New #
is_sound:SOUND_AUTO(default: a sound for errors and warnings only),SOUND_ALWAYS,SOUND_NEVER; the sound plays when the toast is requested, even if it waits for its place.- The text of a toast can be selected and copied (right-click, Copy); selecting text or dragging the scrollbar of a long text no longer answers and closes the toast.
PBT_SetLanguage,PBT_SetDefaultTheme,PBT_SetDefaultThemeAccent,PBT_SetDefaultFontandPBT_SetFlowDirectionreach a toast already on screen, font size included.- Screen readers announce a toast (as an alert for an error), and the close button has a translated name.
of_closeof a toast on screen raisesue_toast_dismissed, like its close button; a toast still waiting, never seen, raises nothing.[symbol=name]tag in rich text: eighteen monochrome glyphs that follow the text colour (clock,location,person,calendar,phone,mail,warning…); an unknown name stays as text.
Fixed #
- A toast anchored to a window follows it when the window moves; a toast anchored to a minimized window waits: it is not shown and its countdown does not run until the window comes back.
- A toast taller than 800 pixels (a long error trace) now appears: its height is capped and its text scrolls inside the toast. The width follows the display scaling (150 %, 200 %).
of_showof a toast that waits for its place returns a real id at once:of_closeremoves it from the queue, and its events carry that id. A full queue (200) returns-4instead of losing the toast silently.- Two toasts without
is_keythat carry a button with the same key are two toasts with two ids; onlyis_keyupdates a toast in place. - Several toasters no longer steal each other's events: each one receives the events of its own toasts, and a destroyed toaster receives nothing more (its toasts stay on screen, silent).
- The same
is_keyshown by two toasters gives each its own toast; an update also takes the new corner, screen anchoring and anchor window. - Toasts anchored to the screen from two windows, or without
ipo_owner, no longer land exactly on top of each other: one stack per monitor and per corner, andil_max_visiblecounts per monitor. Freeing a place in one corner no longer overfills another. - A toast that arrives while the stack is hovered is born paused, like the others; moving the pointer from one toast to another no longer lifts the pause; updating a hovered toast no longer restarts the whole stack.
- A toast whose anchor window closes goes away with it, and the toasts waiting for that window are dropped.
of_closeright afterof_show, before the toast is fully built, is safe.of_keys_atandof_hasread the right buttons even when a key contains unusual characters.- A runtime error in your
ue_toast_*event reaches the application'sSystemErrorevent like any script error, and the following events are still delivered. - Rich text: a closing tag closes its own tag only (
[b]A[i]B[/b]CleavesCin italics only), a]escaped byof_escape_markupright after a tag no longer breaks the formatting around it, and[picture=…]accepts a data URI and a file name containing a comma. - With no language chosen by the application, the component announces English to screen readers (it announced French).
- The application accent (
PBT_SetDefaultThemeAccent) survives a change of theme, is followed as long as the component has no accent of its own, and repaints everything derived from it (hover, pressed, selections); Windows high contrast is supported.
Behavior changes #
See Migrating from 3.0 to 4.0 (sections 11.3 and 11.38).
ue_toast_clicked,ue_toast_actionandue_toast_dismissedtakelong al_idas first argument (the number returned byof_show);as_keyis now the toast'sis_key(empty without a key). ReplaceLong(as_key)withal_id.of_add_buttonreturns0, and-5without adding anything for an empty key, a key already taken, a key containing/or|, or a fourth button. The number of buttons is read withof_count();il_button_countis no longer public.of_showreturns-5and shows nothing whenis_kind,is_positionoris_soundis not one of its constants,il_max_visibleis outside 0-20, oril_timeoutis belowTIMEOUT_AUTO; it returns-6(instead of-1) without the WebView2 runtime.il_max_visibledefaults to0(nothing sent): the limit is shared by the whole application and the last value set wins (5 until someone sets it).- Only a window set in
ipo_receiverreceivespbm_custom02; theipo_ownerwindow no longer does. Events arrive by themselves: code mapped onpbm_custom02for toasts can be removed. - Information and success toasts are silent by default: set
is_sound = SOUND_ALWAYSto keep a sound on them. of_countreturns alongandof_keys_attakes along.- Rich text: a markup image on a network share (
[picture=\\server\share\x.png]) is no longer shown: go throughof_icon(), which embeds it.
3.0 — September 2026 #
New #
- The toaster delivers its events by itself: set
ipo_ownerand handleue_toast_*; no receiver, no timer, noof_process_eventscall to wire.ipo_receiverbecomes optional.
Fixed #
- A toast closed while the pointer was over it no longer leaves the whole stack paused.
- Rich text: a
[word]that is not a tag is shown as typed (report[final].pdf) instead of disappearing with the rest of the text.
2.0 — September 2026 #
New #
of_count,of_keys_atandof_hason the action buttons declared byof_add_button.
Fixed #
- The label of a hovered action button stays readable in dark mode.
Behavior changes #
- The first argument of
ue_toast_clicked,ue_toast_dismissedandue_toast_actionis namedas_key(it wasas_id) — see Migrating from 1.0 to 2.0.
1.0 — August 2026 #
New #
- Non-blocking notifications with four levels (
KIND_INFO,KIND_SUCCESS,KIND_WARNING,KIND_ERROR), six corners, anchored to the window or to the screen. - Rich text body, bold title, illustration image, display time (
TIMEOUT_AUTO: an error stays until clicked). is_keyupdates a toast already on screen instead of opening a second one (progress notifications);il_max_visiblelimits the toasts per corner, the others wait for their turn.- Up to three action buttons (
of_add_button),of_closeby id, and the eventsue_toast_clicked,ue_toast_action,ue_toast_dismissed.