Record: integration failures and window geometry

Outcome

The “Replace existing” failure was reproduced, explained, and made visible. The window geometry is now remembered for every handler window, with the position kept only where the platform permits it.

Why “Replace existing” Appeared to Fail

The real desktop state showed that the FreeCAD 1.1.3 integration had in fact succeeded: manifest 11aaf8de04157bd4, launcher org.freecad.FreeCAD.desktop, target ~/Applications/FreeCAD_1.1.3-Linux-x86_64-py311.AppImage, and the AppImageLauncher launcher moved into the backup directory. The failing attempts were retries, and three defects made them confusing.

Defect Effect Fix
The dialog showed stdout or stderr, and install prints the plan to stdout before it can fail the failure dialog showed the plan, which looks like success, and hid the error on stderr the dialog now shows both streams and labels the error output; a failed install is titled “Could not integrate”
A retry used the original Downloads path, but a successful run had already moved the file the plan failed with “cannot open file” and looked like a fresh bug the handler now detects that the file is gone and says so, pointing at the application menu; install also treats “source gone, target present” as already placed instead of failing
Every replace renamed the displaced launcher onto the same backup name an earlier backup could be overwritten backup names are now made unique with a numeric suffix

The .desktop Installed as an Icon

The real manifest contained:

icon=…/hicolor/256x256/apps/appimage_11aaf8de_org.freecad.FreeCAD.desktop

The root-icon matcher accepted any payload root file whose name began with the icon base, and FreeCAD’s payload root contains org.freecad.FreeCAD.desktop next to org.freecad.FreeCAD.svg. The desktop entry was therefore copied as a 256x256 icon.

Window Geometry

The Wayland Limitation

Position cannot be restored on a Wayland session. Wayland deliberately does not let a client choose or read its own toplevel position; the compositor owns placement, and GTK4 consequently has no move or get-position API. The user’s session here is XDG_SESSION_TYPE=wayland.

The handler therefore:

Verification

Verified 2026-09-22 with make test; all fifteen test scripts passed.

Commits