虽然之前修复了lazarus的代码编辑、synedit控件和cudatex在linux下不能输入中文的bug,但存在使用搜狗输入法输入词组时只能输入第一个字的问题,原以为是synEdit控件引起的,对lazarus进行debug,终于找到问题所在的位置,最后发现在gtk2widgetset的gtk_commit_cb处理时添加1行代码就能解决这个Bug。
步骤如下:
1、打开/lazarus/lcl/interfaces/gtk2/gtk2widgetset.inc
2、找到第236行procedure gtk_commit_cb ({%H-}context: PGtkIMContext; const Str: Pgchar;
添加1行红字代码,
3、重新编译lazarus
编译后lazarus、SynEdit控件及cudatex(也要重新编译cudatex,可以在windows、linux和macos运行,很不错的编辑器)就可以完美兼容系统自带的输入法和搜狗输入法。
步骤如下:
1、打开/lazarus/lcl/interfaces/gtk2/gtk2widgetset.inc
2、找到第236行procedure gtk_commit_cb ({%H-}context: PGtkIMContext; const Str: Pgchar;
添加1行红字代码,
3、重新编译lazarus
编译后lazarus、SynEdit控件及cudatex(也要重新编译cudatex,可以在windows、linux和macos运行,很不错的编辑器)就可以完美兼容系统自带的输入法和搜狗输入法。
procedure gtk_commit_cb ({%H-}context: PGtkIMContext; const Str: Pgchar; {%H-}Data: Pointer); cdecl; {$IFDEF WITH_GTK2_IM} var control:TWinControl; i:Integer; {$ENDIF} begin {$IFDEF WITH_GTK2_IM} //DebugLn(['gtk_commit_cb ',dbgstr(Str),'="',Str,'"']); { fix double normal character input } if not im_context_use then im_context_string:=Str // key at non-composition else im_context_string_commit:=Str; // key at composition { commit composition string, not key } if (im_context_widget<>nil) then begin im_context_skipdelete:=True; Control:=TWinControl(GetNearestLCLObject(im_context_widget)); SendMessage(control.Handle,LM_IM_COMPOSITION,GTK_IM_FLAG_COMMIT,LPARAM(pchar(im_context_string_commit))); im_context_string_commit:=''; end; {$ELSE} im_context_string:=Str; {$ENDIF} end;
原来的方法在(fpc trunk)时编译出错,现修改为(紫色字代码):
procedure gtk_commit_cb ({%H-}context: PGtkIMContext; const Str: Pgchar; {%H-}Data: Pointer); cdecl; {$IFDEF WITH_GTK2_IM} var control:TWinControl; i:Integer; {$ENDIF} begin {$IFDEF WITH_GTK2_IM} //DebugLn(['gtk_commit_cb ',dbgstr(Str),'="',Str,'"']); { fix double normal character input } if (ord(anstchar(str[0]))>127) or (length(str)>1) then im_context_use:=true; if not im_context_use then im_context_string:=Str // key at non-composition else im_context_string_commit:=Str; // key at composition // { commit composition string, not key } if (im_context_widget<>nil) then begin im_context_skipdelete:=True; Control:=TWinControl(GetNearestLCLObject(im_context_widget)); SendMessage(control.Handle,LM_IM_COMPOSITION,GTK_IM_FLAG_COMMIT,LPARAM(pchar(im_context_string_commit))); im_context_string_commit:=''; end; {$ELSE} im_context_string:=Str; {$ENDIF} end;