Jelajahi Sumber

* Key handling

Michaël Van Canneyt 6 bulan lalu
induk
melakukan
58d274ad39
1 mengubah file dengan 179 tambahan dan 8 penghapusan
  1. 179 8
      src/gtk3/fresnel.gtk3.pas

+ 179 - 8
src/gtk3/fresnel.gtk3.pas

@@ -21,7 +21,7 @@ uses
   {$ENDIF}
   // fresnel
   Fresnel.Classes, Fresnel.Forms, Fresnel.WidgetSet, Fresnel.DOM,
-  Fresnel.Events, FCL.Events;
+  Fresnel.Events, FCL.Events, Fresnel.Keys;
 
 const
   GTK3_LEFT_BUTTON = 1;
@@ -247,6 +247,158 @@ begin
   end;
 end;
 
+function GdkKeyToFresnelKey(AValue: cuint32): Integer;
+begin
+  if (AValue <= $FF) then
+    Exit(AValue);
+  Result := 0;
+  case AValue of
+    GDK_KEY_Return,
+    GDK_KEY_KP_Enter,
+    GDK_KEY_ISO_Enter,
+    GDK_KEY_3270_Enter: Result := TKeyCodes.Enter;
+    GDK_KEY_Escape: Result := TKeyCodes.Escape;
+    GDK_KEY_Insert: Result := TKeyCodes.Insert;
+    GDK_KEY_Delete: Result := TKeyCodes.Delete;
+    GDK_KEY_BackSpace: Result := TKeyCodes.BackSpace;
+    GDK_KEY_Home: Result := TKeyCodes.Home;
+    GDK_KEY_End: Result := TKeyCodes.End_;
+    GDK_KEY_KP_Page_Up,
+    GDK_KEY_Page_Up: Result := TKeyCodes.PageUp;
+    GDK_KEY_KP_Page_Down,
+    GDK_KEY_Page_Down: Result := TKeyCodes.PageDown;
+    GDK_KEY_Left,
+    GDK_KEY_KP_LEFT: Result := TKeyCodes.ArrowLeft;
+    GDK_KEY_Up,
+    GDK_KEY_KP_UP: Result := TKeyCodes.ArrowUp;
+    GDK_KEY_Right,
+    GDK_KEY_KP_Right: Result := TKeyCodes.ArrowRight;
+    GDK_KEY_Down,
+    GDK_KEY_KP_Down: Result := TKeyCodes.ArrowDown;
+    GDK_KEY_Menu: Result := TKeyCodes.ContextMenu;
+    GDK_KEY_Tab,
+    GDK_KEY_3270_BackTab,
+    GDK_KEY_ISO_Left_Tab: Result := TKeyCodes.Tab;
+    GDK_KEY_Shift_L,
+    GDK_KEY_Shift_R: Result := TKeyCodes.Shift;
+    GDK_KEY_Control_L,
+    GDK_KEY_Control_R: Result := TKeyCodes.Control;
+    GDK_KEY_F1 .. GDK_KEY_F24:
+      Result:= TKeyCodes.F1 + (AValue - GDK_KEY_F1);
+    GDK_KEY_Copy : Result := TKeyCodes.Copy;
+    GDK_KEY_Caps_Lock : Result := TKeyCodes.CapsLock;
+    GDK_KEY_Hyper_L,
+    GDK_KEY_Hyper_R : Result:=TKeyCodes.Hyper;
+    GDK_KEY_Meta_L,
+    GDK_KEY_Meta_R : Result:=TKeyCodes.Meta;
+    GDK_KEY_Num_Lock : Result:=TKeyCodes.NumLock;
+    GDK_KEY_Scroll_Lock : Result:=TKeyCodes.ScrollLock;
+    GDK_KEY_Super_L,
+    GDK_KEY_Super_R : Result:=TKeyCodes.Super;
+    GDK_KEY_KP_Space : Result:=Ord(' ');
+    GDK_KEY_Clear : Result:=TKeyCodes.Clear;
+    GDK_KEY_3270_CursorSelect : Result:=TKeyCodes.CrSel;
+    GDK_KEY_3270_EraseEOF : Result:=TKeyCodes.EraseEof;
+    GDK_KEY_3270_ExSelect : Result:=TKeyCodes.ExSel;
+    GDK_KEY_Paste : Result:=TKeyCodes.Paste;
+    GDK_KEY_Redo : Result:=TKeyCodes.Redo;
+    GDK_KEY_Undo : Result:=TKeyCodes.Undo;
+    GDK_KEY_3270_Attn : Result:=TKeyCodes.Attn;
+    GDK_KEY_Cancel : Result:=TKeyCodes.Cancel;
+    GDK_KEY_Execute : Result:=TKeyCodes.Execute;
+    GDK_KEY_Find : Result:=TKeyCodes.Find;
+    GDK_KEY_Help : Result:=TKeyCodes.Help;
+    GDK_KEY_Pause,
+    GDK_KEY_Break : Result:=TKeyCodes.Pause;
+    GDK_KEY_3270_Play : Result:=TKeyCodes.Play;
+    GDK_KEY_Select : Result:=TKeyCodes.Select;
+    GDK_KEY_ZoomIn : Result:=TKeyCodes.ZoomIn;
+    GDK_KEY_ZoomOut : Result:=TKeyCodes.ZoomOut;
+    GDK_KEY_MonBrightnessDown : Result:=TKeyCodes.BrightnessDown;
+    GDK_KEY_MonBrightnessUp : Result:=TKeyCodes.BrightnessUp;
+    GDK_KEY_Eject : Result:=TKeyCodes.Eject;
+    GDK_KEY_PowerDown,
+    GDK_KEY_PowerOff : Result:=TKeyCodes.PowerOff;
+    GDK_KEY_3270_PrintScreen,
+    GDK_KEY_Sys_Req : Result:=TKeyCodes.PrintScreen;
+    GDK_KEY_Hibernate : Result:=TKeyCodes.Hibernate;
+    GDK_KEY_Standby,
+    GDK_KEY_Suspend,
+    GDK_KEY_Sleep : Result:=TKeyCodes.Standby;
+    GDK_KEY_WakeUp : Result:=TKeyCodes.WakeUp;
+    GDK_KEY_Eisu_toggle,
+    GDK_KEY_Eisu_Shift : Result:=TKeyCodes.Alphanumeric;
+    GDK_KEY_Codeinput : Result:=TKeyCodes.CodeInput;
+    GDK_KEY_Multi_key  : Result:=TKeyCodes.Compose;
+    GDK_KEY_Henkan : Result:=TKeyCodes.Convert;
+    GDK_KEY_ISO_First_Group : Result:=TKeyCodes.GroupFirst;
+    GDK_KEY_ISO_Last_Group : Result:=TKeyCodes.GroupLast;
+    GDK_KEY_ISO_Next_Group : Result:=TKeyCodes.GroupNext;
+    GDK_KEY_script_switch : Result:=TKeyCodes.ModeChange;
+    {GDK_KEY_Mode_switch : Result:=TKeyCodes.ModeChange; } // duplicate
+    GDK_KEY_Muhenkan : Result:=TKeyCodes.NonConvert;
+    GDK_KEY_PreviousCandidate : Result:=TKeyCodes.PreviousCandidate;
+    GDK_KEY_SingleCandidate : Result:=TKeyCodes.SingleCandidate;
+    GDK_KEY_Hangul : Result:=TKeyCodes.HangulMode;
+    GDK_KEY_Hangul_Hanja : Result:=TKeyCodes.HanjaMode;
+    GDK_KEY_Hangul_Jeonja : Result:=TKeyCodes.HanjaMode;
+    {GDK_KEY_Eisu_toggle: Result:=TKeyCodes.Eisu;}
+    GDK_KEY_hankaku: Result:=TKeyCodes.Hankaku;
+    GDK_KEY_hiragana: Result:=TKeyCodes.Hiranga;
+    GDK_KEY_Hiragana_Katakana: Result:=TKeyCodes.HirangaKatakana;
+    GDK_KEY_Kana_Lock,
+    GDK_KEY_Kana_Shift : Result:=TKeyCodes.KanaMode;
+    GDK_KEY_Kanji  : Result:=TKeyCodes.KanjiMode;
+    GDK_KEY_Katakana : Result:=TKeyCodes.Katakana;
+    GDK_KEY_Romaji : Result:=TKeyCodes.Romaji;
+    GDK_KEY_Zenkaku  : Result:=TKeyCodes.Zenkaku;
+    GDK_KEY_Zenkaku_Hankaku : Result:=TKeyCodes.ZenkakuHankaku;
+    GDK_KEY_AudioForward : Result:=TKeyCodes.MediaFastForward;
+    GDK_KEY_AudioPause : Result:=TKeyCodes.MediaPause;
+    GDK_KEY_AudioPlay : Result:=TKeyCodes.MediaPlay;
+    GDK_KEY_AudioRecord : Result:=TKeyCodes.MediaRecord;
+    GDK_KEY_AudioRewind : Result:=TKeyCodes.MediaRewind;
+    GDK_KEY_AudioNext : Result:=TKeyCodes.MediaTrackNext;
+    GDK_KEY_AudioPrev : Result:=TKeyCodes.MediaTrackPrevious;
+    GDK_KEY_AudioLowerVolume : Result:=TKeyCodes.AudioVolumeDown;
+    GDK_KEY_AudioRaiseVolume : Result:=TKeyCodes.AudioVolumeUp;
+    GDK_KEY_AudioMute : Result:=TKeyCodes.AudioVolumeMute;
+    GDK_KEY_AudioMicMute : Result:=TKeyCodes.MicrophoneVolumeMute;
+    GDK_KEY_BrightnessAdjust : Result:=TKeyCodes.Dimmer;
+    GDK_KEY_AudioCycleTrack : Result:=TKeyCodes.MediaAudioTrack;
+    GDK_KEY_AudioRandomPlay : Result:=TKeyCodes.RandomToggle;
+    GDK_KEY_SplitScreen : Result:=TKeyCodes.SplitScreenToggle;
+    GDK_KEY_Subtitle : Result:=TKeyCodes.Subtitle;
+    GDK_KEY_Next_VMode :  Result:=TKeyCodes.VideoModeNext;
+    GDK_KEY_Close : Result:=TKeyCodes.Close;
+    GDK_KEY_New : Result:=TKeyCodes.New;
+    GDK_KEY_Open : Result:=TKeyCodes.Open;
+    GDK_KEY_Print : Result:=TKeyCodes.Print;
+    GDK_KEY_Save : Result:=TKeyCodes.Save;
+    GDK_KEY_Spell : Result:=TKeyCodes.SpellCheck;
+    GDK_KEY_MailForward : Result:=TKeyCodes.MailForward;
+    GDK_KEY_Reply : Result:=TKeyCodes.MailReply;
+    GDK_KEY_Send : Result:=TKeyCodes.MailSend;
+    GDK_KEY_Calculator : Result:=TKeyCodes.LaunchCalculator;
+    GDK_KEY_Calendar : Result:=TKeyCodes.LaunchCalendar;
+    GDK_KEY_Mail :  Result:=TKeyCodes.LaunchMail;
+    GDK_KEY_CD,
+    GDK_KEY_Video,
+    GDK_KEY_AudioMedia : Result:=TKeyCodes.LaunchMediaPlayer;
+    GDK_KEY_Music : Result:=TKeyCodes.LaunchMusicPlayer;
+    GDK_KEY_Explorer : Result:=TKeyCodes.LaunchMyComputer;
+    GDK_KEY_ScreenSaver : Result:=TKeyCodes.LaunchScreenSaver;
+    GDK_KEY_Phone : Result:=TKeyCodes.LaunchPhone;
+    GDK_KEY_Excel : Result:=TKeyCodes.LaunchSpreadsheet;
+    GDK_KEY_WWW : Result:=TKeyCodes.LaunchWebBrowser;
+    GDK_KEY_WebCam : Result:=TKeyCodes.LaunchWebCam;
+    GDK_KEY_Word : Result:=TKeyCodes.LaunchWordProcessor;
+    GDK_KEY_Launch0..GDK_KEY_LaunchF : Result:=TKeyCodes.LaunchApplication1+(AValue-GDK_KEY_Launch0);
+  else
+    Result := gdk_keyval_to_unicode(AValue);
+  end;
+end;
+
 function GdkModifierStateToShiftState(const AState: TGdkModifierType
   ): TShiftState;
 begin
@@ -319,7 +471,8 @@ end;
 
 procedure TGtk3WSForm.GtkEventDestroy;
 begin
-
+  FWindow:=Nil;
+  FreeAndNil(FForm);
 end;
 
 function TGtk3WSForm.GtkEventDraw(AContext: Pcairo_t): Boolean;
@@ -369,16 +522,34 @@ begin
   {$ENDIF}
 end;
 
+
 function TGtk3WSForm.GtkEventKeyDown(Event: PGdkEvent): Boolean;
+var
+  lInit : TFresnelKeyEventInit;
+
 begin
-  if Event=nil then ;
-  Result:=false;
+  if Event=nil then exit;
+  lInit:=Default(TFresnelKeyEventInit);
+  lInit.ShiftState:=GdkModifierStateToShiftState(Event^.key.state);
+  // This will handle unicode.
+  lInit.NumKey:=GdkKeyToFresnelKey(Event^.Key.keyval);
+  Form.WSKey(lInit,evtKeyDown);
+  Result:=True;
 end;
 
 function TGtk3WSForm.GtkEventKeyUp(Event: PGdkEvent): Boolean;
+var
+  lInit : TFresnelKeyEventInit;
+
 begin
-  if Event=nil then ;
-  Result:=false;
+  if Event=nil then exit;
+  lInit:=Default(TFresnelKeyEventInit);
+  lInit.ShiftState:=GdkModifierStateToShiftState(Event^.key.state);
+  // This will handle unicode.
+  lInit.NumKey:=GdkKeyToFresnelKey(Event^.Key.keyval);
+  lInit.Key := TKeyCodes.Names[lInit.NumKey];
+  Form.WSKey(lInit,evtKeyUp);
+  Result:=True;
 end;
 
 function TGtk3WSForm.GtkEventMouseXY(Event: PGdkEvent): Boolean;
@@ -502,7 +673,7 @@ end;
 
 procedure TGtk3WSForm.GtkEventHide;
 begin
-
+  Form.Hide;
 end;
 
 procedure TGtk3WSForm.GtkEventMap;
@@ -512,7 +683,7 @@ end;
 
 procedure TGtk3WSForm.GtkEventShow;
 begin
-
+  Form.Show;
 end;
 
 procedure TGtk3WSForm.GtkEventSizeAllocate(aRect: PGdkRectangle);