From 2d1027253fb1cfce5c875b58b817046bdd38c7e6 Mon Sep 17 00:00:00 2001 From: rich2014 Date: Sat, 26 Aug 2023 23:48:04 +0800 Subject: [PATCH] LCL: WidgetSet.BeginMessageProcess/EndMessageProcess added --- lcl/include/application.inc | 22 ++++++++++++++++++---- lcl/include/interfacebase.inc | 9 +++++++++ lcl/interfacebase.pp | 9 ++++++++- 3 files changed, 35 insertions(+), 5 deletions(-) diff --git a/lcl/include/application.inc b/lcl/include/application.inc index edbbc816b8..109af908cc 100644 --- a/lcl/include/application.inc +++ b/lcl/include/application.inc @@ -416,13 +416,20 @@ end; TApplication ProcesssMessages "Enter the messageloop and process until empty" ------------------------------------------------------------------------------} procedure TApplication.ProcessMessages; +var + context: TLCLHandle; begin if Self=nil then begin // when the programmer did a mistake, avoid getting strange errors raise Exception.Create('Application=nil'); end; - WidgetSet.AppProcessMessages; - ProcessAsyncCallQueue; + context := WidgetSet.BeginMessageProcess; + try + WidgetSet.AppProcessMessages; + ProcessAsyncCallQueue; + finally + WidgetSet.EndMessageProcess(context); + end; end; {------------------------------------------------------------------------------ @@ -1267,9 +1274,16 @@ end; Handles all messages first then the Idle ------------------------------------------------------------------------------} procedure TApplication.HandleMessage; +var + context: TLCLHandle; begin - WidgetSet.AppProcessMessages; // process all events - if not Terminated then Idle(true); + context := WidgetSet.BeginMessageProcess; + try + WidgetSet.AppProcessMessages; // process all events + if not Terminated then Idle(true); + finally + WidgetSet.EndMessageProcess(context); + end; end; function TApplication.HelpContext(Context: THelpContext): Boolean; diff --git a/lcl/include/interfacebase.inc b/lcl/include/interfacebase.inc index 0608326c5c..b27c4e208e 100644 --- a/lcl/include/interfacebase.inc +++ b/lcl/include/interfacebase.inc @@ -84,6 +84,15 @@ procedure TWidgetSet.AppSetupMainForm(AMainForm: TObject); //e.g. handle widge begin end; +function TWidgetSet.BeginMessageProcess: TLCLHandle; +begin + Result := 0; +end; + +procedure TWidgetSet.EndMessageProcess(context: TLCLHandle); +begin +end; + function TWidgetSet.GetLCLCapability(ACapability: TLCLCapability): PtrUInt; begin case ACapability of diff --git a/lcl/interfacebase.pp b/lcl/interfacebase.pp index f3bae3db07..657d9616c0 100644 --- a/lcl/interfacebase.pp +++ b/lcl/interfacebase.pp @@ -147,7 +147,14 @@ type function AppRestoreStayOnTopFlags(const ASystemTopAlso: Boolean = False): Boolean; virtual; procedure AppSetMainFormOnTaskBar(const DoSet: Boolean); virtual; procedure AppSetupMainForm(AMainForm: TObject); virtual; - + + // Begin/End processing messages, which can be used to acquire/release + // resources during message processing. + // for example, on Cocoa, it needs to be used to release AutoReleasePool + // to avoid resource leaks. + function BeginMessageProcess: TLCLHandle; virtual; + procedure EndMessageProcess(context: TLCLHandle); virtual; + function LCLPlatform: TLCLPlatform; virtual; abstract; function GetLCLCapability(ACapability: TLCLCapability): PtrUInt; virtual;