mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-08-11 16:56:01 +02:00
gtk1+2 intf: key handling: fixed handling result of DeliverMessage, bug #9638
git-svn-id: trunk@18577 -
This commit is contained in:
parent
0d67f9edaa
commit
26b2693ef7
@ -746,22 +746,22 @@ end;
|
||||
|
||||
function GTKKeyPress(Widget: PGtkWidget; Event: PGdkEventKey; Data: gPointer) : GBoolean; cdecl;
|
||||
begin
|
||||
Result := HandleGtkKeyUpDown(Widget,Event,Data,true, True);
|
||||
Result := HandleGtkKeyUpDown(Widget,Event,Data,true,True,'key-press-event');
|
||||
end;
|
||||
|
||||
function GTKKeyPressAfter(Widget: PGtkWidget; Event: pgdkeventkey; Data: gPointer): GBoolean; cdecl;
|
||||
begin
|
||||
Result := HandleGtkKeyUpDown(Widget,Event,Data,false, True);
|
||||
Result := HandleGtkKeyUpDown(Widget,Event,Data,false,True,'key-press-event');
|
||||
end;
|
||||
|
||||
function GTKKeyRelease(Widget: PGtkWidget; Event: PGdkEventKey; Data: gPointer) : GBoolean; cdecl;
|
||||
begin
|
||||
Result := HandleGtkKeyUpDown(Widget,Event,Data,true, False);
|
||||
Result := HandleGtkKeyUpDown(Widget,Event,Data,true,False,'key-release-event');
|
||||
end;
|
||||
|
||||
function GTKKeyReleaseAfter(Widget: PGtkWidget; Event: pgdkeventkey; Data: gPointer): GBoolean; cdecl;
|
||||
begin
|
||||
Result := HandleGtkKeyUpDown(Widget,Event,Data,false, False);
|
||||
Result := HandleGtkKeyUpDown(Widget,Event,Data,false,False,'key-release-event');
|
||||
end;
|
||||
|
||||
function GTKFocusCB( widget: PGtkWidget; event:PGdkEventFocus;
|
||||
|
@ -1858,7 +1858,9 @@ begin
|
||||
end;
|
||||
|
||||
function HandleGTKKeyUpDown(AWidget: PGtkWidget; AEvent: PGdkEventKey;
|
||||
AData: gPointer; ABeforeEvent, AHandleDown: Boolean) : GBoolean;
|
||||
AData: gPointer; ABeforeEvent, AHandleDown: Boolean;
|
||||
const AEventName: PGChar) : GBoolean;
|
||||
// returns CallBackDefaultReturn if event can continue in gtk's message system
|
||||
{off $DEFINE VerboseKeyboard}
|
||||
const
|
||||
KEYUP_MAP: array[Boolean {syskey}, Boolean {before}] of Cardinal = (
|
||||
@ -1898,7 +1900,7 @@ var
|
||||
TargetObj: gPointer;
|
||||
KeyPressesChar: char;
|
||||
|
||||
procedure StopKeyEvent(const AEventName: PChar);
|
||||
procedure StopKeyEvent;
|
||||
begin
|
||||
{$IFDEF VerboseKeyboard}
|
||||
DebugLn('StopKeyEvent AEventName="',AEventName,'" ABeforeEvent=',dbgs(ABeforeEvent));
|
||||
@ -1922,6 +1924,12 @@ var
|
||||
AEvent^.KeyVal := 0;
|
||||
end;
|
||||
|
||||
function DeliverKeyMessage(const Target: Pointer; var AMessage): boolean;
|
||||
begin
|
||||
Result:=DeliverMessage(Target,AMessage)=0;
|
||||
if not Result then StopKeyEvent;
|
||||
end;
|
||||
|
||||
function CanSendChar: Boolean;
|
||||
begin
|
||||
Result := False;
|
||||
@ -2081,7 +2089,7 @@ var
|
||||
{debugln('KeyActivatedAccelerator call TControl.DialogChar');
|
||||
if TControl(AComponent).DialogChar(Msg.CharCode) then begin
|
||||
debugln('KeyActivatedAccelerator C handled by LCL');
|
||||
StopKeyEvent('key_press_event');
|
||||
StopKeyEvent;
|
||||
Result:=true;
|
||||
end;}
|
||||
end;
|
||||
@ -2116,7 +2124,7 @@ var
|
||||
|
||||
// send the (Sys)KeyDown message directly to the LCL
|
||||
NotifyApplicationUserInput(Msg.Msg);
|
||||
Result := DeliverMessage(TargetObj, Msg) = 0;
|
||||
DeliverKeyMessage(TargetObj, Msg);
|
||||
end;
|
||||
{$ENDIF}
|
||||
end;
|
||||
@ -2261,13 +2269,9 @@ begin
|
||||
then begin
|
||||
// send the (Sys)KeyDown message directly to the LCL
|
||||
NotifyApplicationUserInput(Msg.Msg);
|
||||
Result := DeliverMessage(TargetObj, Msg) = 0;
|
||||
end;
|
||||
|
||||
if Msg.CharCode <> Vkey
|
||||
then begin
|
||||
// key was changed by LCL
|
||||
StopKeyEvent('key_press_event');
|
||||
if DeliverKeyMessage(TargetObj, Msg)
|
||||
and (Msg.CharCode <> Vkey) then
|
||||
StopKeyEvent;
|
||||
end;
|
||||
|
||||
if (not EventStopped) and aBeforeEvent
|
||||
@ -2288,12 +2292,12 @@ begin
|
||||
// send the message directly to the LCL
|
||||
Msg.Result:=0;
|
||||
NotifyApplicationUserInput(Msg.Msg);
|
||||
Result := DeliverMessage(TargetObj, Msg) = 0;
|
||||
|
||||
if Msg.CharCode <> VKey
|
||||
if DeliverKeyMessage(TargetObj, Msg)
|
||||
and (Msg.CharCode <> VKey)
|
||||
then begin
|
||||
// key was handled by LCL
|
||||
StopKeyEvent('key_release_event');
|
||||
StopKeyEvent;
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
@ -2329,7 +2333,7 @@ begin
|
||||
// send the key after navigation keys were handled
|
||||
Result := TWinControl(LCLObject).IntfUTF8KeyPress(Character, 1, SysKey);
|
||||
if Result or (Character = '')
|
||||
then StopKeyEvent('key_press_event')
|
||||
then StopKeyEvent
|
||||
else if (Length(Character) = 1)
|
||||
{$IFDEF Gtk1}
|
||||
// GTK1 only supports normal ASCII characters (Note: #127 is delete)
|
||||
@ -2369,15 +2373,14 @@ begin
|
||||
// send the (Sys)Char message directly (not queued) to the LCL
|
||||
Msg.Result:=0;
|
||||
Msg.CharCode := Ord(KeyPressesChar);
|
||||
Result := DeliverMessage(TargetObj, Msg) = 0;
|
||||
|
||||
if Ord(KeyPressesChar) <> Msg.CharCode
|
||||
if DeliverKeyMessage(TargetObj, Msg)
|
||||
and (Ord(KeyPressesChar) <> Msg.CharCode)
|
||||
then begin
|
||||
// key was changed by lcl
|
||||
if (Msg.CharCode=0) or (Msg.CharCode>=128)
|
||||
then begin
|
||||
// key set to invalid => just stop
|
||||
StopKeyEvent('key_press_event');
|
||||
StopKeyEvent;
|
||||
end
|
||||
else begin
|
||||
// try to change the key
|
||||
@ -3533,7 +3536,7 @@ begin
|
||||
and (TLMessage(AMessage).Msg <>LM_PAINT)
|
||||
and (TLMessage(AMessage).Msg <>LM_KEYDOWN)
|
||||
and (TLMessage(AMessage).Msg <>LM_KEYUP)
|
||||
and (TLMessage(AMessage).Msg < CN_KEYDOWN ) then
|
||||
and (TLMessage(AMessage).Msg <CN_KEYDOWN ) then
|
||||
DebugLn('DeliverMessage ',DbgS(Target),
|
||||
' ',TComponent(Target).Name,':',TObject(Target).ClassName,
|
||||
' Message=',GetMessageName(TLMessage(AMessage).Msg));
|
||||
|
@ -427,7 +427,8 @@ procedure RememberKeyEventWasHandledByLCL(Event: PGdkEventKey;
|
||||
function KeyEventWasHandledByLCL(Event: PGdkEventKey;
|
||||
BeforeEvent: boolean): boolean;
|
||||
function HandleGTKKeyUpDown(AWidget: PGtkWidget; AEvent: PGdkEventKey;
|
||||
AData: gPointer; ABeforeEvent, AHandleDown: Boolean) : GBoolean;
|
||||
AData: gPointer; ABeforeEvent, AHandleDown: Boolean; const AEventName: PGChar
|
||||
) : GBoolean;
|
||||
|
||||
// ----
|
||||
|
||||
|
@ -65,28 +65,28 @@ function GTK2KeyDown(Widget: PGtkWidget; Event : pgdkeventkey;
|
||||
Data: gPointer) : GBoolean; cdecl;
|
||||
begin
|
||||
//debugln('GTK2KeyDown ',DbgSName(TObject(Data)));
|
||||
Result := HandleGtkKeyUpDown(Widget, Event, Data, True, True);
|
||||
Result := HandleGtkKeyUpDown(Widget, Event, Data, True, True, 'key-press-event');
|
||||
end;
|
||||
|
||||
function GTK2KeyDownAfter(Widget: PGtkWidget; Event : pgdkeventkey;
|
||||
Data: gPointer) : GBoolean; cdecl;
|
||||
begin
|
||||
//debugln('GTK2KeyDownAfter ',DbgSName(TObject(Data)));
|
||||
Result := HandleGtkKeyUpDown(Widget, Event, Data, False, True);
|
||||
Result := HandleGtkKeyUpDown(Widget, Event, Data, False, True, 'key-press-event');
|
||||
end;
|
||||
|
||||
function GTK2KeyUp(Widget: PGtkWidget; Event : pgdkeventkey;
|
||||
Data: gPointer) : GBoolean; cdecl;
|
||||
begin
|
||||
//debugln('GTK2KeyUp ',DbgSName(TObject(Data)));
|
||||
Result := HandleGtkKeyUpDown(Widget, Event, Data, True, False);
|
||||
Result := HandleGtkKeyUpDown(Widget, Event, Data, True, False, 'key-release-event');
|
||||
end;
|
||||
|
||||
function GTK2KeyUpAfter(Widget: PGtkWidget; Event : pgdkeventkey;
|
||||
Data: gPointer) : GBoolean; cdecl;
|
||||
begin
|
||||
//debugln('GTK2KeyUpAfter ',DbgSName(TObject(Data)));
|
||||
Result := HandleGtkKeyUpDown(Widget, Event, Data, False, False);
|
||||
Result := HandleGtkKeyUpDown(Widget, Event, Data, False, False, 'key-release-event');
|
||||
end;
|
||||
|
||||
function GTK2KillFocusCB(widget: PGtkWidget; event:PGdkEventFocus;
|
||||
|
Loading…
Reference in New Issue
Block a user