From 517a0522055e1c8269bf1dadc4b2f40c2095b053 Mon Sep 17 00:00:00 2001 From: JianjunLiu Date: Fri, 22 Apr 2022 15:27:57 +0800 Subject: [PATCH] =?UTF-8?q?=E7=95=8C=E9=9D=A2=E5=BA=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 浼樺寲浠g爜 --- funcext/tvclib/tgdiplusflat.tsf | 6 +- funcext/tvclib/tslvcl.tsf | 792 +++++++++++++++---------------- funcext/tvclib/ugtkinterface.tsf | 7 +- plugin/TSLUIL.dll | Bin 49152 -> 49152 bytes 4 files changed, 387 insertions(+), 418 deletions(-) diff --git a/funcext/tvclib/tgdiplusflat.tsf b/funcext/tvclib/tgdiplusflat.tsf index b5b3c0a..16153d4 100644 --- a/funcext/tvclib/tgdiplusflat.tsf +++ b/funcext/tvclib/tgdiplusflat.tsf @@ -314,7 +314,11 @@ type TGdiplusflat=class class function GlobalSize(menm:pointer):integer;stdcall;external "Kernel32.dll" name "GlobalSize"; class function memcpy(dst:pointer;src:string;size_t:integer):pointer;cdecl;external "msvcrt.dll" name "memcpy"; class function memcpy2(var dst:string;src:pointer;size_t:integer):pointer;cdecl;external "msvcrt.dll" name "memcpy"; - class function tuicloseistream(sm:pointer):integer;cdecl;external "TSLUIL.dll" name "tuicloseistream"; + class function tuicloseistream(sm:pointer); + begin + r := tslvclcloseistream(sm); + return r; + end class function GlobalAlloc(uFlags :integer;dwBytes:integer):pointer;stdcall;external "Kernel32.dll" name "GlobalAlloc"; class Function GdipCreatePath(brushMode:integer;var path:pointer):integer;stdcall;external "gdiplus.dll" name "GdipCreatePath"; diff --git a/funcext/tvclib/tslvcl.tsf b/funcext/tvclib/tslvcl.tsf index 76ebd5a..64194f2 100644 --- a/funcext/tvclib/tslvcl.tsf +++ b/funcext/tvclib/tslvcl.tsf @@ -954,7 +954,6 @@ end end end class function MultiByteToWideChar_a(CodePage:integer;dwFlags:integer;lpMultiByteStr:string;cbMultiByte:integer;var lpWideCharStr:string;cchWideChar:integer):integer; - class function tuicloseistream(sm:pointer):integer; class function GetEncoderClsid(n:String;ed:pointer):integer; begin WriteStringToPtr(ed,n); //保存 @@ -2770,7 +2769,7 @@ end gtk_widget_destroy(cdlg); return r=-5; end - function tsl_gtk_color_selection_property(w:pointer):pointer;cdecl;external "./plugin/libTSLUIL.so"; + type TBrowseinfoA_ = class(tslcstructureobj) {** @explan(说明)文件夹选择结构 %% @@ -3066,8 +3065,11 @@ end MultiByteToWideChar_a(0, 0, c , -1, pwszUnicode , iSize-1); return pwszUnicode; end - class function GetEncoderClsid(n:String;ed:pointer):integer;cdecl;external "TSLUIL.dll" name "GetEncoderClsid"; - class function tuicloseistream(sm:pointer):integer;cdecl;external "TSLUIL.dll" name "tuicloseistream"; + class function GetEncoderClsid(n:String;ed:pointer); + begin + r := tslvclgetencoderclsid(n,ed); + return r; + end; //*********** function GetDpiForMonitor(hmonitor:pointer; dpiType:integer;var dpiX:integer;var dpiY:integer):pointer;stdcall;external "Shcore.dll" name "GetDpiForMonitor"; //Kernel32.dll @@ -25745,16 +25747,6 @@ type TImage=class(TSLUIBASE) vp := GetFileType(t); s := gdi.imagetostring(FHandle,vp); return s; - ///////////////// - st := ImageToStream(t); - _wapi.GetHGlobalFromStream(st,memo); - len := _wapi.GlobalSize(memo); - s := ""; - lm := _wapi.GlobalLock(memo); - setlength(s,len); - _wapi.memcpy2(s,lm,len); - _wapi.tuicloseistream(st); - return s; end function StringToImage(b); begin @@ -25771,24 +25763,6 @@ type TImage=class(TSLUIBASE) FHandle := hd; end return r; - //////////////////////////////////// - len := length(b); - hm := _wapi.GlobalAlloc(2,len+1); //分配内容 - lm := _wapi.GlobalLock(hm); //枷锁 - if lm <> 0 then - begin - _wapi.memcpy(lm,b,len); //内存拷贝 - _wapi.GlobalUnlock(hm); //解锁 - end - _wapi.CreateStreamOnHGlobal(hm,true,st); - r := gdi.GdipLoadImageFromStream(st,hd); - if hd then - begin - DestroyHandle(); - FHandle := hd; - end - _wapi.tuicloseistream(st); - return r; end function ToHbitmap(); begin @@ -28221,7 +28195,8 @@ type TBasicAction=class(TComponent) begin if FOnExecute then begin - calldatafunction(FOnExecute,self); + e := new tuieventbase(0,0,0,0); + calldatafunction(FOnExecute,self(true),e); return true; end return false; @@ -31809,388 +31784,377 @@ type TArrayTreeClass = class FSubName := sub; end end + function create(v); + begin + {** + @explan(说明) 构造节点 %% + **} + FId := v[FIdName]; + FValue := v; + FComponents := array(); + end + function addcomponent(o); + begin + {** + @explan(说明) 添加节点 %% + **} + len := length(FComponents); + for i := 0 to len-1 do if o=FComponents[i]then exit; + FComponents[len]:= o; + end + function Recycle(); + begin + {** + @explan(说明) 出现死循环的时候的处理 %% + **} + if FRecyce then return; + FRecyce := true; + for i,v in FComponents do + begin + v.Recycle(); + end + FComponents := array(); + end + function toarray(); + begin + {** + @explan(说明) 转换为array %% + **} + if FInToArray=FSInToArray then + begin + Recycle(); + raise "节点关系出现循环"; + end + FInToArray := FSInToArray; + ret := array(); + sub := array(); + for i := 0 to length(FComponents)-1 do + begin + ret[FSubName,i]:= FComponents[i].toarray(); + end + for i,v in FValue do + begin + if i=FSubName then continue; + ret[i]:= v; + end + return ret; + end + class function SetColumnName(info); + begin + if not ifarray(info)then info := array("id":"id","pid":"pid","sub":"sub"); + if not ClumnNameOk(info["id"])then info["id"]:= "id"; + if not ClumnNameOk(info["pid"])then info["pid"]:= "pid"; + if not ClumnNameOk(info["sub"])then info["sub"]:= "sub"; + SetIdName(info["id"],info["pid"],info["sub"]); + end + class function ToTree(d,info); + begin + {** + @explan(说明) 二维表转换为树结构 %% + @param(d)(array) 数据包含 信息 %% + @param(info)(array) 字段信息 "id" 当前节点的字段,"pid" 当前节点的父节点字段,"sub" ,返回子节点的字段 + 默认值 array("id":"id","pid":"pid","sub":"sub"); %% + @return(TArrayTreeClass) + **} + SetColumnName(info); + root := new TArrayTreeClass(array(FIdName:nil,FPIdName:nil)); + oarray := array(); + oarray[-inf]:= root; + for i,v in d do //构建id + begin + id := v[FIdName]; + ido := oarray[id]; + if ifnil(ido)then + begin + ido := new TArrayTreeClass(v); + oarray[id]:= ido; + end + end + ifcycle := true; + for i,v in d do + begin + id := v[FIdName]; + ido := oarray[id]; + pid := v[FPIdName]; + pdo := oarray[pid]; + if not pdo then + begin + pdo := oarray[-inf]; + ifcycle := false; + end + pdo.addcomponent(ido); + end + if ifcycle and oarray then + begin + for i,v in oarray do + begin + v.Recycle(); + raise "节点关系出现循环"; + break; + end + end + return root; + end + class function CreateRow(d,id,r); + begin + for i,v in d do + begin + ri := array(); + if not v then continue; + ri[FIdName]:= GetCounter(); + ri[FPIdName]:= id; + for j,vi in v do + begin + if j=FSubName then + begin + call(thisfunction,vi,ri[FIdName],r); + end + {else if j=FIdName or j = FPIdName then + begin + + end}else + begin + ri[j]:= vi; + end + end + if ri then + begin + r[length(r)]:= ri; + end + end + end + class function TreeArrayToArray(d,info); + begin + {** + @explan(说明) 树结构转换为二维表 %% + @param(d)(array) 数据包含 信息 %% + @param(info)(array) 字段信息 "id" 当前节点的字段,"pid" 当前节点的父节点字段,"sub" ,返回子节点的字段 + 默认值 array("id":"id","pid":"pid","sub":"sub"); %% + @return(array) + **} + if not ifarray(d)then exit; + SetColumnName(info); + r := array(); + initconter(); + CreateRow(d,GetCounter(),r); + return r; + end + class function ToTreeArray(d,info); + begin + {** + @explan(说明) 二维表转换为树结构 %% + @param(d)(array) 数据包含 信息 %% + @param(info)(array) 字段信息 "id" 当前节点的字段,"pid" 当前节点的父节点字段,"sub" ,返回子节点的字段 + 默认值 array("id":"id","pid":"pid","sub":"sub"); %% + @return(array) 树形结构的array + **} + root := ToTree(d,info); + if not root then return; + FSInToArray := tostn(now()); + r :=(root.toarray()); + return r; + end +end +type TIniFileExta=class() + {** + @explan(说明) ini文件读写封装 %% + **} + private + FTStringa; + Fini; + FVtype; + FLowerKey; + FLowerValue; + function CheckSK(s,k); + begin + return ifstring(s) and s and ifstring(k) and k; + end + function ChangeV(V); + begin + vv := v; + case Vtype of + 1:vv := vv="0"?false:true; + 2:vv := StrToIntDef(vv,0); + else + begin + if FLowerValue then vv := lowercase(vv); + end + end + return vv; + end + function STNVA(); + begin + {** + @explan(说明) 转换为name,value 列的二维数组 %% + **} + r := array(); + for i := 0 to FTStringa.Count-1 do + begin + n := FTStringa.Names(i); + if n then + begin + if FLowerKey then n := lowercase(n); + vv := FTStringa.Values(n); + r[length(r)]:= array("name":n,"value":ChangeV(vv)); + end + end + FTStringa.Clear(); + return r; + end + function STNV(); + begin + {** + @explan(说明) 转换为name:value 一维数组 %% + **} + nr := STNVA(); + r := array(); + for i,v in nr do + begin + r[v["name"]]:= v["value"]; + end + return r; + end + function STA(); + begin + {** + @explan(说明) 转换为一维数组 %% + **} + r := array(); + for i := 0 to FTStringa.Count-1 do + begin + vi := FTStringa.Strings(i); + r[i]:= FLowerKey?lowercase(vi):vi; + end + FTStringa.Clear(); + return r; + end + public + function create(al,Fname);override; + begin + {** + @explan(说明) 构造函数 %% + @param(al)(string) 别名 %% + @param(name)(string) 文件名 %% + **} + if ifstring(al)and ifstring(Fname)then + begin + FIni := new TIniFile(al,Fname); + FTStringa := new TStringlist(); + end else + raise "ini对象读写构造参数错误"; + end + function readSection(sn);virtual; + begin + {** + @explan(说明) 读取section 下面key %% + **} + if ifstring(sn)and sn then Fini.readSection(sn,FTStringa); + return STA(); + end + function ReadSections();virtual; + begin + {** + @explan(说明) 读取所有section名字 %% + **} + FIni.ReadSections(FTStringa); + return STA(); + end + function ReadSectionValues(sn);virtual; + begin + {** + @explan(说明) 读取section下面的所有key:value %% + **} + if ifstring(sn)and sn then FIni.ReadSectionValues(sn,FTStringa); + return STNV(); + end + function RenameSection(sn1,sn2);virtual; + begin + {** + @explan(说明) 重命名section %% + @param(sn1)(string) 旧名字 %% + @param(sn2)(string) 新名字 %% + **} + if not(sn1 and sn2 and ifstring(sn1))and ifstring(sn2)then exit; + vs1 := ReadSectionValues(sn1); + EraseSection(sn1); + for i,v in vs1 do + begin + WriteKey(sn2,i,v); + end + end + function RenameKey(sec,k1,k2);virtual; + begin + {** + @explan(说明) 重命名key %% + @param(sec)(string) section名称 %% + @param(k1)(string) 旧名字 %% + @param(k2)(string) 新名字 %% + **} + if(sec and k2 and k1 and ifstring(sec)and ifstring(k1)and ifstring(k2))then exit; + v := ReadKey(sec,k1); + DeleteKey(sec,k1); + WriteKey(sec,k2,v); + end + function ReadSectionValues2(sn); + begin + {** + @explan(说明) 获得section 数据,二维表,name,value 列 + **} + if ifstring(sn)and sn then FIni.ReadSectionValues(sn,FTStringa); + return STNVA(); + end + function ReadSectionValues3(sn); + begin + {** + @explan(说明) 获得section 数据,二维表,0列为key,1列为value + **} + d := ReadSectionValues2(sn); + r := array(); + for i,v in d do + begin + r[length(r)]:= array(v["name"],v["value"]); + end + return r; + end + function ReadKey(sn,key,def);virtual; + begin + {** + @explan(说明) 读取key %% + **} + if CheckSK(sn,key)then return FIni.ReadString(sn,key,ifstring(def)?def:""); + return nil; + end + function WriteKey(sn,key,v);virtual; + begin + {** + @explan(说明) 写入key %% + **} + if ifnil(v)then v := ""; + if CheckSK(sn,key)then return FIni.WriteString(sn,key,ifstring(v)?v:tostn(v)); + return 0; + end + function DeleteKey(sn,key);virtual; + begin + if CheckSK(sn,key)then return FIni.DeleteKey(sn,key); + end + function EraseSection(sn);virtual; + begin + {** + @explan(说明)删除section %% + **} + if ifstring(sn)and sn then return FIni.EraseSection(sn); + end + function Destroy();virtual; + begin + FIni := nil; + FTStringa := nil; + end + property VType read FVtype write FVtype; + property LowerKey read FLowerKey write FLowerKey; + property LowerValue read FLowerValue write FLowerValue; + _tag; +end - function create(v); - begin - {** - @explan(说明) 构造节点 %% - **} - FId := v[FIdName]; - FValue := v; - FComponents := array(); - end - function addcomponent(o); - begin - {** - @explan(说明) 添加节点 %% - **} - len := length(FComponents); - for i:= 0 to len-1 do if o= FComponents[i] then exit; - FComponents[len] := o; - end - function Recycle(); - begin - {** - @explan(说明) 出现死循环的时候的处理 %% - **} - if FRecyce then return ; - FRecyce := true; - for i,v in FComponents do - begin - v.Recycle(); - end - FComponents := array(); - end - function toarray(); - begin - {** - @explan(说明) 转换为array %% - **} - if FInToArray=FSInToArray then - begin - Recycle(); - raise "节点关系出现循环"; - end - FInToArray := FSInToArray; - ret := array(); - sub := array(); - for i := 0 to length( FComponents)-1 do - begin - ret[FSubName,i] := FComponents[i].toarray(); - end - for i,v in FValue do - begin - if i =FSubName then continue; - ret[i] := v; - end - return ret; - end - - class function SetColumnName(info); - begin - if not ifarray(info) then info := array("id":"id","pid":"pid","sub":"sub"); - if not ClumnNameOk(info["id"]) then info["id"] := "id"; - if not ClumnNameOk(info["pid"]) then info["pid"] := "pid"; - if not ClumnNameOk(info["sub"]) then info["sub"] := "sub"; - SetIdName(info["id"],info["pid"],info["sub"]); - end - class function ToTree(d,info); - begin - {** - @explan(说明) 二维表转换为树结构 %% - @param(d)(array) 数据包含 信息 %% - @param(info)(array) 字段信息 "id" 当前节点的字段,"pid" 当前节点的父节点字段,"sub" ,返回子节点的字段 - 默认值 array("id":"id","pid":"pid","sub":"sub"); %% - @return(TArrayTreeClass) - **} - SetColumnName(info); - root := new TArrayTreeClass(array(FIdName:nil,FPIdName:nil)); - oarray := array(); - oarray[-inf] := root; - for i,v in d do //构建id - begin - id := v[FIdName]; - ido := oarray[id]; - if ifnil(ido) then - begin - ido := new TArrayTreeClass(v); - oarray[id] := ido; - end - end - ifcycle := true; - for i,v in d do - begin - id := v[FIdName]; - ido := oarray[id]; - pid := v[FPIdName]; - pdo := oarray[pid]; - if not pdo then - begin - pdo := oarray[-inf]; - ifcycle := false; - end - - pdo.addcomponent(ido); - end - if ifcycle and oarray then - begin - for i,v in oarray do - begin - v.Recycle(); - raise "节点关系出现循环"; - break; - end - end - return root; - end - class function CreateRow(d,id,r); - begin - for i,v in d do - begin - ri := array(); - if not v then continue; - ri[FIdName] := GetCounter(); - ri[FPIdName] := id; - for j,vi in v do - begin - if j = FSubName then - begin - call(thisfunction,vi,ri[FIdName],r); - end - {else if j=FIdName or j = FPIdName then - begin - - end} else - begin - ri[j] := vi; - end - end - if ri then - begin - r[length(r)] := ri; - end - end - end - class function TreeArrayToArray(d,info); - begin - {** - @explan(说明) 树结构转换为二维表 %% - @param(d)(array) 数据包含 信息 %% - @param(info)(array) 字段信息 "id" 当前节点的字段,"pid" 当前节点的父节点字段,"sub" ,返回子节点的字段 - 默认值 array("id":"id","pid":"pid","sub":"sub"); %% - @return(array) - **} - if not ifarray(d) then exit; - SetColumnName(info); - r := array(); - initconter(); - CreateRow(d,GetCounter(),r); - return r; - end - class function ToTreeArray(d,info); - begin - {** - @explan(说明) 二维表转换为树结构 %% - @param(d)(array) 数据包含 信息 %% - @param(info)(array) 字段信息 "id" 当前节点的字段,"pid" 当前节点的父节点字段,"sub" ,返回子节点的字段 - 默认值 array("id":"id","pid":"pid","sub":"sub"); %% - @return(array) 树形结构的array - **} - root := ToTree(d,info); - if not root then return ; - FSInToArray := tostn(now()); - r := (root.toarray()); - return r; - end - end - type TIniFileExta = class() - {** - @explan(说明) ini文件读写封装 %% - **} - private - FTStringa; - Fini; - FVtype; - FLowerKey; - FLowerValue; - function CheckSK(s,k); - begin - return ifstring(s) and s and ifstring(k) and k; - end - function ChangeV(V); - begin - vv := v; - case Vtype of - 1:vv := vv="0"?false:true; - 2:vv := StrToIntDef(vv,0); - else - begin - if FLowerValue then vv := lowercase(vv); - end - end - return vv; - end - function STNVA(); - begin - {** - @explan(说明) 转换为name,value 列的二维数组 %% - **} - r := array(); - for i:=0 to FTStringa.Count-1 do - begin - n := FTStringa.Names(i); - if n then - begin - if FLowerKey then n := lowercase(n); - vv := FTStringa.Values(n); - r[length(r)] := array("name":n,"value":ChangeV(vv)); - end - end - FTStringa.Clear(); - return r; - end - - function STNV(); - begin - {** - @explan(说明) 转换为name:value 一维数组 %% - **} - nr := STNVA(); - r := array(); - for i,v in nr do - begin - r[v["name"]] := v["value"]; - end - return r; - end - function STA(); - begin - {** - @explan(说明) 转换为一维数组 %% - **} - r := array(); - for i:=0 to FTStringa.Count-1 do - begin - vi := FTStringa.Strings(i); - r[i] := FLowerKey?lowercase(vi):vi ; - end - FTStringa.Clear(); - return r; - end - public - function create(al,Fname);override; - begin - {** - @explan(说明) 构造函数 %% - @param(al)(string) 别名 %% - @param(name)(string) 文件名 %% - **} - if ifstring(al) and ifstring(Fname) then - begin - FIni := new TIniFile(al,Fname); - FTStringa := new TStringlist(); - end else - raise "ini对象读写构造参数错误"; - end - function readSection(sn);virtual; - begin - {** - @explan(说明) 读取section 下面key %% - **} - if ifstring(sn) and sn then - Fini.readSection(sn,FTStringa); - return STA(); - end - function ReadSections();virtual; - begin - {** - @explan(说明) 读取所有section名字 %% - **} - FIni.ReadSections(FTStringa); - return STA(); - end - function ReadSectionValues(sn);virtual; - begin - {** - @explan(说明) 读取section下面的所有key:value %% - **} - if ifstring(sn) and sn then - FIni.ReadSectionValues(sn,FTStringa); - return STNV(); - end - function RenameSection(sn1,sn2);virtual; - begin - {** - @explan(说明) 重命名section %% - @param(sn1)(string) 旧名字 %% - @param(sn2)(string) 新名字 %% - **} - if not(sn1 and sn2 and ifstring(sn1)) and ifstring(sn2) then exit; - vs1 := ReadSectionValues(sn1); - EraseSection(sn1); - for i,v in vs1 do - begin - WriteKey(sn2,i,v); - end - end - function RenameKey(sec,k1,k2);virtual; - begin - {** - @explan(说明) 重命名key %% - @param(sec)(string) section名称 %% - @param(k1)(string) 旧名字 %% - @param(k2)(string) 新名字 %% - **} - if (sec and k2 and k1 and ifstring(sec) and ifstring(k1) and ifstring(k2)) then exit; - v := ReadKey(sec,k1); - DeleteKey(sec,k1); - WriteKey(sec,k2,v); - end - function ReadSectionValues2(sn); - begin - {** - @explan(说明) 获得section 数据,二维表,name,value 列 - **} - if ifstring(sn) and sn then - FIni.ReadSectionValues(sn,FTStringa); - return STNVA(); - end - function ReadSectionValues3(sn); - begin - {** - @explan(说明) 获得section 数据,二维表,0列为key,1列为value - **} - d := ReadSectionValues2(sn); - r := array(); - for i,v in d do - begin - r[length(r)] := array(v["name"],v["value"]); - end - return r; - end - function ReadKey(sn,key,def);virtual; - begin - {** - @explan(说明) 读取key %% - **} - if CheckSK(sn,key) then - return FIni.ReadString(sn,key,ifstring(def)?def:""); - return nil; - end - function WriteKey(sn,key,v);virtual; - begin - {** - @explan(说明) 写入key %% - **} - - if ifnil(v) then v := ""; - if CheckSK(sn,key) then - return FIni.WriteString(sn,key,ifstring(v)?v:tostn(v)); - return 0; - end - function DeleteKey(sn,key);virtual; - begin - if CheckSK(sn,key) then - return FIni.DeleteKey(sn,key); - end - function EraseSection(sn);virtual; - begin - {** - @explan(说明)删除section %% - **} - if ifstring(sn) and sn then - return FIni.EraseSection(sn); - end - function Destroy();virtual; - begin - FIni := nil; - FTStringa := nil; - end - property VType read FVtype write FVtype; - property LowerKey read FLowerKey write FLowerKey; - property LowerValue read FLowerValue write FLowerValue; - _tag; - end type TCreateProcessA = class() {** @explan(说明) 进程构造对象 %% diff --git a/funcext/tvclib/ugtkinterface.tsf b/funcext/tvclib/ugtkinterface.tsf index 08ca25b..93d0cff 100644 --- a/funcext/tvclib/ugtkinterface.tsf +++ b/funcext/tvclib/ugtkinterface.tsf @@ -453,6 +453,7 @@ type tgtkapis = class() //gtk function gtk_main_iteration():integer ;cdecl;external 'libgtk-3.so'; /////////////////////////////////////////////////////// function tsl_gtk_idle_interface(p:pointer):integer;cdecl;external "./plugin/libTSLUIL.so"; + function tsl_gtk_color_selection_property(w:pointer):pointer;cdecl;external "./plugin/libTSLUIL.so"; function g_idle_remove_by_data(p:pointer):integer;cdecl;external 'libgtk-3.so'; //////////////// @@ -2867,7 +2868,7 @@ type tgtk_ctl_object = class(_gtkeventtype) FConnectNameIds := array(); FConnectHandlers := array(); end - function getsingalmap();virtual; + function getsignalmap();virtual; begin return array( "wm-user":'tsl_gtk_wmuser_event', //用户 @@ -2898,7 +2899,7 @@ type tgtk_ctl_object = class(_gtkeventtype) end //echo "\r\nconnect ===========================",FHandle,"=====",n; eid := GetGtkEventNameOrId(ln); - fn := (getsingalmap())[ln]; + fn := (getsignalmap())[ln]; if not(fn and ifstring(fn)) then fn := "tsl_gtk_normal_event_cb"; lnid := g_signal_connect_data(FHandle, ln, gettslvcleventhandler(fn), eid,nil,0); FConnectNameIds[ln] := lnid; @@ -3143,7 +3144,7 @@ type tgtk_im_object = class(tgtk_ctl_object) Connect(v,f); end end - function getsingalmap();override; + function getsignalmap();override; begin return array( "preedit-start":"dodeleteevents" , diff --git a/plugin/TSLUIL.dll b/plugin/TSLUIL.dll index 7fb296e89191597883a07669b23e118a08367468..d0ad6652ce7c786234ad464340ed94c47e1ee47e 100644 GIT binary patch delta 10034 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