lcl: gtk2: fixed freeing TLCLHandledKeyEvent while processing keys

git-svn-id: trunk@64889 -
This commit is contained in:
mattias 2021-03-29 12:14:55 +00:00
parent 176d2080c3
commit be1d17f306
2 changed files with 239 additions and 218 deletions

View File

@ -121,7 +121,7 @@ begin
Result:=TLCLHandledKeyEvent.Create(Event);
EventList.Add(Result);
while EventList.Count>10 do begin
TLCLHandledKeyEvent(EventList[0]).Free;
TLCLHandledKeyEvent(EventList[0]).Release;
EventList.Delete(0);
end;
end;
@ -2278,7 +2278,8 @@ begin
// remember this event
EventHandledByLCL := RememberKeyEventWasHandledByLCL(AEvent, ABeforeEvent);
EventHandledByLCL.AddRef;
try
if TargetWidget = nil then Exit;
//DebugLn(['HandleGTKKeyUpDown TargetWidget=',GetWidgetDebugReport(TargetWidget)]);
@ -2532,6 +2533,9 @@ begin
end;
EmulateEatenKeys;
finally
EventHandledByLCL.Release
end;
Result:=EventStopped;
end;
@ -3481,13 +3485,13 @@ begin
DisconnectGdkKeymapChangedSignal;
if LCLHandledKeyEvents<>nil then begin
for i:=0 to LCLHandledKeyEvents.Count-1 do
TObject(LCLHandledKeyEvents[i]).Free;
TLCLHandledKeyEvent(LCLHandledKeyEvents[i]).Release;
LCLHandledKeyEvents.Free;
LCLHandledKeyEvents:=nil;
end;
if LCLHandledKeyAfterEvents<>nil then begin
for i:=0 to LCLHandledKeyAfterEvents.Count-1 do
TObject(LCLHandledKeyAfterEvents[i]).Free;
TLCLHandledKeyEvent(LCLHandledKeyAfterEvents[i]).Release;
LCLHandledKeyAfterEvents.Free;
LCLHandledKeyAfterEvents:=nil;
end;

View File

@ -852,6 +852,8 @@ type
// TLCLHandledKeyEvent is used to remember, if an gdk key event was already
// handled.
TLCLHandledKeyEvent = class
private
fRefCount: integer;
public
thetype: TGdkEventType;
window: PGdkWindow;
@ -862,6 +864,8 @@ type
hardware_keycode : guint16;
constructor Create(Event: PGdkEventKey);
function IsEqual(Event: PGdkEventKey): boolean;
procedure AddRef;
procedure Release;
end;
TWinControlAccess = class(TWinControl)
@ -871,6 +875,7 @@ type
constructor TLCLHandledKeyEvent.Create(Event: PGdkEventKey);
begin
fRefCount:=1;
thetype:=gdk_event_get_type(Event);
window:=Event^.window;
send_event:=Event^.send_event;
@ -892,6 +897,18 @@ begin
;
end;
procedure TLCLHandledKeyEvent.AddRef;
begin
inc(fRefCount);
end;
procedure TLCLHandledKeyEvent.Release;
begin
dec(fRefCount);
if fRefCount=0 then
Free;
end;
var
// LCLHandledKeyEvents stores the last handled key event (handled by the LCL)
// Reason: The gtk sends the same key event to several widgets. The gtk intf