mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-08-28 18:21:26 +02:00
lcl: gtk2: fixed freeing TLCLHandledKeyEvent while processing keys
git-svn-id: trunk@64889 -
This commit is contained in:
parent
176d2080c3
commit
be1d17f306
@ -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;
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user