[Lazarus] Modal Window Crashes on Mac OS X 10.15 Beta (Catalina)

David Jenkins david at scootersoftware.com
Tue Jun 11 16:05:58 CEST 2019

'Override run' doesn't necessarily mean replace all of it. Inherited can 
be called from the override.  And I'd agree with the addendum "(This a 
critical and complex task, however, that you should only attempt with 
good reason.)".

I looked at the assembly for NSApplication.run, there are a lot of 
things being called and set before the call to nextEventMatching...   
The .isRunning variable being one of them - which is read only and can't 
be set.  It can be overridden (and is one of the suggested overrides) 
but unfortunately there are times, in other parts of the code, that they 
look directly at the ._running variable where the value of .isRunning is 
stored instead of calling .isRunning (look at 
NSApplication._setMainWindow).  Which sets up a mismatch between what an 
overridden .isRunning method would return and what ._running is set to.

Obviously the overrides have worked fine so far.  And I agree with 
Tobias that it is code changes in the 10.15 beta that has really caused 
this to not work.  Setting up NSFrontmostDocumentWindowObserver is new 
to 10.15 and that is where the fault has happened.  It is beta software 
and bugs will be there.  Or functionality that will be removed before 
release. Nevertheless I'd suggest a couple of cautionary points with 
regards to overriding run:

1) I have found Apple Documentation to be overly sparse at points and 
that it doesn't keep up well with new code.  So reading that it you can 
override .run in the Documentation doesn't immediately suggest to me 
that it is a good idea or should be done.

2) Take the "(This a critical and complex task, however, that you should 
only attempt with good reason.)" seriously and call inherited or look at 
inherited (lldb/assembly) and try to implement most of what happens 
there.  Notice that the initial override of run did cause a bug in 
Lazarus that had to be resolved by overriding .isRunning.

I'm fine with a more elegant way to call aloop.  The advantage of what 
we have done is that it is the very first thing that happens when 
NSApplication.run calls nextEventMatching - no if ands or buts.  I had 
originally kicked it off by calling postEvent(event, Yes) (put event at 
top of queue).  This does not guarantee that nothing else happens before 
we get aloop running.  It would be nice to not have the to check 'isrun' 
each time through nextEventMatching.


On 6/10/19 6:56 PM, Dmitry Boyarintsev via lazarus wrote:
> On Mon, Jun 10, 2019 at 6:18 PM David Jenkins via lazarus 
> <lazarus at lists.lazarus-ide.org <mailto:lazarus at lists.lazarus-ide.org>> 
> wrote:
>     In now.  Mantis 35702
> While the research seems to be quite thorough, the following statement:
> "Error is caused because Cocoa currently doesn't run through base 
> level NSApplication.run and thus appropriate ._isrunning flag is not 
> set "
> contradicts Apple's documentation 
> (https://developer.apple.com/documentation/appkit/nsapplication?language=objc)
> "...Methods to Override
> ...
> Override run if you want the app to manage the main event loop 
> differently than it does by default. (This a critical and complex 
> task, however, that you should only attempt with good reason.)"
> If the first statement is true, then run cannot and should not be 
> overriden at all.
> thanks,
> Dmitry

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.lazarus-ide.org/pipermail/lazarus/attachments/20190611/4cde693b/attachment.html>

More information about the lazarus mailing list