Commit Graph
3102 Commits
Author SHA1 Message Date
dotCooCoo e9942b69d2 Help: a frame run while a file dialog waits is timed for the hang report
The input hook, the logic and the interface of a frame now mark their
time as timed whatever the activity around them, so a frame the system
runs while an in-line file dialog waits for the user is timed too, and
the dialog's wait is not timed again once the frame ends.
2026-11-11 17:36:11 -08:00
dotCooCoo 7f5e4519a5 Help: input in a focused floating window is timed for the hang report
The end of a frame counted the renderer as busy only when the main
window had the focus, so a stall drawing input in a focused floating
panel or document window wrote no hang report. A floating window that
has the focus and is not minimized now counts too. A frame that sends
that window commands to minimize or hide it, or to move or resize it,
ends idle, including commands its own pass sent, which are noted
before egui passes them on.
2026-11-11 17:26:09 -08:00
dotCooCoo 7f641b9c10 Help: a stalled interface writes a hang report, and Copy Troubleshooting Info copies it
When the interface thread stays in one part of a frame for 3 s, a
watching thread writes a hang report to the log and to
logs/hang-report-<process id>.txt. The report gives the part of the
frame (input hook, logic, interface, or the renderer after a frame in
which any window had input), a system clipboard call in progress, the
last 8 different command ids, the last 16 frame times, the platform,
window system, desktop and session type, Flatpak, graphics adapter, the
present mode and frame latency the app asks for, the running time and
the number of open documents. It holds no document contents, file paths
or command parameters. The interface thread marks its stages with a few
atomic stores a frame, and the watching thread reads those marks without
waiting on it.

The process keeps the report file locked until the interface answers
again, then removes it. A file nobody holds at a later launch was left
by a session that was closed while it did not answer: the launch writes
the report to the log, moves the file to logs/hang-report.1.txt and,
unless another start-up message is showing, says so in the status bar.
Help › Copy Troubleshooting Info puts the platform facts, the recent
commands and frame times and both sessions' reports on the clipboard for
a bug report. An in-line file dialog, an open menu of the macOS menu bar,
and the time after a frame that minimizes or hides the window or starts
moving or resizing it are not timed.

The menu label and the two status messages have rows in every catalog.
2026-11-11 15:19:35 -08:00
BFlat f9ff1caf54 Merge pull request #6648 from dotCooCoo/feat/dynamic-text-on-path
Type: Dynamic Text sizes type on a path to fill its brackets
2026-11-12 02:45:39 +07:00
BFlat 541f8beae7 Merge pull request #6643 from dotCooCoo/feat/pdf-large-pages-in-points
PDF: an option writes pages longer than 200 in at full size in points
2026-11-12 02:05:54 +07:00
BFlat c70d320d64 Merge pull request #6639 from dotCooCoo/fix/issue-6622
Part of #6622: Help Bar hints and tool names show in full on hover when clipped
2026-11-12 02:01:07 +07:00
BFlat 6a4ef12091 Merge pull request #6603 from Messhias/feat/g5-brush-lib-energy-beams
G5: built-in Energy Beams brush library
2026-11-12 01:43:54 +07:00
dotCooCoo 2606b70604 Type: Dynamic Text sizes type on a path to fill its brackets
Type › Dynamic Text (`type.dynamicText`, also on the Contextual Task Bar
for type on a path) scales the text by one factor so it fills the span
between its start and end brackets, and the layout fits it again after
each edit to the text, the path or a bracket. The first character's
size moves in 0.1 pt steps within 0.1 to 1,296 pt. Turning it off, or
threading the type, keeps the sizes it was drawn at.

- The model saves `dynamicText` only when on.
- SVG, the legacy .ai writer and the .ai editing data write the drawn
  sizes through `vectorcraft_text::drawn`; the editing data warns that
  the setting is not written.
- Shrink Text to Fit and Dynamic Text step the size the Character panel
  shows when a size measures the cap height, x-height or ICF box.

Docs: docs/mcp.md, docs/type-parity.md, docs/target-app-parity.md.
Part of #4134.
2026-11-11 10:42:49 -08:00
BFlat 210e9ad7d0 Merge pull request #6632 from dotCooCoo/feat/ruler-guides-as-objects
Guides: ruler guides are document objects on their layers
2026-11-12 01:32:07 +07:00
BFlat 69a021e0f7 Merge pull request #6630 from devius/ka-update
i18n(ka): update the Georgian catalog (55 strings)
2026-11-12 01:20:53 +07:00
dotCooCoo 3074560b07 PDF: an option writes pages longer than 200 in at full size in points
The Save PDF dialog's General section gets "Write pages longer than 200 in
at full size in points" (longPagesInPoints in document.exportPdf,
document.export, presets and document.pdfSettings), off by default. When it
is on, a page with a side longer than 14,400 pt is written with its media
box in points and no /UserUnit at every PDF version, and a PDF 1.5 file
stays PDF 1.5. The export's warning for such a page then says it is written
in points. With the option off, and for pages of 14,400 pt or less, the
file is the same as before.

Docs: docs/mcp.md, docs/target-app-parity.md. The new label has a row in
every catalog that lists the dialog's other options.
2026-11-11 10:17:24 -08:00
Fabio William Conceição 72c7cb5a73 G5: built-in Energy Beams brush library
Six brush libraries; MCP docs list Energy Beams with the other generated brush libraries.
2026-11-11 18:07:54 +00:00
dotCooCoo 4825113906 Part of #6622: Help Bar hints and tool names show in full on hover when clipped
The status message already ends in an ellipsis and shows its full text
on hover when it is clipped. The Help Bar's hint and the tool name in
the status bar ran past the window edge instead; the Dimension tool's
hint is wider than an 800-point window. Both now end in an ellipsis and
show their full text in a tooltip on hover. Screen readers receive the
full text, and text that fits shows no tooltip.

In a narrow status bar the tool name now ends in an ellipsis before it
takes the status message's room. Before, the tool name could leave the
message almost no width.

The tooltips of the clipped hint, tool name and message wrap to fit
inside the window. egui's tooltips are 500 points wide, which is wider
than an 800-point window at UI Scaling 1.6 or more.

The hint and tool name tests fail without the change. The status
message test covers its existing ellipsis and tooltip.
2026-11-11 09:58:49 -08:00
dotCooCoo 5ac7d97d85 Guides: ruler guides are document objects on their layers
Ruler guides were a list kept beside the layers. Each guide is now an
object of its layer or sublayer, always directly in it and above the
layer's art. These behave as on main:

- Guides draw on screen only. Exports (SVG, PDF, PNG, PSD), Fit All,
  Select All, the art bounds, clicks and marquees, and a layer's
  Pathfinder and Transform effects leave them out. The Layers panel
  lists them as guide rows of their layer, the highest guide.list
  index first.
- Deleting a layer deletes its guides, and merging layers keeps their
  guides in the merged layer.
- The guide commands number guides as guide.list does, in the order
  they were made.

New: each guide takes an id from the document's object ids. An object
command given a guide's id fails with an error, and node.move cannot
put a guide into a group or out of its layers. A guide made while an
opacity mask, a symbol or a pattern is edited moves to the top
visible, unlocked layer when editing ends.

File format: native files still save the guides in the document's
guides list, in every file version, so older builds read them. Each
entry may now also carry the guide's id, name, locked and hidden
flags; older builds ignore those fields. Opening a file puts each
saved guide on its layer (on the top visible, unlocked layer when the
file names none or a layer it does not have), and each saved guide
counts against the object limit for opening a file. A ruler guide node
that a file holds below a layer's art moves up to the layer's guides,
and one anywhere else (in a group or another object, beside the
layers, or in a symbol) is removed. Ruler guides read from an .ai file
become guide objects on the layer they were on, numbered in the order
the file lists them.
2026-11-11 09:52:28 -08:00
Fabio William Conceição f07c2f7e9c G5: built-in Skill Icons symbol library
Five symbol libraries; MCP docs list Skill Icons with the other generated symbol libraries.
2026-11-11 17:08:39 +00:00
BFlat b6b23703b0 Merge pull request #6608 from dotCooCoo/fix/inspect-pending-read-root
MCP: ui.inspect leaves out paths outside the read roots
2026-11-11 23:25:21 +07:00
dotCooCoo 774f7568da MCP: ui.inspect hides every loaded library path outside the read roots
Under --automation-read-root, ui.inspect and ui.docking hid a library's
path only when its panel was in ui.library_panels. A library used as the
Color Guide's limit, or named by a closed panel's place in
ui.docking_hidden, a workspace layout or the docking layout, still showed
its full loaded/<path> id.

The ids to hide now come from every place the UI state refers to a
library: the library panels, the Color Guide's limit, and the panel ids in
the docking layout, closed panels, icon and collapsed lists and workspace
layouts. Typed text such as a command palette query is not read as an id.

Two hidden libraries with the same file name no longer share one id, which
dropped one of them from an object keyed by panel id. They show as
loaded/<file name>, loaded/<file name> (2) and so on, in the order of
their full ids, and a library has the same id in ui.inspect and
ui.docking.

Docs: docs/mcp.md.
2026-11-11 07:40:36 -08:00
dotCooCoo 5d7e2fa8e1 MCP: ui.inspect leaves out paths outside the read roots
Under --automation-read-root, ui.inspect returned the paths of documents
still opening, the recent files, library panels' files and the folder
preferences even when they lay outside the read roots. The reply now
leaves them out, checked with file_access::check_read as ui.menu.list
checks recent files and listed scripts:

- opening and ui.recent_files keep only the readable paths, in order.
- A library panel keeps its row without its path; a library loaded from
  outside the roots shows as loaded/<file name> in its id and panel id,
  in ui.inspect and ui.docking.
- The folder preferences in ui.engine_prefs and in an open Preferences
  dialog are left out; an empty folder and the scratch disk choices
  Startup and None stay.

The app's own state is not changed. Without roots the replies are as
before.

Docs: docs/mcp.md, docs/control-protocol.md, docs/target-app-parity.md.
2026-11-11 06:13:33 -08:00
dotCooCoo 48e342f03b Merge main into feat/script-dollar-object 2026-11-11 05:55:39 -08:00
BFlat 015805322a Merge pull request #6594 from dotCooCoo/fix/menu-list-recent-test-disabled-rows
Tests: a recent file outside the read root is not listed even as a disabled row
2026-11-11 20:51:37 +07:00
BFlat bebe0a402a Merge pull request #6568 from Hassan1305/fix-6506-middle-click-close-tab
Document tabs: a middle-click closes the tab, as the × does (#6506)
2026-11-11 20:51:28 +07:00
HassanKhan 6c731e026a Merge remote-tracking branch 'upstream/main' into fix-6506-middle-click-close-tab
# Conflicts:
#	docs/ui-parity.md
2026-11-11 18:08:22 +05:00
dotCooCoo f77fe0423f Merge main into fix/script-console-report-text 2026-11-11 04:58:29 -08:00
dotCooCoo a69985fe60 Tests: a recent file outside the read root is not listed even as a disabled row
The test of #6580 compared only the enabled File > Open Recent Files
rows, so it also passed when ui.menu.list kept a file outside the read
root as a disabled row with its name. The test now compares every row,
marking disabled ones.
2026-11-11 04:57:10 -08:00
dotCooCoo ccf153dccc Merge main into feat/script-dollar-object 2026-11-11 04:52:37 -08:00
Davit Matchakhelidze 6ee426ef4b i18n(ka): update the Georgian catalog 2026-11-11 16:34:33 +04:00
Davit Matchakhelidze 971eaf9b3b Merge upstream into ka-update 2026-11-11 16:34:32 +04:00
BFlat 58c37a28e9 Merge pull request #6580 from dotCooCoo/fix/menu-list-recent-read-root
MCP: ui.menu.list leaves out recent files outside the read roots
2026-11-11 19:27:56 +07:00
Davit Matchakhelidze 0984292b57 i18n(ka): update the Georgian catalog 2026-11-11 16:27:17 +04:00
Davit Matchakhelidze 3b0585afd8 Merge upstream into ka-update 2026-11-11 16:27:17 +04:00
BFlat 5d5ce999d7 Merge pull request #6586 from dotCooCoo/fix/pen-escape-ends-only-active-path
Pen: one Escape after deselecting the path being drawn ends something else
2026-11-11 19:23:09 +07:00
dotCooCoo d50ea29772 Merge main into feat/script-dollar-object 2026-11-11 03:58:05 -08:00
HassanKhan cc7020847f Merge remote-tracking branch 'upstream/main' into fix-6506-middle-click-close-tab
# Conflicts:
#	docs/ui-parity.md
2026-11-11 16:45:31 +05:00
dotCooCoo 4cde1aaa1f Pen: Escape after the path is deselected ends something else
The Pen and the Smart Pen reported a path being drawn to Escape for as
long as they remembered the path, even after Deselect or Undo left it
unselected. That Escape then ended nothing, and isolation mode or a
rotated view needed a second press. Both tools now report the path only
while they would go on drawing it, as the Curvature tool does.

Follows #6405
2026-11-11 03:44:25 -08:00
dotCooCoo baf8056c5f Merge main into fix/script-console-report-text 2026-11-11 03:28:54 -08:00
BFlat 212bc9f837 Merge pull request #5457 from Taha-Mahmoodi/fix/ruler-double-click-guide
Fix #5239: double-clicking a ruler adds a guide there
2026-11-11 18:24:56 +07:00
BFlat 31971bc090 Merge pull request #6555 from dotCooCoo/feat/plugin-effect-open-budget
Plug-ins: live effects of a document's first view share a 2,000 ms budget
2026-11-11 18:22:28 +07:00
dotCooCoo dfa6e6ea60 MCP: ui.menu.list leaves out recent files outside the read roots
Under --automation-read-root, a control client's ui.menu.list (and
ui.contextMenu.list, which shares the listing) left every File › Open
Recent Files row in, so the client saw the names of recent files it may
not read. file.recentFiles returned their full paths, and
file.openRecentN for such a file answered with a refusal naming the path.

Now the listing leaves out a recent file outside the read roots, as it
already leaves out listed scripts outside them. The other rows keep their
ids, so file.openRecent3 still opens the third file. file.recentFiles
returns only the files inside the roots, in order, and file.openRecentN
for a file outside them ends with "no such recent file", as an empty slot
does. The person's own menus and Home screen are unchanged.

Docs: docs/mcp.md, docs/control-protocol.md, docs/target-app-parity.md.
2026-11-11 03:20:14 -08:00
Davit Matchakhelidze 4c4e4dda22 i18n(ka): update the Georgian catalog 2026-11-11 15:01:23 +04:00
HassanKhan be1ce4d2d7 Document tabs: test a middle-click on the ×; docs status and revision history (#6506)
Only closing a modified document's last view asks to save, so the docs row and the comment say so.
2026-11-11 15:57:09 +05:00
Davit Matchakhelidze d12a24f04a i18n(ka): update the Georgian catalog 2026-11-11 14:48:24 +04:00
Davit Matchakhelidze 01cd72d7c7 i18n(ka): update the Georgian catalog 2026-11-11 14:38:53 +04:00
dotCooCoo 0e4010d26b Merge main into feat/script-dollar-object 2026-11-11 02:35:43 -08:00
Taha-Mahmoodi 2a2add8af1 Merge remote-tracking branch 'origin/main' into fix/ruler-double-click-guide
# Conflicts:
#	docs/gaps.md
#	docs/target-app-parity.md
2026-11-11 15:01:34 +04:30
BFlat 6a2b5b9c06 Merge pull request #6459 from Messhias/feat/g5-style-lib-status-effects
G5: built-in Status Effects graphic style library
2026-11-11 17:30:34 +07:00
dotCooCoo bca428e699 Merge main into fix/script-console-report-text 2026-11-11 02:26:40 -08:00
HassanKhan 03a7320a0c Document tabs: a middle-click closes the tab, as the × does (#6506) 2026-11-11 15:19:26 +05:00
BFlat 9a28264cfe Merge pull request #6557 from dotCooCoo/feat/script-alert-confirm-prompt
Scripts: alert, confirm and prompt open dialogs with Stop, and headless runs take their answers from script.run
2026-11-11 17:13:46 +07:00
dotCooCoo 179bd81566 Scripts: the $ object's other members, localize and toSource
A script's $ object now has the other members the Dollar object page
lists: about, appEncoding, bp, build, buildDate, colorPicker,
decimalPoint, engineName, error, flags, gc, getenv, setenv, global,
hiresTimer, level, line, locale, localize, memCache, os, screens, sleep,
stack, strict and version. Scripts also get the global
localize(object, ...values), toSource(value) and
Object.prototype.toSource().

Each run starts with the interface's locale and its own $ state;
$.setenv changes only the run's copy of LANG, LC_MESSAGES, LC_ALL and
OS, and $.getenv returns null for every other name. $.sleep waits from
0 to 1,000 ms between frames, and script.stop ends the wait. toSource
writes plain data only and throws on cycles, getters, host objects and
values past the data limits.

The script checker reports $.localize as a $ member instead of the
global localize function.
2026-11-11 01:59:37 -08:00
dotCooCoo 9b2410d5f9 Script Console: report lines match script.console, counts of one are singular, every run ends
- The panel's report line gives a run without a clock as "time
  unavailable", as script.console does, instead of "? ms", and shows the
  slowest commands after "slowest:" as script.console does.
- "1 host call", "1 earlier line dropped" and "1 line cut" take the
  singular in the panel and in script.console, and each catalog gives
  its language's plural forms. The dropped and cut counts choose their
  forms independently.
- A run whose state is gone still gets an end line: "stopped" when it is
  abandoned, "internal" when the next slice finds it missing. Neither
  adds a report line. The missing-run path in script_pump now also puts
  the session's state back, as script_abandon does, so the next run can
  start.
2026-11-11 01:38:31 -08:00