Skip to content

NSMenuView: opt-in Tognazzini "aim triangle" submenu tracking - #451

Open
mrtonik wants to merge 2 commits into
gnustep:masterfrom
mrtonik:submenu-aim-triangle
Open

NSMenuView: opt-in Tognazzini "aim triangle" submenu tracking#451
mrtonik wants to merge 2 commits into
gnustep:masterfrom
mrtonik:submenu-aim-triangle

Conversation

@mrtonik

@mrtonik mrtonik commented Jul 1, 2026

Copy link
Copy Markdown

NSMenuView: opt-in Tognazzini "aim triangle" submenu tracking

Summary

What: This PR adds the "aim triangle" (wedge) algorithm feature from the
classic Macintosh hierarchical menus, as specified by Bruce Tognazzini to the
submenu-tracking logic in NSMenuView.m.

Why: The current approach protects a newly opened submenu from closing using
a short fixed delay combined with a horizontal-movement check. This works
reasonably well, but since human arm movement pivots at the elbow, users
naturally drift vertically while sliding toward a submenu, and a timer-based
approach can't fully account for that.

The wedge algorithm instead tracks direction rather than time: it forms a
triangle from the point where the pointer entered the parent item to the near
edge of the open submenu, and keeps the submenu open as long as the pointer
stays within that triangle, however slowly the user moves. A clear vertical move
outside the triangle switches items immediately. This mirrors how the original
Mac implementation handled the problem and removes the need for a fixed timeout,
while ideally making submenu navigation a bit more forgiving for natural mouse
movement.

Behavior

  • Default off — with the default unset, tracking is byte-for-byte the
    existing behavior.
  • GSMenuSubmenuAimTracking = YES enables the wedge.

Scope / limitations

Aim tracking applies to vertical menus only. It is deliberately disabled for
horizontal menu views (-[NSMenuView isHorizontal]), so switching between
top-level items on a horizontal menu bar stays instant, as it should. A
practical consequence worth calling out: for a horizontal / global menu bar,
the first-level submenu opens below the bar and is therefore not wedge-tracked

— only the deeper, vertically-stacked submenus benefit from the aim triangle.
This matches the intent (the diagonal-traversal problem the wedge solves only
exists for side-opening vertical submenus) and keeps menu-bar navigation
feeling instant.

Implementation notes

  • All tracking logic stays in -[NSMenuView _trackWithEvent:startingMenuView:];
    the legacy heuristic is preserved unchanged in the else branch.
  • The point-in-triangle test is a small private class method
    (+_mouseAt:aimsAtSubmenuFrame:fromApex:slack:) using three edge
    cross-products. The all-same-sign check is orientation independent, so it is
    immune to GNUstep's flipped screen coordinates and to submenus nudged leftward
    by shiftOnScreen.
  • The apex and the pointer are tested in screen coordinates; the park timer
    compares window-base points (translation-invariant distance).

Compatibility

Opt-in via a user default; no API or behavior change unless the default is set.
Works across interface styles (NeXTstep / Win95 / Macintosh) since the wedge only
gates the just-attached-submenu reset and falls back cleanly when the submenu
window is not available.

Documentation

  • Documentation/GuiUser/DefaultsSummary.gsdoc documents the new default.
  • The NSMenuView.h header comment now describes the opt-in mode (replacing the
    "rather adhoc" note).

Testing

  • Tests/gui/NSMenuView/aim_triangle.m — geometry regression test covering the
    diagonal-inside, vertical-outside, slack-boundary, and left-opening (right
    edge) cases.
  • Full gnustep-gui build is warning-free.

Let me know your thoughts, if I missed something, or if I should change anything.

Replace the ad-hoc time/velocity heuristic that decides when a just-opened
submenu stops being protected with a directional wedge, enabled by the
GSMenuSubmenuAimTracking user default. While the pointer keeps aiming into
the open submenu it stays open at any speed; leaving the wedge (a deliberate
vertical move to a sibling) switches at once, and a short park timeout still
switches if the pointer stops over another item. The previous behaviour is
kept byte-for-byte when the default is unset, and aim tracking is confined
to vertical menus so horizontal bars keep their instant switch.

Adds a geometry regression test and documents the new default.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@mrtonik
mrtonik requested a review from fredkiefer as a code owner July 1, 2026 13:05
@probonopd

Copy link
Copy Markdown
Contributor

Thank you very much @mrtonik, this will greatly improve how submenus work.

When I try to build this, I get:

 Compiling file NSDataAsset.m ...
 Compiling file NSDataLink.m ...
NSDataLink.m:57:7: error: use of undeclared identifier '_linkNumber'; did you mean 'linkNumber'?
   57 |       _linkNumber = 0;
      |       ^~~~~~~~~~~
      |       linkNumber
/System/Library/Headers/AppKit/NSDataLink.h:67:25: note: 'linkNumber' declared here
   67 |   NSDataLinkNumber      linkNumber;
      |                         ^
NSDataLink.m:58:7: error: use of undeclared identifier '_disposition'; did you mean 'disposition'?
   58 |       _disposition = NSLinkInDestination;
      |       ^~~~~~~~~~~~
      |       disposition
/System/Library/Headers/AppKit/NSDataLink.h:68:25: note: 'disposition' declared
here
   68 |   NSDataLinkDisposition disposition;
      |                         ^
NSDataLink.m:59:7: error: use of undeclared identifier '_updateMode'; did you mean 'updateMode'?
   59 |       _updateMode = NSUpdateContinuously;
      |       ^~~~~~~~~~~
      |       updateMode
/System/Library/Headers/AppKit/NSDataLink.h:69:25: note: 'updateMode' declared here
   69 |   NSDataLinkUpdateMode  updateMode;
      |                         ^
NSDataLink.m:60:7: error: use of undeclared identifier '_lastUpdateTime'; did you mean 'lastUpdateTime'?
   60 |       _lastUpdateTime = nil;
      |       ^~~~~~~~~~~~~~~
      |       lastUpdateTime
/System/Library/Headers/AppKit/NSDataLink.h:72:26: note: 'lastUpdateTime' declared here
   72 |   NSDate                *lastUpdateTime;
      |                          ^
NSDataLink.m:61:7: error: use of undeclared identifier '_sourceApplicationName'; did you mean 'sourceApplicationName'?
   61 |       _sourceApplicationName = nil;
      |       ^~~~~~~~~~~~~~~~~~~~~~
      |       sourceApplicationName
/System/Library/Headers/AppKit/NSDataLink.h:73:26: note: 'sourceApplicationName' declared here
   73 |   NSString              *sourceApplicationName;
      |                          ^
NSDataLink.m:62:7: error: use of undeclared identifier '_sourceFilename'; did you mean 'sourceFilename'?
   62 |       _sourceFilename = nil;
      |       ^~~~~~~~~~~~~~~
      |       sourceFilename
/System/Library/Headers/AppKit/NSDataLink.h:74:26: note: 'sourceFilename' declared here
   74 |   NSString              *sourceFilename;
      |                          ^
NSDataLink.m:63:7: error: use of undeclared identifier '_sourceSelection'; did you mean 'sourceSelection'?
   63 |       _sourceSelection = nil;
      |       ^~~~~~~~~~~~~~~~
      |       sourceSelection
/System/Library/Headers/AppKit/NSDataLink.h:75:26: note: 'sourceSelection' declared here
   75 |   NSSelection           *sourceSelection;
      |                          ^
NSDataLink.m:64:7: error: use of undeclared identifier '_sourceManager'; did you mean 'sourceManager'?
   64 |       _sourceManager = nil;
      |       ^~~~~~~~~~~~~~
      |       sourceManager
/System/Library/Headers/AppKit/NSDataLink.h:76:25: note: 'sourceManager' declared here
   76 |   id                    sourceManager;
      |                         ^
NSDataLink.m:65:7: error: use of undeclared identifier '_destinationApplicationName'; did you mean 'destinationApplicationName'?
   65 |       _destinationApplicationName = nil;
      |       ^~~~~~~~~~~~~~~~~~~~~~~~~~~
      |       destinationApplicationName
/System/Library/Headers/AppKit/NSDataLink.h:79:26: note: 'destinationApplicationName' declared here
   79 |   NSString              *destinationApplicationName;
      |                          ^
NSDataLink.m:66:7: error: use of undeclared identifier '_destinationFilename'; did you mean 'destinationFilename'?
   66 |       _destinationFilename = nil;
      |       ^~~~~~~~~~~~~~~~~~~~
      |       destinationFilename
/System/Library/Headers/AppKit/NSDataLink.h:80:26: note: 'destinationFilename' declared here
   80 |   NSString              *destinationFilename;
      |                          ^
NSDataLink.m:67:7: error: use of undeclared identifier '_destinationSelection';
did you mean 'destinationSelection'?
   67 |       _destinationSelection = nil;
      |       ^~~~~~~~~~~~~~~~~~~~~
      |       destinationSelection
/System/Library/Headers/AppKit/NSDataLink.h:81:26: note: 'destinationSelection'
declared here
   81 |   NSSelection           *destinationSelection;
      |                          ^
NSDataLink.m:68:7: error: use of undeclared identifier '_destinationManager'; did you mean 'destinationManager'?
   68 |       _destinationManager = nil;
      |       ^~~~~~~~~~~~~~~~~~~
      |       destinationManager
/System/Library/Headers/AppKit/NSDataLink.h:82:25: note: 'destinationManager' declared here
   82 |   id                    destinationManager;
      |                         ^
NSDataLink.m:69:7: error: use of undeclared identifier '_types'; did you mean 'types'?
   69 |       _types = nil;
      |       ^~~~~~
      |       types
/System/Library/Headers/AppKit/NSDataLink.h:85:26: note: 'types' declared here
   85 |   NSArray               *types;
      |                          ^
NSDataLink.m:83:11: error: use of undeclared identifier '_lastUpdateTime'; did you mean 'lastUpdateTime'?
   83 |   RELEASE(_lastUpdateTime);
      |           ^~~~~~~~~~~~~~~
      |           lastUpdateTime
/System/Library/Headers/GNUstepBase/GNUstep.h:130:32: note: expanded from macro
'RELEASE'
  130 | #define RELEASE(object)         [(id)(object) release]
      |                                       ^
/System/Library/Headers/AppKit/NSDataLink.h:72:26: note: 'lastUpdateTime' declared here
   72 |   NSDate                *lastUpdateTime;
      |                          ^
NSDataLink.m:84:11: error: use of undeclared identifier '_sourceApplicationName'; did you mean 'sourceApplicationName'?
   84 |   RELEASE(_sourceApplicationName);
      |           ^~~~~~~~~~~~~~~~~~~~~~
      |           sourceApplicationName
/System/Library/Headers/GNUstepBase/GNUstep.h:130:32: note: expanded from macro
'RELEASE'
  130 | #define RELEASE(object)         [(id)(object) release]
      |                                       ^
/System/Library/Headers/AppKit/NSDataLink.h:73:26: note: 'sourceApplicationName' declared here
   73 |   NSString              *sourceApplicationName;
      |                          ^
NSDataLink.m:85:11: error: use of undeclared identifier '_sourceFilename'; did you mean 'sourceFilename'?
   85 |   RELEASE(_sourceFilename);
      |           ^~~~~~~~~~~~~~~
      |           sourceFilename
/System/Library/Headers/GNUstepBase/GNUstep.h:130:32: note: expanded from macro
'RELEASE'
  130 | #define RELEASE(object)         [(id)(object) release]
      |                                       ^
/System/Library/Headers/AppKit/NSDataLink.h:74:26: note: 'sourceFilename' declared here
   74 |   NSString              *sourceFilename;
      |                          ^
NSDataLink.m:86:11: error: use of undeclared identifier '_sourceSelection'; did
you mean 'sourceSelection'?
   86 |   RELEASE(_sourceSelection);
      |           ^~~~~~~~~~~~~~~~
      |           sourceSelection
/System/Library/Headers/GNUstepBase/GNUstep.h:130:32: note: expanded from macro
'RELEASE'
  130 | #define RELEASE(object)         [(id)(object) release]
      |                                       ^
/System/Library/Headers/AppKit/NSDataLink.h:75:26: note: 'sourceSelection' declared here
   75 |   NSSelection           *sourceSelection;
      |                          ^
NSDataLink.m:87:11: error: use of undeclared identifier '_destinationApplicationName'; did you mean 'destinationApplicationName'?
   87 |   RELEASE(_destinationApplicationName);
      |           ^~~~~~~~~~~~~~~~~~~~~~~~~~~
      |           destinationApplicationName
/System/Library/Headers/GNUstepBase/GNUstep.h:130:32: note: expanded from macro
'RELEASE'
  130 | #define RELEASE(object)         [(id)(object) release]
      |                                       ^
/System/Library/Headers/AppKit/NSDataLink.h:79:26: note: 'destinationApplicationName' declared here
   79 |   NSString              *destinationApplicationName;
      |                          ^
NSDataLink.m:88:11: error: use of undeclared identifier '_destinationFilename';
did you mean 'destinationFilename'?
   88 |   RELEASE(_destinationFilename);
      |           ^~~~~~~~~~~~~~~~~~~~
      |           destinationFilename
/System/Library/Headers/GNUstepBase/GNUstep.h:130:32: note: expanded from macro
'RELEASE'
  130 | #define RELEASE(object)         [(id)(object) release]
      |                                       ^
/System/Library/Headers/AppKit/NSDataLink.h:80:26: note: 'destinationFilename' declared here
   80 |   NSString              *destinationFilename;
      |                          ^
fatal error: too many errors emitted, stopping now [-ferror-limit=]
20 errors generated.
gmake[4]: *** [/System/Library/Makefiles/rules.make:534: obj/libgnustep-gui.obj/NSDataLink.m.o] Error 1
gmake[3]: *** [/System/Library/Makefiles/Instance/library.make:286: internal-library-all_] Error 2
gmake[2]: *** [/System/Library/Makefiles/Master/rules.make:297: libgnustep-gui.all.library.variables] Error 2
gmake[1]: *** [/System/Library/Makefiles/Master/library.make:37: internal-all] Error 2
gmake: *** [/System/Library/Makefiles/Master/serial-subdirectories.make:53: internal-all] Error 2

Do you have an idea what might be causing this?

@mrtonik

mrtonik commented Jul 4, 2026

Copy link
Copy Markdown
Author

Thank you very much @mrtonik, this will greatly improve how submenus work.

When I try to build this, I get:

 Compiling file NSDataAsset.m ...
 Compiling file NSDataLink.m ...
NSDataLink.m:57:7: error: use of undeclared identifier '_linkNumber'; did you mean 'linkNumber'?
   57 |       _linkNumber = 0;
      |       ^~~~~~~~~~~
      |       linkNumber
/System/Library/Headers/AppKit/NSDataLink.h:67:25: note: 'linkNumber' declared here
   67 |   NSDataLinkNumber      linkNumber;
      |                         ^
NSDataLink.m:58:7: error: use of undeclared identifier '_disposition'; did you mean 'disposition'?
   58 |       _disposition = NSLinkInDestination;
      |       ^~~~~~~~~~~~
      |       disposition
/System/Library/Headers/AppKit/NSDataLink.h:68:25: note: 'disposition' declared
here
   68 |   NSDataLinkDisposition disposition;
      |                         ^
NSDataLink.m:59:7: error: use of undeclared identifier '_updateMode'; did you mean 'updateMode'?
   59 |       _updateMode = NSUpdateContinuously;
      |       ^~~~~~~~~~~
      |       updateMode
/System/Library/Headers/AppKit/NSDataLink.h:69:25: note: 'updateMode' declared here
   69 |   NSDataLinkUpdateMode  updateMode;
      |                         ^
NSDataLink.m:60:7: error: use of undeclared identifier '_lastUpdateTime'; did you mean 'lastUpdateTime'?
   60 |       _lastUpdateTime = nil;
      |       ^~~~~~~~~~~~~~~
      |       lastUpdateTime
/System/Library/Headers/AppKit/NSDataLink.h:72:26: note: 'lastUpdateTime' declared here
   72 |   NSDate                *lastUpdateTime;
      |                          ^
NSDataLink.m:61:7: error: use of undeclared identifier '_sourceApplicationName'; did you mean 'sourceApplicationName'?
   61 |       _sourceApplicationName = nil;
      |       ^~~~~~~~~~~~~~~~~~~~~~
      |       sourceApplicationName
/System/Library/Headers/AppKit/NSDataLink.h:73:26: note: 'sourceApplicationName' declared here
   73 |   NSString              *sourceApplicationName;
      |                          ^
NSDataLink.m:62:7: error: use of undeclared identifier '_sourceFilename'; did you mean 'sourceFilename'?
   62 |       _sourceFilename = nil;
      |       ^~~~~~~~~~~~~~~
      |       sourceFilename
/System/Library/Headers/AppKit/NSDataLink.h:74:26: note: 'sourceFilename' declared here
   74 |   NSString              *sourceFilename;
      |                          ^
NSDataLink.m:63:7: error: use of undeclared identifier '_sourceSelection'; did you mean 'sourceSelection'?
   63 |       _sourceSelection = nil;
      |       ^~~~~~~~~~~~~~~~
      |       sourceSelection
/System/Library/Headers/AppKit/NSDataLink.h:75:26: note: 'sourceSelection' declared here
   75 |   NSSelection           *sourceSelection;
      |                          ^
NSDataLink.m:64:7: error: use of undeclared identifier '_sourceManager'; did you mean 'sourceManager'?
   64 |       _sourceManager = nil;
      |       ^~~~~~~~~~~~~~
      |       sourceManager
/System/Library/Headers/AppKit/NSDataLink.h:76:25: note: 'sourceManager' declared here
   76 |   id                    sourceManager;
      |                         ^
NSDataLink.m:65:7: error: use of undeclared identifier '_destinationApplicationName'; did you mean 'destinationApplicationName'?
   65 |       _destinationApplicationName = nil;
      |       ^~~~~~~~~~~~~~~~~~~~~~~~~~~
      |       destinationApplicationName
/System/Library/Headers/AppKit/NSDataLink.h:79:26: note: 'destinationApplicationName' declared here
   79 |   NSString              *destinationApplicationName;
      |                          ^
NSDataLink.m:66:7: error: use of undeclared identifier '_destinationFilename'; did you mean 'destinationFilename'?
   66 |       _destinationFilename = nil;
      |       ^~~~~~~~~~~~~~~~~~~~
      |       destinationFilename
/System/Library/Headers/AppKit/NSDataLink.h:80:26: note: 'destinationFilename' declared here
   80 |   NSString              *destinationFilename;
      |                          ^
NSDataLink.m:67:7: error: use of undeclared identifier '_destinationSelection';
did you mean 'destinationSelection'?
   67 |       _destinationSelection = nil;
      |       ^~~~~~~~~~~~~~~~~~~~~
      |       destinationSelection
/System/Library/Headers/AppKit/NSDataLink.h:81:26: note: 'destinationSelection'
declared here
   81 |   NSSelection           *destinationSelection;
      |                          ^
NSDataLink.m:68:7: error: use of undeclared identifier '_destinationManager'; did you mean 'destinationManager'?
   68 |       _destinationManager = nil;
      |       ^~~~~~~~~~~~~~~~~~~
      |       destinationManager
/System/Library/Headers/AppKit/NSDataLink.h:82:25: note: 'destinationManager' declared here
   82 |   id                    destinationManager;
      |                         ^
NSDataLink.m:69:7: error: use of undeclared identifier '_types'; did you mean 'types'?
   69 |       _types = nil;
      |       ^~~~~~
      |       types
/System/Library/Headers/AppKit/NSDataLink.h:85:26: note: 'types' declared here
   85 |   NSArray               *types;
      |                          ^
NSDataLink.m:83:11: error: use of undeclared identifier '_lastUpdateTime'; did you mean 'lastUpdateTime'?
   83 |   RELEASE(_lastUpdateTime);
      |           ^~~~~~~~~~~~~~~
      |           lastUpdateTime
/System/Library/Headers/GNUstepBase/GNUstep.h:130:32: note: expanded from macro
'RELEASE'
  130 | #define RELEASE(object)         [(id)(object) release]
      |                                       ^
/System/Library/Headers/AppKit/NSDataLink.h:72:26: note: 'lastUpdateTime' declared here
   72 |   NSDate                *lastUpdateTime;
      |                          ^
NSDataLink.m:84:11: error: use of undeclared identifier '_sourceApplicationName'; did you mean 'sourceApplicationName'?
   84 |   RELEASE(_sourceApplicationName);
      |           ^~~~~~~~~~~~~~~~~~~~~~
      |           sourceApplicationName
/System/Library/Headers/GNUstepBase/GNUstep.h:130:32: note: expanded from macro
'RELEASE'
  130 | #define RELEASE(object)         [(id)(object) release]
      |                                       ^
/System/Library/Headers/AppKit/NSDataLink.h:73:26: note: 'sourceApplicationName' declared here
   73 |   NSString              *sourceApplicationName;
      |                          ^
NSDataLink.m:85:11: error: use of undeclared identifier '_sourceFilename'; did you mean 'sourceFilename'?
   85 |   RELEASE(_sourceFilename);
      |           ^~~~~~~~~~~~~~~
      |           sourceFilename
/System/Library/Headers/GNUstepBase/GNUstep.h:130:32: note: expanded from macro
'RELEASE'
  130 | #define RELEASE(object)         [(id)(object) release]
      |                                       ^
/System/Library/Headers/AppKit/NSDataLink.h:74:26: note: 'sourceFilename' declared here
   74 |   NSString              *sourceFilename;
      |                          ^
NSDataLink.m:86:11: error: use of undeclared identifier '_sourceSelection'; did
you mean 'sourceSelection'?
   86 |   RELEASE(_sourceSelection);
      |           ^~~~~~~~~~~~~~~~
      |           sourceSelection
/System/Library/Headers/GNUstepBase/GNUstep.h:130:32: note: expanded from macro
'RELEASE'
  130 | #define RELEASE(object)         [(id)(object) release]
      |                                       ^
/System/Library/Headers/AppKit/NSDataLink.h:75:26: note: 'sourceSelection' declared here
   75 |   NSSelection           *sourceSelection;
      |                          ^
NSDataLink.m:87:11: error: use of undeclared identifier '_destinationApplicationName'; did you mean 'destinationApplicationName'?
   87 |   RELEASE(_destinationApplicationName);
      |           ^~~~~~~~~~~~~~~~~~~~~~~~~~~
      |           destinationApplicationName
/System/Library/Headers/GNUstepBase/GNUstep.h:130:32: note: expanded from macro
'RELEASE'
  130 | #define RELEASE(object)         [(id)(object) release]
      |                                       ^
/System/Library/Headers/AppKit/NSDataLink.h:79:26: note: 'destinationApplicationName' declared here
   79 |   NSString              *destinationApplicationName;
      |                          ^
NSDataLink.m:88:11: error: use of undeclared identifier '_destinationFilename';
did you mean 'destinationFilename'?
   88 |   RELEASE(_destinationFilename);
      |           ^~~~~~~~~~~~~~~~~~~~
      |           destinationFilename
/System/Library/Headers/GNUstepBase/GNUstep.h:130:32: note: expanded from macro
'RELEASE'
  130 | #define RELEASE(object)         [(id)(object) release]
      |                                       ^
/System/Library/Headers/AppKit/NSDataLink.h:80:26: note: 'destinationFilename' declared here
   80 |   NSString              *destinationFilename;
      |                          ^
fatal error: too many errors emitted, stopping now [-ferror-limit=]
20 errors generated.
gmake[4]: *** [/System/Library/Makefiles/rules.make:534: obj/libgnustep-gui.obj/NSDataLink.m.o] Error 1
gmake[3]: *** [/System/Library/Makefiles/Instance/library.make:286: internal-library-all_] Error 2
gmake[2]: *** [/System/Library/Makefiles/Master/rules.make:297: libgnustep-gui.all.library.variables] Error 2
gmake[1]: *** [/System/Library/Makefiles/Master/library.make:37: internal-all] Error 2
gmake: *** [/System/Library/Makefiles/Master/serial-subdirectories.make:53: internal-all] Error 2

Do you have an idea what might be causing this?

That build error isn't from this PR — it's in NSDataLink.m, which this branch doesn't touch. The compiler is picking up a stale installed NSDataLink.h from /System/Library/Headers/AppKit/ whose ivars are un-prefixed (linkNumber, disposition, …), while the current source expects the _-prefixed names. Classic case of installed headers shadowing the newer repo headers.

Fix on your side:

gmake clean
gmake            # rebuild against local Headers/
sudo -E gmake install   # refresh the installed headers

If it persists, confirm the header actually got updated:

grep _linkNumber /System/Library/Headers/AppKit/NSDataLink.h

CI here builds clean on all three configs, so the aim-triangle change itself is unaffected.

@probonopd

probonopd commented Jul 5, 2026

Copy link
Copy Markdown
Contributor

Must be something with my local system then. Could it theoretically be that it picks up on already-installed library rather than the one just built but not yet installed? I cannot install this because I cannot build it, and the already-installed version doesn't have _linkNumber:

devuan@devuanpi:/tmp/libs-gui$ grep _linkNumber /System/Library/Headers/AppKit/NSDataLink.h
devuan@devuanpi:/tmp/libs-gui$

@fredkiefer
fredkiefer removed their request for review September 6, 2026 15:42
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Development

Successfully merging this pull request may close these issues.

3 participants