雖然之前修復了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(ansichar(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;

浙公網安備 33010602011771號