[Lazarus] Modal Window Crashes on Mac OS X 10.15 Beta (Catalina)
Zoë Peterson
zoe at scootersoftware.com
Wed Jun 12 17:48:33 CEST 2019
On 6/11/2019 11:56 PM, Dmitry Boyarintsev via lazarus wrote:
> If it's a problem to check isRunning every time through
> nextEventMatchingMask, and alternative with the same behavior would be
> to swizzle in the runloop variant before calling inherited run and
> switching it back once we get into it.
>
> Switching back? how is it possible?
"Swizzling" is the name for replacing the Objective C method pointers
using method_exchangeImplementations. It's not the same as overriding it.
There's a writeup of it here:
https://trinhngocthuyen.github.io/tech/method-swizzling-what-why-and-how/
So, rather than overriding nextEventMatchingMask directly, ours is
called something like runLoop_nextEventMatchingMask.
TCocoaWidgetSet.AppRun swaps the function pointers, soour version is
only called after we get to that point, and when we get into that
function, we swap them back and call the original implementation like
normal. Our version only gets called once.
> We cannot be sure at what particular event, the hijacking would occur.
> Today, there was a bug report, about crash in the hijacking approach
> https://forum.lazarus.freepascal.org/index.php/topic,44930.msg323420.html#msg323420
>
> The application written caused nextEventMatchMask to be called even
> prior to Application.Init.
The above approach takes care of that, since our version is never used
until we actually swap the method pointers. It removes the need to
maintain an "isRun" variable too.
--
Zoë Peterson
Scooter Software
More information about the lazarus
mailing list