From 266ffbae441ed075ad1b970dd138279cba99ceb3 Mon Sep 17 00:00:00 2001 From: Niclas Overby Date: Fri, 14 Aug 2026 17:51:25 +0200 Subject: [PATCH] fix(cider): Command S opens a panel and Save writes the document, three missing methods later The proof is a file, not a screenshot: type a sentence, Command S, click Save, and /Users/root/Documents/Untitled 1 is an OpenDocument Text whose content.xml contains "Drag across this sentence with the mouse please". docs/wayland-save-panel.png is the panel. Three separate bugs, each fatal to saving on its own, and each one silent because LibreOffice caught it: setCanSelectHiddenExtension: missing killed the process before the panel was shown NSImage lockFocusFlipped: missing raised INSIDE the save path, so the panel never appeared and the keystroke traced perfectly to the application _selectFile: read the SELECTED ROW a file being saved does not exist, so nothing is selected, and the panel returned OK with an empty name The third has an exact A and B, one run apart, same script and same click on the same panel: no file with the row version, the document with the name field version. NSOpenPanel keeps the row behaviour in its own override, because for opening the row IS the answer. The second is the one worth remembering. It looked like flakiness: the panel opened in some runs and not others, the key events were identical, and the only trace of the failure was a raise line in the middle of a font log. Six of them across the runs. Grepping the logs for UNRECOGNIZED found all three in one go. vendor/patches/cocotron/0052 carries all of it, generated against the BUILT pin and checked by applying it to a copy and comparing every file with the tree that produced the saved document. --- docs/wayland-port.md | 31 +++ docs/wayland-save-panel.png | Bin 0 -> 55480 bytes src/darwin/wayland/window.rs | 39 +++- ...ave-panel-answers-and-names-the-file.patch | 189 ++++++++++++++++++ 4 files changed, 253 insertions(+), 6 deletions(-) create mode 100644 docs/wayland-save-panel.png create mode 100644 vendor/patches/cocotron/0052-save-panel-answers-and-names-the-file.patch diff --git a/docs/wayland-port.md b/docs/wayland-port.md index 45b4e9cc8..cf6a1aaf8 100644 --- a/docs/wayland-port.md +++ b/docs/wayland-port.md @@ -1763,3 +1763,34 @@ Both directions are checked, and the second one is the one that matters: The second is a control that FIRES: if the decline had stopped working, the line would be missing and X11 would never be reached on a machine without Wayland. + +## Saving a document works, and it took three missing methods + +docs/wayland-save-panel.png is the panel Command S opens: a file list of the guest root, Cancel and +Save. The proof is not the picture though, it is the file: type a sentence, Command S, click Save, +and /Users/root/Documents/Untitled 1 is an OpenDocument Text whose content.xml contains +"Drag across this sentence with the mouse please". + +THREE SEPARATE BUGS, each of which stopped the save on its own, and each invisible in the ordinary +sense: the application caught every one and reported nothing. + +1. -[NSSavePanel setCanSelectHiddenExtension:] did not exist. An application configures the panel + before showing it, so this killed the process outright: the whole dialog was built and then the + configure step raised. Unspecified Application Error, no panel. + +2. -[NSImage lockFocusFlipped:] did not exist. This one is subtler: the raise happened INSIDE the + save path, LibreOffice caught it, and the panel simply never appeared. The keystroke traced + perfectly to the application every time. This is what made the panel look flaky. + +3. -[NSSavePanel _selectFile:] took the filename from the SELECTED ROW, which cannot be right for a + save: the file does not exist yet, so nothing is selected, and the panel returned OK with an + empty name. Clicking Save closed the panel and saved nothing. It uses the name field the + application already sets, joined to the directory. NSOpenPanel keeps the row behaviour, in its + own override, because opening really is the row. + +The A and B for 3 is exact: the same script and the same click on the same panel wrote no file with +the row version and wrote the document with the name field version, one run apart. + +STILL WRONG in the panel: its buttons are clipped by about half. The panel maps at 500x400 and the +compositor tiles it to the full height, and something in the layout is a title bar taller than the +surface. The document window does not do this. Not chased yet. diff --git a/docs/wayland-save-panel.png b/docs/wayland-save-panel.png new file mode 100644 index 0000000000000000000000000000000000000000..046ae16a71f021eab3d9d21f025b7c61ba845516 GIT binary patch literal 55480 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∋G-$m%Y7L`~B|YwZ3!ulwP6-J<&2n|Zd? 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 TlPxu=ksz+8tDnm{r-UW|e7hh7 literal 0 HcmV?d00001 diff --git a/src/darwin/wayland/window.rs b/src/darwin/wayland/window.rs index 519e7b1b0..ac43cb27c 100644 --- a/src/darwin/wayland/window.rs +++ b/src/darwin/wayland/window.rs @@ -291,12 +291,37 @@ pub fn deliver_pending_configures() { "cider-wayland-window resized number={} size={width}x{height}", st.number ); - if st.delegate.is_null() { - continue; + let has_delegate = !st.delegate.is_null(); + if has_delegate { + unsafe { + let sel = objc::sel_registerName(cstr!("platformWindow:frameChanged:didSize:")); + objc::msg_send_frame_changed(st.delegate, sel, st.owner, st.frame, objc::YES); + } } - unsafe { - let sel = objc::sel_registerName(cstr!("platformWindow:frameChanged:didSize:")); - objc::msg_send_frame_changed(st.delegate, sel, st.owner, st.frame, objc::YES); + /* + * WHAT THE APPLICATION MADE OF THE SIZE WE JUST GAVE IT. A window whose content view ends up + * taller than the surface draws its bottom row of controls off the end of the buffer, which + * looks like a clipped dialog and not like a geometry bug, so the two rects are worth having + * side by side rather than inferred from a screenshot. + */ + if has_delegate && std::env::var_os("CIDER_WAYLAND_TRACE_GEOMETRY").is_some() { + // THE DELEGATE IS THE NSWindow. st.owner is our own platform window, which answers the + // sixteen selectors AppKit sends a backend window and NOT -contentView; asking it + // raises inside our own code and the application reports Unspecified Application Error. + unsafe { + let f = objc::msg_send_rect_ret(st.delegate, objc::sel_registerName(cstr!("frame"))); + let cv = objc::msg_send0(st.delegate, objc::sel_registerName(cstr!("contentView"))); + let cf = if cv.is_null() { + objc::NsRect::new(0.0, 0.0, 0.0, 0.0) + } else { + objc::msg_send_rect_ret(cv, objc::sel_registerName(cstr!("frame"))) + }; + println!( + "cider-wayland-geometry number={} delegate={} surface={}x{} frame={}x{} content={}x{}+{}+{}", + st.number, has_delegate, width, height, f.size.width, f.size.height, + cf.size.width, cf.size.height, cf.origin.x, cf.origin.y + ); + } } /* * AND REDRAW THE WHOLE THING. A frame change makes the application lay out again, and it @@ -308,7 +333,9 @@ pub fn deliver_pending_configures() { * is resized once during startup and the rest of the bar was laid out into a strip nobody * repainted. One click on the bar brought all of it back. */ - st.needs_full_display = true; + if has_delegate { + st.needs_full_display = true; + } } } diff --git a/vendor/patches/cocotron/0052-save-panel-answers-and-names-the-file.patch b/vendor/patches/cocotron/0052-save-panel-answers-and-names-the-file.patch new file mode 100644 index 000000000..95dae973d --- /dev/null +++ b/vendor/patches/cocotron/0052-save-panel-answers-and-names-the-file.patch @@ -0,0 +1,189 @@ +--- a/AppKit/include/AppKit/NSSavePanel.h ++++ b/AppKit/include/AppKit/NSSavePanel.h +@@ -41,6 +41,10 @@ + + BOOL _showsHiddenFiles; + ++ /* Whether the panel offers the "Hide extension" checkbox. Stored rather than ignored because ++ * the caller that sets it also reads it back. */ ++ BOOL _canSelectHiddenExtension; ++ + BOOL _treatsFilePackagesAsDirectories; + NSView *_accessoryView; + +@@ -79,6 +83,14 @@ + + - (void) setAccessoryView: (NSView *) view; + - (void) setCanCreateDirectories: (BOOL) value; ++ ++/* THE THREE AN APPLICATION SENDS TO A SAVE PANEL THAT WERE NOT HERE. Sending any of them to a panel ++ * that does not answer raises, and an application that configures its panel before showing it dies ++ * before the panel appears. See the implementation. */ ++- (void) setCanSelectHiddenExtension: (BOOL) value; ++- (BOOL) canSelectHiddenExtension; ++- (void) validateVisibleColumns; ++- (IBAction) cancel: (id) sender; + - (void) setAllowedFileTypes: (NSArray *) value; + - (void) setAllowsOtherFileTypes: (BOOL) value; + +--- a/AppKit/NSSavePanel.subproj/NSSavePanel.m ++++ b/AppKit/NSSavePanel.subproj/NSSavePanel.m +@@ -113,9 +113,45 @@ + } + } + ++/* ++ * WHAT A SAVE PANEL RETURNS, and why saving a document did nothing at all. ++ * ++ * This took the filename from the SELECTED ROW. That is right for an open panel and cannot be right ++ * for a save panel: the file being saved does not exist yet, so there is no row to select, and with ++ * no selection -itemAtRow: is handed -1, answers nil, and the panel returned NSOKButton with an ++ * empty filename. LibreOffice asked for a save location, got "", and quietly did nothing -- the ++ * panel closed, the document stayed unsaved, and no error was raised anywhere. ++ * ++ * THE NAME COMES FROM THE NAME FIELD, which is what an application sets before it shows the panel ++ * (-setNameFieldStringValue:, already stored here) and what a name field would write into. It is ++ * joined to the directory the panel is showing, or to a selected DIRECTORY row when there is one, ++ * which is how a save panel picks a destination. ++ * ++ * With no name set, the old behaviour stands, so an open panel and a save panel used as a picker ++ * both still answer with the row. NSOpenPanel overrides this anyway, deliberately: nothing about ++ * opening should change because saving was fixed. ++ */ + - (IBAction) _selectFile: (id) sender { + NSURL *url = [_outlineView itemAtRow: [_outlineView selectedRow]]; +- [self _setFilename: [url path]]; ++ NSString *path = [url path]; ++ NSString *name = [self nameFieldStringValue]; ++ ++ if ([name length] > 0) { ++ NSFileManager *fm = [NSFileManager defaultManager]; ++ BOOL isDirectory = NO; ++ NSString *directory = path; ++ ++ if (directory == nil || ++ ![fm fileExistsAtPath: directory isDirectory: &isDirectory] || !isDirectory) { ++ directory = [self directory]; ++ } ++ if ([directory length] == 0) { ++ directory = NSHomeDirectory(); ++ } ++ path = [directory stringByAppendingPathComponent: name]; ++ } ++ ++ [self _setFilename: path]; + + [NSApp stopModalWithCode: NSOKButton]; + } +@@ -247,6 +283,41 @@ + NSUnimplementedMethod(); + } + ++/* ++ * THE THREE A SAVE PANEL HAS TO ANSWER, and the first one is why Command S killed LibreOffice. ++ * ++ * An application configures the panel before it shows it, so an unrecognized selector here is fatal ++ * BEFORE anything is drawn: the whole dialog was built -- outline view, scrollers, table corner -- ++ * and then -setCanSelectHiddenExtension: raised and the process reported Unspecified Application ++ * Error. Saving a document was impossible and nothing said which selector it was until the ++ * exception was caught. ++ * ++ * The flag is STORED rather than dropped: it decides whether the panel offers the "Hide extension" ++ * checkbox, and a caller that sets it reads it back to lay out its accessory view. ++ * ++ * -validateVisibleColumns asks a panel to re-read what it is showing, which is a refresh HINT and ++ * not a command; this panel builds its list when it opens and has no browser columns to re-read, so ++ * doing nothing is the correct answer rather than a stub for one. ++ * ++ * -cancel: is the standard action name for the dismiss button and is what an application sends to ++ * close a panel it opened itself. The panel already has -_cancel: for its own button, so this is ++ * the public name for the same thing rather than a second implementation of it. ++ */ ++- (void) setCanSelectHiddenExtension: (BOOL) value { ++ _canSelectHiddenExtension = value; ++} ++ ++- (BOOL) canSelectHiddenExtension { ++ return _canSelectHiddenExtension; ++} ++ ++- (void) validateVisibleColumns { ++} ++ ++- (IBAction) cancel: (id) sender { ++ [self _cancel: sender]; ++} ++ + - (void) setAllowedFileTypes: (NSArray *) value { + [_allowedFileTypes release]; + _allowedFileTypes = [value copy]; +--- a/AppKit/NSSavePanel.subproj/NSOpenPanel.m ++++ b/AppKit/NSSavePanel.subproj/NSOpenPanel.m +@@ -95,6 +95,20 @@ + _filenames = [@[ filename ] retain]; + } + ++/* ++ * OPENING ANSWERS WITH THE ROW, and says so here rather than relying on the superclass. ++ * ++ * NSSavePanel's version now prefers the name field, because a file being SAVED does not exist yet ++ * and has no row. An open panel is the opposite case: the row is the whole answer, and a stale name ++ * left in the field must not override what the user picked. ++ */ ++- (IBAction) _selectFile: (id) sender { ++ NSURL *url = [_outlineView itemAtRow: [_outlineView selectedRow]]; ++ [self _setFilename: [url path]]; ++ ++ [NSApp stopModalWithCode: NSOKButton]; ++} ++ + - (NSInteger) runModalForDirectory: (NSString *) directory + file: (NSString *) file + types: (NSArray *) types +--- a/AppKit/include/AppKit/NSImage.h ++++ b/AppKit/include/AppKit/NSImage.h +@@ -113,6 +113,9 @@ + factor: (float) factor; + + - (void) lockFocus; ++/* Locks focus with the origin at the TOP when flipped is YES. See the implementation: a missing ++ * one is what stopped LibreOffice from saving. */ ++- (void) lockFocusFlipped: (BOOL) flipped; + - (void) lockFocusOnRepresentation: (NSImageRep *) representation; + - (void) unlockFocus; + +--- a/AppKit/NSImage.m ++++ b/AppKit/NSImage.m +@@ -967,6 +967,32 @@ + [self lockFocusOnRepresentation: nil]; + } + ++/* ++ * DRAWING INTO AN IMAGE WITH THE ORIGIN AT THE TOP, which is what an application asks for when it ++ * renders an icon it is about to put in a view whose coordinates run downwards. ++ * ++ * IT IS ON THE SAVE PATH, which is why a missing method here was not a cosmetic gap: Command S in ++ * LibreOffice raised -[NSImage lockFocusFlipped:] as an unrecognized selector, the application ++ * caught it, and the save panel never opened. Nothing was logged but the raise itself, and the ++ * document simply did not save. ++ * ++ * The flip is the CTM, not a flag: translate to the top edge and invert Y, so a drawing operation ++ * with a small y lands near the top. lockFocus does the rest and unlockFocus is unchanged, since ++ * restoring the context discards the transform with it. ++ */ ++- (void) lockFocusFlipped: (BOOL) flipped { ++ [self lockFocus]; ++ ++ if (flipped) { ++ CGContextRef context = [[NSGraphicsContext currentContext] graphicsPort]; ++ ++ if (context != NULL) { ++ CGContextTranslateCTM(context, 0.0, [self size].height); ++ CGContextScaleCTM(context, 1.0, -1.0); ++ } ++ } ++} ++ + - (void) lockFocusOnRepresentation: (NSImageRep *) representation { + NSGraphicsContext *context = nil; + CGContextRef graphicsPort; -- 2.51.2