mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-04-22 16:19:36 +02:00
cocoa: simplify post event processing release
git-svn-id: trunk@61388 -
This commit is contained in:
parent
9d37096ca3
commit
896e16115b
@ -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;
|
||||
|
@ -163,7 +163,7 @@ end;
|
||||
------------------------------------------------------------------------------}
|
||||
destructor TCocoaWidgetSet.Destroy;
|
||||
begin
|
||||
ReleaseAllToCollect;
|
||||
ReleaseToCollect(0);
|
||||
inherited Destroy;
|
||||
|
||||
FreeStockItems;
|
||||
|
Loading…
Reference in New Issue
Block a user