mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-08-17 05:29:29 +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;
|
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;
|
||||||
|
|
||||||
|
@ -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;
|
||||||
|
Loading…
Reference in New Issue
Block a user