From efe547e62811b7ea014999b249a42d990a0400e6 Mon Sep 17 00:00:00 2001 From: JianjunLiu Date: Thu, 24 Nov 2022 14:14:16 +0800 Subject: [PATCH] gtk idle --- designer/gettslvcldesignerstart.tsf | 2 +- funcext/tvclib/tslvcl.tsf | 6 +- funcext/tvclib/ugtkinterface.tsf | 185 +++++++++++++++------------- funcext/tvclib/utslvclstdctl.tsf | 4 +- 4 files changed, 103 insertions(+), 94 deletions(-) diff --git a/designer/gettslvcldesignerstart.tsf b/designer/gettslvcldesignerstart.tsf index 95423ae..6acbea1 100644 --- a/designer/gettslvcldesignerstart.tsf +++ b/designer/gettslvcldesignerstart.tsf @@ -40,7 +40,7 @@ type TVclDesignerStart = class(TVclDesigner) //实 _wapi.bringWindowToTop(self.Handle); end inherited; - end + end function CreateParams(p);override; begin inherited; diff --git a/funcext/tvclib/tslvcl.tsf b/funcext/tvclib/tslvcl.tsf index 8fc7ee1..1c5f193 100644 --- a/funcext/tvclib/tslvcl.tsf +++ b/funcext/tvclib/tslvcl.tsf @@ -215,10 +215,10 @@ type tapplication=class(tcomponent) **} initialize(); {$ifdef linuxgtk} - idledata :=(new tcbytearray(4))._getptr_(); - id := tsl_gtk_idle_interface(idledata);//_wapi.tsl_gtk_idle_interface(idledata); //构造idle + //idledata :=(new tcbytearray(4))._getptr_(); + //id := tsl_gtk_idle_interface(idledata);//_wapi.tsl_gtk_idle_interface(idledata); //构造idle _wapi.gtk_main(); - _Wapi.g_idle_remove_by_data(idledata); //删除idle + //_Wapi.g_idle_remove_by_data(idledata); //删除idle return 1; {$endif} if not FMessageObj then FMessageObj := new TTagMSG(); diff --git a/funcext/tvclib/ugtkinterface.tsf b/funcext/tvclib/ugtkinterface.tsf index 2bdb59f..d47bf4a 100644 --- a/funcext/tvclib/ugtkinterface.tsf +++ b/funcext/tvclib/ugtkinterface.tsf @@ -6625,112 +6625,111 @@ function g_main_context_new():pointer;cdecl;external "libgtk-3.so"; function g_main_context_ref(m:pointer):pointer;cdecl;external "libgtk-3.so"; function g_main_context_acquire(m:pointer):integer;cdecl;external "libgtk-3.so"; procedure g_main_context_release(m:pointer);cdecl;external "libgtk-3.so"; -type tGtkMessageQueue = class //消息队列 -{** +type tGtkMessageQueue=class //消息队列 + {** @ignore(忽略) gtk消息队列 -**} - private - - public - function Create(); - begin - Clean(); - FMainContext := g_main_context_new(); - g_main_context_ref(FMainContext); - fLock := 0; - end - function Add(h,m,l,w,obj); - begin - lock(); - FLen++; - FData[FLen] := array(h,m,l,w,obj); - unlock(); - end - - function Feach(); - begin - lock(); - if FCurrent100 then - begin - FData := FData[FCurrent+1:];//min(FLen-1,FCurrent+100)]; - FCurrent := -1; - FLen := length(FData); - end - end - else - begin - Clean(); - end - unlock(); - return r; - end - function cleaneasyLostMessage(h,m); - begin - idx := FCurrent; - lock(); - while idx100 then + begin + FData := FData[FCurrent:]; //min(FLen-1,FCurrent+100)]; + FCurrent :=0; + FLen := length(FData); + end + end else + begin + Clean(); + end + unlock(); + return r; + end + function cleaneasyLostMessage(h,m); + begin + idx := FCurrent; + lock(); + while idx0) then + return; + if(fLock>0)then begin fLock--; - if (fLock=0) then + if(fLock=0)then begin g_main_context_release(FMainContext); end end end - end +end + function _gtkeventcall_();//消息回调 begin r := class(tgtk_ctl_object).DispatchGtkEventCall(params); @@ -6839,6 +6838,11 @@ begin _wapi.cairo_destroy(cr); _wapi.gtk_object_set_data(cr); end +function createidle(); +begin + idledata :=(new tcbytearray(4))._getptr_(); + id := tsl_gtk_idle_interface(idledata); +end function _gtkidledo_(); //回调 begin d := FeachMessageFromGtkMessageQueue(); @@ -6873,19 +6877,22 @@ begin return 1; end - return r; + return 1; //r end else begin tslprocessmessages(false); //sleep(10); end + r := 1; end else begin + r := 0; tslprocessmessages(false); //sleep(10);//休息一下 end unit(uvclthreadworker).RunThreadWorkerHost(); + return r; end procedure tslprocessmessages()begin end; function InitGtkWindowClass(); //初始化窗口类 diff --git a/funcext/tvclib/utslvclstdctl.tsf b/funcext/tvclib/utslvclstdctl.tsf index f87e5a3..1ebb4de 100644 --- a/funcext/tvclib/utslvclstdctl.tsf +++ b/funcext/tvclib/utslvclstdctl.tsf @@ -5566,7 +5566,8 @@ type TcustomStatusBar=class(TCustomControl) if nv<>FItemOder then begin FItemOder := nv; - InvalidateRect(nil,false); + if FItems then + InvalidateRect(nil,false); end end function paintb();//从左到右 @@ -6769,6 +6770,7 @@ end initialization {$ifdef linux} class(tUIglobalData).uisetdata("G_T_TTIMER_",class(TCustomTimer)); +class(TCustomTimer)._wapi.SetTimer(nil,10000,100,getwinprocptr(2)); {$endif} end. \ No newline at end of file