An entry `<area>/keeps-<left area>` kept the copies in the left area
whenever the lock check on `<area>` failed, so an entry in a folder of
another account, or in one whose lock file can't be opened, kept a
crashed app's copies from being offered. Such an entry now keeps
nothing: only an area that this session holds, or that a running app of
this account has locked, keeps the copies it names.
When a running app has to leave its recovery area (its lock file was
removed and another app locked the area), its copies stay in the old area
until it writes them again in its new area. Only that app knew this, so
once the other app let the old area go, any app could offer, restore or
discard those copies while their app still ran.
The app now writes an entry `<new area>/keeps-<old area>` in its own area
while copies of its documents are left in the old one, and removes it
when none are. Another app that finds an area unlocked checks for such an
entry, and treats the area as a running app's while the area that names
it is held. After a crash the new area is no longer held, so the copies
are offered as before. The heartbeat writes the entry again if it was
removed.
effect.list's catalog lists the plug-ins installed in the process-wide
registry, which the plug-in tests change while the id and ids comparisons
run in the same test binary. Both comparisons, id against ids of one and
ids against the selection, now take the plug-in effects (plugin.<id>) out
of effect.list's catalog before comparing. The built-in catalog, applied,
activeItem, errors and the document are still compared.
Paragraph Style Options and New Paragraph Style gain a Tabs section. It
lists the style's stops and edits the selected stop's Alignment, position
(X:, or Y: for vertical type), Leader and Align On character. Add puts a
left stop 36 pt past the furthest one, Delete Tab removes the selected
stop, and Clear All Tabs leaves the style with no stops. OK sorts the
stops by position and keeps the stop edited last when two share one
position. Reset Panel removes the style's tabs.
paraStyle.new, paraStyle.setAttrs and paraStyle.edit check changed tabs
stop by stop: at most 256 stops, and each changed stop's position from 0
to 100000 pt and leader of at most 8 characters. Stops the style already
has are kept as they are. Changed tabs are sorted by position, keeping
the first of stops at one position. text.tabs.set rejects a leader longer
than 8 characters, an Align On value of more than one character and more
than 256 stops. Loading paragraph styles skips a style whose indents,
spacing, hyphenation, justification or tabs are out of range.
Docs: docs/mcp.md, docs/target-app-parity.md.
flat_charged and the property-key path now root the rope itself, so a string held only by
native code (a getter's result for ++o.x, a valueOf result, a toString key) still counts
what it holds when the reservation collects. The per-call roots for these cases are removed.
stroke.set without an item always went to the painted leaves, so a join
set on a group whose stroke is its own (a row in the group's stack)
left that stroke alone and gave every member without a stroke a new
black 1 pt one: on a PDF map, every glyph path got an outline. A
selected group or layer with a stroke row of its own now edits that
row, as the Stroke panel does with the group targeted; other targets
reach their leaves as before. A stroke row made for options alone
(cap, join, miter limit, dashes, alignment) has no paint, so nothing
becomes visible; a weight, an arrowhead or a profile still gives the
black stroke.
Fixes#6739
When the flattened copy of a String object's concatenated string would pass the heap limit
before a collection can run, the indexed read walks the rope to the unit instead, taking a
unit of fuel for each node it visits, so no copy is made.
Inside braces, a line such as `#include$size = 1` was taken for an `#include` line, because only the ASCII letters, digits and `_` after the `#` were compared with the directive names. The name now runs over every character a name may hold, written out or as an escape, before the comparison.
On Windows, removing a copy whose path runs through a file reports the copy as missing, so the removal counted as done and the file in the way went unreported, while a listing names it. The removal now names that file, and a copy that is just not there still counts as removed.
effect.deferredStatus lists a stage in the art of a symbol, pattern, brush
or opacity mask by the id of the object in that art. effect.refreshDeferred
took such an id only while the object still had a deferred stage; an
existing object there without one was refused as no such object, while a
layer object without a stage was accepted. An id is now valid when it names
an object in the layers or in that art, an object without a stage adds
nothing to the counts, and an id of no object is an error.
The params text and docs/mcp.md said `id` names one object, but the params
text did not list the key, so `{id: N}` was refused as an unknown
parameter. It is now `{ids?|id?}`, and the command checks only the form of
the ids before it looks them up itself.
The requested ids are held in a set while the art is walked, and only those
with a stage are handed to the refresh.
- ui.dock's move takes a hidden panel's shown id in target, as the other
docking destinations do.
- Shortcut overrides keyed panel:<panel id>, saved and in an open
Keyboard Shortcuts dialog, show the panel id shown for a library
outside the read roots, also when nothing else refers to it.
- Outside Windows, a native path is matched only as written: a sent
/out/weird/name.svg no longer renames a hidden library at
/out/weird\name.svg, and a reply does not read one as a spelling of the
other. Windows paths are still matched with either separator.