|  | @@ -470,6 +470,8 @@ int laGetReady(){
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  void laShutoff(){
 | 
	
		
			
				|  |  | +    if(MAIN.Cleanup) MAIN.Cleanup();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |      strSafeDestroy(&MAIN.WorkingDirectory);
 | 
	
		
			
				|  |  |      strSafeDestroy(&MAIN.example_string);
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -743,6 +745,9 @@ void laRetriggerOperators(){
 | 
	
		
			
				|  |  |  void laSetFrameCallbacks(laPreFrameF PreFrame, laPreDrawF PreDraw, laPostFrameF PostFrame){
 | 
	
		
			
				|  |  |      MAIN.PreFrame=PreFrame; MAIN.PreDraw=PreDraw; MAIN.PostFrame=PostFrame;
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  | +void laSetCleanupCallback(laCleanupF Cleanup){
 | 
	
		
			
				|  |  | +    MAIN.Cleanup=Cleanup;
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  //====================================================================================================
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -3019,7 +3024,7 @@ laUiItem *la_UpdatePropDisplay(laUiItem *ui, laPropPack *Base, const char *Path,
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          if (!result){
 | 
	
		
			
				|  |  |              ui->AT = laGetOperatorType(Path);
 | 
	
		
			
				|  |  | -            if (!ui->AT /* && !OverrideType*/) return la_UpdatePropDisplay(ui, 0, "la.example_int", 0, 0, instructions);
 | 
	
		
			
				|  |  | +            if (!ui->AT /* && !OverrideType*/) return la_UpdatePropDisplay(ui, 0, "la.unknown_prop", 0, 0, instructions);
 | 
	
		
			
				|  |  |              ui->Type = la_GetUiButtonType();
 | 
	
		
			
				|  |  |              if (OverrideType && (OverrideType->ForType == LA_PROP_OPERATOR)) ui->Type = OverrideType;
 | 
	
		
			
				|  |  |          }else{
 | 
	
	
		
			
				|  | @@ -4321,7 +4326,7 @@ int la_UpdateUiListRecursive(laUiList *uil, int U, int L, int R, int B, int Fast
 | 
	
		
			
				|  |  |                  int MaxB = ElementB;
 | 
	
		
			
				|  |  |                  int CanGetTheme = laCanGetTheme(ui->PP.LastPs->p);laTheme* OriginalTheme=MAIN.CurrentTheme;
 | 
	
		
			
				|  |  |                  int CanGetGap= laCanGetGap(ui->PP.LastPs->p); int Gap=0;
 | 
	
		
			
				|  |  | -                int CanGetCategory= laCanGetCategory(ui->PP.LastPs->p); char _cat[256]; char* cat=_cat; int GotCategory=0;
 | 
	
		
			
				|  |  | +                int CanGetCategory= laCanGetCategory(ui->PP.LastPs->p); char _cat[256]; char* cat=_cat; int GotCategory=0,FirstIn=1;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |                  if (!ElementLimit) RowPriority = 0;
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -4350,11 +4355,12 @@ int la_UpdateUiListRecursive(laUiList *uil, int U, int L, int R, int B, int Fast
 | 
	
		
			
				|  |  |                          laGetCategory(ui->PP.LastPs->p, ui->PP.LastPs->UseInstance, ui->PP.EndInstance, _cat, &cat); if(cat[0]) GotCategory=1;
 | 
	
		
			
				|  |  |                      }else GotCategory=0;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -                    if(GotCategory){ Begin+=LA_RH*1.5+bt->TM; 
 | 
	
		
			
				|  |  | +                    if(GotCategory){ Begin+=LA_RH*(FirstIn?1:1.5)+bt->TM; 
 | 
	
		
			
				|  |  |                          if (RowPriority){
 | 
	
		
			
				|  |  | -                            Row += 1; Col=0; Begin = ElementB+bt->TM+LA_RH*1.5+bt->TM;
 | 
	
		
			
				|  |  | +                            Row += 1; Col=0; Begin = ElementB+bt->TM+LA_RH*(FirstIn?1:1.5)+bt->TM;
 | 
	
		
			
				|  |  |                          }
 | 
	
		
			
				|  |  |                      }
 | 
	
		
			
				|  |  | +                    FirstIn=0;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |                      if (ElementLimit){
 | 
	
		
			
				|  |  |                          EL = tnsInterpolate(ui->TL, ui->TR, (Col)*ElementWidth);
 | 
	
	
		
			
				|  | @@ -4972,7 +4978,10 @@ int la_DrawUiListRecursive(laUiListDraw *uild, laUiList *uil, int L, int R, int
 | 
	
		
			
				|  |  |                      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |                      if(sub->TabName && sub->TabName->Ptr){
 | 
	
		
			
				|  |  | -                        tnsDrawStringAuto(sub->TabName->Ptr,laThemeColor(bt,LA_BT_DISABLED|LA_BT_TEXT),ui->L+bt->LM+bt->LP,ui->R,sub->U-LA_RH,LA_TEXT_MONO);
 | 
	
		
			
				|  |  | +                        int NoDecal=ui->Flags&LA_UI_FLAGS_NO_DECAL;
 | 
	
		
			
				|  |  | +                        int NoGap=ui->Flags&LA_UI_FLAGS_NO_GAP;
 | 
	
		
			
				|  |  | +                        tnsDrawStringAuto(sub->TabName->Ptr,laThemeColor(bt,LA_BT_DISABLED|LA_BT_TEXT),
 | 
	
		
			
				|  |  | +                            ui->L+(NoDecal?0:bt->LM)+(NoGap?0:bt->LP),ui->R,sub->U-LA_RH,LA_TEXT_MONO);
 | 
	
		
			
				|  |  |                          tnsFlush();
 | 
	
		
			
				|  |  |                      }
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -5608,7 +5617,7 @@ void *la_DestroyOperator(laOperator **a, laListHandle *Operators, int OnlyThisOn
 | 
	
		
			
				|  |  |          MAIN.CurrentPanel = (*a)->OperatorPanel;
 | 
	
		
			
				|  |  |          laDestroySinglePanel((*a)->OperatorPanel,0);
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  | -    if ((*a)->CreatedThis) FreeMem((*a)->CreatedThis);
 | 
	
		
			
				|  |  | +    if ((*a)->CreatedThis) memFree((*a)->CreatedThis);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      if ((*a)->ExtraInstructionsP) strDestroyStringSplitor(&(*a)->ExtraInstructionsP);
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -5667,85 +5676,11 @@ int laOperatorAvailableSafe(char *ID, laPropPack *This, void *Real_FromInstance,
 | 
	
		
			
				|  |  |      return laOperatorAvailablePSafe(at, This, Real_FromInstance, Instructions);
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -int laInvokeUi(laOperator *From, char *ID, laEvent *e, void *inst, laListHandle *Locals, int IgnoreLocals){
 | 
	
		
			
				|  |  | -    laOperatorType *at;
 | 
	
		
			
				|  |  | -    laOperator *a, *f = From;
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    int rev;
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    if (la_UiOperatorExists(inst)) return -1;
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    at = hsh256FindItemSTR(&MAIN.OperatorTypeHash, la_OperatorTypeByID, ID);
 | 
	
		
			
				|  |  | -    if (!at) return -1;
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    a = la_CreateOperator(at);
 | 
	
		
			
				|  |  | -    a->Instance = inst;
 | 
	
		
			
				|  |  | -    a->ToPanel = MAIN.ToPanel;
 | 
	
		
			
				|  |  | -    if (!IgnoreLocals) lstGeneratePointerList(f ? &f->LocalUiLists : 0, Locals, &a->LocalUiLists);
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    if (From) f->Child = a;
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    a->Using = 1;
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    if (at->Init) at->Init(a);
 | 
	
		
			
				|  |  | -    rev = at->Invoke(a, e);
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    a->Using = 0;
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    if (rev & LA_FINISH){
 | 
	
		
			
				|  |  | -        a->StopNow = 1; if(From)From->Child=0;
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -    if (rev & LA_BLOCK){
 | 
	
		
			
				|  |  | -        lstAppendItem(&MAIN.CurrentWindow->PendingOperators, a);
 | 
	
		
			
				|  |  | -        a->State = rev;
 | 
	
		
			
				|  |  | -    }else la_DestroyOperator(&a, 0, 0);
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    return rev;
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | -int laInvokeUiP(laOperator *From, laOperatorType *at, laEvent *e, void *inst, laListHandle *Locals, int IgnoreLocals){
 | 
	
		
			
				|  |  | -    laOperator *a, *f = From;
 | 
	
		
			
				|  |  | -    int rev;
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    if (!at || (la_UiOperatorExists(inst))){
 | 
	
		
			
				|  |  | -        return -1;
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -    a = la_CreateOperator(at);
 | 
	
		
			
				|  |  | -    a->Instance = inst;
 | 
	
		
			
				|  |  | -    a->ToPanel = MAIN.ToPanel;
 | 
	
		
			
				|  |  | -    if (!IgnoreLocals) lstGeneratePointerList(f ? &f->LocalUiLists : 0, Locals, &a->LocalUiLists);
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    if (From) f->Child = a;
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    a->Using = 1;
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    if (at->Init) at->Init(a);
 | 
	
		
			
				|  |  | -    rev = at->Invoke(a, e);
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    a->Using = 0;
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    if (rev & LA_FINISH){
 | 
	
		
			
				|  |  | -        a->StopNow = 1; if(From)From->Child=0;
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -    if (rev & LA_BLOCK){
 | 
	
		
			
				|  |  | -        lstAppendItem(&MAIN.CurrentWindow->PendingOperators, a);
 | 
	
		
			
				|  |  | -        a->State = rev;
 | 
	
		
			
				|  |  | -    }else
 | 
	
		
			
				|  |  | -        la_DestroyOperator(&a, 0, 0);
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    DEB = a;
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    return rev;
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -int laInvoke(laOperator *From, char *ID, laEvent *e, laPropPack *This, char *args, char *args2){
 | 
	
		
			
				|  |  | -    laOperatorType *at;
 | 
	
		
			
				|  |  | +int laInvokeP(laOperator *From, laOperatorType *at, laEvent *e, laPropPack *This, char *args, char *args2){
 | 
	
		
			
				|  |  |      laOperator *a, *f = From;
 | 
	
		
			
				|  |  |      int rev;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -    at = hsh256FindItemSTR(&MAIN.OperatorTypeHash, la_OperatorTypeByID, ID);
 | 
	
		
			
				|  |  | -    if (!at) return -1;
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    if (!f && e && e->Localized) return -1;
 | 
	
		
			
				|  |  | +    if (!f && e&&e->Localized) return -1;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      a = la_CreateOperator(at);
 | 
	
		
			
				|  |  |      a->ToPanel = MAIN.ToPanel;
 | 
	
	
		
			
				|  | @@ -5760,14 +5695,21 @@ int laInvoke(laOperator *From, char *ID, laEvent *e, laPropPack *This, char *arg
 | 
	
		
			
				|  |  |          return LA_CANCELED;
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -    if (e&&(!e->Localized) && (at->ExtraMark & LA_EXTRA_TO_PANEL)){
 | 
	
		
			
				|  |  | +    lstGeneratePointerList(f ? &f->LocalUiLists : 0, 0, &a->LocalUiLists);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    if (e&&!e->Localized && at->ExtraMark & LA_EXTRA_TO_PANEL){
 | 
	
		
			
				|  |  |          laWindowToLocal(0, a->ToPanel, &e->x, &e->y);
 | 
	
		
			
				|  |  |          e->Localized = 1;
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -    if (e&&e->Localized && (!at->ExtraMark & LA_EXTRA_TO_PANEL)){
 | 
	
		
			
				|  |  | -        laLocalToWindow(0, a->ToPanel, &e->x, &e->y);
 | 
	
		
			
				|  |  | -        e->Localized = 0;
 | 
	
		
			
				|  |  | +    if (e&&e->Localized){
 | 
	
		
			
				|  |  | +        if (!at->ExtraMark & LA_EXTRA_TO_PANEL){
 | 
	
		
			
				|  |  | +            laLocalToWindow(f, f->ToPanel, &e->x, &e->y);
 | 
	
		
			
				|  |  | +            e->Localized = 0;
 | 
	
		
			
				|  |  | +        }else{
 | 
	
		
			
				|  |  | +            laLocalToWindow(f, f->ToPanel, &e->x, &e->y);
 | 
	
		
			
				|  |  | +            laWindowToLocal(a, a->ToPanel, &e->x, &e->y);
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      if (From) f->Child = a;
 | 
	
	
		
			
				|  | @@ -5780,30 +5722,35 @@ int laInvoke(laOperator *From, char *ID, laEvent *e, laPropPack *This, char *arg
 | 
	
		
			
				|  |  |      a->Using = 0;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      if (rev & LA_FINISH){
 | 
	
		
			
				|  |  | -        a->StopNow = 1; if(From)From->Child=0;
 | 
	
		
			
				|  |  | +        a->StopNow = 1;  if(From)From->Child=0;
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      if (!a->StopNow && (rev&LA_BLOCK || rev&LA_PASS_ON)){
 | 
	
		
			
				|  |  |          lstAppendItem(&MAIN.CurrentWindow->PendingOperators, a);
 | 
	
		
			
				|  |  |          a->State = rev;
 | 
	
		
			
				|  |  |          a->PP.EndInstance = a->CustomData;
 | 
	
		
			
				|  |  | +        if (a->PP.LastPs) a->PP.LastPs->Type = L'.';
 | 
	
		
			
				|  |  |      }else
 | 
	
		
			
				|  |  |          la_DestroyOperator(&a, 0, 0);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      return rev;
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  | -int laInvokeCreateThis(laOperator *From, char *ID, laEvent *e, laPropPack *OrigionalThis, void *FromInstance, char *args, char *args2){
 | 
	
		
			
				|  |  | -    laOperatorType *at;
 | 
	
		
			
				|  |  | -    laOperator *a, *f = From;
 | 
	
		
			
				|  |  | -    int rev;
 | 
	
		
			
				|  |  | -    laPropPack *created;
 | 
	
		
			
				|  |  | +int laInvoke(laOperator *From, char *ID, laEvent *e, laPropPack *This, char *args, char *args2){
 | 
	
		
			
				|  |  | +    laOperatorType *at; laOperator *a, *f = From;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      at = hsh256FindItemSTR(&MAIN.OperatorTypeHash, la_OperatorTypeByID, ID);
 | 
	
		
			
				|  |  |      if (!at) return -1;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -    if (!f && (e && e->Localized) || !OrigionalThis || !OrigionalThis->LastPs) return -1;
 | 
	
		
			
				|  |  | +    return laInvokeP(From,at,e,This,args,args2);
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +int laInvokePCreateThis(laOperator *From, laOperatorType *at, laEvent *e, laPropPack *OrigionalThis, void *FromInstance, char *args, char *args2){
 | 
	
		
			
				|  |  | +    laOperator *a, *f = From;
 | 
	
		
			
				|  |  | +    int rev;
 | 
	
		
			
				|  |  | +    laPropPack *created;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    if (!f && e&&e->Localized || !OrigionalThis || !OrigionalThis->LastPs) return -1;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -    created = CreateNew(laPropPack);
 | 
	
		
			
				|  |  | +    created = memAcquireSimple(sizeof(laPropPack));
 | 
	
		
			
				|  |  |      created->LastPs = memAcquireSimple(sizeof(laPropStep));
 | 
	
		
			
				|  |  |      created->Go = created->LastPs;
 | 
	
		
			
				|  |  |      created->LastPs->p = OrigionalThis->LastPs->p;
 | 
	
	
		
			
				|  | @@ -5851,41 +5798,15 @@ int laInvokeCreateThis(laOperator *From, char *ID, laEvent *e, laPropPack *Origi
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      return rev;
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  | -int laInvokeP(laOperator *From, laOperatorType *at, laEvent *e, laPropPack *This, char *args, char *args2){
 | 
	
		
			
				|  |  | +int laInvokeUiP(laOperator *From, laOperatorType *at, laEvent *e, void *inst, laListHandle *Locals, int IgnoreLocals){
 | 
	
		
			
				|  |  |      laOperator *a, *f = From;
 | 
	
		
			
				|  |  |      int rev;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -    if (!f && e&&e->Localized) return -1;
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | +    if (!at || (la_UiOperatorExists(inst))){ return -1; }
 | 
	
		
			
				|  |  |      a = la_CreateOperator(at);
 | 
	
		
			
				|  |  | +    a->Instance = inst;
 | 
	
		
			
				|  |  |      a->ToPanel = MAIN.ToPanel;
 | 
	
		
			
				|  |  | -    a->This = This;
 | 
	
		
			
				|  |  | -    a->ExtraInstructions = args;
 | 
	
		
			
				|  |  | -    strMakeInstructions(&a->ExtraInstructionsP, args);
 | 
	
		
			
				|  |  | -    strMakeInstructions(&a->ExtraInstructionsP, args2);
 | 
	
		
			
				|  |  | -    strMakeInstructions(&a->ExtraInstructionsP, at->ExtraInstructions);
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    if (!laOperatorAvailableP(at, This, a->ExtraInstructionsP)){
 | 
	
		
			
				|  |  | -        la_DestroyOperator(&a, 0, 0);
 | 
	
		
			
				|  |  | -        return LA_CANCELED;
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    lstGeneratePointerList(f ? &f->LocalUiLists : 0, 0, &a->LocalUiLists);
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    if (e&&!e->Localized && at->ExtraMark & LA_EXTRA_TO_PANEL){
 | 
	
		
			
				|  |  | -        laWindowToLocal(0, a->ToPanel, &e->x, &e->y);
 | 
	
		
			
				|  |  | -        e->Localized = 1;
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    if (e&&e->Localized){
 | 
	
		
			
				|  |  | -        if (!at->ExtraMark & LA_EXTRA_TO_PANEL){
 | 
	
		
			
				|  |  | -            laLocalToWindow(f, f->ToPanel, &e->x, &e->y);
 | 
	
		
			
				|  |  | -            e->Localized = 0;
 | 
	
		
			
				|  |  | -        }else{
 | 
	
		
			
				|  |  | -            laLocalToWindow(f, f->ToPanel, &e->x, &e->y);
 | 
	
		
			
				|  |  | -            laWindowToLocal(a, a->ToPanel, &e->x, &e->y);
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | +    if (!IgnoreLocals) lstGeneratePointerList(f ? &f->LocalUiLists : 0, Locals, &a->LocalUiLists);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      if (From) f->Child = a;
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -5897,74 +5818,27 @@ int laInvokeP(laOperator *From, laOperatorType *at, laEvent *e, laPropPack *This
 | 
	
		
			
				|  |  |      a->Using = 0;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      if (rev & LA_FINISH){
 | 
	
		
			
				|  |  | -        a->StopNow = 1;  if(From)From->Child=0;
 | 
	
		
			
				|  |  | +        a->StopNow = 1; if(From)From->Child=0;
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    if (!a->StopNow && (rev&LA_BLOCK || rev&LA_PASS_ON)){
 | 
	
		
			
				|  |  | +    if (rev & LA_BLOCK){
 | 
	
		
			
				|  |  |          lstAppendItem(&MAIN.CurrentWindow->PendingOperators, a);
 | 
	
		
			
				|  |  |          a->State = rev;
 | 
	
		
			
				|  |  | -        a->PP.EndInstance = a->CustomData;
 | 
	
		
			
				|  |  | -        if (a->PP.LastPs) a->PP.LastPs->Type = L'.';
 | 
	
		
			
				|  |  | -    }else
 | 
	
		
			
				|  |  | -        la_DestroyOperator(&a, 0, 0);
 | 
	
		
			
				|  |  | +    }else la_DestroyOperator(&a, 0, 0);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    DEB = a;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      return rev;
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  | -int laInvokePCreateThis(laOperator *From, laOperatorType *at, laEvent *e, laPropPack *OrigionalThis, void *FromInstance, char *args, char *args2){
 | 
	
		
			
				|  |  | +int laInvokeUi(laOperator *From, char *ID, laEvent *e, void *inst, laListHandle *Locals, int IgnoreLocals){
 | 
	
		
			
				|  |  | +    laOperatorType *at;
 | 
	
		
			
				|  |  |      laOperator *a, *f = From;
 | 
	
		
			
				|  |  | -    int rev;
 | 
	
		
			
				|  |  | -    laPropPack *created;
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    if (!f && e&&e->Localized || !OrigionalThis || !OrigionalThis->LastPs) return -1;
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    created = CreateNew(laPropPack);
 | 
	
		
			
				|  |  | -    created->LastPs = memAcquireSimple(sizeof(laPropStep));
 | 
	
		
			
				|  |  | -    created->Go = created->LastPs;
 | 
	
		
			
				|  |  | -    created->LastPs->p = OrigionalThis->LastPs->p;
 | 
	
		
			
				|  |  | -    created->LastPs->UseInstance = FromInstance;
 | 
	
		
			
				|  |  | -    created->EndInstance = FromInstance;
 | 
	
		
			
				|  |  | -    created->LastIndex = OrigionalThis->LastIndex;
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    a = la_CreateOperator(at);
 | 
	
		
			
				|  |  | -    a->ToPanel = MAIN.ToPanel;
 | 
	
		
			
				|  |  | -    a->This = created;
 | 
	
		
			
				|  |  | -    a->CreatedThis = created;
 | 
	
		
			
				|  |  | -    a->ExtraInstructions = args;
 | 
	
		
			
				|  |  | -    strMakeInstructions(&a->ExtraInstructionsP, args);
 | 
	
		
			
				|  |  | -    strMakeInstructions(&a->ExtraInstructionsP, args2);
 | 
	
		
			
				|  |  | -    strMakeInstructions(&a->ExtraInstructionsP, at->ExtraInstructions);
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    if (!laOperatorAvailableP(at, created, a->ExtraInstructionsP)){
 | 
	
		
			
				|  |  | -        la_DestroyOperator(&a, 0, 0);
 | 
	
		
			
				|  |  | -        return LA_CANCELED;
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    lstGeneratePointerList(f ? &f->LocalUiLists : 0, 0, &a->LocalUiLists);
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    if (e&&!e->Localized && at->ExtraMark & LA_EXTRA_TO_PANEL) laWindowToLocal(0, a->ToPanel, &e->x, &e->y);
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    if (From) f->Child = a;
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    a->Using = 1;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -    if (at->Init) at->Init(a);
 | 
	
		
			
				|  |  | -    rev = at->Invoke(a, e);
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    a->Using = 0;
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    if (rev & LA_FINISH){
 | 
	
		
			
				|  |  | -        a->StopNow = 1; if(From)From->Child=0;
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    if (!a->StopNow && (rev&LA_BLOCK || rev&LA_PASS_ON)){
 | 
	
		
			
				|  |  | -        lstAppendItem(&MAIN.CurrentWindow->PendingOperators, a);
 | 
	
		
			
				|  |  | -        a->State = rev;
 | 
	
		
			
				|  |  | -        a->PP.EndInstance = a->CustomData;
 | 
	
		
			
				|  |  | -    }else
 | 
	
		
			
				|  |  | -        la_DestroyOperator(&a, 0, 0);
 | 
	
		
			
				|  |  | +    if (la_UiOperatorExists(inst)) return -1;
 | 
	
		
			
				|  |  | +    at = hsh256FindItemSTR(&MAIN.OperatorTypeHash, la_OperatorTypeByID, ID); if (!at) return -1;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -    return rev;
 | 
	
		
			
				|  |  | +    return laInvokeUiP(From,at,e,inst,Locals,IgnoreLocals);
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  void laRequestDelayEvent(real Seconds){
 | 
	
		
			
				|  |  |      MAIN.DelayTriggered=0; MAIN.DelayStart=MAIN.TimeAccum; MAIN.DelayTime = Seconds; }
 | 
	
		
			
				|  |  |  
 |