cocoa: simplify post event processing release

git-svn-id: trunk@61388 -
This commit is contained in:
dmitry 2019-06-14 14:39:13 +00:00
parent 9d37096ca3
commit 896e16115b
2 changed files with 14 additions and 70 deletions

View File

@ -132,7 +132,8 @@ type
// collecting objects that needs to be released AFTER an event
// has been processed
ToCollect: TList;
procedure ReleaseAllToCollect;
function RetainToCollect: Integer;
procedure ReleaseToCollect(fromIdx: integer);
procedure SyncClipboard();
@ -209,8 +210,6 @@ type
// the extra LCL interface methods
{$I cocoalclintfh.inc}
procedure AddToCollect(obj: TObject);
procedure RetainToCollect;
procedure ReleaseToCollect;
end;
var
@ -464,8 +463,9 @@ var
cb : ICommonCallback;
wnd: TCocoaWindow;
allowcocoa : Boolean;
idx: integer;
begin
CocoaWidgetSet.RetainToCollect;
idx := CocoaWidgetSet.RetainToCollect;
try
if (theEvent.type_ = NSKeyDown) or (theEvent.type_ = NSKeyUp) or
(theEvent.type_ = NSFlagsChanged) then begin
@ -497,7 +497,7 @@ begin
if (theEvent.type_ = NSMouseMoved) then ForwardMouseMove(Self, theEvent);
finally
CocoaWidgetSet.ReleaseToCollect;
CocoaWidgetSet.ReleaseToCollect(idx);
end;
end;
@ -709,86 +709,30 @@ begin
Result := Assigned(Modals) and (Modals.Count > 0);
end;
type
{ TToCollectItem }
TToCollectItem = class(TObject)
// reference count is needed, in case the event processing
// goes into a recursion (i.e. a modal window)
// Thus the object added at the start of event, should not be released
// until its "event loop" is actually finishing
refCount: Integer;
obj: TObject;
constructor Create(aobj: TObject);
destructor Destroy; override;
end;
{ TToCollectItem }
constructor TToCollectItem.Create(aobj: TObject);
begin
inherited Create;
obj := aobj;
refCount := 1;
end;
destructor TToCollectItem.Destroy;
begin
obj.Free;
inherited;
end;
procedure TCocoaWidgetSet.AddToCollect(obj: TObject);
var
i : integer;
begin
// let's try to find an object. Do not add a duplicate
for i := 0 to ToCollect.Count - 1 do
if TToCollectItem(ToCollect[i]).obj=obj then
Exit;
ToCollect.Add(TToCollectItem.Create(obj));
if (ToCollect.IndexOf(Obj)>=0) then Exit;
ToCollect.Add(obj);
end;
procedure TCocoaWidgetSet.RetainToCollect;
var
i : Integer;
cl : TToCollectItem;
function TCocoaWidgetSet.RetainToCollect: Integer;
begin
for i := 0 to ToCollect.Count - 1 do
begin
cl := TToCollectItem(ToCollect[i]);
inc(cl.refCount);
end;
Result := ToCollect.Count;
end;
procedure TCocoaWidgetSet.ReleaseToCollect;
procedure TCocoaWidgetSet.ReleaseToCollect(fromIdx: integer);
var
cl : TToCollectItem;
i : integer;
begin
for i := 0 to ToCollect.Count - 1 do
for i := fromIdx to ToCollect.Count - 1 do
begin
cl := TToCollectItem(ToCollect[i]);
dec(cl.refCount);
if cl.refCount = 0 then
begin
cl.Free;
ToCollect[i] := nil;
end;
TObject(ToCollect[i]).Free;
ToCollect[i]:=nil;
end;
ToCollect.Pack;
end;
procedure TCocoaWidgetSet.ReleaseAllToCollect;
var
i : integer;
begin
for i := 0 to ToCollect.Count - 1 do
TToCollectItem(ToCollect[i]).Free;
ToCollect.Clear;
end;
initialization
// {$I Cocoaimages.lrs}
InternalInit;

View File

@ -163,7 +163,7 @@ end;
------------------------------------------------------------------------------}
destructor TCocoaWidgetSet.Destroy;
begin
ReleaseAllToCollect;
ReleaseToCollect(0);
inherited Destroy;
FreeStockItems;