mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-04-17 04:29:25 +02:00
gtk2: fixed double keys in ide editor. Patch by C Western. issue #36976
git-svn-id: trunk@63089 -
This commit is contained in:
parent
990ea0d78a
commit
6528ab5a42
@ -82,13 +82,33 @@ begin
|
||||
result := PGdkEvent(Event)^._type;
|
||||
end;
|
||||
|
||||
procedure RememberKeyEventWasHandledByLCL(Event: PGdkEventKey;
|
||||
BeforeEvent: boolean);
|
||||
function KeyEventWasHandledByLCL(Event: PGdkEventKey; BeforeEvent: boolean
|
||||
): TLCLHandledKeyEvent;
|
||||
var
|
||||
HandledEvent: TLCLHandledKeyEvent;
|
||||
i: Integer;
|
||||
EventList: TFPList;
|
||||
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 LCLHandledKeyEvents=nil then
|
||||
LCLHandledKeyEvents:=TFPList.Create;
|
||||
@ -98,37 +118,14 @@ begin
|
||||
LCLHandledKeyAfterEvents:=TFPList.Create;
|
||||
EventList:=LCLHandledKeyAfterEvents;
|
||||
end;
|
||||
HandledEvent:=TLCLHandledKeyEvent.Create(Event);
|
||||
EventList.Add(HandledEvent);
|
||||
Result:=TLCLHandledKeyEvent.Create(Event);
|
||||
EventList.Add(Result);
|
||||
while EventList.Count>10 do begin
|
||||
HandledEvent:=TLCLHandledKeyEvent(EventList[0]);
|
||||
HandledEvent.Free;
|
||||
TLCLHandledKeyEvent(EventList[0]).Free;
|
||||
EventList.Delete(0);
|
||||
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;
|
||||
begin
|
||||
If (aclass <> nil) then
|
||||
@ -1880,7 +1877,7 @@ var
|
||||
FocusedWidget: PGtkWidget;
|
||||
LCLObject: TObject;
|
||||
FocusedWinControl: TWinControl;
|
||||
HandledByLCL: Boolean;
|
||||
EventHandledByLCL: TLCLHandledKeyEvent;
|
||||
TargetWidget: PGtkWidget;
|
||||
TargetObj: gPointer;
|
||||
KeyPressesChar: char;
|
||||
@ -1897,6 +1894,8 @@ var
|
||||
end;
|
||||
{MWE:.$EndIf}
|
||||
AEvent^.KeyVal := 0;
|
||||
if EventHandledByLCL <> nil then
|
||||
EventHandledByLCL.keyval := 0;
|
||||
end;
|
||||
|
||||
procedure StopKeyEvent;
|
||||
@ -2197,7 +2196,7 @@ begin
|
||||
Result := CallBackDefaultReturn;
|
||||
|
||||
EventStopped := False;
|
||||
HandledByLCL := KeyEventWasHandledByLCL(AEvent, ABeforeEvent);
|
||||
EventHandledByLCL := KeyEventWasHandledByLCL(AEvent, ABeforeEvent);
|
||||
|
||||
{$IFDEF VerboseKeyboard}
|
||||
DebugLn(['[HandleGTKKeyUpDown] START ',DbgSName(TControl(AData)),
|
||||
@ -2209,11 +2208,11 @@ begin
|
||||
' _string="',dbgMemRange(PByte(AEvent^._string),AEvent^.length),'"',
|
||||
' group=',(AEvent^.group),
|
||||
' Widget=',GetWidgetClassName(AWidget),
|
||||
' Before=',ABeforeEvent,' Down=',AHandleDown,' HandledByLCL=',HandledByLCL]);
|
||||
' Before=',ABeforeEvent,' Down=',AHandleDown,' HandledByLCL=',HandledByLCL<>nil]);
|
||||
{$ENDIF}
|
||||
|
||||
// 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
|
||||
AWidget := AWidget^.parent;
|
||||
@ -2254,7 +2253,7 @@ begin
|
||||
end;
|
||||
|
||||
// remember this event
|
||||
RememberKeyEventWasHandledByLCL(AEvent, ABeforeEvent);
|
||||
EventHandledByLCL := RememberKeyEventWasHandledByLCL(AEvent, ABeforeEvent);
|
||||
|
||||
if TargetWidget = nil then Exit;
|
||||
|
||||
|
@ -439,10 +439,7 @@ function GTKEventStateToShiftState(KeyState: LongWord): TShiftState;
|
||||
procedure gdk_event_key_get_string(Event: PGDKEventKey; var theString: Pointer);
|
||||
procedure gdk_event_key_set_string(Event: PGDKEventKey; const NewString: PChar);
|
||||
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;
|
||||
AData: gPointer; ABeforeEvent, AHandleDown: Boolean; const AEventName: PGChar
|
||||
) : GBoolean;
|
||||
|
Loading…
Reference in New Issue
Block a user