diff --git a/demos/Lazarus_Linux_GTK3/SimpleOSRBrowser/uceflinuxosrimehandler.pas b/demos/Lazarus_Linux_GTK3/SimpleOSRBrowser/uceflinuxosrimehandler.pas deleted file mode 100644 index 5c5de1e6..00000000 --- a/demos/Lazarus_Linux_GTK3/SimpleOSRBrowser/uceflinuxosrimehandler.pas +++ /dev/null @@ -1,269 +0,0 @@ -unit uCEFLinuxOSRIMEHandler; - -{$mode ObjFPC}{$H+} - -interface - -uses - {$IFDEF LCLGTK2}gtk2, glib2, gdk2,{$ENDIF} - {$IFDEF LCLGTK3}LazGdk3, LazGtk3, LazGObject2, LazGLib2, gtk3procs, gtk3widgets,{$ENDIF} - Classes, ExtCtrls, Forms; - -type - TCEFLinuxOSRIMEHandler = class - protected - FPanel : TCustomPanel; - FForm : TCustomForm; - FHasFocus : boolean; - {$IF DEFINED(LCLGTK2) or DEFINED(LCLGTK3)} - FIMContext : PGtkIMContext; - {$IFEND} - - function GetInitialized : boolean; - procedure SetPanel(aValue : TCustomPanel); - - public - constructor Create(aPanel : TCustomPanel); - destructor Destroy; override; - procedure CreateContext; - procedure DestroyContext; - procedure SetClientWindow; - procedure ResetClientWindow; - procedure ConnectSignals; - procedure Focus; - procedure Blur; - procedure Reset; - procedure SetCursorLocation(X, Y: integer); - {$IF DEFINED(LCLGTK2) or DEFINED(LCLGTK3)} - function FilterKeyPress(aEvent : PGdkEventKey) : boolean; - {$ENDIF} - - property Initialized : boolean read GetInitialized; - property HasFocus : boolean read FHasFocus; - property Panel : TCustomPanel read FPanel write SetPanel; - end; - -implementation - -// https://chromium.googlesource.com/chromium/src/+/4079d37114e1dd416e99d5edc535f4214b787fc7/chrome/browser/ui/gtk/input_method_context_impl_gtk.cc -// https://chromium.googlesource.com/chromium/src/+/refs/heads/main/ui/gtk/input_method_context_impl_gtk.cc - -uses - {$IF DEFINED(LCLGTK2) or DEFINED(LCLGTK3)}pango,{$ENDIF} - {$IFDEF FPC}LCLType, LCLIntf, LMessages,{$ENDIF} - SysUtils; - -{$IF DEFINED(LCLGTK2) or DEFINED(LCLGTK3)} -procedure gtk_commit_cb({%H-}context: PGtkIMContext; const Str: Pgchar; {%H-}Data: Pointer); cdecl; -begin - SendMessage(HWND(Data), LM_IM_COMPOSITION, GTK_IM_FLAG_COMMIT, LPARAM(Str)); -end; - -procedure gtk_preedit_start_cb({%H-}context: PGtkIMContext; {%H-}Data: Pointer); cdecl; -begin - SendMessage(HWND(Data), LM_IM_COMPOSITION, GTK_IM_FLAG_START, LPARAM(context)); -end; - -procedure gtk_preedit_end_cb({%H-}context: PGtkIMContext; {%H-}Data: Pointer); cdecl; -begin - SendMessage(HWND(Data), LM_IM_COMPOSITION, GTK_IM_FLAG_END, LPARAM(context)); -end; - -procedure gtk_preedit_changed_cb({%H-}context:PGtkIMContext; {%H-}Data:Pointer); cdecl; -var - TempStr : Pgchar; - TempPangoAttr : PPangoAttrList; - TempCurpos : gint; -begin - gtk_im_context_get_preedit_string(context, @TempStr, {$IFDEF LCLGTK3}@{$ENDIF}TempPangoAttr, @TempCurpos); - SendMessage(HWND(Data), LM_IM_COMPOSITION, GTK_IM_FLAG_PREEDIT, LPARAM(pchar(TempStr))); - g_free(TempStr); - pango_attr_list_unref(TempPangoAttr); -end; -{$ENDIF} - -constructor TCEFLinuxOSRIMEHandler.Create(aPanel : TCustomPanel); -begin - inherited Create; - - FPanel := aPanel; - FHasFocus := False; - {$IF DEFINED(LCLGTK2) or DEFINED(LCLGTK3)} - FIMContext := nil; - {$ENDIF} - - if assigned(FPanel) then - FForm := GetParentForm(FPanel) - else - FForm := nil; -end; - -destructor TCEFLinuxOSRIMEHandler.Destroy; -begin - ResetClientWindow; - DestroyContext; - - inherited Destroy; -end; - -function TCEFLinuxOSRIMEHandler.GetInitialized : boolean; -begin - {$IF DEFINED(LCLGTK2) or DEFINED(LCLGTK3)} - Result := assigned(FPanel) and assigned(FIMContext); - {$ELSE} - Result := False; - {$ENDIF} -end; - -procedure TCEFLinuxOSRIMEHandler.SetPanel(aValue : TCustomPanel); - -begin - FPanel := aValue; - - if assigned(FPanel) then - FForm := GetParentForm(FPanel) - else - FForm := nil; -end; - -procedure TCEFLinuxOSRIMEHandler.CreateContext; -begin - {$IF DEFINED(LCLGTK2) or DEFINED(LCLGTK3)} - if not(assigned(FIMContext)) then - begin - FIMContext := gtk_im_multicontext_new(); - SetClientWindow; - ConnectSignals; - end; - {$ENDIF} -end; - -procedure TCEFLinuxOSRIMEHandler.DestroyContext; -begin - {$IF DEFINED(LCLGTK2) or DEFINED(LCLGTK3)} - if assigned(FIMContext) then - begin - g_object_unref(FIMContext); - FIMContext := nil; - end; - {$ENDIF} -end; - -procedure TCEFLinuxOSRIMEHandler.SetClientWindow; -{$IF DEFINED(LCLGTK2) or DEFINED(LCLGTK3)} -var - TempWidget : PGtkWidget; -{$ENDIF} -begin - if Initialized then - begin - {$IFDEF LCLGTK2} - TempWidget := PGtkWidget(FForm.Handle); - gtk_im_context_set_client_window(FIMContext, TempWidget^.window); - {$ENDIF} - {$IFDEF LCLGTK3} - TempWidget := TGtk3Widget(FForm.Handle).Widget; - gtk_im_context_set_client_window(FIMContext, TempWidget^.window); - {$ENDIF} - end; -end; - -procedure TCEFLinuxOSRIMEHandler.ResetClientWindow; -begin - if Initialized then - begin - {$IF DEFINED(LCLGTK2) or DEFINED(LCLGTK3)} - gtk_im_context_reset(FIMContext); - gtk_im_context_set_client_window(FIMContext, nil); - {$ENDIF} - end; -end; - -procedure TCEFLinuxOSRIMEHandler.ConnectSignals; -begin - if Initialized then - begin - {$IFDEF LCLGTK3} - g_signal_connect_data(PGObject(@FIMContext), 'commit', TGCallback(@gtk_commit_cb), GPointer(FPanel.Handle), nil, G_CONNECT_DEFAULT); - g_signal_connect_data(PGObject(@FIMContext), 'preedit-start', TGCallback(@gtk_preedit_start_cb), GPointer(FPanel.Handle), nil, G_CONNECT_DEFAULT); - g_signal_connect_data(PGObject(@FIMContext), 'preedit-end', TGCallback(@gtk_preedit_end_cb), GPointer(FPanel.Handle), nil, G_CONNECT_DEFAULT); - g_signal_connect_data(PGObject(@FIMContext), 'preedit-changed', TGCallback(@gtk_preedit_changed_cb), GPointer(FPanel.Handle), nil, G_CONNECT_DEFAULT); - {$ENDIF} - {$IFDEF LCLGTK2} - g_signal_connect(G_OBJECT(FIMContext), 'commit', G_CALLBACK(@gtk_commit_cb), GPointer(FPanel.Handle)); - g_signal_connect(G_OBJECT(FIMContext), 'preedit-start', G_CALLBACK(@gtk_preedit_start_cb), GPointer(FPanel.Handle)); - g_signal_connect(G_OBJECT(FIMContext), 'preedit-end', G_CALLBACK(@gtk_preedit_end_cb), GPointer(FPanel.Handle)); - g_signal_connect(G_OBJECT(FIMContext), 'preedit-changed', G_CALLBACK(@gtk_preedit_changed_cb), GPointer(FPanel.Handle)); - {$ENDIF} - end; -end; - -procedure TCEFLinuxOSRIMEHandler.Focus; -begin - if Initialized then - begin - {$IF DEFINED(LCLGTK2) or DEFINED(LCLGTK3)} - gtk_im_context_focus_in(FIMContext); - {$ENDIF} - FHasFocus := True; - end; -end; - -procedure TCEFLinuxOSRIMEHandler.Blur; -begin - if Initialized then - begin - {$IF DEFINED(LCLGTK2) or DEFINED(LCLGTK3)} - gtk_im_context_focus_out(FIMContext); - {$ENDIF} - FHasFocus := False; - end; -end; - -procedure TCEFLinuxOSRIMEHandler.Reset; -begin - if Initialized then - begin - {$IF DEFINED(LCLGTK2) or DEFINED(LCLGTK3)} - gtk_im_context_reset(FIMContext); - - // Some input methods may not honour the reset call. - // Focusing out/in the to make sure it gets reset correctly. - if FHasFocus then - begin - gtk_im_context_focus_out(FIMContext); - gtk_im_context_focus_in(FIMContext); - end; - {$ENDIF} - end; -end; - -procedure TCEFLinuxOSRIMEHandler.SetCursorLocation(X, Y: integer); -{$IF DEFINED(LCLGTK2) or DEFINED(LCLGTK3)} -var - TempCurPos: TGdkRectangle; -{$ENDIF} -begin - if Initialized then - begin - {$IF DEFINED(LCLGTK2) or DEFINED(LCLGTK3)} - TempCurPos.x := x; - TempCurPos.y := y; - TempCurPos.width := 0; - TempCurPos.height := 0; - - gtk_im_context_set_cursor_location(FIMContext, @TempCurPos); - {$ENDIF} - end; -end; - -{$IF DEFINED(LCLGTK2) or DEFINED(LCLGTK3)} -function TCEFLinuxOSRIMEHandler.FilterKeyPress(aEvent : PGdkEventKey) : boolean; -begin - if Initialized then - Result := gtk_im_context_filter_keypress(FIMContext, aEvent); -end; -{$ENDIF} - -end. - diff --git a/packages/cef4delphi_lazarus.lpk b/packages/cef4delphi_lazarus.lpk index 8ff16adc..553b0e3a 100644 --- a/packages/cef4delphi_lazarus.lpk +++ b/packages/cef4delphi_lazarus.lpk @@ -22,7 +22,7 @@ - + diff --git a/packages/cef4delphi_lazarus.pas b/packages/cef4delphi_lazarus.pas index 2c78c365..bcfc7bc8 100644 --- a/packages/cef4delphi_lazarus.pas +++ b/packages/cef4delphi_lazarus.pas @@ -71,7 +71,7 @@ uses uCEFSharedMemoryRegion, uCEFPreferenceManager, uCEFPreferenceRegistrar, uCEFApplicationEvents, uCEFBrowserBitmap, uCEFComponentIdList, uCEFWindowInfoWrapper, uCEFTaskManager, uCEFPreferenceObserver, - uCEFSettingObserver, LazarusPackageIntf; + uCEFSettingObserver, uCEFLinuxOSRIMEHandler, LazarusPackageIntf; implementation diff --git a/update_CEF4Delphi.json b/update_CEF4Delphi.json index 4d3c7112..870d73e2 100644 --- a/update_CEF4Delphi.json +++ b/update_CEF4Delphi.json @@ -2,7 +2,7 @@ "UpdateLazPackages" : [ { "ForceNotify" : true, - "InternalVersion" : 770, + "InternalVersion" : 771, "Name" : "cef4delphi_lazarus.lpk", "Version" : "139.0.28" }