gtk2: fixed double keys in ide editor. Patch by C Western. issue #36976

git-svn-id: trunk@63089 -
This commit is contained in:
zeljko 2020-04-28 08:22:59 +00:00
parent 990ea0d78a
commit 6528ab5a42
2 changed files with 35 additions and 39 deletions

View File

@ -82,13 +82,33 @@ begin
result := PGdkEvent(Event)^._type; result := PGdkEvent(Event)^._type;
end; end;
procedure RememberKeyEventWasHandledByLCL(Event: PGdkEventKey; function KeyEventWasHandledByLCL(Event: PGdkEventKey; BeforeEvent: boolean
BeforeEvent: boolean); ): TLCLHandledKeyEvent;
var var
HandledEvent: TLCLHandledKeyEvent; i: Integer;
EventList: TFPList; EventList: TFPList;
begin begin
if KeyEventWasHandledByLCL(Event,BeforeEvent) then exit; Result:=nil;
if BeforeEvent then
EventList:=LCLHandledKeyEvents
else
EventList:=LCLHandledKeyAfterEvents;
if EventList=nil then exit;
for i:=0 to EventList.Count-1 do begin
Result:=TLCLHandledKeyEvent(EventList[i]);
if Result.IsEqual(Event) then
exit;
end;
Result:=nil;
end;
function RememberKeyEventWasHandledByLCL(Event: PGdkEventKey;
BeforeEvent: boolean):TLCLHandledKeyEvent;
var
EventList: TFPList;
begin
Result:= KeyEventWasHandledByLCL(Event,BeforeEvent);
if Result<>nil then exit;
if BeforeEvent then begin if BeforeEvent then begin
if LCLHandledKeyEvents=nil then if LCLHandledKeyEvents=nil then
LCLHandledKeyEvents:=TFPList.Create; LCLHandledKeyEvents:=TFPList.Create;
@ -98,37 +118,14 @@ begin
LCLHandledKeyAfterEvents:=TFPList.Create; LCLHandledKeyAfterEvents:=TFPList.Create;
EventList:=LCLHandledKeyAfterEvents; EventList:=LCLHandledKeyAfterEvents;
end; end;
HandledEvent:=TLCLHandledKeyEvent.Create(Event); Result:=TLCLHandledKeyEvent.Create(Event);
EventList.Add(HandledEvent); EventList.Add(Result);
while EventList.Count>10 do begin while EventList.Count>10 do begin
HandledEvent:=TLCLHandledKeyEvent(EventList[0]); TLCLHandledKeyEvent(EventList[0]).Free;
HandledEvent.Free;
EventList.Delete(0); EventList.Delete(0);
end; end;
end; end;
function KeyEventWasHandledByLCL(Event: PGdkEventKey; BeforeEvent: boolean
): boolean;
var
i: Integer;
HandledEvent: TLCLHandledKeyEvent;
EventList: TFPList;
begin
Result:=false;
if BeforeEvent then
EventList:=LCLHandledKeyEvents
else
EventList:=LCLHandledKeyAfterEvents;
if EventList=nil then exit;
for i:=0 to EventList.Count-1 do begin
HandledEvent:=TLCLHandledKeyEvent(EventList[i]);
if HandledEvent.IsEqual(Event) then begin
Result:=true;
exit;
end;
end;
end;
function gtk_class_get_type(aclass : Pointer) : TGtkType; function gtk_class_get_type(aclass : Pointer) : TGtkType;
begin begin
If (aclass <> nil) then If (aclass <> nil) then
@ -1880,7 +1877,7 @@ var
FocusedWidget: PGtkWidget; FocusedWidget: PGtkWidget;
LCLObject: TObject; LCLObject: TObject;
FocusedWinControl: TWinControl; FocusedWinControl: TWinControl;
HandledByLCL: Boolean; EventHandledByLCL: TLCLHandledKeyEvent;
TargetWidget: PGtkWidget; TargetWidget: PGtkWidget;
TargetObj: gPointer; TargetObj: gPointer;
KeyPressesChar: char; KeyPressesChar: char;
@ -1897,6 +1894,8 @@ var
end; end;
{MWE:.$EndIf} {MWE:.$EndIf}
AEvent^.KeyVal := 0; AEvent^.KeyVal := 0;
if EventHandledByLCL <> nil then
EventHandledByLCL.keyval := 0;
end; end;
procedure StopKeyEvent; procedure StopKeyEvent;
@ -2197,7 +2196,7 @@ begin
Result := CallBackDefaultReturn; Result := CallBackDefaultReturn;
EventStopped := False; EventStopped := False;
HandledByLCL := KeyEventWasHandledByLCL(AEvent, ABeforeEvent); EventHandledByLCL := KeyEventWasHandledByLCL(AEvent, ABeforeEvent);
{$IFDEF VerboseKeyboard} {$IFDEF VerboseKeyboard}
DebugLn(['[HandleGTKKeyUpDown] START ',DbgSName(TControl(AData)), DebugLn(['[HandleGTKKeyUpDown] START ',DbgSName(TControl(AData)),
@ -2209,11 +2208,11 @@ begin
' _string="',dbgMemRange(PByte(AEvent^._string),AEvent^.length),'"', ' _string="',dbgMemRange(PByte(AEvent^._string),AEvent^.length),'"',
' group=',(AEvent^.group), ' group=',(AEvent^.group),
' Widget=',GetWidgetClassName(AWidget), ' Widget=',GetWidgetClassName(AWidget),
' Before=',ABeforeEvent,' Down=',AHandleDown,' HandledByLCL=',HandledByLCL]); ' Before=',ABeforeEvent,' Down=',AHandleDown,' HandledByLCL=',HandledByLCL<>nil]);
{$ENDIF} {$ENDIF}
// handle every key event only once // handle every key event only once
if HandledByLCL then exit; if EventHandledByLCL<>nil then exit;
while (not GtkWidgetIsA(AWidget, gtk_window_get_type)) and (AWidget^.parent <> nil) do while (not GtkWidgetIsA(AWidget, gtk_window_get_type)) and (AWidget^.parent <> nil) do
AWidget := AWidget^.parent; AWidget := AWidget^.parent;
@ -2254,7 +2253,7 @@ begin
end; end;
// remember this event // remember this event
RememberKeyEventWasHandledByLCL(AEvent, ABeforeEvent); EventHandledByLCL := RememberKeyEventWasHandledByLCL(AEvent, ABeforeEvent);
if TargetWidget = nil then Exit; if TargetWidget = nil then Exit;

View File

@ -439,10 +439,7 @@ function GTKEventStateToShiftState(KeyState: LongWord): TShiftState;
procedure gdk_event_key_get_string(Event: PGDKEventKey; var theString: Pointer); procedure gdk_event_key_get_string(Event: PGDKEventKey; var theString: Pointer);
procedure gdk_event_key_set_string(Event: PGDKEventKey; const NewString: PChar); procedure gdk_event_key_set_string(Event: PGDKEventKey; const NewString: PChar);
function gdk_event_get_type(Event: Pointer): TGdkEventType; function gdk_event_get_type(Event: Pointer): TGdkEventType;
procedure RememberKeyEventWasHandledByLCL(Event: PGdkEventKey;
BeforeEvent: boolean);
function KeyEventWasHandledByLCL(Event: PGdkEventKey;
BeforeEvent: boolean): boolean;
function HandleGTKKeyUpDown(AWidget: PGtkWidget; AEvent: PGdkEventKey; function HandleGTKKeyUpDown(AWidget: PGtkWidget; AEvent: PGdkEventKey;
AData: gPointer; ABeforeEvent, AHandleDown: Boolean; const AEventName: PGChar AData: gPointer; ABeforeEvent, AHandleDown: Boolean; const AEventName: PGChar
) : GBoolean; ) : GBoolean;