gtk1+2 intf: key handling: fixed handling result of DeliverMessage, bug #9638

git-svn-id: trunk@18577 -
This commit is contained in:
mattias 2009-02-05 10:30:42 +00:00
parent 0d67f9edaa
commit 26b2693ef7
4 changed files with 33 additions and 29 deletions

View File

@ -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;

View File

@ -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));

View File

@ -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;
// ----

View File

@ -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;