Added
Widgets
- Esperanto (
eo) translations for all 313 framework messages, available
throughteksilo_widgets::framework_locales(). NotificationArchiveModel::push_update, which archives an in-place update
of a notice still on screen, besidepush, which archives a notice raised.
UPDATE_HISTORY_LIMITis how many update records a row keeps.
Changed
Widgets
NotificationArchiveModel::pushwith thededup_idof an archived row now
takes the entry as that notice raised again: the row moves to the top,
takes the entry's time and read state, and records the occurrence even
when nothing it says has changed. An app that pushed to the archive itself
to update a notice still on screen callspush_updateinstead, which
updates the row where it is.
Fixed
Core
- A drag preview's resources outlived the drag. When a drag ended, the
preview widget was removed from the tree without the teardown every other
removal goes through, so whatever it had registered (animations, animated
indicators, bindings, subscriptions, shortcuts) stayed registered until
the window closed. The preview is now torn down like any other widget. - A widget changed while out of view could come back showing its old
content. A widget marked for repaint while it was clipped out of a
scroll area or under a fully transparent ancestor (or itself fully
transparent) lost the mark without repainting, and if it came back into
view without moving it replayed the paint it had before the change. Such
a widget now drops its stale paint and repaints when it is next visible;
a widget that did not change keeps its cached paint as before. - An accordion opened in a window without focus stayed closed. The
animation scheduler paused every animation of a window that was unfocused
or occluded, one-shot tweens included, so aCollapseopened there (by an
assistive technology, an automation client, or the app itself in a window
behind another) held its body at no height while its header already said
it was expanded, in a scrolling dialog as anywhere else. Only looping
animations are paused now; a tween runs to its end, as it already did for
a widget off screen. A loop started while its window had no focus also
starts when the window gets it, rather than later by however long the
window had been without focus before the loop existed.
Render
- Clipping was misplaced at fractional scales and lost around blurs. A
clip inside a translated scope (a panned scene, a moved transform
wrapper) landed at the wrong place whenever the display scale was not 1,
because the translation was scaled twice. Content drawn after a blur
inside a clipped region (a scroll area, for instance) was not clipped at
all, since the blur restarted drawing without restoring the clip. Both
now clip where the content is, and a clip opened outside a blur no
longer reaches the blur's own offscreen drawing. - Blur used the wrong kernel width. Every pass of every blur in a frame
read the kernel offset written for the frame's last blur pass, because
the per-pass parameters were rewritten into one buffer that the GPU reads
only once the whole frame runs. A blur therefore came out softer or
sharper than its radius asked for, and changed when another blur of a
different size appeared on screen. Each pass now reads its own
parameters.
Widgets
- An image or raster icon could show another image's pixels.
ImageWidget::newandIconWidget::from_raster/from_animatednamed
their texture after the icon's memory address, so an icon created where a
dropped one had lived reused the old texture. They now name it after the
icon's identity, which a clone shares. AnIconWidgetshown in both
TintableandFullColormode also shared one texture between the two
and drew both from whichever registered first; each mode now has its own.
As before, these textures last as long as the window: an icon decoded
afresh for every widget gets a new texture each time. - The notification log kept the first notice's actions for a notice
updated in place. An archived row merged from a later notice with the
same id took only its title and body, so a progress notice offering Cancel
that became a result offering Open now and See report stayed a Cancel row,
under its first severity, and the log never offered the report. The row
now takes the latest notice's actions, replay names included, its
severity, priority and audience; an update offering no actions leaves the
row with none, as it leaves the live notice. The row keeps its id, its
place in the log and the time the notice was raised, and its group and
source unless the update names them. Updating a row nobody had read no
longer adds to the unread count, which grew by one per update and stayed
up under a bell scoped to a window or an audience. - A notice raised again was filed under the first one. A toast raised
with the id of an archived notice that had already left the screen merged
into that row like an update of a live toast: the row stayed where it
was, dated when the first notice was raised, below every notice raised
since. An import run on Friday under the same id as Monday's showed its
result in the log under Monday. The row now comes back to the top, unread,
dated when the notice came back, with a record of the occurrence even when
it says the same as before. - A progress notice grew its archive row without bound. Every in-place
update appended a record to the row, written to the archive file, so a
notice reporting each step of a long import gathered thousands, and an id
reused for every run of an operation gathered them from every run. An
update that repeats the row exactly now records nothing, and a row keeps
only its 20 most recent records.
Full Changelog: v0.15.0...v0.15.1