*/}}
Browse Source

Use Deferred destoy panel nodes to avoid user delay problem

Yiming Wu 2 years ago
parent
commit
0d56a13fcd
2 changed files with 12 additions and 2 deletions
  1. 1 0
      source/lagui/la_interface.h
  2. 11 2
      source/lagui/la_kernel.c

+ 1 - 0
source/lagui/la_interface.h

@@ -221,6 +221,7 @@ STRUCTURE(LA){
     laListHandle Controllers;
 
     laListHandle Windows;
+    laListHandle WastedPanels;
 
     real IdleStart, DelayStart;
     int DelayTriggered;

+ 11 - 2
source/lagui/la_kernel.c

@@ -407,6 +407,7 @@ void laShutoff(){
     laSharedTypeItem* sti; while(sti=lstPopItem(&MAIN.SharedTypePointerSync)){ memFree(sti); }
     laKeyMapItem* kmi; while(kmi=lstPopItem(&MAIN.KeyMap.Items)){ la_FreeKeyMapItem(kmi); }
     laTheme* t; while(t=lstPopItem(&MAIN.Themes)){ la_DestroyTheme(t); }
+    laPanel* p; while(p=lstPopItem(&MAIN.WastedPanels)){ memFree(p); }
 
     arrFree(&MAIN.InputBuf,&MAIN.InputBufNext);
     arrFree(&MAIN.InputBufU,&MAIN.InputBufUNext);
@@ -1840,8 +1841,16 @@ void la_EnsurePanelExtras(laPanel *p){
     p->PropLinkPP.LastPs->Type = L'.';
     p->PropLinkFakePS.p = p->PropLinkFakeProp;
 }
+laPanel* la_GivePanelNode(){
+    laPanel* p; if(p=lstPopItem(&MAIN.WastedPanels)) return p;
+    return memAcquire(sizeof(laPanel));
+}
+void la_ReturnPanelNode(laPanel* p){
+    memset(p,0,sizeof(laPanel));
+    lstAppendItem(&MAIN.WastedPanels, p);
+}
 laPanel *la_NewPanel(laUiTemplate* uit, int X, int Y, int W, int H, int MaxW, int MaxH, int MinW, int MinH, int SnapL, int SnapR, int SnapT, int SnapB){
-    laPanel *p = memAcquireHyper(sizeof(laPanel));
+    laPanel *p = la_GivePanelNode();
     int CW = MAIN.CurrentWindow->CW;
     int CH = MAIN.CurrentWindow->CH;
     p->PanelTemplate = uit;
@@ -2138,7 +2147,7 @@ void laDeferredDestroyPanel(laPanel *p){
 
     memFree(p->PropLinkContainer); memFree(p->PropLinkFakeProp);
 
-    memFree(p);
+    la_ReturnPanelNode(p);
 }
 void laDestroySinglePanel(laPanel *p){
     la_SetPropMathcerContext(p);