*/}}

2 次代碼提交 2c536eca0d ... 72d8f0db9c

作者 SHA1 備註 提交日期
  YimingWu 72d8f0db9c Audio channel structure and ui 15 小時之前
  YimingWu 69c964207e Event handling of the lua script 17 小時之前
共有 12 個文件被更改,包括 365 次插入181 次删除
  1. 18 18
      la_animation.c
  2. 100 1
      la_audio.c
  3. 19 1
      la_interface.h
  4. 15 9
      la_kernel.c
  5. 2 0
      la_tns.h
  6. 38 4
      la_tns_kernel.c
  7. 12 12
      resources/la_modelling.c
  8. 46 46
      resources/la_operators.c
  9. 1 0
      resources/la_properties.c
  10. 24 0
      resources/la_tnslibs.cpp
  11. 72 72
      resources/la_widgets.c
  12. 18 18
      resources/la_widgets_viewers.c

+ 18 - 18
la_animation.c

@@ -478,34 +478,34 @@ int LAMOD_AnimationActionsCanvas(laOperator *a, laEvent *e){
     int Channels=aa?lstCountElements(&aa->Channels):0;
     int Channels=aa?lstCountElements(&aa->Channels):0;
     int Modal=0; int mid=((W-lr)/2);
     int Modal=0; int mid=((W-lr)/2);
     
     
-    if(e->Type==LA_M_MOUSE_DOWN){
+    if(e->type==LA_M_MOUSE_DOWN){
         ex->UiMode=1; ex->ClickedX=e->x; ex->ClickedY=e->y; Modal=1; ex->Dragging=10;
         ex->UiMode=1; ex->ClickedX=e->x; ex->ClickedY=e->y; Modal=1; ex->Dragging=10;
-    }elif(e->Type==LA_M_MOUSE_UP || e->Type==LA_L_MOUSE_UP){
+    }elif(e->type==LA_M_MOUSE_UP || e->type==LA_L_MOUSE_UP){
         ex->UiMode=0; Modal=1; ex->Dragging=0; ex->TargetIndexVali=0;
         ex->UiMode=0; Modal=1; ex->Dragging=0; ex->TargetIndexVali=0;
     }
     }
     if(ex->UiMode==1){
     if(ex->UiMode==1){
-        if(e->Type&LA_MOUSE_EVENT){
+        if(e->type&LA_MOUSE_EVENT){
             ex->PanY-=e->y-ex->ClickedY; ex->PanX-=e->x-ex->ClickedX;
             ex->PanY-=e->y-ex->ClickedY; ex->PanX-=e->x-ex->ClickedX;
             ex->ClickedX=e->x; ex->ClickedY=e->y; Modal=1;
             ex->ClickedX=e->x; ex->ClickedY=e->y; Modal=1;
         }
         }
     }elif(ex->UiMode==2){ Modal=1;
     }elif(ex->UiMode==2){ Modal=1;
-        if(e->Type&LA_MOUSE_EVENT){
+        if(e->type&LA_MOUSE_EVENT){
             ex->LW=e->x-ui->L+LA_SEAM_W; ex->ClickedX=e->x; ex->ClickedY=e->y;
             ex->LW=e->x-ui->L+LA_SEAM_W; ex->ClickedX=e->x; ex->ClickedY=e->y;
             if(ex->LW<LA_RH*3 && ex->LW>=LA_RH/2){ ex->LW=LA_RH*3; }
             if(ex->LW<LA_RH*3 && ex->LW>=LA_RH/2){ ex->LW=LA_RH*3; }
             if(ex->LW<LA_RH/2 && ex->Dragging!=12){ ex->ShowLegend=0; ex->LW=0; }
             if(ex->LW<LA_RH/2 && ex->Dragging!=12){ ex->ShowLegend=0; ex->LW=0; }
             if(ex->LW<LA_RH*3){ ex->LW=LA_RH*3;}
             if(ex->LW<LA_RH*3){ ex->LW=LA_RH*3;}
         }
         }
     }elif(ex->UiMode==3){ Modal=1;
     }elif(ex->UiMode==3){ Modal=1;
-        if(e->Type&LA_MOUSE_EVENT){ ex->ClickedX=e->x; ex->ClickedY=e->y;
+        if(e->type&LA_MOUSE_EVENT){ ex->ClickedX=e->x; ex->ClickedY=e->y;
             int SetFrame=(real)(e->x-tl+ex->PanX)/ex->ZoomX/FW;
             int SetFrame=(real)(e->x-tl+ex->PanX)/ex->ZoomX/FW;
             la_AnimationActionSetOwnFrame(aa,SetFrame);
             la_AnimationActionSetOwnFrame(aa,SetFrame);
         }
         }
     }elif(ex->UiMode==4){ Modal=1;
     }elif(ex->UiMode==4){ Modal=1;
-        if(e->Type==LA_R_MOUSE_DOWN || (e->Type==LA_ESCAPE_DOWN)){ ex->UiMode=0; ex->Dragging=0;
+        if(e->type==LA_R_MOUSE_DOWN || (e->type==LA_ESCAPE_DOWN)){ ex->UiMode=0; ex->Dragging=0;
             la_ActionRestoreKeyOriginalAt(aa); laNotifyUsers("la.animation.current_action");
             la_ActionRestoreKeyOriginalAt(aa); laNotifyUsers("la.animation.current_action");
-        }elif(e->Type==LA_L_MOUSE_DOWN){ la_ActionRemoveDuplicatedFrames(aa);
+        }elif(e->type==LA_L_MOUSE_DOWN){ la_ActionRemoveDuplicatedFrames(aa);
             laNotifyUsers("la.animation.current_action"); ex->UiMode=0; ex->Dragging=0;
             laNotifyUsers("la.animation.current_action"); ex->UiMode=0; ex->Dragging=0;
-        }elif(e->Type&LA_MOUSE_EVENT){ Modal=1;
+        }elif(e->type&LA_MOUSE_EVENT){ Modal=1;
             int ToFrame=(real)(e->x-tl+ex->PanX)/ex->ZoomX/FW,FromFrame=(real)(ex->ClickedX-tl+ex->PanX)/ex->ZoomX/FW;
             int ToFrame=(real)(e->x-tl+ex->PanX)/ex->ZoomX/FW,FromFrame=(real)(ex->ClickedX-tl+ex->PanX)/ex->ZoomX/FW;
             la_ActionMoveSelectedFrames(aa,ToFrame-FromFrame); laNotifyUsers("la.animation.current_action");
             la_ActionMoveSelectedFrames(aa,ToFrame-FromFrame); laNotifyUsers("la.animation.current_action");
         }
         }
@@ -514,34 +514,34 @@ int LAMOD_AnimationActionsCanvas(laOperator *a, laEvent *e){
     int MaxDN=LA_RH*(Channels+1)-H+bt->TP+bt->BP; if(MaxDN<0) MaxDN=0;
     int MaxDN=LA_RH*(Channels+1)-H+bt->TP+bt->BP; if(MaxDN<0) MaxDN=0;
     if(!Modal){
     if(!Modal){
         if(e->x<=lr){
         if(e->x<=lr){
-            if(e->Type==LA_MOUSE_WHEEL_DOWN){ ex->PanY+=LA_RH*MAIN.ScrollingSpeed; Modal=1; }
-            if(e->Type==LA_MOUSE_WHEEL_UP){ ex->PanY-=LA_RH*MAIN.ScrollingSpeed; Modal=1; }
+            if(e->type==LA_MOUSE_WHEEL_DOWN){ ex->PanY+=LA_RH*MAIN.ScrollingSpeed; Modal=1; }
+            if(e->type==LA_MOUSE_WHEEL_UP){ ex->PanY-=LA_RH*MAIN.ScrollingSpeed; Modal=1; }
             if(e->x>=lr-LA_SEAM_W*2){ if(!ex->TargetIndexVali){ ex->TargetIndexVali=1; Modal=1; }
             if(e->x>=lr-LA_SEAM_W*2){ if(!ex->TargetIndexVali){ ex->TargetIndexVali=1; Modal=1; }
-                if(e->Type==LA_L_MOUSE_DOWN){
+                if(e->type==LA_L_MOUSE_DOWN){
                     ex->UiMode=2; ex->ClickedX=e->x; ex->ClickedY=e->y; Modal=1; ex->Dragging=10; Modal=1;
                     ex->UiMode=2; ex->ClickedX=e->x; ex->ClickedY=e->y; Modal=1; ex->Dragging=10; Modal=1;
                 }
                 }
             }else{ if(ex->TargetIndexVali){ ex->TargetIndexVali=0; Modal=1; } }
             }else{ if(ex->TargetIndexVali){ ex->TargetIndexVali=0; Modal=1; } }
         }elif(aa){
         }elif(aa){
             if((!ex->ShowLegend)&&e->x<=ll+LA_SEAM_W*2){
             if((!ex->ShowLegend)&&e->x<=ll+LA_SEAM_W*2){
                 if(!ex->TargetIndexVali){ ex->TargetIndexVali=1; Modal=1; }
                 if(!ex->TargetIndexVali){ ex->TargetIndexVali=1; Modal=1; }
-                if(e->Type==LA_L_MOUSE_DOWN){ ex->LW=LA_RH*4; ex->Dragging=12; ex->ShowLegend=1; Modal=1; ex->UiMode=2; ex->TargetIndexVali=1; }
+                if(e->type==LA_L_MOUSE_DOWN){ ex->LW=LA_RH*4; ex->Dragging=12; ex->ShowLegend=1; Modal=1; ex->UiMode=2; ex->TargetIndexVali=1; }
             }else{ if(ex->TargetIndexVali){ ex->TargetIndexVali=0; Modal=1; } }
             }else{ if(ex->TargetIndexVali){ ex->TargetIndexVali=0; Modal=1; } }
-            if(e->Type==LA_MOUSE_WHEEL_DOWN){ ex->ZoomX*=0.9; ex->PanX+=mid; ex->PanX*=0.9; ex->PanX-=mid; Modal=1; }
-            elif(e->Type==LA_MOUSE_WHEEL_UP){ ex->ZoomX*=1.1; ex->PanX+=mid; ex->PanX*=1.1; ex->PanX-=mid; Modal=1; }
-            elif(e->Type==LA_L_MOUSE_DOWN){
+            if(e->type==LA_MOUSE_WHEEL_DOWN){ ex->ZoomX*=0.9; ex->PanX+=mid; ex->PanX*=0.9; ex->PanX-=mid; Modal=1; }
+            elif(e->type==LA_MOUSE_WHEEL_UP){ ex->ZoomX*=1.1; ex->PanX+=mid; ex->PanX*=1.1; ex->PanX-=mid; Modal=1; }
+            elif(e->type==LA_L_MOUSE_DOWN){
                 ex->UiMode=3; int SetFrame=(real)(e->x-tl+ex->PanX)/ex->ZoomX/FW;
                 ex->UiMode=3; int SetFrame=(real)(e->x-tl+ex->PanX)/ex->ZoomX/FW;
                 la_AnimationActionSetOwnFrame(aa,SetFrame); Modal=1;
                 la_AnimationActionSetOwnFrame(aa,SetFrame); Modal=1;
-            }elif(e->Type==LA_R_MOUSE_DOWN){
+            }elif(e->type==LA_R_MOUSE_DOWN){
                 int row=(e->y-ui->U-bt->BM-LA_RH)/LA_RH; real at=(real)(e->x-tl+ex->PanX)/ex->ZoomX/FW;
                 int row=(e->y-ui->U-bt->BM-LA_RH)/LA_RH; real at=(real)(e->x-tl+ex->PanX)/ex->ZoomX/FW;
                 if(!(e->SpecialKeyBit&LA_KEY_SHIFT)){ la_ActionDeselectFrames(aa); }
                 if(!(e->SpecialKeyBit&LA_KEY_SHIFT)){ la_ActionDeselectFrames(aa); }
                 la_ActionSelectFrame(aa,row,at,ex->ZoomX);
                 la_ActionSelectFrame(aa,row,at,ex->ZoomX);
                 laNotifyUsers("la.animation.current_action");
                 laNotifyUsers("la.animation.current_action");
-            }elif(e->Type==LA_KEY_DOWN&&e->key=='g'){
+            }elif(e->type==LA_KEY_DOWN&&e->key=='g'){
                 int any=la_ActionSaveKeyOriginalAt(aa);
                 int any=la_ActionSaveKeyOriginalAt(aa);
                 if(any){ ex->ClickedX=e->x; ex->ClickedY=e->y; ex->UiMode=4; Modal=1; ex->Dragging=13;
                 if(any){ ex->ClickedX=e->x; ex->ClickedY=e->y; ex->UiMode=4; Modal=1; ex->Dragging=13;
                     laNotifyUsers("la.animation.current_action");
                     laNotifyUsers("la.animation.current_action");
                 }
                 }
-            }elif(e->Type==LA_KEY_DOWN&&e->key=='x'){
+            }elif(e->type==LA_KEY_DOWN&&e->key=='x'){
                 int any=la_ActionDeleteSelectedFrames(aa);
                 int any=la_ActionDeleteSelectedFrames(aa);
                 if(any){
                 if(any){
                     laNotifyUsers("la.animation.current_action");
                     laNotifyUsers("la.animation.current_action");

+ 100 - 1
la_audio.c

@@ -24,6 +24,7 @@
 extern LA MAIN;
 extern LA MAIN;
 
 
 laPropContainer* LA_PC_SYNTH;
 laPropContainer* LA_PC_SYNTH;
+laPropContainer* LA_PC_CHANNEL;
 
 
 laNodeCategory* LA_NODE_CATEGORY_SYNTHESIZER;
 laNodeCategory* LA_NODE_CATEGORY_SYNTHESIZER;
 laNodeCategory* LA_NODE_CATEGORY_SYSTEM_SOUND;
 laNodeCategory* LA_NODE_CATEGORY_SYSTEM_SOUND;
@@ -634,7 +635,7 @@ int OPINV_ShedRemoveSynth(laOperator* a, laEvent* e){
     laSynth* ss=a->This?a->This->EndInstance:0; if(!ss)return LA_CANCELED;
     laSynth* ss=a->This?a->This->EndInstance:0; if(!ss)return LA_CANCELED;
     if(strSame(strGetArgumentString(a->ExtraInstructionsP,"confirm"),"true")){
     if(strSame(strGetArgumentString(a->ExtraInstructionsP,"confirm"),"true")){
         laRemoveSynth(ss);
         laRemoveSynth(ss);
-        laNotifyInstanceUsers(MAIN.Audio); laRecordAndPush(0,"la.audio","Remove la project", 0);
+        laNotifyInstanceUsers(MAIN.Audio); laRecordAndPush(0,"la.audio","Remove synthesizer", 0);
         return LA_FINISHED;
         return LA_FINISHED;
     }
     }
     laEnableOperatorPanel(a,a->This,e->x,e->y,200,200,0,0,0,0,0,0,0,0,e);
     laEnableOperatorPanel(a,a->This,e->x,e->y,200,200,0,0,0,0,0,0,0,0,e);
@@ -658,6 +659,50 @@ int OPINV_laSynthPlay(laOperator* a, laEvent* e){
     return LA_FINISHED;
     return LA_FINISHED;
 }
 }
 
 
+void laAudioEnsureChannelPtr(){
+    for(laAudioChannel* iac=MAIN.Audio->Channels.pFirst;iac;iac=iac->Item.pNext){
+        TNS_CLAMP(iac->ID,0,31);
+        MAIN.Audio->ChannelPtr[iac->ID]=iac;
+    }
+}
+laAudioChannel* laNewAudioChannel(char* Name){
+    laAudioChannel* ac=memAcquireHyper(sizeof(laAudioChannel)); lstAppendItem(&MAIN.Audio->Channels,ac);
+    strSafeSet(&ac->Name,Name); int has=0,i;
+    for(i=0;i<64;i++){
+        for(laAudioChannel* iac=MAIN.Audio->Channels.pFirst;iac;iac=iac->Item.pNext){ if(iac->ID==i){ has=1; break; } }
+    }
+    if(!has){ac->ID = i;}else{ac->ID=0;}
+    ac->Volume = 10.0f; laAudioEnsureChannelPtr();
+}
+void laRemoveAudioChannel(laAudioChannel* ac){
+    lstRemoveItem(&MAIN.Audio->Channels,ac); strSafeDestroy(&ac->Name);
+    memFree(ac); laAudioEnsureChannelPtr();
+}
+
+int OPCHK_IslaAudioChannel(laPropPack *This, laStringSplitor *ss){
+    if (This && This->EndInstance && la_EnsureSubTarget(This->LastPs->p,0) == LA_PC_CHANNEL) return 1;
+    return 0;
+}
+int OPINV_ShedNewAudioChannel(laOperator* a, laEvent* e){
+    laNewAudioChannel("Output");
+    laNotifyInstanceUsers(MAIN.Audio); laRecordAndPush(0,"la.audio","New channel", 0); // TODO: hint for laAudioEnsureChannelPtr
+    return LA_FINISHED;
+}
+int OPINV_ShedRemoveAudioChannel(laOperator* a, laEvent* e){
+    laAudioChannel*ac=a->This?a->This->EndInstance:0; if(!ac)return LA_CANCELED;
+    if(strSame(strGetArgumentString(a->ExtraInstructionsP,"confirm"),"true")){
+        laRemoveAudioChannel(ac); laNotifyInstanceUsers(MAIN.Audio); laRecordAndPush(0,"la.audio","Remove audio channel", 0);
+        return LA_FINISHED;
+    }
+    laEnableOperatorPanel(a,a->This,e->x,e->y,200,200,0,0,0,0,0,0,0,0,e);
+    return LA_RUNNING;
+}
+void laui_RemoveAudioChannel(laUiList *uil, laPropPack *This, laPropPack *Extra, laColumn *UNUSED, int context){
+    laColumn* c=laFirstColumn(uil);
+    laShowItemFull(uil,c,This,"remove",0,"confirm=true;text=Confirm",0,0);
+}
+
+
 void lauidetached_Synthersizers(laPanel* p){
 void lauidetached_Synthersizers(laPanel* p){
     la_MakeDetachedProp(p, "la.detached_view_switch", "detached");
     la_MakeDetachedProp(p, "la.detached_view_switch", "detached");
     la_MakeDetachedProp(p, "la.audio.current_synth", "page");
     la_MakeDetachedProp(p, "la.audio.current_synth", "page");
@@ -704,6 +749,32 @@ void laui_Synthersizers(laUiList *uil, laPropPack *This, laPropPack *Extra, laCo
 
 
 #undef ADD_PAGE
 #undef ADD_PAGE
 }
 }
+void laui_AudioChannel(laUiList *uil, laPropPack *This, laPropPack *Extra, laColumn *UNUSED, int context){
+    laColumn* c=laFirstColumn(uil); laSplitColumn(uil,c,0.3); laColumn* c1=laLeftColumn(c,1),*c2=laRightColumn(c,0); laUiItem* b;
+    
+    laShowHeightAdjuster(uil,c1,This,"__move",0);
+
+    laShowItem(uil,c2,This,"name");
+    b=laBeginRow(uil,c2,0,0);
+    laShowItem(uil,c2,This,"id")->Expand=1; laShowItem(uil,c,This,"remove")->Flags|=LA_UI_FLAGS_ICON;
+    laEndRow(uil,b);
+    laShowItem(uil,c2,This,"volume");
+
+    laShowSeparator(uil,c);
+}
+void laui_AudioChannels(laUiList *uil, laPropPack *This, laPropPack *Extra, laColumn *UNUSED, int context){
+    laColumn* c=laFirstColumn(uil);  laUiItem* b;
+
+    b=laBeginRow(uil,c,0,0);
+    laShowItem(uil,c,0,"LA_new_channel");
+    laEndRow(uil,b);
+    // if horizontal look:
+    // laUiItem* g=laMakeGroup(uil,c,"Racks",0);{ g->Flags|=/*LA_UI_FLAGS_NO_GAP|LA_UI_FLAGS_NO_DECAL|*/LA_UI_FLAGS_NODE_CONTAINER;
+    //     laUiList* gu=g->Page; laColumn* gc=laFirstColumn(gu); gu->HeightCoeff=-1; g->State=LA_UI_ACTIVE;
+    //     laShowItemFull(gu,gc,0,"la.audio.channels",0,0,laui_AudioChannel,0)->Expand=5;
+    // }
+    laShowItemFull(uil,c,0,"la.audio.channels",0,0,laui_AudioChannel,0);
+}
 
 
 void* laget_FirstAudioDevice(void* unused1,void* unused2){
 void* laget_FirstAudioDevice(void* unused1,void* unused2){
     return MAIN.Audio->AudioDevices.pFirst;
     return MAIN.Audio->AudioDevices.pFirst;
@@ -725,10 +796,21 @@ void laset_CurrentSynth(laAudio* a,laSynth* s){
 void laset_CurrentAudioDevice(laAudio* a,laAudioDevice* ad){
 void laset_CurrentAudioDevice(laAudio* a,laAudioDevice* ad){
     la_SelectAudioDevice(ad);
     la_SelectAudioDevice(ad);
 }
 }
+void laget_OutputSendChannelName(laSynthNodeOutput* n, char* str, char** target){
+    if(!MAIN.Audio||!MAIN.Audio->ChannelPtr[n->Send]) *target="-";
+    *target = SSTR(MAIN.Audio->ChannelPtr[n->Send]->Name);
+}
 void laset_QuantizeEnabledKeys(laSynthNodeQuantize* n, int index, int val_UNUSED){
 void laset_QuantizeEnabledKeys(laSynthNodeQuantize* n, int index, int val_UNUSED){
     if(n->EnabledBits[index] & 0x1){ n->EnabledBits[index]=0; }
     if(n->EnabledBits[index] & 0x1){ n->EnabledBits[index]=0; }
     else{ n->EnabledBits[index]=1; }
     else{ n->EnabledBits[index]=1; }
 }
 }
+void laset_AudioChannelID(laAudioChannel* ac, int id){
+    ac->ID=id; laAudioEnsureChannelPtr();
+}
+void laset_AudioChannelMove(laAudioChannel* ac, int move){
+    if(move<0 && ac->Item.pPrev){ lstMoveUp(&MAIN.Audio->Channels, ac); laNotifyUsers("la.audio"); }
+    elif(move>0 && ac->Item.pNext){ lstMoveDown(&MAIN.Audio->Channels, ac); laNotifyUsers("la.audio"); }
+}
 
 
 void la_AudioPreFrame(){
 void la_AudioPreFrame(){
     if(MAIN.GraphNeedsRebuild){ laRebuildSynthGraphs(); }
     if(MAIN.GraphNeedsRebuild){ laRebuildSynthGraphs(); }
@@ -746,6 +828,7 @@ void laInitAudio(){
     laInitMiniAudio();
     laInitMiniAudio();
 
 
     laRegisterUiTemplate("LAUI_synthesizers","Synthesizers",laui_Synthersizers,lauidetached_Synthersizers,0,"Audio",0,0,0);
     laRegisterUiTemplate("LAUI_synthesizers","Synthesizers",laui_Synthersizers,lauidetached_Synthersizers,0,"Audio",0,0,0);
+    laRegisterUiTemplate("LAUI_audio_channels","Mixer",laui_AudioChannels,0,0,0,0,0,0);
 
 
     laCreateOperatorType("LA_new_synth", "New Synthesizer", "Add a synthesizer",0,0,0,OPINV_ShedNewSynth,0,'+',0);
     laCreateOperatorType("LA_new_synth", "New Synthesizer", "Add a synthesizer",0,0,0,OPINV_ShedNewSynth,0,'+',0);
     laCreateOperatorType("LA_remove_synth", "Remove Synthesizer", "Remove a synthesizer",OPCHK_IslaSynth,0,0,OPINV_ShedRemoveSynth,OPMOD_FinishOnData,L'🗴',0)
     laCreateOperatorType("LA_remove_synth", "Remove Synthesizer", "Remove a synthesizer",OPCHK_IslaSynth,0,0,OPINV_ShedRemoveSynth,OPMOD_FinishOnData,L'🗴',0)
@@ -753,6 +836,10 @@ void laInitAudio(){
     laCreateOperatorType("LA_synth_play", "Play Synthesizer", "Play a synthesizer",OPCHK_IslaSynth,0,0,OPINV_laSynthPlay,0,0,0);
     laCreateOperatorType("LA_synth_play", "Play Synthesizer", "Play a synthesizer",OPCHK_IslaSynth,0,0,OPINV_laSynthPlay,0,0,0);
     laCreateOperatorType("LA_refresh_audio_devices", "Refresh Audio Devices", "Enumerate audio devices for selection",0,0,0,OPINV_laRefreshAudioDevices,0,U'🗘',0);
     laCreateOperatorType("LA_refresh_audio_devices", "Refresh Audio Devices", "Enumerate audio devices for selection",0,0,0,OPINV_laRefreshAudioDevices,0,U'🗘',0);
 
 
+    laCreateOperatorType("LA_new_channel", "New Channel", "Add an audio channel",0,0,0,OPINV_ShedNewAudioChannel,0,'+',0);
+    laCreateOperatorType("LA_remove_channel", "Remove Channel", "Remove an audio channel",OPCHK_IslaAudioChannel,0,0,OPINV_ShedRemoveAudioChannel,OPMOD_FinishOnData,L'🗴',0)
+        ->UiDefine=laui_RemoveAudioChannel;
+
     pc = laAddPropertyContainer("la_audio_device","LaGUI Audio Device","LaGUI enumerated audio device",0,0,sizeof(laAudioDevice),0,0,1);{
     pc = laAddPropertyContainer("la_audio_device","LaGUI Audio Device","LaGUI enumerated audio device",0,0,sizeof(laAudioDevice),0,0,1);{
         laAddStringProperty(pc,"name","Name","Name of the audio device",0,0,0,0,1,offsetof(laAudioDevice,Name),0,0,0,0,LA_AS_IDENTIFIER);
         laAddStringProperty(pc,"name","Name","Name of the audio device",0,0,0,0,1,offsetof(laAudioDevice,Name),0,0,0,0,LA_AS_IDENTIFIER);
     }
     }
@@ -768,6 +855,16 @@ void laInitAudio(){
         laAddOperatorProperty(pc,"play","Play Synth", "Play synth", "LA_synth_play", 0, 0);
         laAddOperatorProperty(pc,"play","Play Synth", "Play synth", "LA_synth_play", 0, 0);
     }
     }
 
 
+    pc = laAddPropertyContainer("la_audio_channel", "LaGUI Audio Channel", "LaGUI Audio Channel", 0,0,sizeof(laAudioChannel),0,0,2);{
+        LA_PC_CHANNEL=pc;
+        laAddStringProperty(pc,"name","Name","Name of the synthesizer",0,0,0,0,1,offsetof(laAudioChannel,Name),0,0,0,0,LA_AS_IDENTIFIER);
+        laAddIntProperty(pc,"id","ID","Identifier of this channel",0,0,0,31,0,0,0,0,offsetof(laAudioChannel,ID),0,laset_AudioChannelID,0,0,0,0,0,0,0,0,0);
+        //laAddIntProperty(pc,"id","ID","Identifier of this channel",0,0,0,31,0,0,0,0,offsetof(laAudioChannel,ID),0,laset_AudioChannelID,0,0,0,0,0,0,0,0,0);
+        laAddFloatProperty(pc,"volume","Volume","Volume of this channel",0,0,0,15,0,0.05,0,0,offsetof(laAudioChannel,Volume),0,0,0,0,0,0,0,0,0,0,0);
+        laAddOperatorProperty(pc,"remove","Remove Channel", "Remove this channel", "LA_remove_channel", L'🗴', 0);
+        laAddIntProperty(pc,"__move","Move Slider","Move Slider",LA_WIDGET_HEIGHT_ADJUSTER,0,0,0,0,0,0,0,0,0,laset_AudioChannelMove,0,0,0,0,0,0,0,0,LA_UDF_IGNORE);
+    }
+
     pc=laAddPropertyContainer("la_node_synth_fm", "FM OSC Node", "Osilliator node with frequency modulation",0,laui_FMNode,sizeof(laSynthNodeFM),lapost_Node,0,1);
     pc=laAddPropertyContainer("la_node_synth_fm", "FM OSC Node", "Osilliator node with frequency modulation",0,laui_FMNode,sizeof(laSynthNodeFM),lapost_Node,0,1);
     LA_PC_IDN_FM=pc; laPropContainerExtraFunctions(pc,0,0,0,0,laui_DefaultNodeOperationsPropUiDefine);
     LA_PC_IDN_FM=pc; laPropContainerExtraFunctions(pc,0,0,0,0,laui_DefaultNodeOperationsPropUiDefine);
     laAddSubGroup(pc,"base","Base","Base node","la_base_node",0,0,0,0,0,0,0,0,0,0,0,LA_UDF_LOCAL);
     laAddSubGroup(pc,"base","Base","Base node","la_base_node",0,0,0,0,0,0,0,0,0,0,0,LA_UDF_LOCAL);
@@ -823,6 +920,8 @@ void laInitAudio(){
     LA_PC_IDN_OUTPUT=pc; laPropContainerExtraFunctions(pc,0,0,0,0,laui_DefaultNodeOperationsPropUiDefine);
     LA_PC_IDN_OUTPUT=pc; laPropContainerExtraFunctions(pc,0,0,0,0,laui_DefaultNodeOperationsPropUiDefine);
     laAddSubGroup(pc,"base","Base","Base node","la_base_node",0,0,0,0,0,0,0,0,0,0,0,LA_UDF_LOCAL);
     laAddSubGroup(pc,"base","Base","Base node","la_base_node",0,0,0,0,0,0,0,0,0,0,0,LA_UDF_LOCAL);
     laAddSubGroup(pc,"in", "Input","Input sound","la_in_socket",0,0,0,offsetof(laSynthNodeOutput,In),0,0,0,0,0,0,0,LA_UDF_SINGLE);
     laAddSubGroup(pc,"in", "Input","Input sound","la_in_socket",0,0,0,offsetof(laSynthNodeOutput,In),0,0,0,0,0,0,0,LA_UDF_SINGLE);
+    laAddIntProperty(pc,"send","Send","Send to channel",0,0,0,128,0,0,0,0,offsetof(laSynthNodeOutput,Send),0,0,0,0,0,0,0,0,0,0,0);
+    laAddStringProperty(pc,"send_channel_name","Channel Name","Channel name of this send target",0,0,0,0,0,-1,0,laget_OutputSendChannelName,0,0,LA_READ_ONLY|LA_UDF_IGNORE);
 
 
     pc=laAddPropertyContainer("la_node_synth_envelope", "Envelope Node", "Sound envelope",0,laui_EnvelopeNode,sizeof(laSynthNodeEnvelope),lapost_Node,0,1);
     pc=laAddPropertyContainer("la_node_synth_envelope", "Envelope Node", "Sound envelope",0,laui_EnvelopeNode,sizeof(laSynthNodeEnvelope),lapost_Node,0,1);
     LA_PC_IDN_ENVELOPE=pc; laPropContainerExtraFunctions(pc,0,0,0,0,laui_DefaultNodeOperationsPropUiDefine);
     LA_PC_IDN_ENVELOPE=pc; laPropContainerExtraFunctions(pc,0,0,0,0,laui_DefaultNodeOperationsPropUiDefine);

+ 19 - 1
la_interface.h

@@ -191,7 +191,9 @@ typedef void (*laCleanupF)();
 STRUCTURE(laEvent){
 STRUCTURE(laEvent){
     laListItem Item;
     laListItem Item;
 
 
-    int Type;
+    laWindow* window;
+
+    int type;
     int state;
     int state;
     int x, y;
     int x, y;
     int key;
     int key;
@@ -206,6 +208,8 @@ STRUCTURE(laEvent){
     void *Localized;
     void *Localized;
 };
 };
 
 
+typedef int (*laInputProcessF)(laEvent* e);
+
 NEED_STRUCTURE(laWindow)
 NEED_STRUCTURE(laWindow)
 NEED_STRUCTURE(laRoot)
 NEED_STRUCTURE(laRoot)
 NEED_STRUCTURE(laPanel)
 NEED_STRUCTURE(laPanel)
@@ -323,6 +327,7 @@ STRUCTURE(LA){
     u8bit LastControllerKey, LastControllerKeyDevice, ControllerHasNewKey;
     u8bit LastControllerKey, LastControllerKeyDevice, ControllerHasNewKey;
     u8bit LastControllerAxis, LastControllerAxisDevice, ControllerHasNewAxis;
     u8bit LastControllerAxis, LastControllerAxisDevice, ControllerHasNewAxis;
 
 
+    laInputProcessF InputProcess;
     laListHandle Windows;
     laListHandle Windows;
     laListHandle WastedPanels;
     laListHandle WastedPanels;
 
 
@@ -1845,6 +1850,7 @@ STRUCTURE(laSynthNodeScope){
 STRUCTURE(laSynthNodeOutput){
 STRUCTURE(laSynthNodeOutput){
     laBaseNode Base;
     laBaseNode Base;
     laNodeInSocket* In;
     laNodeInSocket* In;
+    int Send;
 };
 };
 
 
 STRUCTURE(laSynthNodeEnvelope){
 STRUCTURE(laSynthNodeEnvelope){
@@ -1869,6 +1875,14 @@ STRUCTURE(laSynthNodeQuantize){
 
 
 #include "miniaudio.h"
 #include "miniaudio.h"
 
 
+STRUCTURE(laAudioChannel){
+    laListItem Item;
+    laSafeString* Name;
+    real Volume;
+    int ID;
+    int OutputChannel;
+};
+
 STRUCTURE(laAudioDevice){
 STRUCTURE(laAudioDevice){
     laListItem Item;
     laListItem Item;
     int MiniAudioID;
     int MiniAudioID;
@@ -1881,6 +1895,9 @@ STRUCTURE(laAudio){
     laListHandle Synths;
     laListHandle Synths;
     laSynth* CurrentSynth;
     laSynth* CurrentSynth;
 
 
+    laListHandle Channels;
+    laAudioChannel* ChannelPtr[32];
+
     SYSLOCK AudioStatusLock;
     SYSLOCK AudioStatusLock;
     ma_context MiniAudioContext;
     ma_context MiniAudioContext;
     ma_device AudioDevice;
     ma_device AudioDevice;
@@ -2134,6 +2151,7 @@ void laAddExtraPreferencePath(const char* path);
 void laAddExtraPreferencePage(const char* name, laUiDefineFunc Func);
 void laAddExtraPreferencePage(const char* name, laUiDefineFunc Func);
 void laSetFrameCallbacks(laPreFrameF PreFrame, laPreDrawF PreDraw, laPostFrameF PostFrame);
 void laSetFrameCallbacks(laPreFrameF PreFrame, laPreDrawF PreDraw, laPostFrameF PostFrame);
 void laSetCleanupCallback(laCleanupF Cleanup);
 void laSetCleanupCallback(laCleanupF Cleanup);
+void laSetInputProcessCallback(laInputProcessF InputProcess);
 void laSetMenuBarTemplates(laUiDefineFunc MenuButtons, laUiDefineFunc MenuExtras, const char* ProgramName);
 void laSetMenuBarTemplates(laUiDefineFunc MenuButtons, laUiDefineFunc MenuExtras, const char* ProgramName);
 void laSetAboutTemplates(laUiDefineFunc AboutContent, laUiDefineFunc AboutVersion, laUiDefineFunc AboutAuthor);
 void laSetAboutTemplates(laUiDefineFunc AboutContent, laUiDefineFunc AboutVersion, laUiDefineFunc AboutAuthor);
 void laSetPreferenceTemplates(laUiDefineFunc PreferencePageDisplay, laUiDefineFunc PreferencePageInput, laUiDefineFunc PreferencePageResource, laUiDefineFunc PreferencePageTheme);
 void laSetPreferenceTemplates(laUiDefineFunc PreferencePageDisplay, laUiDefineFunc PreferencePageInput, laUiDefineFunc PreferencePageResource, laUiDefineFunc PreferencePageTheme);

+ 15 - 9
la_kernel.c

@@ -1579,6 +1579,7 @@ void la_SaveEvent(SYSWINDOW hwnd, laEvent *e, int use_last_pos){
     la_MakeSpecialKeyBit(hwnd,wnd,e,use_last_pos);
     la_MakeSpecialKeyBit(hwnd,wnd,e,use_last_pos);
     if(use_last_pos){ e->x=MAIN.evLastX; e->y=MAIN.evLastY; }
     if(use_last_pos){ e->x=MAIN.evLastX; e->y=MAIN.evLastY; }
 
 
+    e->window = wnd;
     e->Twist=MAIN.StylusTwist; e->HasTwist = MAIN.StylusHasTwist;
     e->Twist=MAIN.StylusTwist; e->HasTwist = MAIN.StylusHasTwist;
     e->Pressure=MAIN.IsPen?(MAIN.PointerIsEraser?MAIN.EraserPressure:MAIN.StylusPressure):0.5f;
     e->Pressure=MAIN.IsPen?(MAIN.PointerIsEraser?MAIN.EraserPressure:MAIN.StylusPressure):0.5f;
     e->Orientation=MAIN.PointerIsEraser?MAIN.EraserOrientation:MAIN.StylusOrientation;
     e->Orientation=MAIN.PointerIsEraser?MAIN.EraserOrientation:MAIN.StylusOrientation;
@@ -1590,19 +1591,19 @@ void la_SaveEvent(SYSWINDOW hwnd, laEvent *e, int use_last_pos){
     laMappingRequestEval();
     laMappingRequestEval();
 };
 };
 void la_SendKeyboardEvent(SYSWINDOW hwnd, int type, int key){
 void la_SendKeyboardEvent(SYSWINDOW hwnd, int type, int key){
-    laEvent *e = memAcquireSimple(sizeof(laEvent)); e->Type = type; e->key = tolowerGuarded(key);
+    laEvent *e = memAcquireSimple(sizeof(laEvent)); e->type = type; e->key = tolowerGuarded(key);
     la_SaveEvent(hwnd, e, 1);
     la_SaveEvent(hwnd, e, 1);
 };
 };
 void la_SendInputEvent(SYSWINDOW hwnd, uint32_t Input){
 void la_SendInputEvent(SYSWINDOW hwnd, uint32_t Input){
     laEvent *e = memAcquireSimple(sizeof(laEvent));
     laEvent *e = memAcquireSimple(sizeof(laEvent));
-    e->Type = LA_INPUT; e->Input=Input;
+    e->type = LA_INPUT; e->Input=Input;
 
 
     la_SaveEvent(hwnd, e, 1);
     la_SaveEvent(hwnd, e, 1);
 }
 }
 void la_SendEmptyEvent(SYSWINDOW hwnd){
 void la_SendEmptyEvent(SYSWINDOW hwnd){
     laEvent *e = memAcquireSimple(sizeof(laEvent));
     laEvent *e = memAcquireSimple(sizeof(laEvent));
 
 
-    e->Type = LA_EMPTY;
+    e->type = LA_EMPTY;
 
 
     la_SaveEvent(hwnd, e, 1);
     la_SaveEvent(hwnd, e, 1);
 }
 }
@@ -1662,13 +1663,13 @@ void la_SendMouseEvent(SYSWINDOW hwnd, int type, int x, int y){
     //}
     //}
 
 
     laEvent *e = memAcquireSimple(sizeof(laEvent));
     laEvent *e = memAcquireSimple(sizeof(laEvent));
-    e->Type = type; e->x = x; e->y = y;
+    e->type = type; e->x = x; e->y = y;
     la_SaveEvent(hwnd, e, 0);
     la_SaveEvent(hwnd, e, 0);
     MAIN.evLastX=x; MAIN.evLastY=y;
     MAIN.evLastX=x; MAIN.evLastY=y;
 };
 };
 void la_SendTimerEvent(SYSWINDOW hwnd, int type){
 void la_SendTimerEvent(SYSWINDOW hwnd, int type){
     laEvent *e = memAcquireSimple(sizeof(laEvent));
     laEvent *e = memAcquireSimple(sizeof(laEvent));
-    e->Type = type;
+    e->type = type;
     la_SaveEvent(hwnd, e, 1);
     la_SaveEvent(hwnd, e, 1);
 };
 };
 void laRetriggerOperators(){
 void laRetriggerOperators(){
@@ -1681,6 +1682,9 @@ void laSetFrameCallbacks(laPreFrameF PreFrame, laPreDrawF PreDraw, laPostFrameF
 void laSetCleanupCallback(laCleanupF Cleanup){
 void laSetCleanupCallback(laCleanupF Cleanup){
     MAIN.Cleanup=Cleanup;
     MAIN.Cleanup=Cleanup;
 }
 }
+void laSetInputProcessCallback(laInputProcessF InputProcess){
+    MAIN.InputProcess=InputProcess;
+}
 
 
 //====================================================================================================
 //====================================================================================================
 
 
@@ -6538,10 +6542,10 @@ laKeyMapItem *laAssignNewKey(laKeyMapper *km, char *Path, char *Operation, char
 int laKeyMapExecuteEvent(laOperator *from, laKeyMapper *km, laEvent *e){
 int laKeyMapExecuteEvent(laOperator *from, laKeyMapper *km, laEvent *e){
     laKeyMapItem *kmi; int inv=0;
     laKeyMapItem *kmi; int inv=0;
     char *instructions;
     char *instructions;
-    if(e->Type==LA_MOUSEMOVE) return 0;
+    if(e->type==LA_MOUSEMOVE) return 0;
     for (kmi = km->Items.pFirst; kmi; kmi = kmi->Item.pNext){
     for (kmi = km->Items.pFirst; kmi; kmi = kmi->Item.pNext){
         if (kmi->SpecialKeyBits == e->SpecialKeyBit &&
         if (kmi->SpecialKeyBits == e->SpecialKeyBit &&
-            kmi->EventType == e->Type && ((kmi->Key == e->Input) || (kmi->Key == e->key))){
+            kmi->EventType == e->type && ((kmi->Key == e->Input) || (kmi->Key == e->key))){
             instructions = kmi->Instructions ? kmi->Instructions->Ptr : 0;
             instructions = kmi->Instructions ? kmi->Instructions->Ptr : 0;
             if (kmi->Operation)
             if (kmi->Operation)
                 laInvoke(from, kmi->Operation->Ptr, e, 0, instructions, 0);
                 laInvoke(from, kmi->Operation->Ptr, e, 0, instructions, 0);
@@ -6556,10 +6560,10 @@ int laKeyMapExecuteEventEx(laOperator *from, laPropPack *UiExtra, laKeyMapper *k
     laKeyMapItem *kmi;
     laKeyMapItem *kmi;
     char *instructions;
     char *instructions;
     int inv = 0; int lx = -1, ly = -1;
     int inv = 0; int lx = -1, ly = -1;
-    if(e->Type==LA_MOUSEMOVE) return 0;
+    if(e->type==LA_MOUSEMOVE) return 0;
     for (kmi = km->Items.pFirst; kmi; kmi = kmi->Item.pNext){
     for (kmi = km->Items.pFirst; kmi; kmi = kmi->Item.pNext){
         if (kmi->SpecialKeyBits == e->SpecialKeyBit &&
         if (kmi->SpecialKeyBits == e->SpecialKeyBit &&
-            kmi->EventType == e->Type && ((kmi->Key == e->Input) || (kmi->Key == e->key))){
+            kmi->EventType == e->type && ((kmi->Key == e->Input) || (kmi->Key == e->key))){
             if (e->Localized){
             if (e->Localized){
                 lx = e->x;
                 lx = e->x;
                 ly = e->y;
                 ly = e->y;
@@ -7334,6 +7338,8 @@ int la_HandleSingleEvent(laEvent *e, laListHandle *Operators){
     int Result = 0;
     int Result = 0;
     laConfirmData *ConfirmData = 0, *NextConfirmData = 0;
     laConfirmData *ConfirmData = 0, *NextConfirmData = 0;
 
 
+    if(MAIN.InputProcess){ MAIN.InputProcess(e); }
+
     a = Operators->pFirst;
     a = Operators->pFirst;
 
 
     la_DestroyConfirmData(&MAIN.InvokeConfirmData);
     la_DestroyConfirmData(&MAIN.InvokeConfirmData);

+ 2 - 0
la_tns.h

@@ -1280,6 +1280,8 @@ void tnsFreeEvaluatedArray(tnsEvaluateData* ed);
 void tnsEvaluateThisObject(tnsObject *o, tnsEvaluateData* ed);
 void tnsEvaluateThisObject(tnsObject *o, tnsEvaluateData* ed);
 void tnsSetObjectTreeEvaluationArgs(tnsObject* from, tnsObject* Active, int FillOutline, int FillSelectionID, int W, int H);
 void tnsSetObjectTreeEvaluationArgs(tnsObject* from, tnsObject* Active, int FillOutline, int FillSelectionID, int W, int H);
 void tnsEvaluateObjectTree(tnsObject* from, tnsEvaluateData* UseED, int EvaluatePlay);
 void tnsEvaluateObjectTree(tnsObject* from, tnsEvaluateData* UseED, int EvaluatePlay);
+NEED_STRUCTURE(laEvent);
+int tnsEvaluateObjectTreeEvent(tnsEvaluateData* ed_play, tnsEvaluatedNode* en, laEvent* e);
 void tnsAddEvaluatedInstance(tnsEvaluateData* ed, tnsObject* ob, tnsDrawEvaluatedInstanceF Draw, int Layer, 
 void tnsAddEvaluatedInstance(tnsEvaluateData* ed, tnsObject* ob, tnsDrawEvaluatedInstanceF Draw, int Layer, 
     int IsActive, int MeshSelectionType, int InstanceSelectionID);
     int IsActive, int MeshSelectionType, int InstanceSelectionID);
 void tnsDrawLayer(tnsEvaluateData* ed,int Layer,void* CustomData);
 void tnsDrawLayer(tnsEvaluateData* ed,int Layer,void* CustomData);

+ 38 - 4
la_tns_kernel.c

@@ -4016,12 +4016,17 @@ void tnsFreePlayDuplicate(tnsObject* o){
 
 
 #ifdef LA_WITH_LUAJIT
 #ifdef LA_WITH_LUAJIT
 
 
+void tnsLuaPushTypedPointer(lua_State* L, char* ct, void* data){
+    lua_getglobal(L,"ffi"); lua_getfield(L,-1,"cast"); lua_pushstring(L,ct); lua_pushlightuserdata(L,data);
+    lua_call(L,2,1); lua_remove(L,-2);
+}
 void tnsLuaSetObject(lua_State* L, tnsObject*o){
 void tnsLuaSetObject(lua_State* L, tnsObject*o){
-    lua_getglobal(L,"ffi"); lua_getfield(L,-1,"cast"); lua_pushstring(L,"struct tnsObject *"); lua_pushlightuserdata(L,o);
-    lua_call(L,2,1); lua_remove(L,-2); lua_setfield(L,-2,"object");
+    tnsLuaPushTypedPointer(L,"struct tnsObject *",o); lua_setfield(L,-2,"object");
 }
 }
 void tnsLuaInit(lua_State* L){
 void tnsLuaInit(lua_State* L){
-    if(luaL_loadstring(L, LA_TNS_LIB_COMMON) || lua_pcall(L, 0, 0, 0)){ logPrint("    Error loading tns lua libs\n"); };
+    if(luaL_loadstring(L, LA_TNS_LIB_COMMON) || lua_pcall(L, 0, 0, 0)){ logPrint("    Error loading tns lua libs\n");
+        lua_getglobal(L,"log"); lua_insert(L,-2); if(lua_pcall(L,1,0,0)){ lua_pop(L,1); }
+    };
     lua_settop(L,0);
     lua_settop(L,0);
     lua_newtable(L); lua_setglobal(L,"scene");
     lua_newtable(L); lua_setglobal(L,"scene");
     lua_getglobal(L,"scene"); lua_pushstring(L,"nodes"); lua_newtable(L); lua_settable(L,1);
     lua_getglobal(L,"scene"); lua_pushstring(L,"nodes"); lua_newtable(L); lua_settable(L,1);
@@ -4079,7 +4084,26 @@ void tnsLuaRunNode(lua_State* L, tnsEvaluatedNode* en, char* func, tnsObject* ro
     lua_pushnil(L); while(lua_next(L,-2)){
     lua_pushnil(L); while(lua_next(L,-2)){
         lua_getfield(L,-1,func); if((!lua_isnil(L,-1))&&lua_isfunction(L,-1)){
         lua_getfield(L,-1,func); if((!lua_isnil(L,-1))&&lua_isfunction(L,-1)){
             lua_pushvalue(L,-2); if(lua_pcall(L,1,0,0)){ lua_getglobal(L,"log"); lua_insert(L,-2); if(lua_pcall(L,1,0,0)){ lua_pop(L,1); } }
             lua_pushvalue(L,-2); if(lua_pcall(L,1,0,0)){ lua_getglobal(L,"log"); lua_insert(L,-2); if(lua_pcall(L,1,0,0)){ lua_pop(L,1); } }
-        }
+        }else{ lua_pop(L,1); }
+        lua_pop(L,1);
+    }
+    lua_pop(L,3);
+}
+int tnsLuaRunNodeEvent(lua_State* L, tnsEvaluatedNode* en, tnsObject* object, laEvent* e){ lua_settop(L,0); int index=en->LuaID;
+    if(!en->LuaLoaded){ return 0; }
+    lua_getglobal(L,"scene"); lua_getfield(L,1,"nodes");
+    lua_pushinteger(L,index); lua_gettable(L,-2); lua_setfield(L,1,"node");
+    lua_getfield(L,1,"node"); tnsLuaSetObject(L,object);
+    lua_getfield(L,-1,"scripts");
+    if(lua_isnil(L,-1) || (!lua_istable(L,-1))){ return 0; }
+
+    lua_pushnil(L); while(lua_next(L,-2)){
+        lua_getfield(L,-1,"input"); if((!lua_isnil(L,-1))&&lua_isfunction(L,-1)){
+            lua_pushvalue(L,-2); tnsLuaPushTypedPointer(L,"laEvent*",e);
+            if(lua_pcall(L,2,1,0)){ lua_getglobal(L,"log"); lua_insert(L,-2); if(lua_pcall(L,1,0,0)){ lua_pop(L,1); } lua_pop(L,1); continue; }
+            int result = lua_tonumber(L,-1); lua_pop(L,1);
+            if (result!=0){ lua_settop(L,0); return 1; }
+        }else{ lua_pop(L,1); }
         lua_pop(L,1);
         lua_pop(L,1);
     }
     }
     lua_pop(L,3);
     lua_pop(L,3);
@@ -4239,6 +4263,16 @@ void tnsEvaluateObjectTree(tnsObject* from, tnsEvaluateData* UseED, int Evaluate
         //if(ed->Scene){ tnsPrintEvaluatedNode(ed->Scene->Root,0);}
         //if(ed->Scene){ tnsPrintEvaluatedNode(ed->Scene->Root,0);}
     }
     }
 }
 }
+int tnsEvaluateObjectTreeEvent(tnsEvaluateData* ed_play, tnsEvaluatedNode* en, laEvent* e){
+    int stop=0;
+    for(tnsEvaluatedNode* lip=en->Children.pFirst;lip;lip=lip->Item.pNext){
+        if(tnsEvaluateObjectTreeEvent(ed_play, lip, e)){ stop=1; }
+    }
+    //tnsRunNode(en,"input",en->Target);
+#ifdef LA_WITH_LUAJIT
+    if(!stop){ return tnsLuaRunNodeEvent(ed_play->L,en,en->Target,e); }
+#endif
+}
 void tnsDrawLayer(tnsEvaluateData* ed,int Layer,void* CustomData){
 void tnsDrawLayer(tnsEvaluateData* ed,int Layer,void* CustomData){
     tnsEvaluatedInstance* ei; int next=0;
     tnsEvaluatedInstance* ei; int next=0;
     int No2D=Layer&TNS_EVAL_LAYER_NO_2D; int Do2D=Layer&TNS_EVAL_LAYER_SHOW_2D;
     int No2D=Layer&TNS_EVAL_LAYER_NO_2D; int Do2D=Layer&TNS_EVAL_LAYER_SHOW_2D;

+ 12 - 12
resources/la_modelling.c

@@ -427,9 +427,9 @@ int OPMOD_Select(laOperator *a, laEvent *e){
     tnsObject* o=root->Active; tnsMeshObject* mo=o; tnsShapeObject* so=o;
     tnsObject* o=root->Active; tnsMeshObject* mo=o; tnsShapeObject* so=o;
     MSelectExtra* se=a->CustomData;
     MSelectExtra* se=a->CustomData;
 
 
-    if(e->Type==LA_L_MOUSE_DOWN){ se->InSelect=1; ex->DrawCursor=2; ex->ClickedX=e->x; ex->ClickedY=e->y; laRedrawCurrentPanel(); }
-    if(e->Type&LA_MOUSE_EVENT){ ex->OnX=e->x; ex->OnY=e->y; laRedrawCurrentPanel(); }
-    if(e->Type==LA_R_MOUSE_DOWN || (e->Type == LA_KEY_DOWN && e->key==LA_KEY_ESCAPE)){
+    if(e->type==LA_L_MOUSE_DOWN){ se->InSelect=1; ex->DrawCursor=2; ex->ClickedX=e->x; ex->ClickedY=e->y; laRedrawCurrentPanel(); }
+    if(e->type&LA_MOUSE_EVENT){ ex->OnX=e->x; ex->OnY=e->y; laRedrawCurrentPanel(); }
+    if(e->type==LA_R_MOUSE_DOWN || (e->type == LA_KEY_DOWN && e->key==LA_KEY_ESCAPE)){
         ex->DrawCursor=0; la_FreeSelectData(se->sd); memFree(se); laNotifyUsers("tns.world"); return LA_FINISHED;
         ex->DrawCursor=0; la_FreeSelectData(se->sd); memFree(se); laNotifyUsers("tns.world"); return LA_FINISHED;
     }
     }
 
 
@@ -438,7 +438,7 @@ int OPMOD_Select(laOperator *a, laEvent *e){
     int Remove=e->SpecialKeyBit&LA_KEY_ALT; if(Remove) DeselectAll=0;
     int Remove=e->SpecialKeyBit&LA_KEY_ALT; if(Remove) DeselectAll=0;
 
 
     int is_geo=0;
     int is_geo=0;
-    if(se->InSelect && e->Type==LA_L_MOUSE_UP){
+    if(se->InSelect && e->type==LA_L_MOUSE_UP){
         if(o && o->Type==TNS_OBJECT_MESH && mo->Mode==TNS_MESH_EDIT_MODE){ is_geo=1;
         if(o && o->Type==TNS_OBJECT_MESH && mo->Mode==TNS_MESH_EDIT_MODE){ is_geo=1;
             la_DoMeshSelect(mo, 0, ex->SelectMode, DeselectAll, 0, 0);
             la_DoMeshSelect(mo, 0, ex->SelectMode, DeselectAll, 0, 0);
             int len; int* ids=la_SelectGetBox(se->sd, ex->ClickedX-ui->L, ex->ClickedY-ui->U, e->x-ui->L, e->y-ui->U, &len);
             int len; int* ids=la_SelectGetBox(se->sd, ex->ClickedX-ui->L, ex->ClickedY-ui->U, e->x-ui->L, e->y-ui->U, &len);
@@ -942,7 +942,7 @@ int OPMOD_Transformation(laOperator *a, laEvent *e){
         td->UserDeltaVal=fabs(td->UserDeltaVal); for(char*pc=entered;*pc;pc++){ if(*pc=='-') td->UserDeltaVal=-td->UserDeltaVal; } free(entered); 
         td->UserDeltaVal=fabs(td->UserDeltaVal); for(char*pc=entered;*pc;pc++){ if(*pc=='-') td->UserDeltaVal=-td->UserDeltaVal; } free(entered); 
     }
     }
 
 
-    if(e->Type==LA_KEY_DOWN){
+    if(e->type==LA_KEY_DOWN){
         int Other=1; if(e->SpecialKeyBit&LA_KEY_SHIFT){ Other=-1; }
         int Other=1; if(e->SpecialKeyBit&LA_KEY_SHIFT){ Other=-1; }
         if(e->key=='x'){ td->LockAxis[0]=Other*((Other<0&&td->LockAxis[0])?td->LockAxis[0]:!td->LockAxis[0]); td->LockAxis[1]=td->LockAxis[2]=0; }
         if(e->key=='x'){ td->LockAxis[0]=Other*((Other<0&&td->LockAxis[0])?td->LockAxis[0]:!td->LockAxis[0]); td->LockAxis[1]=td->LockAxis[2]=0; }
         if(e->key=='y'){ td->LockAxis[1]=Other*((Other<0&&td->LockAxis[1])?td->LockAxis[1]:!td->LockAxis[1]); td->LockAxis[0]=td->LockAxis[2]=0; }
         if(e->key=='y'){ td->LockAxis[1]=Other*((Other<0&&td->LockAxis[1])?td->LockAxis[1]:!td->LockAxis[1]); td->LockAxis[0]=td->LockAxis[2]=0; }
@@ -953,7 +953,7 @@ int OPMOD_Transformation(laOperator *a, laEvent *e){
         if(e->key==' '){ td->UseLocal=!td->UseLocal; }
         if(e->key==' '){ td->UseLocal=!td->UseLocal; }
     }
     }
 
 
-    if(e->Type==LA_MOUSEMOVE || e->Type==LA_KEY_DOWN){
+    if(e->type==LA_MOUSEMOVE || e->type==LA_KEY_DOWN){
         switch(td->mode){
         switch(td->mode){
             case LA_TRANSFORM_MODE_GRAB: la_ApplyTranslation(td,e->x-ex->ClickedX, e->y-ex->ClickedY); break;
             case LA_TRANSFORM_MODE_GRAB: la_ApplyTranslation(td,e->x-ex->ClickedX, e->y-ex->ClickedY); break;
             case LA_TRANSFORM_MODE_SCALE: la_ApplyScale(td,e->x-ui->L, e->y-ui->U); break;
             case LA_TRANSFORM_MODE_SCALE: la_ApplyScale(td,e->x-ui->L, e->y-ui->U); break;
@@ -964,11 +964,11 @@ int OPMOD_Transformation(laOperator *a, laEvent *e){
         laNotifyUsers("tns.world");
         laNotifyUsers("tns.world");
     }
     }
 
 
-    if(e->Type==LA_L_MOUSE_DOWN || (e->Type==LA_KEY_DOWN && e->key==LA_KEY_ENTER)){ ex->DrawCursor=0;
+    if(e->type==LA_L_MOUSE_DOWN || (e->type==LA_KEY_DOWN && e->key==LA_KEY_ENTER)){ ex->DrawCursor=0;
         la_RecordTransformDifferences(td);
         la_RecordTransformDifferences(td);
         laNotifyUsers("tns.world"); la_FreeTransformData(td); return LA_FINISHED;
         laNotifyUsers("tns.world"); la_FreeTransformData(td); return LA_FINISHED;
     }
     }
-    if(e->Type==LA_R_MOUSE_DOWN || e->Type==LA_ESCAPE_DOWN){ ex->DrawCursor=0;
+    if(e->type==LA_R_MOUSE_DOWN || e->type==LA_ESCAPE_DOWN){ ex->DrawCursor=0;
         la_CancelTransformObjects(td); laNotifyUsers("tns.world"); la_FreeTransformData(td); return LA_FINISHED;
         la_CancelTransformObjects(td); laNotifyUsers("tns.world"); la_FreeTransformData(td); return LA_FINISHED;
     }
     }
 
 
@@ -1793,11 +1793,11 @@ int OPMOD_Knife(laOperator *a, laEvent *e){
     tnsMeshObject* mo=root->Active;
     tnsMeshObject* mo=root->Active;
     int changed=0;
     int changed=0;
 
 
-    if(e->Type==LA_R_MOUSE_DOWN || (e->Type == LA_KEY_DOWN && e->key==LA_KEY_ESCAPE)){
+    if(e->type==LA_R_MOUSE_DOWN || (e->type == LA_KEY_DOWN && e->key==LA_KEY_ESCAPE)){
         la_KnifeFinish(se,mo); laNotifyUsers("tns.world"); return LA_FINISHED;
         la_KnifeFinish(se,mo); laNotifyUsers("tns.world"); return LA_FINISHED;
     }
     }
 
 
-    if(e->Type&LA_MOUSE_EVENT){
+    if(e->type&LA_MOUSE_EVENT){
         int elemtype,id=la_SelectGetClosest(se->sd, e->x-ui->L, e->y-ui->U, LA_RH,&elemtype)-1;
         int elemtype,id=la_SelectGetClosest(se->sd, e->x-ui->L, e->y-ui->U, LA_RH,&elemtype)-1;
         void* p=la_SelectGetRef(se->sd,id,elemtype);
         void* p=la_SelectGetRef(se->sd,id,elemtype);
         if(se->IsLoop){
         if(se->IsLoop){
@@ -1809,11 +1809,11 @@ int OPMOD_Knife(laOperator *a, laEvent *e){
             if(la_KnifeIsDuplicated(se,p)) p=0;
             if(la_KnifeIsDuplicated(se,p)) p=0;
             if(se->PendingElem!=p){ changed=1; }
             if(se->PendingElem!=p){ changed=1; }
             se->PendingElem=p; se->PendingElemType=elemtype;
             se->PendingElem=p; se->PendingElemType=elemtype;
-            if(e->Type==LA_L_MOUSE_DOWN && p){ la_KnifeAppendCut(se); changed=1; }
+            if(e->type==LA_L_MOUSE_DOWN && p){ la_KnifeAppendCut(se); changed=1; }
         }
         }
     }
     }
 
 
-    if((e->Type==LA_KEY_DOWN && e->key==LA_KEY_ENTER) || (se->IsLoop && e->Type==LA_L_MOUSE_DOWN)){
+    if((e->type==LA_KEY_DOWN && e->key==LA_KEY_ENTER) || (se->IsLoop && e->type==LA_L_MOUSE_DOWN)){
         if(la_KnifeRegisterCuts(se,mo,se->IsLoop)){ tnsMMeshEnsureSelection(mo,ex->SelectMode);
         if(la_KnifeRegisterCuts(se,mo,se->IsLoop)){ tnsMMeshEnsureSelection(mo,ex->SelectMode);
             tnsInvalidateMeshBatch(mo); laNotifyUsers("tns.world");
             tnsInvalidateMeshBatch(mo); laNotifyUsers("tns.world");
             laRecordAndPush(0,"tns.world",se->IsLoop?"Loop Cut":"Knife Cut",TNS_HINT_GEOMETRY);
             laRecordAndPush(0,"tns.world",se->IsLoop?"Loop Cut":"Knife Cut",TNS_HINT_GEOMETRY);

+ 46 - 46
resources/la_operators.c

@@ -471,7 +471,7 @@ int OPMOD_FileBrowser(laOperator *a, laEvent *e){
         }
         }
     }
     }
 
 
-    if (e->Type == LA_ESCAPE_DOWN){
+    if (e->type == LA_ESCAPE_DOWN){
         laConfirmInt(a, 0, LA_CONFIRM_CANCEL);
         laConfirmInt(a, 0, LA_CONFIRM_CANCEL);
         return LA_FINISHED;
         return LA_FINISHED;
     }
     }
@@ -815,11 +815,11 @@ int OPMOD_InputMappingEntrySelectKey(laOperator *a, laEvent *e){
     if(!a->This || !a->This->EndInstance) return LA_CANCELED; laInputMappingEntry* ime=a->This->EndInstance;
     if(!a->This || !a->This->EndInstance) return LA_CANCELED; laInputMappingEntry* ime=a->This->EndInstance;
     laKeyDetectorData* kdd=a->CustomData; if(!kdd){ return LA_FINISHED; }
     laKeyDetectorData* kdd=a->CustomData; if(!kdd){ return LA_FINISHED; }
     char buf[64],*_next=buf;
     char buf[64],*_next=buf;
-    if(e->Type == LA_KEY_DOWN || e->Type == LA_KEY_UP){
+    if(e->type == LA_KEY_DOWN || e->type == LA_KEY_UP){
         kdd->Key = e->key; laToUTF8(e->key,buf,&_next); *_next=0; strSafeSet(&kdd->Str,buf); kdd->IsController=0;
         kdd->Key = e->key; laToUTF8(e->key,buf,&_next); *_next=0; strSafeSet(&kdd->Str,buf); kdd->IsController=0;
         laNotifyInstanceUsers(kdd);
         laNotifyInstanceUsers(kdd);
         return LA_RUNNING;
         return LA_RUNNING;
-    }elif(e->Type == LA_EMPTY){
+    }elif(e->type == LA_EMPTY){
         if(MAIN.ControllerHasNewAxis){
         if(MAIN.ControllerHasNewAxis){
             kdd->Axis = MAIN.LastControllerAxis; kdd->Device = MAIN.LastControllerAxisDevice; kdd->Button =-1; kdd->IsController=1;
             kdd->Axis = MAIN.LastControllerAxis; kdd->Device = MAIN.LastControllerAxisDevice; kdd->Button =-1; kdd->IsController=1;
             strSafeSet(&kdd->Str,laControllerIDGetAxisName(kdd->Device,kdd->Axis)); laNotifyInstanceUsers(kdd);
             strSafeSet(&kdd->Str,laControllerIDGetAxisName(kdd->Device,kdd->Axis)); laNotifyInstanceUsers(kdd);
@@ -1219,7 +1219,7 @@ int OPINV_BlockClosePanel(laOperator *a, laEvent *e){
 int OPMOD_BlockClosePanel(laOperator *a, laEvent *e){
 int OPMOD_BlockClosePanel(laOperator *a, laEvent *e){
     laLayout *l = MAIN.CurrentWindow->CurrentLayout;
     laLayout *l = MAIN.CurrentWindow->CurrentLayout;
     laBlock *b = l->OperatingBlock;
     laBlock *b = l->OperatingBlock;
-    if (e->Type == LA_ESCAPE_DOWN) return LA_FINISHED;
+    if (e->type == LA_ESCAPE_DOWN) return LA_FINISHED;
     if (a->ConfirmData){
     if (a->ConfirmData){
         if (!b) b = laDetectBlockRecursive(l->FirstBlock, e->x, e->y);
         if (!b) b = laDetectBlockRecursive(l->FirstBlock, e->x, e->y);
         if (!b) return LA_CANCELED;
         if (!b) return LA_CANCELED;
@@ -1404,9 +1404,9 @@ int la_ProcessBlockEvent(laOperator *a, laBlock *b, laEvent *e){
         MAIN.CurrentWindow->CurrentLayout->OperatingBlock = b;
         MAIN.CurrentWindow->CurrentLayout->OperatingBlock = b;
 
 
         if (b->CurrentPanel){
         if (b->CurrentPanel){
-            if (e->Type == LA_MOUSE_WHEEL_DOWN && b->CurrentPanel->Item.pNext){
+            if (e->type == LA_MOUSE_WHEEL_DOWN && b->CurrentPanel->Item.pNext){
                 b->CurrentPanel = b->CurrentPanel->Item.pNext; Executed = 1;
                 b->CurrentPanel = b->CurrentPanel->Item.pNext; Executed = 1;
-            }elif (e->Type == LA_MOUSE_WHEEL_UP && b->CurrentPanel->Item.pPrev){
+            }elif (e->type == LA_MOUSE_WHEEL_UP && b->CurrentPanel->Item.pPrev){
                 b->CurrentPanel = b->CurrentPanel->Item.pPrev; Executed = 1;
                 b->CurrentPanel = b->CurrentPanel->Item.pPrev; Executed = 1;
             }
             }
         }
         }
@@ -1415,7 +1415,7 @@ int la_ProcessBlockEvent(laOperator *a, laBlock *b, laEvent *e){
             for (p = b->Panels.pFirst; p; p = p->Item.pNext){ tw += (p->TitleWidth + LA_SEAM_W*2); }
             for (p = b->Panels.pFirst; p; p = p->Item.pNext){ tw += (p->TitleWidth + LA_SEAM_W*2); }
             if (tw > b->W - LA_SEAM_W*2 - LA_RH) ratio = (real)(b->W - LA_SEAM_W*2 - LA_RH) / tw;
             if (tw > b->W - LA_SEAM_W*2 - LA_RH) ratio = (real)(b->W - LA_SEAM_W*2 - LA_RH) / tw;
 
 
-            if ((e->Type == LA_L_MOUSE_DOWN)){
+            if ((e->type == LA_L_MOUSE_DOWN)){
                 uid->LastX = e->x;
                 uid->LastX = e->x;
                 uid->LastY = e->y;
                 uid->LastY = e->y;
                 int LT=0,RT=0;
                 int LT=0,RT=0;
@@ -1426,7 +1426,7 @@ int la_ProcessBlockEvent(laOperator *a, laBlock *b, laEvent *e){
                     }
                     }
                     LT = RT;
                     LT = RT;
                 }
                 }
-            }elif (e->Type == LA_MOUSEMOVE){
+            }elif (e->type == LA_MOUSEMOVE){
                 if (abs(e->x - uid->LastX) > LA_RH*3 || abs(e->y - uid->LastY) > LA_RH*3){
                 if (abs(e->x - uid->LastX) > LA_RH*3 || abs(e->y - uid->LastY) > LA_RH*3){
                     if (MAIN.CurrentWindow->CurrentLayout->ClickedPanel){
                     if (MAIN.CurrentWindow->CurrentLayout->ClickedPanel){
                         l = MAIN.CurrentWindow->CurrentLayout;
                         l = MAIN.CurrentWindow->CurrentLayout;
@@ -1435,7 +1435,7 @@ int la_ProcessBlockEvent(laOperator *a, laBlock *b, laEvent *e){
                         laRefreshWindow();
                         laRefreshWindow();
                     }
                     }
                 }
                 }
-            }elif (e->Type == LA_L_MOUSE_UP){
+            }elif (e->type == LA_L_MOUSE_UP){
                 l = MAIN.CurrentWindow->CurrentLayout;
                 l = MAIN.CurrentWindow->CurrentLayout;
                 if (l->DropToBlock){
                 if (l->DropToBlock){
                     l->DropToBlock = la_MakeDropBlock(l->DropToBlock,l->DropLocation);
                     l->DropToBlock = la_MakeDropBlock(l->DropToBlock,l->DropLocation);
@@ -1468,8 +1468,8 @@ int la_ProcessBlockEvent(laOperator *a, laBlock *b, laEvent *e){
             }
             }
         }else{
         }else{
             if(!b->OnButton){ b->OnButton=1; laRefreshWindow(); } Ret=0;
             if(!b->OnButton){ b->OnButton=1; laRefreshWindow(); } Ret=0;
-            if(laIsInBlockBotton1(b, e->x, e->y)){ if(b->OnButton!=2){b->OnButton=2;laRefreshWindow();} if(e->Type==LA_L_MOUSE_DOWN){laUnfoldBlockTitle(b);Executed=1;Ret=1;} }
-            elif(laIsInBlockBotton2(b, e->x, e->y)){ if(b->OnButton!=2){b->OnButton=2;laRefreshWindow();}  if(e->Type==LA_L_MOUSE_DOWN){laMaximizeBlock(b);Executed=1;Ret=1;} }
+            if(laIsInBlockBotton1(b, e->x, e->y)){ if(b->OnButton!=2){b->OnButton=2;laRefreshWindow();} if(e->type==LA_L_MOUSE_DOWN){laUnfoldBlockTitle(b);Executed=1;Ret=1;} }
+            elif(laIsInBlockBotton2(b, e->x, e->y)){ if(b->OnButton!=2){b->OnButton=2;laRefreshWindow();}  if(e->type==LA_L_MOUSE_DOWN){laMaximizeBlock(b);Executed=1;Ret=1;} }
         }
         }
 
 
         if (Executed){
         if (Executed){
@@ -1477,7 +1477,7 @@ int la_ProcessBlockEvent(laOperator *a, laBlock *b, laEvent *e){
             la_RecalcBlockRecursive(b, b->X, b->Y, b->W, b->H);
             la_RecalcBlockRecursive(b, b->X, b->Y, b->W, b->H);
         }
         }
 
 
-        if (!Executed && e->Type == LA_L_MOUSE_DOWN && laIsInBlockBotton1(b, e->x, e->y)){
+        if (!Executed && e->type == LA_L_MOUSE_DOWN && laIsInBlockBotton1(b, e->x, e->y)){
             laui_BlockMenu(a, MAIN.CurrentWindow, MAIN.CurrentWindow->CurrentLayout, b, e);
             laui_BlockMenu(a, MAIN.CurrentWindow, MAIN.CurrentWindow->CurrentLayout, b, e);
         }
         }
         return Ret;
         return Ret;
@@ -1489,7 +1489,7 @@ int la_ProcessBlockEvent(laOperator *a, laBlock *b, laEvent *e){
 int la_ProcessBlockEdgeEvent(laOperator *WindowAct, laLayout *l, laBlock *b, laEvent *e){
 int la_ProcessBlockEdgeEvent(laOperator *WindowAct, laLayout *l, laBlock *b, laEvent *e){
     laBlock *ob = l->MovingBlock;
     laBlock *ob = l->MovingBlock;
     laWindow *w = WindowAct->Instance;
     laWindow *w = WindowAct->Instance;
-    if (e->Type == LA_MOUSEMOVE && ob && l->MovingBlock && l->IsMoving){
+    if (e->type == LA_MOUSEMOVE && ob && l->MovingBlock && l->IsMoving){
         if (ob->Vertical) ob->SplitRatio = (real)(e->y - ob->Y) / (real)(ob->H);
         if (ob->Vertical) ob->SplitRatio = (real)(e->y - ob->Y) / (real)(ob->H);
         else ob->SplitRatio = (real)(e->x - ob->X) / (real)(ob->W);
         else ob->SplitRatio = (real)(e->x - ob->X) / (real)(ob->W);
         la_RecalcBlockRecursive(ob, ob->X, ob->Y, ob->W, ob->H);
         la_RecalcBlockRecursive(ob, ob->X, ob->Y, ob->W, ob->H);
@@ -1501,11 +1501,11 @@ int la_ProcessBlockEdgeEvent(laOperator *WindowAct, laLayout *l, laBlock *b, laE
         ob->B1->OnButton=ob->B2->OnButton=0;
         ob->B1->OnButton=ob->B2->OnButton=0;
         if(l->MovingBlock!=ob){ laRefreshWindow(); }
         if(l->MovingBlock!=ob){ laRefreshWindow(); }
         l->MovingBlock = ob; laSetWindowCursor(ob->Vertical?LA_UP_AND_DOWN:LA_LEFT_AND_RIGHT);
         l->MovingBlock = ob; laSetWindowCursor(ob->Vertical?LA_UP_AND_DOWN:LA_LEFT_AND_RIGHT);
-        if (e->Type == LA_L_MOUSE_DOWN){
+        if (e->type == LA_L_MOUSE_DOWN){
             l->IsMoving = 1;
             l->IsMoving = 1;
-        }elif (e->Type == LA_L_MOUSE_UP){
+        }elif (e->type == LA_L_MOUSE_UP){
             l->IsMoving = 0;
             l->IsMoving = 0;
-        }elif (e->Type == LA_R_MOUSE_DOWN){
+        }elif (e->type == LA_R_MOUSE_DOWN){
             l->OnBlockSeperator = ob;
             l->OnBlockSeperator = ob;
             laui_BlockEdgeMenu(WindowAct, l, ob, e);
             laui_BlockEdgeMenu(WindowAct, l, ob, e);
         }
         }
@@ -1631,13 +1631,13 @@ int OPMOD_Window(laOperator *a, laEvent *e){
             MAIN.CurrentWindow->CurrentLayout->DropToBlock = 0;
             MAIN.CurrentWindow->CurrentLayout->DropToBlock = 0;
         }
         }
 
 
-        if(e->Type==LA_L_MOUSE_UP && l->DropToBlock){
+        if(e->type==LA_L_MOUSE_UP && l->DropToBlock){
             l->DropToBlock = la_MakeDropBlock(l->DropToBlock, l->DropLocation);
             l->DropToBlock = la_MakeDropBlock(l->DropToBlock, l->DropLocation);
             laDockPanel(w->DockingFrom, l->DropToBlock, MAIN.DockingPanel);
             laDockPanel(w->DockingFrom, l->DropToBlock, MAIN.DockingPanel);
             la_StopDocking();la_ClearDockingTarget(); return LA_RUNNING;
             la_StopDocking();la_ClearDockingTarget(); return LA_RUNNING;
         }
         }
 
 
-        if(e->Type==LA_R_MOUSE_DOWN || (e->Type==LA_KEY_DOWN&&e->key==LA_KEY_ESCAPE)){
+        if(e->type==LA_R_MOUSE_DOWN || (e->type==LA_KEY_DOWN&&e->key==LA_KEY_ESCAPE)){
             la_StopDocking();la_ClearDockingTarget(); return LA_RUNNING;
             la_StopDocking();la_ClearDockingTarget(); return LA_RUNNING;
         }
         }
         return LA_RUNNING;
         return LA_RUNNING;
@@ -1651,7 +1651,7 @@ int OPMOD_Window(laOperator *a, laEvent *e){
             return LA_RUNNING;
             return LA_RUNNING;
         }
         }
         if(e->y>LA_2RH && e->x>LA_2RH){ if(!uid->Dragging)laRequestDelayEvent(0.5); uid->Dragging=1; }
         if(e->y>LA_2RH && e->x>LA_2RH){ if(!uid->Dragging)laRequestDelayEvent(0.5); uid->Dragging=1; }
-        if(e->Type==LA_TIME_DELAY){ laHideMenuBar(); }
+        if(e->type==LA_TIME_DELAY){ laHideMenuBar(); }
     }else{
     }else{
         if(MAIN.PendingSplash){
         if(MAIN.PendingSplash){
             laSetOperatorLocalizer(MAIN.PendingSplash);
             laSetOperatorLocalizer(MAIN.PendingSplash);
@@ -1694,7 +1694,7 @@ void OPEXT_Panel(laOperator *a, int ExitCode){
 }
 }
 int la_ScrollPanel(laGeneralUiExtraData*ex, laPanel*p, laEvent* e){
 int la_ScrollPanel(laGeneralUiExtraData*ex, laPanel*p, laEvent* e){
     int ret=0;
     int ret=0;
-    if(ex->TargetIndexVali==4 && e->Type==LA_MOUSEMOVE){
+    if(ex->TargetIndexVali==4 && e->type==LA_MOUSEMOVE){
         laUiList* uuil=ex->Ptr1; laUiItem* upui=ex->Ptr2;
         laUiList* uuil=ex->Ptr1; laUiItem* upui=ex->Ptr2;
         if(upui){ laPanUiListFree(uuil, ex->LastX-e->x, ex->LastY-e->y);
         if(upui){ laPanUiListFree(uuil, ex->LastX-e->x, ex->LastY-e->y);
             //if(uuil->HeightCoeff){
             //if(uuil->HeightCoeff){
@@ -1708,28 +1708,28 @@ int la_ScrollPanel(laGeneralUiExtraData*ex, laPanel*p, laEvent* e){
         laRedrawCurrentPanel();
         laRedrawCurrentPanel();
         ret= 1;
         ret= 1;
     }
     }
-    if(ex->TargetIndexVali==5 && e->Type==LA_MOUSEMOVE){
+    if(ex->TargetIndexVali==5 && e->type==LA_MOUSEMOVE){
         laUiList* uuil=ex->Ptr1; laUiItem* upui=ex->Ptr2;
         laUiList* uuil=ex->Ptr1; laUiItem* upui=ex->Ptr2;
         if(upui)laScaleUiList(uuil, -(ex->LastY-e->y)*0.005+1, upui->L, upui->R, upui->U, upui->B);
         if(upui)laScaleUiList(uuil, -(ex->LastY-e->y)*0.005+1, upui->L, upui->R, upui->U, upui->B);
         ex->LastX=e->x; ex->LastY=e->y;
         ex->LastX=e->x; ex->LastY=e->y;
         laRecalcCurrentPanel();
         laRecalcCurrentPanel();
         ret= 1;
         ret= 1;
     }
     }
-    if(e->Type==LA_M_MOUSE_UP){ ex->TargetIndexVali=0; }
-    if (e->Type & LA_KEY_MOUSE_SCROLL || e->Type==LA_M_MOUSE_DOWN){
+    if(e->type==LA_M_MOUSE_UP){ ex->TargetIndexVali=0; }
+    if (e->type & LA_KEY_MOUSE_SCROLL || e->type==LA_M_MOUSE_DOWN){
         laUiItem *pui = 0; laListHandle levels={0}; int dir;
         laUiItem *pui = 0; laListHandle levels={0}; int dir;
-        if (e->Type & LA_STATE_DOWN) dir=1;
-        elif (e->Type & LA_STATE_UP) dir=-1;
+        if (e->type & LA_STATE_DOWN) dir=1;
+        elif (e->type & LA_STATE_UP) dir=-1;
         laUiList *duil = la_DetectUiListRecursiveDeep(p->MenuRefer?p->MenuRefer:&p->UI, e->x, e->y, 10000, &pui, 0, 0, 0, 0, &levels);
         laUiList *duil = la_DetectUiListRecursiveDeep(p->MenuRefer?p->MenuRefer:&p->UI, e->x, e->y, 10000, &pui, 0, 0, 0, 0, &levels);
         laUiListRecord* lip=levels.pLast; laUiList* uuil=lip->uil; laUiItem* upui=lip->Item.pPrev?((laUiListRecord*)lip->Item.pPrev)->pui:0; int ran=0;
         laUiListRecord* lip=levels.pLast; laUiList* uuil=lip->uil; laUiItem* upui=lip->Item.pPrev?((laUiListRecord*)lip->Item.pPrev)->pui:0; int ran=0;
         if(e->SpecialKeyBit == LA_KEY_CTRL){
         if(e->SpecialKeyBit == LA_KEY_CTRL){
-            if(e->Type==LA_M_MOUSE_DOWN){
+            if(e->type==LA_M_MOUSE_DOWN){
                 while (lip && upui && (!uuil->AllowScale)) { lip=lip->Item.pPrev; uuil=lip->uil;  upui=lip->Item.pPrev?((laUiListRecord*)lip->Item.pPrev)->pui:0; } 
                 while (lip && upui && (!uuil->AllowScale)) { lip=lip->Item.pPrev; uuil=lip->uil;  upui=lip->Item.pPrev?((laUiListRecord*)lip->Item.pPrev)->pui:0; } 
                 if(uuil) { ex->TargetIndexVali=5; ex->Ptr1=uuil; ex->Ptr2=upui; ex->LastX=e->x; ex->LastY=e->y; ret= 1;}
                 if(uuil) { ex->TargetIndexVali=5; ex->Ptr1=uuil; ex->Ptr2=upui; ex->LastX=e->x; ex->LastY=e->y; ret= 1;}
             }else{
             }else{
             }
             }
         }else{
         }else{
-            if(e->Type==LA_M_MOUSE_DOWN){
+            if(e->type==LA_M_MOUSE_DOWN){
                 while (lip && upui && (!uuil->AllowScale)) { lip=lip->Item.pPrev; uuil=lip->uil;  upui=lip->Item.pPrev?((laUiListRecord*)lip->Item.pPrev)->pui:0; } 
                 while (lip && upui && (!uuil->AllowScale)) { lip=lip->Item.pPrev; uuil=lip->uil;  upui=lip->Item.pPrev?((laUiListRecord*)lip->Item.pPrev)->pui:0; } 
                 if(uuil) { ex->TargetIndexVali=4; ex->Ptr1=uuil; ex->Ptr2=upui; ex->LastX=e->x; ex->LastY=e->y; ret= 1;}
                 if(uuil) { ex->TargetIndexVali=4; ex->Ptr1=uuil; ex->Ptr2=upui; ex->LastX=e->x; ex->LastY=e->y; ret= 1;}
             }else{
             }else{
@@ -1762,7 +1762,7 @@ int OPMOD_Panel(laOperator *a, laEvent *e){
 
 
     if (!p->Show || (!laIsInPanel(p, x, y) && !uid->TargetIndexVali)){
     if (!p->Show || (!laIsInPanel(p, x, y) && !uid->TargetIndexVali)){
         if(p->CloseWhenMovedOut==2){
         if(p->CloseWhenMovedOut==2){
-            if(e->Type&LA_STATE_DOWN){
+            if(e->type&LA_STATE_DOWN){
                 la_StopUiOperatorService(p); laDestroySinglePanel(p,0); return LA_FINISHED;
                 la_StopUiOperatorService(p); laDestroySinglePanel(p,0); return LA_FINISHED;
             }
             }
             return LA_RUNNING;
             return LA_RUNNING;
@@ -1781,13 +1781,13 @@ int OPMOD_Panel(laOperator *a, laEvent *e){
         dp = laDetectPanel(x, y);
         dp = laDetectPanel(x, y);
         if (dp->Mode && dp != p){
         if (dp->Mode && dp != p){
             return LA_FINISHED;
             return LA_FINISHED;
-        }else if ((e->Type & LA_MOUSEDOWN) == LA_MOUSEDOWN){
+        }else if ((e->type & LA_MOUSEDOWN) == LA_MOUSEDOWN){
             laPopPanel(p); IsTop=1;
             laPopPanel(p); IsTop=1;
         }else if(p->Mode) return LA_RUNNING;
         }else if(p->Mode) return LA_RUNNING;
         laWindowToLocal(0, p, &x, &y);
         laWindowToLocal(0, p, &x, &y);
     }
     }
 
 
-    if (e->Type == LA_L_MOUSE_DOWN && (!NoPrimaryUI) && e->x + e->y < p->W + p->H - LA_SCROLL_W*2){
+    if (e->type == LA_L_MOUSE_DOWN && (!NoPrimaryUI) && e->x + e->y < p->W + p->H - LA_SCROLL_W*2){
         laUiItem *pui = 0; laUiList *suil = 0;laListHandle levels={0};
         laUiItem *pui = 0; laUiList *suil = 0;laListHandle levels={0};
         laUiList *duil = la_DetectUiListRecursiveDeep(&p->UI, e->x, e->y, 10000, &pui, &suil, 0, 0, 0, &levels);
         laUiList *duil = la_DetectUiListRecursiveDeep(&p->UI, e->x, e->y, 10000, &pui, &suil, 0, 0, 0, &levels);
         while(duil=lstPopPointer(&levels));
         while(duil=lstPopPointer(&levels));
@@ -1817,18 +1817,18 @@ int OPMOD_Panel(laOperator *a, laEvent *e){
     }
     }
     lstClearPointer(&Locals);
     lstClearPointer(&Locals);
     
     
-    if (p->Mode && e->Type&LA_MOUSE_EVENT && !uid->TargetIndexVali && !p->IsMenuPanel){
+    if (p->Mode && e->type&LA_MOUSE_EVENT && !uid->TargetIndexVali && !p->IsMenuPanel){
         if (e->x + e->y > p->W + p->H - LA_SCROLL_W*2){
         if (e->x + e->y > p->W + p->H - LA_SCROLL_W*2){
             if((!a->Item.pPrev) && (!p->ShowCorner)){ p->ShowCorner=1; laSetWindowCursor(LA_CORNER);  laRefreshWindow(); }
             if((!a->Item.pPrev) && (!p->ShowCorner)){ p->ShowCorner=1; laSetWindowCursor(LA_CORNER);  laRefreshWindow(); }
-            if(e->Type==LA_L_MOUSE_DOWN){ uid->TargetIndexVali = 2; uid->LastX=e->x;uid->LastY=e->y; }
+            if(e->type==LA_L_MOUSE_DOWN){ uid->TargetIndexVali = 2; uid->LastX=e->x;uid->LastY=e->y; }
             return LA_RUNNING;
             return LA_RUNNING;
         }else{
         }else{
             if(p->ShowCorner){ p->ShowCorner=0; laSetWindowCursor(LA_ARROW); laRefreshWindow(); }
             if(p->ShowCorner){ p->ShowCorner=0; laSetWindowCursor(LA_ARROW); laRefreshWindow(); }
-            if(e->Type==LA_L_MOUSE_DOWN){  uid->TargetIndexVali = 1; uid->LastX=e->x;uid->LastY=e->y; return LA_RUNNING; }
+            if(e->type==LA_L_MOUSE_DOWN){  uid->TargetIndexVali = 1; uid->LastX=e->x;uid->LastY=e->y; return LA_RUNNING; }
         }
         }
     }
     }
 
 
-    if (e->Type == LA_MOUSEMOVE){
+    if (e->type == LA_MOUSEMOVE){
         if (uid->TargetIndexVali == 1){
         if (uid->TargetIndexVali == 1){
             if (!p->SL && !p->SR) p->TX = p->X + e->x - uid->LastX;
             if (!p->SL && !p->SR) p->TX = p->X + e->x - uid->LastX;
             if (!p->ST && !p->SB) p->TY = p->Y + e->y - uid->LastY;
             if (!p->ST && !p->SB) p->TY = p->Y + e->y - uid->LastY;
@@ -1860,12 +1860,12 @@ int OPMOD_Panel(laOperator *a, laEvent *e){
         }
         }
     }
     }
 
 
-    if (e->Type == LA_L_MOUSE_UP){
+    if (e->type == LA_L_MOUSE_UP){
         uid->TargetIndexVali = 0; laSetWindowCursor(LA_ARROW);
         uid->TargetIndexVali = 0; laSetWindowCursor(LA_ARROW);
         return LA_RUNNING;
         return LA_RUNNING;
     }
     }
 
 
-    if(p->Mode&&e->Type&LA_MOUSE_EVENT){ return LA_RUNNING; }
+    if(p->Mode&&e->type&LA_MOUSE_EVENT){ return LA_RUNNING; }
 
 
     return RET;
     return RET;
 }
 }
@@ -1882,12 +1882,12 @@ int OPMOD_MenuPanel(laOperator *a, laEvent *e){
     int IsClose=laIsCloseToPanel(p,x,y);
     int IsClose=laIsCloseToPanel(p,x,y);
     int IsIn=laIsInPanel(p, x, y);
     int IsIn=laIsInPanel(p, x, y);
 
 
-    if(p->CloseWhenMovedOut && ((!IsClose) || (!IsIn && e->Type==LA_TIME_IDLE) || e->Type==LA_L_MOUSE_DOWN||e->Type==LA_R_MOUSE_DOWN)){ 
+    if(p->CloseWhenMovedOut && ((!IsClose) || (!IsIn && e->type==LA_TIME_IDLE) || e->type==LA_L_MOUSE_DOWN||e->type==LA_R_MOUSE_DOWN)){ 
         la_StopUiOperatorService(p);
         la_StopUiOperatorService(p);
         laDestroySinglePanel(p,0);
         laDestroySinglePanel(p,0);
         return LA_FINISHED_PASS;
         return LA_FINISHED_PASS;
     }
     }
-    if (e->Type == LA_ESCAPE_DOWN || (e->Type == LA_L_MOUSE_DOWN && !IsIn)){
+    if (e->type == LA_ESCAPE_DOWN || (e->type == LA_L_MOUSE_DOWN && !IsIn)){
         laConfirmInt(a, 1, LA_CONFIRM_DATA);
         laConfirmInt(a, 1, LA_CONFIRM_DATA);
         la_StopUiOperatorService(p);
         la_StopUiOperatorService(p);
         laDestroySinglePanel(p,0);
         laDestroySinglePanel(p,0);
@@ -1896,7 +1896,7 @@ int OPMOD_MenuPanel(laOperator *a, laEvent *e){
 
 
     if(p->PanelTemplate && laKeyMapExecuteEvent(a, &p->PanelTemplate->KeyMap, e)) return LA_RUNNING_PASS;
     if(p->PanelTemplate && laKeyMapExecuteEvent(a, &p->PanelTemplate->KeyMap, e)) return LA_RUNNING_PASS;
 
 
-    if (e->Type == LA_L_MOUSE_DOWN && e->y < p->H - LA_SCROLL_W){
+    if (e->type == LA_L_MOUSE_DOWN && e->y < p->H - LA_SCROLL_W){
         laUiItem *pui = 0; laUiList *suil = 0;laListHandle levels={0};
         laUiItem *pui = 0; laUiList *suil = 0;laListHandle levels={0};
         laUiList *duil = la_DetectUiListRecursiveDeep(p->MenuRefer?p->MenuRefer:&p->UI, e->x, e->y, 10000, &pui, &suil, 0, 0, 0, &levels);
         laUiList *duil = la_DetectUiListRecursiveDeep(p->MenuRefer?p->MenuRefer:&p->UI, e->x, e->y, 10000, &pui, &suil, 0, 0, 0, &levels);
         while(duil=lstPopPointer(&levels));
         while(duil=lstPopPointer(&levels));
@@ -1908,14 +1908,14 @@ int OPMOD_MenuPanel(laOperator *a, laEvent *e){
             return LA_RUNNING;
             return LA_RUNNING;
         }
         }
     }
     }
-    if (e->Type == LA_L_MOUSE_UP && uid->TargetIndexVali == 3){
+    if (e->type == LA_L_MOUSE_UP && uid->TargetIndexVali == 3){
         uid->TargetIndexVali = 0;
         uid->TargetIndexVali = 0;
         return LA_RUNNING;
         return LA_RUNNING;
     }
     }
 
 
     if(la_ScrollPanel(uid,p,e))return LA_RUNNING;
     if(la_ScrollPanel(uid,p,e))return LA_RUNNING;
 
 
-    if (e->Type == LA_MOUSEMOVE){
+    if (e->type == LA_MOUSEMOVE){
         if (uid->TargetIndexVali == 3){
         if (uid->TargetIndexVali == 3){
             laUiList *suil = uid->Ptr1; laUiItem *pui = uid->Ptr2;
             laUiList *suil = uid->Ptr1; laUiItem *pui = uid->Ptr2;
             int IsVertical=uid->On;
             int IsVertical=uid->On;
@@ -1964,7 +1964,7 @@ int OPMOD_ModalPanel(laOperator *a, laEvent *e){
 
 
     if(MAIN.DockingPanel){return LA_FINISHED; }
     if(MAIN.DockingPanel){return LA_FINISHED; }
 
 
-    if (e->Type == LA_KEY_DOWN && e->key==LA_KEY_ESCAPE){
+    if (e->type == LA_KEY_DOWN && e->key==LA_KEY_ESCAPE){
         laConfirmInt(a, 0, LA_CONFIRM_CANCEL);
         laConfirmInt(a, 0, LA_CONFIRM_CANCEL);
         la_StopUiOperatorService(p);
         la_StopUiOperatorService(p);
         laDestroySinglePanel(p,0);
         laDestroySinglePanel(p,0);
@@ -1987,7 +1987,7 @@ int OPMOD_ModalPanel(laOperator *a, laEvent *e){
 
 
     if(p->PanelTemplate && laKeyMapExecuteEvent(a, &p->PanelTemplate->KeyMap, e)) return LA_RUNNING_PASS;
     if(p->PanelTemplate && laKeyMapExecuteEvent(a, &p->PanelTemplate->KeyMap, e)) return LA_RUNNING_PASS;
 
 
-    if (e->Type == LA_L_MOUSE_DOWN && e->y < p->H -  LA_SCROLL_W){
+    if (e->type == LA_L_MOUSE_DOWN && e->y < p->H -  LA_SCROLL_W){
         laUiItem *pui = 0; laUiList *suil = 0;laListHandle levels={0};
         laUiItem *pui = 0; laUiList *suil = 0;laListHandle levels={0};
         laUiList *duil = la_DetectUiListRecursiveDeep(&p->UI, e->x, e->y, 10000, &pui, &suil, 0, 0, 0, &levels);
         laUiList *duil = la_DetectUiListRecursiveDeep(&p->UI, e->x, e->y, 10000, &pui, &suil, 0, 0, 0, &levels);
         while(duil=lstPopPointer(&levels));
         while(duil=lstPopPointer(&levels));
@@ -2019,14 +2019,14 @@ int OPMOD_ModalPanel(laOperator *a, laEvent *e){
     int insize=0; if (e->x + e->y > p->W + p->H - LA_SCROLL_W*2){ insize=1;
     int insize=0; if (e->x + e->y > p->W + p->H - LA_SCROLL_W*2){ insize=1;
         if((!a->Item.pPrev) && (!p->ShowCorner)){ p->ShowCorner=1; laSetWindowCursor(LA_CORNER); laRefreshWindow(); }
         if((!a->Item.pPrev) && (!p->ShowCorner)){ p->ShowCorner=1; laSetWindowCursor(LA_CORNER); laRefreshWindow(); }
              }else{ if(p->ShowCorner){ p->ShowCorner=0; laSetWindowCursor(LA_ARROW); laRefreshWindow(); } }
              }else{ if(p->ShowCorner){ p->ShowCorner=0; laSetWindowCursor(LA_ARROW); laRefreshWindow(); } }
-    if (e->Type == LA_L_MOUSE_DOWN){
+    if (e->type == LA_L_MOUSE_DOWN){
         uid->LastX = e->x;
         uid->LastX = e->x;
         uid->LastY = e->y;
         uid->LastY = e->y;
         if(insize){ uid->TargetIndexVali = 2; laSetWindowCursor(LA_CORNER); }
         if(insize){ uid->TargetIndexVali = 2; laSetWindowCursor(LA_CORNER); }
         else uid->TargetIndexVali = 1;
         else uid->TargetIndexVali = 1;
         return LA_RUNNING;
         return LA_RUNNING;
     }
     }
-    if (e->Type == LA_MOUSEMOVE){
+    if (e->type == LA_MOUSEMOVE){
         if (uid->TargetIndexVali == 1){
         if (uid->TargetIndexVali == 1){
             if (!p->SL && !p->SR) p->TX = p->X + e->x - uid->LastX;
             if (!p->SL && !p->SR) p->TX = p->X + e->x - uid->LastX;
             if (!p->ST && !p->SB) p->TY = p->Y + e->y - uid->LastY;
             if (!p->ST && !p->SB) p->TY = p->Y + e->y - uid->LastY;
@@ -2058,7 +2058,7 @@ int OPMOD_ModalPanel(laOperator *a, laEvent *e){
         }
         }
         if(uid->TargetIndexVali==2){laSetWindowCursor(LA_CORNER);}
         if(uid->TargetIndexVali==2){laSetWindowCursor(LA_CORNER);}
     }
     }
-    if (e->Type == LA_L_MOUSE_UP){
+    if (e->type == LA_L_MOUSE_UP){
         uid->TargetIndexVali = 0; laSetWindowCursor(LA_ARROW);
         uid->TargetIndexVali = 0; laSetWindowCursor(LA_ARROW);
         return LA_RUNNING;
         return LA_RUNNING;
     }
     }

+ 1 - 0
resources/la_properties.c

@@ -1552,6 +1552,7 @@ void la_RegisterInternalProps(){
                 laSubGroupDetachable(sp,laget_FirstSynth,laget_ListNext);
                 laSubGroupDetachable(sp,laget_FirstSynth,laget_ListNext);
                 laAddSubGroup(p,"audio_devices","Audio Devices","Enumerated audio devices","la_audio_device",0,0,0,-1,0,0,0,0,0,0,offsetof(laAudio,AudioDevices),0);
                 laAddSubGroup(p,"audio_devices","Audio Devices","Enumerated audio devices","la_audio_device",0,0,0,-1,0,0,0,0,0,0,offsetof(laAudio,AudioDevices),0);
                 laAddSubGroup(p, "current_audio_device", "Current Audio Device", "Current audio device","la_audio_device",0,0,0,offsetof(laAudio,UsingDevice),laget_FirstAudioDevice,0,laget_ListNext,laset_CurrentAudioDevice,0,0,0,LA_UDF_REFER);
                 laAddSubGroup(p, "current_audio_device", "Current Audio Device", "Current audio device","la_audio_device",0,0,0,offsetof(laAudio,UsingDevice),laget_FirstAudioDevice,0,laget_ListNext,laset_CurrentAudioDevice,0,0,0,LA_UDF_REFER);
+                laAddSubGroup(p,"channels","Channels","Audio channels","la_audio_channel",0,0,0,-1,0,0,0,0,0,0,offsetof(laAudio,Channels),0);
             }
             }
         }
         }
 
 

+ 24 - 0
resources/la_tnslibs.cpp

@@ -20,6 +20,30 @@
 
 
 extern "C" const char* LA_TNS_LIB_COMMON=R"(
 extern "C" const char* LA_TNS_LIB_COMMON=R"(
 ffi.cdef[[
 ffi.cdef[[
+
+typedef double real;
+
+typedef struct _laListItem laListItem;
+struct _laListItem {
+	void* pPrev;
+	void* pNext;
+};
+typedef struct _laEvent laEvent;
+struct _laEvent{
+    laListItem Item;
+    void* window;
+    int type;
+    int state;
+    int x, y;
+    int key;
+    int SpecialKeyBit;
+    int p1, p2;
+    uint32_t Input;
+    int GoodPressure,IsEraser,HasTwist;
+    real Pressure,Orientation,Deviation,Twist;
+    void *Localized;
+};
+
 typedef struct tnsObject tnsObject;
 typedef struct tnsObject tnsObject;
 int tnsSizeOfObject(tnsObject* o);
 int tnsSizeOfObject(tnsObject* o);
 
 

+ 72 - 72
resources/la_widgets.c

@@ -2198,7 +2198,7 @@ int OPINV_EditStringCopySelection(laOperator *a, laEvent *e){
 int la_ProcessTextEdit(laEvent *e, laStringEdit *se, laUiItem* ui){
 int la_ProcessTextEdit(laEvent *e, laStringEdit *se, laUiItem* ui){
     int Select=e->SpecialKeyBit&LA_KEY_SHIFT;
     int Select=e->SpecialKeyBit&LA_KEY_SHIFT;
     real _L, MonoWidth;
     real _L, MonoWidth;
-    switch (e->Type){
+    switch (e->type){
     case LA_INPUT:
     case LA_INPUT:
         switch (e->Input){
         switch (e->Input){
         case 0x08: if(strHasSelection(se)) strClearSelection(se); else strBackspace(se); return 1;
         case 0x08: if(strHasSelection(se)) strClearSelection(se); else strBackspace(se); return 1;
@@ -2222,7 +2222,7 @@ int la_ProcessTextEdit(laEvent *e, laStringEdit *se, laUiItem* ui){
         if(!ui) return 0;
         if(!ui) return 0;
         MonoWidth=tnsGetMonoFontAdvance(); _L=(*ui->Type->Theme)->LM*2+ui->L;
         MonoWidth=tnsGetMonoFontAdvance(); _L=(*ui->Type->Theme)->LM*2+ui->L;
         int Count=se->TotalLines; while(Count){ Count/=10; _L+=MonoWidth; }
         int Count=se->TotalLines; while(Count){ Count/=10; _L+=MonoWidth; }
-        if(e->Type==LA_L_MOUSE_DOWN){
+        if(e->type==LA_L_MOUSE_DOWN){
             strSetCursor(se, (e->y-ui->U)/LA_RH+se->ViewStartLine, (real)se->ViewStartCol+((real)e->x-_L)/MonoWidth+0.5); strCancelSelect(se); strLazySelect(se);
             strSetCursor(se, (e->y-ui->U)/LA_RH+se->ViewStartLine, (real)se->ViewStartCol+((real)e->x-_L)/MonoWidth+0.5); strCancelSelect(se); strLazySelect(se);
             se->MouseSelecting=1; se->CursorPreferBefore=se->CursorBefore; return 1;
             se->MouseSelecting=1; se->CursorPreferBefore=se->CursorBefore; return 1;
         }else{
         }else{
@@ -2283,7 +2283,7 @@ int OPMOD_IntArrayHorizon(laOperator *a, laEvent *e){
         return LA_FINISHED_PASS;
         return LA_FINISHED_PASS;
     }
     }
 
 
-    if (e->Type == LA_TIME_IDLE && !uit->On && !uit->Edit && !NoTooltip){
+    if (e->type == LA_TIME_IDLE && !uit->On && !uit->Edit && !NoTooltip){
         int GX = e->x, GY = e->y; laLocalToWindow(a, a->ToPanel, &GX, &GY);
         int GX = e->x, GY = e->y; laLocalToWindow(a, a->ToPanel, &GX, &GY);
         laPanel *p = laEnableIdlePanel(a->ToPanel, a, 0, 0, &ui->PP, GX, GX + 150, GY, 600, 200, e);
         laPanel *p = laEnableIdlePanel(a->ToPanel, a, 0, 0, &ui->PP, GX, GX + 150, GY, 600, 200, e);
         return LA_RUNNING;
         return LA_RUNNING;
@@ -2291,7 +2291,7 @@ int OPMOD_IntArrayHorizon(laOperator *a, laEvent *e){
 
 
     if(NoEvent){ return LA_RUNNING_PASS; }
     if(NoEvent){ return LA_RUNNING_PASS; }
 
 
-    if (e->Type == LA_L_MOUSE_DOWN){
+    if (e->type == LA_L_MOUSE_DOWN){
         if (laIsPropertyReadOnly(&ui->PP)) return LA_RUNNING_PASS;
         if (laIsPropertyReadOnly(&ui->PP)) return LA_RUNNING_PASS;
         if (uit->Edit){
         if (uit->Edit){
             if (!laIsInUiItem(ui, e->x, e->y)){
             if (!laIsInUiItem(ui, e->x, e->y)){
@@ -2313,7 +2313,7 @@ int OPMOD_IntArrayHorizon(laOperator *a, laEvent *e){
         laRedrawCurrentPanel();
         laRedrawCurrentPanel();
         return LA_RUNNING;
         return LA_RUNNING;
     }
     }
-    if (e->Type == LA_MOUSEMOVE && ui->Extra->On){
+    if (e->type == LA_MOUSEMOVE && ui->Extra->On){
         if(ui->Extra->Edit){ return LA_RUNNING; }
         if(ui->Extra->Edit){ return LA_RUNNING; }
         int dist=abs(e->x - uit->LastX + uit->LastY - e->y);
         int dist=abs(e->x - uit->LastX + uit->LastY - e->y);
         if (dist > MAIN.ValuatorThreshold || uit->Dragging){
         if (dist > MAIN.ValuatorThreshold || uit->Dragging){
@@ -2331,7 +2331,7 @@ int OPMOD_IntArrayHorizon(laOperator *a, laEvent *e){
         }
         }
         return LA_RUNNING;
         return LA_RUNNING;
     }
     }
-    if (e->Type == LA_L_MOUSE_UP){
+    if (e->type == LA_L_MOUSE_UP){
         if (laIsPropertyReadOnly(&ui->PP)) return LA_RUNNING_PASS;
         if (laIsPropertyReadOnly(&ui->PP)) return LA_RUNNING_PASS;
         if (uit->Dragging){
         if (uit->Dragging){
             if (ui->Extra->On){
             if (ui->Extra->On){
@@ -2356,7 +2356,7 @@ int OPMOD_IntArrayHorizon(laOperator *a, laEvent *e){
         return LA_RUNNING;
         return LA_RUNNING;
     }
     }
 
 
-    if(e->Type ==LA_KEY_DOWN){
+    if(e->type ==LA_KEY_DOWN){
         if (e->key == LA_KEY_ENTER && uit->Edit){
         if (e->key == LA_KEY_ENTER && uit->Edit){
             char* buf=strEndEdit(&uit->Edit, 0);
             char* buf=strEndEdit(&uit->Edit, 0);
             int Result; sscanf(buf, "%d", &Result); free(buf);
             int Result; sscanf(buf, "%d", &Result); free(buf);
@@ -2370,7 +2370,7 @@ int OPMOD_IntArrayHorizon(laOperator *a, laEvent *e){
         }
         }
     }
     }
     
     
-    if (e->Type == LA_R_MOUSE_DOWN){
+    if (e->type == LA_R_MOUSE_DOWN){
         int GX = e->x, GY = e->y;
         int GX = e->x, GY = e->y;
         ui->PP.LastIndex = la_DetectColumn(ui, e->x, Len);
         ui->PP.LastIndex = la_DetectColumn(ui, e->x, Len);
         laLocalToWindow(a, a->ToPanel, &GX, &GY);
         laLocalToWindow(a, a->ToPanel, &GX, &GY);
@@ -2406,7 +2406,7 @@ int OPMOD_FloatArrayHorizon(laOperator *a, laEvent *e){
         return LA_FINISHED_PASS;
         return LA_FINISHED_PASS;
     }
     }
 
 
-    if (e->Type == LA_TIME_IDLE && !uit->On && !uit->Edit){
+    if (e->type == LA_TIME_IDLE && !uit->On && !uit->Edit){
         int GX = e->x, GY = e->y; laLocalToWindow(a, a->ToPanel, &GX, &GY);
         int GX = e->x, GY = e->y; laLocalToWindow(a, a->ToPanel, &GX, &GY);
         laPanel *p = laEnableIdlePanel(a->ToPanel, a, 0, 0, &ui->PP, GX, GX + 150, GY, 600, 200, e);
         laPanel *p = laEnableIdlePanel(a->ToPanel, a, 0, 0, &ui->PP, GX, GX + 150, GY, 600, 200, e);
         return LA_RUNNING;
         return LA_RUNNING;
@@ -2414,7 +2414,7 @@ int OPMOD_FloatArrayHorizon(laOperator *a, laEvent *e){
 
 
     if(NoEvent){ return LA_RUNNING_PASS; }
     if(NoEvent){ return LA_RUNNING_PASS; }
 
 
-    if (e->Type == LA_L_MOUSE_DOWN){
+    if (e->type == LA_L_MOUSE_DOWN){
         if (uit->Edit){
         if (uit->Edit){
             if (!laIsInUiItem(ui, e->x, e->y)){
             if (!laIsInUiItem(ui, e->x, e->y)){
                 strEndEdit(&uit->Edit, 1);
                 strEndEdit(&uit->Edit, 1);
@@ -2437,7 +2437,7 @@ int OPMOD_FloatArrayHorizon(laOperator *a, laEvent *e){
 
 
         return LA_RUNNING;
         return LA_RUNNING;
     }
     }
-    if (e->Type == LA_MOUSEMOVE && ui->Extra->On){
+    if (e->type == LA_MOUSEMOVE && ui->Extra->On){
         if(uit->Edit){ return LA_RUNNING; }
         if(uit->Edit){ return LA_RUNNING; }
         int dist=abs(e->x - uit->LastX - e->y + uit->LastY);
         int dist=abs(e->x - uit->LastX - e->y + uit->LastY);
         if (dist > MAIN.ValuatorThreshold || uit->Dragging){
         if (dist > MAIN.ValuatorThreshold || uit->Dragging){
@@ -2455,7 +2455,7 @@ int OPMOD_FloatArrayHorizon(laOperator *a, laEvent *e){
         }
         }
         return LA_RUNNING;
         return LA_RUNNING;
     }
     }
-    if (e->Type == LA_L_MOUSE_UP){
+    if (e->type == LA_L_MOUSE_UP){
         if (laIsPropertyReadOnly(&ui->PP)) return LA_RUNNING_PASS;
         if (laIsPropertyReadOnly(&ui->PP)) return LA_RUNNING_PASS;
         if (uit->Dragging){
         if (uit->Dragging){
             if (ui->Extra->On){
             if (ui->Extra->On){
@@ -2480,7 +2480,7 @@ int OPMOD_FloatArrayHorizon(laOperator *a, laEvent *e){
         return LA_RUNNING;
         return LA_RUNNING;
     }
     }
 
 
-    if(e->Type ==LA_KEY_DOWN){
+    if(e->type ==LA_KEY_DOWN){
         if (e->key == LA_KEY_ENTER && uit->Edit){
         if (e->key == LA_KEY_ENTER && uit->Edit){
             char* buf=strEndEdit(&uit->Edit, 0);
             char* buf=strEndEdit(&uit->Edit, 0);
             real Result; sscanf(buf, "%lf", &Result); free(buf);
             real Result; sscanf(buf, "%lf", &Result); free(buf);
@@ -2494,7 +2494,7 @@ int OPMOD_FloatArrayHorizon(laOperator *a, laEvent *e){
         }
         }
     }
     }
 
 
-    if (e->Type == LA_R_MOUSE_DOWN){
+    if (e->type == LA_R_MOUSE_DOWN){
         int GX = e->x, GY = e->y;
         int GX = e->x, GY = e->y;
         ui->PP.LastIndex = la_DetectColumn(ui, e->x, laGetArrayLength(&ui->PP));
         ui->PP.LastIndex = la_DetectColumn(ui, e->x, laGetArrayLength(&ui->PP));
         laLocalToWindow(a, a->ToPanel, &GX, &GY);
         laLocalToWindow(a, a->ToPanel, &GX, &GY);
@@ -2521,7 +2521,7 @@ int OPMOD_FloatColor(laOperator *a, laEvent *e){
         return LA_FINISHED_PASS;
         return LA_FINISHED_PASS;
     }
     }
 
 
-    if (e->Type == LA_TIME_IDLE && !NoTooltip){
+    if (e->type == LA_TIME_IDLE && !NoTooltip){
         int GX = e->x, GY = e->y; laLocalToWindow(a, a->ToPanel, &GX, &GY);
         int GX = e->x, GY = e->y; laLocalToWindow(a, a->ToPanel, &GX, &GY);
         laPanel *p = laEnableIdlePanel(a->ToPanel, a, 0, 0, &ui->PP, GX, GX + 150, GY, 600, 200, e);
         laPanel *p = laEnableIdlePanel(a->ToPanel, a, 0, 0, &ui->PP, GX, GX + 150, GY, 600, 200, e);
         return LA_RUNNING;
         return LA_RUNNING;
@@ -2529,7 +2529,7 @@ int OPMOD_FloatColor(laOperator *a, laEvent *e){
     
     
     if(NoEvent){ return LA_RUNNING_PASS; }
     if(NoEvent){ return LA_RUNNING_PASS; }
 
 
-    if (e->Type == LA_L_MOUSE_DOWN){
+    if (e->type == LA_L_MOUSE_DOWN){
         laUiList *uil;
         laUiList *uil;
         laColumn *col;
         laColumn *col;
         laPanel *p;
         laPanel *p;
@@ -2545,7 +2545,7 @@ int OPMOD_FloatColor(laOperator *a, laEvent *e){
         }
         }
         return LA_RUNNING;
         return LA_RUNNING;
     }
     }
-    if (e->Type == LA_R_MOUSE_DOWN){
+    if (e->type == LA_R_MOUSE_DOWN){
         int GX = e->x, GY = e->y;
         int GX = e->x, GY = e->y;
         laLocalToWindow(a, a->ToPanel, &GX, &GY);
         laLocalToWindow(a, a->ToPanel, &GX, &GY);
         laPanel *p = laEnablePropertyPanel(a->ToPanel, a, 0, 0, 0, &ui->PP, GX, GX + 150, GY, 600, 200, e);
         laPanel *p = laEnablePropertyPanel(a->ToPanel, a, 0, 0, 0, &ui->PP, GX, GX + 150, GY, 600, 200, e);
@@ -2569,14 +2569,14 @@ int OPMOD_ColorHCY(laOperator *a, laEvent *e){
         return LA_FINISHED_PASS;
         return LA_FINISHED_PASS;
     }
     }
 
 
-    if(e->Type == LA_L_MOUSE_DOWN && es->HeightCoeff>=0 && e->x>ui->R-bt->RM-LA_RH && e->y>ui->B-bt->BM-LA_RH){
+    if(e->type == LA_L_MOUSE_DOWN && es->HeightCoeff>=0 && e->x>ui->R-bt->RM-LA_RH && e->y>ui->B-bt->BM-LA_RH){
         es->Dragging=3; es->LastX=e->x; es->LastY=e->y; es->TargetIndexVali=es->HeightCoeff; return LA_RUNNING;
         es->Dragging=3; es->LastX=e->x; es->LastY=e->y; es->TargetIndexVali=es->HeightCoeff; return LA_RUNNING;
     }
     }
     if(es->Dragging==3){
     if(es->Dragging==3){
-        if(e->Type==LA_MOUSEMOVE){ es->HeightCoeff=es->TargetIndexVali+((real)e->y-es->LastY+0.5)/LA_RH;
+        if(e->type==LA_MOUSEMOVE){ es->HeightCoeff=es->TargetIndexVali+((real)e->y-es->LastY+0.5)/LA_RH;
             if(es->HeightCoeff<1)es->HeightCoeff=1; laRecalcCurrentPanel();}
             if(es->HeightCoeff<1)es->HeightCoeff=1; laRecalcCurrentPanel();}
-        elif(e->Type==LA_L_MOUSE_UP){ es->Dragging=0; }
-        elif(e->Type==LA_R_MOUSE_DOWN){
+        elif(e->type==LA_L_MOUSE_UP){ es->Dragging=0; }
+        elif(e->type==LA_R_MOUSE_DOWN){
             es->Dragging=0; es->HeightCoeff=es->TargetIndexVali; laRecalcCurrentPanel(); }
             es->Dragging=0; es->HeightCoeff=es->TargetIndexVali; laRecalcCurrentPanel(); }
         return LA_RUNNING;
         return LA_RUNNING;
     }
     }
@@ -2586,14 +2586,14 @@ int OPMOD_ColorHCY(laOperator *a, laEvent *e){
     real dx = e->x - c, dy = e->y - (ui->U + r + bt->TP);
     real dx = e->x - c, dy = e->y - (ui->U + r + bt->TP);
     real dist = sqrt(dx * dx + dy * dy);
     real dist = sqrt(dx * dx + dy * dy);
 
 
-    if (e->Type == LA_L_MOUSE_DOWN){ ui->State = LA_UI_ACTIVE; laRedrawCurrentPanel(); es->Dragging=(dist<=r)?1:2; }
-    if (e->Type == LA_L_MOUSE_UP){
+    if (e->type == LA_L_MOUSE_DOWN){ ui->State = LA_UI_ACTIVE; laRedrawCurrentPanel(); es->Dragging=(dist<=r)?1:2; }
+    if (e->type == LA_L_MOUSE_UP){
         ui->State = LA_UI_NORMAL; es->Dragging=0; laRedrawCurrentPanel();
         ui->State = LA_UI_NORMAL; es->Dragging=0; laRedrawCurrentPanel();
         laRecordAndPushProp(&ui->PP,0); laMarkPropChanged(&ui->PP);
         laRecordAndPushProp(&ui->PP,0); laMarkPropChanged(&ui->PP);
         return LA_RUNNING_PASS;
         return LA_RUNNING_PASS;
     }
     }
 
 
-    if (e->Type & LA_MOUSE_EVENT && es->Dragging){
+    if (e->type & LA_MOUSE_EVENT && es->Dragging){
         laGetFloatArray(&ui->PP, Color);
         laGetFloatArray(&ui->PP, Color);
         if(ui->PP.LastPs->p->Tag&LA_PROP_IS_LINEAR_SRGB){ tns2LogsRGB(Color); }
         if(ui->PP.LastPs->p->Tag&LA_PROP_IS_LINEAR_SRGB){ tns2LogsRGB(Color); }
         tnsRGB2HCY(Color, hcy);
         tnsRGB2HCY(Color, hcy);
@@ -2653,7 +2653,7 @@ int OPMOD_EnumSelector(laOperator *a, laEvent *e){
 
 
     if (!laIsInUiItem(ui, e->x, e->y) && !uit->On){ return LA_FINISHED_PASS; }
     if (!laIsInUiItem(ui, e->x, e->y) && !uit->On){ return LA_FINISHED_PASS; }
     
     
-    if (e->Type == LA_TIME_IDLE && !NoTooltip && !uit->On){
+    if (e->type == LA_TIME_IDLE && !NoTooltip && !uit->On){
         int GX = e->x, GY = e->y; laLocalToWindow(a, a->ToPanel, &GX, &GY);
         int GX = e->x, GY = e->y; laLocalToWindow(a, a->ToPanel, &GX, &GY);
         laPanel *p = laEnableIdlePanel(a->ToPanel, a, 0, 0, &ui->PP, GX, GX + 150, GY, 600, 200, e);
         laPanel *p = laEnableIdlePanel(a->ToPanel, a, 0, 0, &ui->PP, GX, GX + 150, GY, 600, 200, e);
         return LA_RUNNING;
         return LA_RUNNING;
@@ -2661,7 +2661,7 @@ int OPMOD_EnumSelector(laOperator *a, laEvent *e){
 
 
     if(NoEvent){ return LA_RUNNING_PASS; }
     if(NoEvent){ return LA_RUNNING_PASS; }
 
 
-    if (e->Type == LA_L_MOUSE_DOWN || (IsMomentary && e->Type == LA_L_MOUSE_UP)){
+    if (e->type == LA_L_MOUSE_DOWN || (IsMomentary && e->type == LA_L_MOUSE_UP)){
         if (laIsPropertyReadOnly(&ui->PP)) return LA_RUNNING_PASS;
         if (laIsPropertyReadOnly(&ui->PP)) return LA_RUNNING_PASS;
 
 
         int IsVertical = ui->Flags&LA_UI_FLAGS_TRANSPOSE;
         int IsVertical = ui->Flags&LA_UI_FLAGS_TRANSPOSE;
@@ -2699,7 +2699,7 @@ int OPMOD_EnumSelector(laOperator *a, laEvent *e){
             laEnumItem* ei=laGetEnumArrayIndexed(&ui->PP, ArrTarget);
             laEnumItem* ei=laGetEnumArrayIndexed(&ui->PP, ArrTarget);
             if(!ei){ ei=((laEnumProp*)ui->PP.LastPs->p)->Items.pFirst; }
             if(!ei){ ei=((laEnumProp*)ui->PP.LastPs->p)->Items.pFirst; }
             ei = ei->Item.pNext?ei->Item.pNext:((laEnumProp*)ui->PP.LastPs->p)->Items.pFirst;
             ei = ei->Item.pNext?ei->Item.pNext:((laEnumProp*)ui->PP.LastPs->p)->Items.pFirst;
-            if(IsMomentary){  uit->On = 1; if(e->Type==LA_L_MOUSE_UP){ ei = ei=((laEnumProp*)ui->PP.LastPs->p)->Items.pFirst; uit->On = 0;} }
+            if(IsMomentary){  uit->On = 1; if(e->type==LA_L_MOUSE_UP){ ei = ei=((laEnumProp*)ui->PP.LastPs->p)->Items.pFirst; uit->On = 0;} }
             laSetEnumArrayIndexed(&ui->PP, ArrTarget, ei->Index);
             laSetEnumArrayIndexed(&ui->PP, ArrTarget, ei->Index);
             laConfirmInt(a,EnumTarget,LA_CONFIRM_DATA);
             laConfirmInt(a,EnumTarget,LA_CONFIRM_DATA);
             laRecordAndPushProp(&ui->PP,0); laMarkPropChanged(&ui->PP);
             laRecordAndPushProp(&ui->PP,0); laMarkPropChanged(&ui->PP);
@@ -2715,7 +2715,7 @@ int OPMOD_EnumSelector(laOperator *a, laEvent *e){
         return LA_RUNNING;
         return LA_RUNNING;
     }
     }
 
 
-    if(e->Type==LA_R_MOUSE_DOWN){
+    if(e->type==LA_R_MOUSE_DOWN){
         int GX = e->x, GY = e->y;
         int GX = e->x, GY = e->y;
         laLocalToWindow(a, a->ToPanel, &GX, &GY);
         laLocalToWindow(a, a->ToPanel, &GX, &GY);
         laPanel *p = laEnablePropertyPanel(a->ToPanel, a, 0, 0, 0, &ui->PP, GX, GX + 150, GY, 600, 200, e);
         laPanel *p = laEnablePropertyPanel(a->ToPanel, a, 0, 0, 0, &ui->PP, GX, GX + 150, GY, 600, 200, e);
@@ -2730,7 +2730,7 @@ int OPMOD_Button(laOperator *a, laEvent *e){
     int lx, ly;
     int lx, ly;
     int Away = 0;
     int Away = 0;
 
 
-    if (e->Type == LA_TIME_IDLE && !ui->State){
+    if (e->type == LA_TIME_IDLE && !ui->State){
         int GX = e->x, GY = e->y; laLocalToWindow(a, a->ToPanel, &GX, &GY);
         int GX = e->x, GY = e->y; laLocalToWindow(a, a->ToPanel, &GX, &GY);
         laPanel *p = laEnableIdlePanel(a->ToPanel, a,  &ui->ExtraPP, 0,  &ui->PP, GX, GX + 150, GY, 600, 200, e);
         laPanel *p = laEnableIdlePanel(a->ToPanel, a,  &ui->ExtraPP, 0,  &ui->PP, GX, GX + 150, GY, 600, 200, e);
         return LA_RUNNING;
         return LA_RUNNING;
@@ -2738,7 +2738,7 @@ int OPMOD_Button(laOperator *a, laEvent *e){
     
     
     if (laConfirmSameDataIfAny(a)) return LA_RUNNING_PASS;
     if (laConfirmSameDataIfAny(a)) return LA_RUNNING_PASS;
 
 
-    if (e->Type == LA_ESCAPE_DOWN || e->Type == LA_INPUT) return LA_FINISHED; //debug
+    if (e->type == LA_ESCAPE_DOWN || e->type == LA_INPUT) return LA_FINISHED; //debug
 
 
     if (!laIsInUiItem(ui, e->x, e->y) /*&& ui->State!= LA_UI_ACTIVE*/){
     if (!laIsInUiItem(ui, e->x, e->y) /*&& ui->State!= LA_UI_ACTIVE*/){
         ui->State = LA_UI_NORMAL;
         ui->State = LA_UI_NORMAL;
@@ -2746,7 +2746,7 @@ int OPMOD_Button(laOperator *a, laEvent *e){
         return LA_FINISHED_PASS;
         return LA_FINISHED_PASS;
     }
     }
 
 
-    if (e->Type == LA_L_MOUSE_DOWN){
+    if (e->type == LA_L_MOUSE_DOWN){
         ui->State = LA_UI_ACTIVE;
         ui->State = LA_UI_ACTIVE;
         laRedrawCurrentPanel();
         laRedrawCurrentPanel();
         return LA_RUNNING;
         return LA_RUNNING;
@@ -2756,7 +2756,7 @@ int OPMOD_Button(laOperator *a, laEvent *e){
 
 
     int call_ret=0;
     int call_ret=0;
 
 
-    if (e->Type == LA_L_MOUSE_UP && ui->State!=LA_UI_NORMAL){
+    if (e->type == LA_L_MOUSE_UP && ui->State!=LA_UI_NORMAL){
         ui->State = LA_UI_NORMAL;
         ui->State = LA_UI_NORMAL;
         if (ui->AT){
         if (ui->AT){
             if (!ui->Instructions){
             if (!ui->Instructions){
@@ -2841,7 +2841,7 @@ int OPMOD_MenuItem(laOperator *a, laEvent *e){
         return LA_FINISHED_PASS;
         return LA_FINISHED_PASS;
     }
     }
 
 
-    if (e->Type == LA_L_MOUSE_DOWN){
+    if (e->type == LA_L_MOUSE_DOWN){
         int GX = ui->L, GY = ui->B;
         int GX = ui->L, GY = ui->B;
         laLocalToWindow(a, a->ToPanel, &GX, &GY);
         laLocalToWindow(a, a->ToPanel, &GX, &GY);
         ui->State = LA_UI_ACTIVE;
         ui->State = LA_UI_ACTIVE;
@@ -2863,7 +2863,7 @@ int OPMOD_ConditionToggle(laOperator *a, laEvent *e){
         return LA_FINISHED_PASS;
         return LA_FINISHED_PASS;
     }
     }
 
 
-    if (e->Type == LA_L_MOUSE_DOWN){
+    if (e->type == LA_L_MOUSE_DOWN){
         ui->State = ui->State == LA_UI_ACTIVE ? LA_UI_NORMAL : LA_UI_ACTIVE;
         ui->State = ui->State == LA_UI_ACTIVE ? LA_UI_NORMAL : LA_UI_ACTIVE;
         laRecalcCurrentPanel();
         laRecalcCurrentPanel();
         return LA_RUNNING;
         return LA_RUNNING;
@@ -2889,8 +2889,8 @@ int OPMOD_SingleLineString(laOperator *a, laEvent *e){
             laRedrawCurrentPanel();
             laRedrawCurrentPanel();
             return LA_FINISHED_PASS;
             return LA_FINISHED_PASS;
         }else{
         }else{
-            if(IsTerminal && (e->Type&LA_KEY_MOUSE_SCROLL)){ return LA_RUNNING_PASS; }
-            if ((e->Type & LA_MOUSEDOWN) == LA_MOUSEDOWN){
+            if(IsTerminal && (e->type&LA_KEY_MOUSE_SCROLL)){ return LA_RUNNING_PASS; }
+            if ((e->type & LA_MOUSEDOWN) == LA_MOUSEDOWN){
                 buf=strEndEdit(&uit->Edit, 0);
                 buf=strEndEdit(&uit->Edit, 0);
                 laSetString(&ui->PP, buf); free(buf);
                 laSetString(&ui->PP, buf); free(buf);
                 laRecordAndPushProp(&ui->PP,0); laMarkPropChanged(&ui->PP);
                 laRecordAndPushProp(&ui->PP,0); laMarkPropChanged(&ui->PP);
@@ -2901,7 +2901,7 @@ int OPMOD_SingleLineString(laOperator *a, laEvent *e){
         }
         }
     }
     }
 
 
-    if (e->Type == LA_TIME_IDLE && !ui->State && !NoTooltip){
+    if (e->type == LA_TIME_IDLE && !ui->State && !NoTooltip){
         int GX = e->x, GY = e->y; laLocalToWindow(a, a->ToPanel, &GX, &GY);
         int GX = e->x, GY = e->y; laLocalToWindow(a, a->ToPanel, &GX, &GY);
         laPanel *p = laEnableIdlePanel(a->ToPanel, a, 0, 0, &ui->PP, GX, GX + 150, GY, 600, 200, e);
         laPanel *p = laEnableIdlePanel(a->ToPanel, a, 0, 0, &ui->PP, GX, GX + 150, GY, 600, 200, e);
         return LA_RUNNING;
         return LA_RUNNING;
@@ -2909,7 +2909,7 @@ int OPMOD_SingleLineString(laOperator *a, laEvent *e){
     
     
     if(NoEvent){ return LA_RUNNING_PASS; }
     if(NoEvent){ return LA_RUNNING_PASS; }
 
 
-    if(e->Type ==LA_KEY_DOWN){
+    if(e->type ==LA_KEY_DOWN){
         if (e->key == LA_KEY_ENTER){
         if (e->key == LA_KEY_ENTER){
             buf=IsTerminal?strGetEditString(uit->Edit,0):strEndEdit(&uit->Edit, 0);
             buf=IsTerminal?strGetEditString(uit->Edit,0):strEndEdit(&uit->Edit, 0);
             if(IsTerminal){ MAIN.IsTerminalEnter=1; }
             if(IsTerminal){ MAIN.IsTerminalEnter=1; }
@@ -2934,7 +2934,7 @@ int OPMOD_SingleLineString(laOperator *a, laEvent *e){
 
 
     if(laKeyMapExecuteEventEx(a, &ui->ExtraPP, &ui->Type->KeyMapper, e)) return LA_RUNNING;
     if(laKeyMapExecuteEventEx(a, &ui->ExtraPP, &ui->Type->KeyMapper, e)) return LA_RUNNING;
 
 
-    if (e->Type == LA_L_MOUSE_DOWN){
+    if (e->type == LA_L_MOUSE_DOWN){
         if (ui->State == LA_UI_NORMAL){
         if (ui->State == LA_UI_NORMAL){
             if(laIsPropertyReadOnly(&ui->PP)) return LA_RUNNING;
             if(laIsPropertyReadOnly(&ui->PP)) return LA_RUNNING;
             ui->State = LA_UI_EDITING;
             ui->State = LA_UI_EDITING;
@@ -2949,7 +2949,7 @@ int OPMOD_SingleLineString(laOperator *a, laEvent *e){
         return LA_RUNNING;
         return LA_RUNNING;
     }
     }
 
 
-    if (e->Type == LA_R_MOUSE_DOWN){
+    if (e->type == LA_R_MOUSE_DOWN){
         int GX = e->x, GY = e->y;
         int GX = e->x, GY = e->y;
         ui->PP.LastIndex = la_DetectColumn(ui, e->x, laGetArrayLength(&ui->PP));
         ui->PP.LastIndex = la_DetectColumn(ui, e->x, laGetArrayLength(&ui->PP));
         laLocalToWindow(a, a->ToPanel, &GX, &GY);
         laLocalToWindow(a, a->ToPanel, &GX, &GY);
@@ -2987,7 +2987,7 @@ int OPMOD_MultiString(laOperator *a, laEvent *e){
     int NoTooltip=ui->Flags&LA_UI_FLAGS_NO_TOOLTIP;
     int NoTooltip=ui->Flags&LA_UI_FLAGS_NO_TOOLTIP;
 
 
     if (!laIsInUiItem(ui, e->x, e->y) && !es->Dragging){
     if (!laIsInUiItem(ui, e->x, e->y) && !es->Dragging){
-        if ((e->Type & LA_MOUSEDOWN) == LA_MOUSEDOWN){
+        if ((e->type & LA_MOUSEDOWN) == LA_MOUSEDOWN){
             buf=strGetEditString(es->Edit, 0); laSetString(&ui->PP, buf); free(buf);
             buf=strGetEditString(es->Edit, 0); laSetString(&ui->PP, buf); free(buf);
             laRecordAndPushProp(&ui->PP,0); laMarkPropChanged(&ui->PP);
             laRecordAndPushProp(&ui->PP,0); laMarkPropChanged(&ui->PP);
             ui->State = LA_UI_NORMAL;
             ui->State = LA_UI_NORMAL;
@@ -2997,7 +2997,7 @@ int OPMOD_MultiString(laOperator *a, laEvent *e){
         if(ui->State!=LA_UI_ACTIVE) return LA_FINISHED_PASS;
         if(ui->State!=LA_UI_ACTIVE) return LA_FINISHED_PASS;
     }
     }
 
 
-    if (e->Type == LA_TIME_IDLE && ui->State!=LA_UI_ACTIVE && !NoTooltip){
+    if (e->type == LA_TIME_IDLE && ui->State!=LA_UI_ACTIVE && !NoTooltip){
         int GX = e->x, GY = e->y; laLocalToWindow(a, a->ToPanel, &GX, &GY);
         int GX = e->x, GY = e->y; laLocalToWindow(a, a->ToPanel, &GX, &GY);
         laPanel *p = laEnableIdlePanel(a->ToPanel, a, 0, 0, &ui->PP, GX, GX + 150, GY, 600, 200, e);
         laPanel *p = laEnableIdlePanel(a->ToPanel, a, 0, 0, &ui->PP, GX, GX + 150, GY, 600, 200, e);
         return LA_RUNNING;
         return LA_RUNNING;
@@ -3005,7 +3005,7 @@ int OPMOD_MultiString(laOperator *a, laEvent *e){
 
 
     if(NoEvent){ return LA_RUNNING_PASS; }
     if(NoEvent){ return LA_RUNNING_PASS; }
 
 
-    if(e->Type ==LA_KEY_DOWN){
+    if(e->type ==LA_KEY_DOWN){
         if (e->key == LA_KEY_ESCAPE){
         if (e->key == LA_KEY_ESCAPE){
             if(ui->State != LA_UI_NORMAL){
             if(ui->State != LA_UI_NORMAL){
                 buf=strGetEditString(es->Edit, 0); laSetString(&ui->PP, buf); free(buf);
                 buf=strGetEditString(es->Edit, 0); laSetString(&ui->PP, buf); free(buf);
@@ -3019,26 +3019,26 @@ int OPMOD_MultiString(laOperator *a, laEvent *e){
 
 
     if(laKeyMapExecuteEventEx(a, &ui->ExtraPP, &ui->Type->KeyMapper, e)) return LA_RUNNING;
     if(laKeyMapExecuteEventEx(a, &ui->ExtraPP, &ui->Type->KeyMapper, e)) return LA_RUNNING;
     
     
-    if(e->Type == LA_L_MOUSE_DOWN && es->HeightCoeff>=0 && e->x>ui->R-bt->RM-LA_RH && e->y>ui->B-bt->BM-LA_RH){
+    if(e->type == LA_L_MOUSE_DOWN && es->HeightCoeff>=0 && e->x>ui->R-bt->RM-LA_RH && e->y>ui->B-bt->BM-LA_RH){
         es->Dragging=1; es->LastX=e->x; es->LastY=e->y; es->TargetIndexVali=es->HeightCoeff;
         es->Dragging=1; es->LastX=e->x; es->LastY=e->y; es->TargetIndexVali=es->HeightCoeff;
         return LA_RUNNING;
         return LA_RUNNING;
     }
     }
     if(es->Dragging){
     if(es->Dragging){
-        if(e->Type==LA_MOUSEMOVE){ es->HeightCoeff=es->TargetIndexVali+((real)e->y-es->LastY+0.5)/LA_RH;
+        if(e->type==LA_MOUSEMOVE){ es->HeightCoeff=es->TargetIndexVali+((real)e->y-es->LastY+0.5)/LA_RH;
             if(es->HeightCoeff<1)es->HeightCoeff=1; laRecalcCurrentPanel(); la_SetMultistringViewRange(ui,es->Edit,bt);}
             if(es->HeightCoeff<1)es->HeightCoeff=1; laRecalcCurrentPanel(); la_SetMultistringViewRange(ui,es->Edit,bt);}
-        elif(e->Type==LA_L_MOUSE_UP){ es->Dragging=0; }
-        elif(e->Type==LA_R_MOUSE_DOWN){
+        elif(e->type==LA_L_MOUSE_UP){ es->Dragging=0; }
+        elif(e->type==LA_R_MOUSE_DOWN){
             es->Dragging=0; es->HeightCoeff=es->TargetIndexVali; laRecalcCurrentPanel();la_SetMultistringViewRange(ui,se,bt); }
             es->Dragging=0; es->HeightCoeff=es->TargetIndexVali; laRecalcCurrentPanel();la_SetMultistringViewRange(ui,se,bt); }
         return LA_RUNNING;
         return LA_RUNNING;
     }
     }
     
     
     int NoInactiveScroll=ui->Flags&LA_UI_FLAGS_NO_SCROLL_INACTIVE;
     int NoInactiveScroll=ui->Flags&LA_UI_FLAGS_NO_SCROLL_INACTIVE;
     if((!NoInactiveScroll) || (ui->State==LA_UI_ACTIVE)){
     if((!NoInactiveScroll) || (ui->State==LA_UI_ACTIVE)){
-        if(e->Type==LA_MOUSE_WHEEL_DOWN){ strMoveView(se, MAIN.ScrollingSpeed, 0); laRedrawCurrentPanel(); return LA_RUNNING; }
-        elif(e->Type==LA_MOUSE_WHEEL_UP){ strMoveView(se, -MAIN.ScrollingSpeed, 0); laRedrawCurrentPanel(); return LA_RUNNING; }
+        if(e->type==LA_MOUSE_WHEEL_DOWN){ strMoveView(se, MAIN.ScrollingSpeed, 0); laRedrawCurrentPanel(); return LA_RUNNING; }
+        elif(e->type==LA_MOUSE_WHEEL_UP){ strMoveView(se, -MAIN.ScrollingSpeed, 0); laRedrawCurrentPanel(); return LA_RUNNING; }
     }
     }
 
 
-    if (e->Type == LA_L_MOUSE_DOWN){
+    if (e->type == LA_L_MOUSE_DOWN){
         if (ui->State == LA_UI_NORMAL){
         if (ui->State == LA_UI_NORMAL){
             ui->State = LA_UI_ACTIVE;
             ui->State = LA_UI_ACTIVE;
             laGetString(&ui->PP, _buf, &buf);
             laGetString(&ui->PP, _buf, &buf);
@@ -3048,7 +3048,7 @@ int OPMOD_MultiString(laOperator *a, laEvent *e){
         }
         }
     }
     }
 
 
-    if (e->Type == LA_R_MOUSE_DOWN){
+    if (e->type == LA_R_MOUSE_DOWN){
         int GX = e->x, GY = e->y;
         int GX = e->x, GY = e->y;
         ui->PP.LastIndex = la_DetectColumn(ui, e->x, laGetArrayLength(&ui->PP));
         ui->PP.LastIndex = la_DetectColumn(ui, e->x, laGetArrayLength(&ui->PP));
         laLocalToWindow(a, a->ToPanel, &GX, &GY);
         laLocalToWindow(a, a->ToPanel, &GX, &GY);
@@ -3076,7 +3076,7 @@ int OPMOD_TabSelector(laOperator *a, laEvent *e){
 
 
     if (!laIsInBound(e->x, e->y, ui->L, ui->R, ui->U, ui->U+LA_RH)){ return LA_FINISHED; }
     if (!laIsInBound(e->x, e->y, ui->L, ui->R, ui->U, ui->U+LA_RH)){ return LA_FINISHED; }
 
 
-    if (e->Type == LA_L_MOUSE_DOWN){
+    if (e->type == LA_L_MOUSE_DOWN){
         if (ui->Page->HeightCoeff && ui->R - e->x < LA_RH + bt->RM) return LA_RUNNING_PASS;
         if (ui->Page->HeightCoeff && ui->R - e->x < LA_RH + bt->RM) return LA_RUNNING_PASS;
         for (uil = ui->Subs.pFirst; uil; uil = uil->Item.pNext){ count++; }
         for (uil = ui->Subs.pFirst; uil; uil = uil->Item.pNext){ count++; }
         page = la_DetectColumn(ui, e->x, count);
         page = la_DetectColumn(ui, e->x, count);
@@ -3116,7 +3116,7 @@ int OPMOD_Collection(laOperator *a, laEvent *e) {
     return LA_FINISHED;
     return LA_FINISHED;
   }
   }
 
 
-  if (e->Type & LA_MOUSE_EVENT) {
+  if (e->type & LA_MOUSE_EVENT) {
     laUiList *sub;
     laUiList *sub;
     laUiItem *tui;
     laUiItem *tui;
     int LimHeight = 10000;
     int LimHeight = 10000;
@@ -3142,7 +3142,7 @@ int OPMOD_Collection(laOperator *a, laEvent *e) {
     ui->PP.EndInstance = Active;
     ui->PP.EndInstance = Active;
   }
   }
 
 
-  if (e->Type == LA_L_MOUSE_DOWN && (!laIsPropertyReadOnly(&ui->PP)) &&
+  if (e->type == LA_L_MOUSE_DOWN && (!laIsPropertyReadOnly(&ui->PP)) &&
       ui->Type != _LA_UI_COLLECTION_SINGLE) {
       ui->Type != _LA_UI_COLLECTION_SINGLE) {
     laUiList *uil;
     laUiList *uil;
     for (uil = ui->Subs.pFirst; uil; uil = uil->Item.pNext) {
     for (uil = ui->Subs.pFirst; uil; uil = uil->Item.pNext) {
@@ -3168,7 +3168,7 @@ int OPMOD_Collection(laOperator *a, laEvent *e) {
     }
     }
     return LA_RUNNING;
     return LA_RUNNING;
   }
   }
-  elif (e->Type == LA_R_MOUSE_DOWN) {
+  elif (e->type == LA_R_MOUSE_DOWN) {
     laUiList *uil;
     laUiList *uil;
     for (uil = ui->Subs.pFirst; uil; uil = uil->Item.pNext) {
     for (uil = ui->Subs.pFirst; uil; uil = uil->Item.pNext) {
       if (laIsInBound(e->x, e->y, uil->L, uil->R, uil->U, uil->B)) {
       if (laIsInBound(e->x, e->y, uil->L, uil->R, uil->U, uil->B)) {
@@ -3203,13 +3203,13 @@ int OPMOD_CollectionSelector(laOperator *a, laEvent *e){
         return LA_FINISHED;
         return LA_FINISHED;
     }
     }
 
 
-    if (e->Type == LA_TIME_IDLE && !ui->State && !NoTooltip){
+    if (e->type == LA_TIME_IDLE && !ui->State && !NoTooltip){
         int GX = e->x, GY = e->y; laLocalToWindow(a, a->ToPanel, &GX, &GY);
         int GX = e->x, GY = e->y; laLocalToWindow(a, a->ToPanel, &GX, &GY);
         laPanel *p = laEnableIdlePanel(a->ToPanel, a, 0, 0, &ui->PP, GX, GX + 150, GY, 600, 200, e);
         laPanel *p = laEnableIdlePanel(a->ToPanel, a, 0, 0, &ui->PP, GX, GX + 150, GY, 600, 200, e);
         return LA_RUNNING;
         return LA_RUNNING;
     }
     }
 
 
-    if (e->Type == LA_L_MOUSE_DOWN){
+    if (e->type == LA_L_MOUSE_DOWN){
         laUiList *uil;
         laUiList *uil;
         laColumn *col;
         laColumn *col;
         laPanel *p;
         laPanel *p;
@@ -3253,19 +3253,19 @@ int OPMOD_ColumnAdjuster(laOperator *a, laEvent *e){
         return LA_FINISHED_PASS;
         return LA_FINISHED_PASS;
     }
     }
 
 
-    if (e->Type == LA_L_MOUSE_DOWN){
+    if (e->type == LA_L_MOUSE_DOWN){
         uit->Ptr1 = c;
         uit->Ptr1 = c;
         uit->LastX = e->x;
         uit->LastX = e->x;
         uit->Dragging=1;
         uit->Dragging=1;
         return LA_RUNNING;
         return LA_RUNNING;
     }
     }
-    if (uit->Dragging && uit->Ptr1 && e->Type == LA_MOUSEMOVE){
+    if (uit->Dragging && uit->Ptr1 && e->type == LA_MOUSEMOVE){
         la_AdjustColumnSplit(c, e->x - uit->LastX);
         la_AdjustColumnSplit(c, e->x - uit->LastX);
         uit->LastX = e->x;
         uit->LastX = e->x;
         laRecalcCurrentPanel();
         laRecalcCurrentPanel();
         return LA_RUNNING;
         return LA_RUNNING;
     }
     }
-    if (uit->Dragging && (e->Type == LA_L_MOUSE_UP || e->Type == LA_R_MOUSE_DOWN || e->key == LA_KEY_ESCAPE)){
+    if (uit->Dragging && (e->type == LA_L_MOUSE_UP || e->type == LA_R_MOUSE_DOWN || e->key == LA_KEY_ESCAPE)){
         uit->Ptr1 = 0; uit->Dragging=0;
         uit->Ptr1 = 0; uit->Dragging=0;
         return LA_RUNNING;
         return LA_RUNNING;
     }
     }
@@ -3294,8 +3294,8 @@ int OPMOD_NodeSocket(laOperator *a, laEvent *e){
 
 
     if ((!uit->Dragging) && (!laIsInUiItem(ui, e->x, e->y))){ return LA_FINISHED_PASS; }
     if ((!uit->Dragging) && (!laIsInUiItem(ui, e->x, e->y))){ return LA_FINISHED_PASS; }
 
 
-    if (e->Type==LA_TIME_IDLE){ return LA_RUNNING_PASS; }
-    if (e->Type == LA_L_MOUSE_DOWN){
+    if (e->type==LA_TIME_IDLE){ return LA_RUNNING_PASS; }
+    if (e->type == LA_L_MOUSE_DOWN){
         uit->Dragging=1; MAIN.NextWireColor+=3;
         uit->Dragging=1; MAIN.NextWireColor+=3;
         if(pc==LA_PC_SOCKET_IN)   {
         if(pc==LA_PC_SOCKET_IN)   {
             laNodeInSocket* s=ui->PP.EndInstance;
             laNodeInSocket* s=ui->PP.EndInstance;
@@ -3318,7 +3318,7 @@ int OPMOD_NodeSocket(laOperator *a, laEvent *e){
         laRedrawCurrentPanel();
         laRedrawCurrentPanel();
         return LA_RUNNING;
         return LA_RUNNING;
     }
     }
-    if (uit->Dragging && e->Type == LA_MOUSEMOVE){
+    if (uit->Dragging && e->type == LA_MOUSEMOVE){
         laPanel* p=MAIN.CurrentPanel;
         laPanel* p=MAIN.CurrentPanel;
         laLocalToPanel(a, &lx, &ly);
         laLocalToPanel(a, &lx, &ly);
         laUiItem* tui=la_DetectSocketRecursive(&p->UI,lx,ly,100000,uit->Ptr2?LA_PC_SOCKET_IN:PCFind); uit->Ptr1=tui;
         laUiItem* tui=la_DetectSocketRecursive(&p->UI,lx,ly,100000,uit->Ptr2?LA_PC_SOCKET_IN:PCFind); uit->Ptr1=tui;
@@ -3329,7 +3329,7 @@ int OPMOD_NodeSocket(laOperator *a, laEvent *e){
         laRedrawCurrentPanel();
         laRedrawCurrentPanel();
         return LA_RUNNING;
         return LA_RUNNING;
     }
     }
-    if (uit->Dragging && (e->Type == LA_L_MOUSE_UP || e->Type == LA_R_MOUSE_DOWN || e->key == LA_KEY_ESCAPE)){
+    if (uit->Dragging && (e->type == LA_L_MOUSE_UP || e->type == LA_R_MOUSE_DOWN || e->key == LA_KEY_ESCAPE)){
         uit->Dragging=0; MAIN.tNodeIn->Source=0;
         uit->Dragging=0; MAIN.tNodeIn->Source=0;
         laRecalcCurrentPanel();
         laRecalcCurrentPanel();
         laUiItem* tui=uit->Ptr1; void* soc=tui?tui->PP.EndInstance:0;
         laUiItem* tui=uit->Ptr1; void* soc=tui?tui->PP.EndInstance:0;
@@ -3370,17 +3370,17 @@ int OPMOD_HeightAdjuster(laOperator *a, laEvent *e){
 
 
     if ((!uit->Dragging) && (!laIsInUiItem(ui, e->x, e->y))){ return LA_FINISHED_PASS; }
     if ((!uit->Dragging) && (!laIsInUiItem(ui, e->x, e->y))){ return LA_FINISHED_PASS; }
 
 
-    if (e->Type == LA_L_MOUSE_DOWN || e->Type==LA_R_MOUSE_DOWN){
-        uit->Dragging=1; uit->LastY=e->y; uit->On=0; uit->TargetIndexVali=e->Type==LA_L_MOUSE_DOWN?(ui->State==LA_BT_ACTIVE?2:1):2; uit->HeightCoeff=1;
+    if (e->type == LA_L_MOUSE_DOWN || e->type==LA_R_MOUSE_DOWN){
+        uit->Dragging=1; uit->LastY=e->y; uit->On=0; uit->TargetIndexVali=e->type==LA_L_MOUSE_DOWN?(ui->State==LA_BT_ACTIVE?2:1):2; uit->HeightCoeff=1;
         return LA_RUNNING;
         return LA_RUNNING;
     }
     }
-    if(e->Type==LA_L_MOUSE_UP && uit->HeightCoeff){ ui->State=(ui->State==LA_BT_ACTIVE)?LA_BT_NORMAL:LA_BT_ACTIVE; laRedrawCurrentPanel(); }
-    if (uit->Dragging && e->Type == LA_MOUSEMOVE){
+    if(e->type==LA_L_MOUSE_UP && uit->HeightCoeff){ ui->State=(ui->State==LA_BT_ACTIVE)?LA_BT_NORMAL:LA_BT_ACTIVE; laRedrawCurrentPanel(); }
+    if (uit->Dragging && e->type == LA_MOUSEMOVE){
         int diff=e->y-uit->LastY; diff=((real)diff+0.5)/(ui->B-ui->U); int delta=uit->TargetIndexVali;
         int diff=e->y-uit->LastY; diff=((real)diff+0.5)/(ui->B-ui->U); int delta=uit->TargetIndexVali;
         if(diff!=uit->On){ uit->HeightCoeff=0; int d=diff-uit->On; uit->On=diff; while(d){ laSetInt(&ui->PP, d>0?delta:-delta); d-=(d>0?1:-1); }; laRecalcCurrentPanel(); }
         if(diff!=uit->On){ uit->HeightCoeff=0; int d=diff-uit->On; uit->On=diff; while(d){ laSetInt(&ui->PP, d>0?delta:-delta); d-=(d>0?1:-1); }; laRecalcCurrentPanel(); }
         return LA_RUNNING;
         return LA_RUNNING;
     }
     }
-    if (uit->Dragging && (e->Type == LA_L_MOUSE_UP || e->Type == LA_R_MOUSE_UP || e->key == LA_KEY_ESCAPE)){
+    if (uit->Dragging && (e->type == LA_L_MOUSE_UP || e->type == LA_R_MOUSE_UP || e->key == LA_KEY_ESCAPE)){
         uit->Dragging=0; return LA_RUNNING_PASS;
         uit->Dragging=0; return LA_RUNNING_PASS;
     }
     }
 
 
@@ -3470,11 +3470,11 @@ int OPMOD_ValueMapper(laOperator *a, laEvent *e){
 
 
     laValueMapper* vm=ui->PP.EndInstance;
     laValueMapper* vm=ui->PP.EndInstance;
 
 
-    if (e->Type == LA_L_MOUSE_DOWN){
+    if (e->type == LA_L_MOUSE_DOWN){
         uit->Dragging=1; uit->LastX=e->x; uit->LastY=e->y;
         uit->Dragging=1; uit->LastX=e->x; uit->LastY=e->y;
         return LA_RUNNING;
         return LA_RUNNING;
     }
     }
-    if (uit->Dragging && e->Type == LA_MOUSEMOVE){
+    if (uit->Dragging && e->type == LA_MOUSEMOVE){
         laValueMapperPoint* vmp=uit->Ptr1;
         laValueMapperPoint* vmp=uit->Ptr1;
         if(uit->Dragging==1 && tnsDistIdv2(e->x,e->y,uit->LastX,uit->LastY)>LA_RH/2){ 
         if(uit->Dragging==1 && tnsDistIdv2(e->x,e->y,uit->LastX,uit->LastY)>LA_RH/2){ 
             uit->Ptr1=la_ValueMapperGetPoint(vm,x,y); if(!uit->Ptr1){ uit->Dragging=0; return LA_RUNNING; }
             uit->Ptr1=la_ValueMapperGetPoint(vm,x,y); if(!uit->Ptr1){ uit->Dragging=0; return LA_RUNNING; }
@@ -3487,7 +3487,7 @@ int OPMOD_ValueMapper(laOperator *a, laEvent *e){
         }
         }
         return LA_RUNNING;
         return LA_RUNNING;
     }
     }
-    if (uit->Dragging && (e->Type == LA_L_MOUSE_UP || e->Type == LA_R_MOUSE_UP || e->key == LA_KEY_ESCAPE)){
+    if (uit->Dragging && (e->type == LA_L_MOUSE_UP || e->type == LA_R_MOUSE_UP || e->key == LA_KEY_ESCAPE)){
         uit->Dragging=0; laValueMapperPoint* vmp=uit->Ptr1; if(!vmp) return LA_RUNNING_PASS;
         uit->Dragging=0; laValueMapperPoint* vmp=uit->Ptr1; if(!vmp) return LA_RUNNING_PASS;
         if(vmp->x>1||vmp->x<0) {
         if(vmp->x>1||vmp->x<0) {
             lstRemoveItem(&vm->Points,vmp); la_ValueMapperEnsureValidPoints(vm);
             lstRemoveItem(&vm->Points,vmp); la_ValueMapperEnsureValidPoints(vm);

+ 18 - 18
resources/la_widgets_viewers.c

@@ -784,21 +784,21 @@ int OPMOD_Canvas(laOperator *a, laEvent *e){
     //laLocalToWindow(0, p, &x, &y); if(!p) p=MAIN.CurrentWindow->MaximizedUiPanel;
     //laLocalToWindow(0, p, &x, &y); if(!p) p=MAIN.CurrentWindow->MaximizedUiPanel;
     //if(dp = laDetectPanel(x,y) && dp!=p){ return LA_RUNNING_PASS; }
     //if(dp = laDetectPanel(x,y) && dp!=p){ return LA_RUNNING_PASS; }
 
 
-    if(e->Type&LA_MOUSE_EVENT){
-        if(e->Type == LA_L_MOUSE_DOWN && ui->Expand>=0 && e->x>ui->R-bt->RM-LA_RH && e->y>ui->B-bt->BM-LA_RH){
+    if(e->type&LA_MOUSE_EVENT){
+        if(e->type == LA_L_MOUSE_DOWN && ui->Expand>=0 && e->x>ui->R-bt->RM-LA_RH && e->y>ui->B-bt->BM-LA_RH){
             ex->Dragging=1; ex->ClickedX=e->x; ex->ClickedY=e->y; ex->TargetIndexVali=ui->Expand;
             ex->Dragging=1; ex->ClickedX=e->x; ex->ClickedY=e->y; ex->TargetIndexVali=ui->Expand;
             return LA_RUNNING;
             return LA_RUNNING;
         }
         }
         if(ex->Dragging==1){
         if(ex->Dragging==1){
-            if(e->Type==LA_MOUSEMOVE){ ui->Expand=ex->TargetIndexVali+((real)e->y-ex->ClickedY+0.5)/LA_RH;
+            if(e->type==LA_MOUSEMOVE){ ui->Expand=ex->TargetIndexVali+((real)e->y-ex->ClickedY+0.5)/LA_RH;
                 if(ex->HeightCoeff<1) ex->HeightCoeff=1; laRecalcCurrentPanel(); }
                 if(ex->HeightCoeff<1) ex->HeightCoeff=1; laRecalcCurrentPanel(); }
-            elif(e->Type==LA_L_MOUSE_UP){ ex->Dragging=0; }
-            elif(e->Type==LA_R_MOUSE_DOWN){ ex->Dragging=0; ui->Expand=ex->TargetIndexVali; laRecalcCurrentPanel(); }
+            elif(e->type==LA_L_MOUSE_UP){ ex->Dragging=0; }
+            elif(e->type==LA_R_MOUSE_DOWN){ ex->Dragging=0; ui->Expand=ex->TargetIndexVali; laRecalcCurrentPanel(); }
             return LA_RUNNING;
             return LA_RUNNING;
         }
         }
 
 
         int VeryClose=0; int btn=la_CanvasDetectButtons(ui, bt, e->x, e->y, 2, &VeryClose);
         int VeryClose=0; int btn=la_CanvasDetectButtons(ui, bt, e->x, e->y, 2, &VeryClose);
-        if(e->Type==LA_L_MOUSE_DOWN){
+        if(e->type==LA_L_MOUSE_DOWN){
             if(btn==2){ if(MAIN.CurrentWindow->MaximizedUi==ui) laRestoreCanvasUI(); else laMaximizeCanvasUI(ui,MAIN.CurrentPanel); return LA_RUNNING; }
             if(btn==2){ if(MAIN.CurrentWindow->MaximizedUi==ui) laRestoreCanvasUI(); else laMaximizeCanvasUI(ui,MAIN.CurrentPanel); return LA_RUNNING; }
             if(btn==1){
             if(btn==1){
                 if(ui->Flags&LA_UI_FLAGS_NO_OVERLAY)ui->Flags&=~LA_UI_FLAGS_NO_OVERLAY; else ui->Flags|=LA_UI_FLAGS_NO_OVERLAY;
                 if(ui->Flags&LA_UI_FLAGS_NO_OVERLAY)ui->Flags&=~LA_UI_FLAGS_NO_OVERLAY; else ui->Flags|=LA_UI_FLAGS_NO_OVERLAY;
@@ -824,8 +824,8 @@ int OPMOD_Canvas(laOperator *a, laEvent *e){
             }
             }
             lstClearPointer(&Locals);
             lstClearPointer(&Locals);
 
 
-            if(e->Type&LA_KEY_MOUSE_SCROLL){
-                laUiItem *pui = 0; laListHandle levels={0}; int dir=(e->Type&LA_STATE_DOWN)?1:-1;
+            if(e->type&LA_KEY_MOUSE_SCROLL){
+                laUiItem *pui = 0; laListHandle levels={0}; int dir=(e->type&LA_STATE_DOWN)?1:-1;
                 laUiList *duil = la_DetectUiListRecursiveDeep(subu, e->x, e->y, 10000, &pui, 0, 0, 0, 0, &levels);
                 laUiList *duil = la_DetectUiListRecursiveDeep(subu, e->x, e->y, 10000, &pui, 0, 0, 0, 0, &levels);
                 laUiListRecord* lip=levels.pLast; laUiList* uuil=lip->uil; laUiItem* upui=lip->Item.pPrev?((laUiListRecord*)lip->Item.pPrev)->pui:0; int ran=0;
                 laUiListRecord* lip=levels.pLast; laUiList* uuil=lip->uil; laUiItem* upui=lip->Item.pPrev?((laUiListRecord*)lip->Item.pPrev)->pui:0; int ran=0;
                 while (lip && upui){
                 while (lip && upui){
@@ -895,12 +895,12 @@ int OPMOD_CanvasZoom(laOperator *a, laEvent *e){
     laCanvasExtra *ex = a->This->EndInstance;
     laCanvasExtra *ex = a->This->EndInstance;
     laGeneralUiExtraData *uex = a->CustomData;
     laGeneralUiExtraData *uex = a->CustomData;
 
 
-    if (e->Type == LA_L_MOUSE_UP || e->Type == LA_R_MOUSE_DOWN || e->Type==LA_M_MOUSE_UP){
+    if (e->type == LA_L_MOUSE_UP || e->type == LA_R_MOUSE_DOWN || e->type==LA_M_MOUSE_UP){
         laSetWindowCursor(LA_ARROW);
         laSetWindowCursor(LA_ARROW);
         return LA_FINISHED;
         return LA_FINISHED;
     }
     }
 
 
-    if (e->Type == LA_MOUSEMOVE){
+    if (e->type == LA_MOUSEMOVE){
         if (strArgumentMatch(a->ExtraInstructionsP, "axis", "x")){
         if (strArgumentMatch(a->ExtraInstructionsP, "axis", "x")){
             ex->ZoomX *= (1.0 - (e->x - uex->LastX) * MAIN.ZoomSpeed2D);
             ex->ZoomX *= (1.0 - (e->x - uex->LastX) * MAIN.ZoomSpeed2D);
         }elif(strArgumentMatch(a->ExtraInstructionsP, "lock", "true")){
         }elif(strArgumentMatch(a->ExtraInstructionsP, "lock", "true")){
@@ -923,13 +923,13 @@ int OPMOD_CanvasMove(laOperator *a, laEvent *e){
     laCanvasExtra *ex = a->This->EndInstance;
     laCanvasExtra *ex = a->This->EndInstance;
     laGeneralUiExtraData *uex = a->CustomData;
     laGeneralUiExtraData *uex = a->CustomData;
 
 
-    if (e->Type == LA_L_MOUSE_UP || e->Type == LA_R_MOUSE_DOWN || e->Type==LA_M_MOUSE_UP ||
-       (e->Type==LA_KEY_UP && e->key==' ')) {
+    if (e->type == LA_L_MOUSE_UP || e->type == LA_R_MOUSE_DOWN || e->type==LA_M_MOUSE_UP ||
+       (e->type==LA_KEY_UP && e->key==' ')) {
         laSetWindowCursor(LA_ARROW);
         laSetWindowCursor(LA_ARROW);
         return LA_FINISHED;
         return LA_FINISHED;
     }
     }
 
 
-    if (e->Type == LA_MOUSEMOVE){
+    if (e->type == LA_MOUSEMOVE){
         if (strArgumentMatch(a->ExtraInstructionsP, "axis", "x")){
         if (strArgumentMatch(a->ExtraInstructionsP, "axis", "x")){
             ex->PanX -= (e->x - uex->LastX) * ex->ZoomX;
             ex->PanX -= (e->x - uex->LastX) * ex->ZoomX;
         }else{
         }else{
@@ -947,7 +947,7 @@ int OPINV_CanvasClick(laOperator *a, laEvent *e){
     laCanvasExtra *ex = a->This->EndInstance;
     laCanvasExtra *ex = a->This->EndInstance;
     laGeneralUiExtraData *uex = a->CustomData;
     laGeneralUiExtraData *uex = a->CustomData;
 
 
-    if (e->Type == LA_L_MOUSE_DOWN){
+    if (e->type == LA_L_MOUSE_DOWN){
         ex->ClickedX = (e->x - (ex->ParentUi->R - ex->ParentUi->L) / 2 - ex->ParentUi->L) * ex->ZoomX + ex->PanX;
         ex->ClickedX = (e->x - (ex->ParentUi->R - ex->ParentUi->L) / 2 - ex->ParentUi->L) * ex->ZoomX + ex->PanX;
         ex->ClickedY = ((ex->ParentUi->B - ex->ParentUi->U) / 2 - e->y + ex->ParentUi->U) * ex->ZoomY + ex->PanY;
         ex->ClickedY = ((ex->ParentUi->B - ex->ParentUi->U) / 2 - e->y + ex->ParentUi->U) * ex->ZoomY + ex->PanY;
         laRedrawCurrentPanel();
         laRedrawCurrentPanel();
@@ -999,9 +999,9 @@ int OPMOD_3DViewCameraRotate(laOperator *a, laEvent *e){
         return OPMOD_CanvasMove(a,e);
         return OPMOD_CanvasMove(a,e);
     }
     }
 
 
-    if (e->Type == LA_L_MOUSE_UP || e->Type == LA_M_MOUSE_UP || e->Type == LA_R_MOUSE_DOWN) return LA_FINISHED;
+    if (e->type == LA_L_MOUSE_UP || e->type == LA_M_MOUSE_UP || e->type == LA_R_MOUSE_DOWN) return LA_FINISHED;
 
 
-    if (e->Type == LA_MOUSEMOVE){
+    if (e->type == LA_MOUSEMOVE){
         tnsRotateViewingCamera(ex->ViewingCamera, (real)(uex->LastY - e->y) / 150.0, (real)(uex->LastX - e->x) / 150.0);
         tnsRotateViewingCamera(ex->ViewingCamera, (real)(uex->LastY - e->y) / 150.0, (real)(uex->LastX - e->x) / 150.0);
         uex->LastX = e->x;
         uex->LastX = e->x;
         uex->LastY = e->y;
         uex->LastY = e->y;
@@ -1018,11 +1018,11 @@ int OPMOD_3DViewCameraMove(laOperator *a, laEvent *e){
         return OPMOD_CanvasMove(a,e);
         return OPMOD_CanvasMove(a,e);
     }
     }
 
 
-    if (e->Type == LA_L_MOUSE_UP || e->Type == LA_M_MOUSE_UP || e->Type == LA_R_MOUSE_DOWN){
+    if (e->type == LA_L_MOUSE_UP || e->type == LA_M_MOUSE_UP || e->type == LA_R_MOUSE_DOWN){
         laSetWindowCursor(LA_ARROW);
         laSetWindowCursor(LA_ARROW);
         return LA_FINISHED;
         return LA_FINISHED;
     }
     }
-    if (e->Type == LA_MOUSEMOVE){
+    if (e->type == LA_MOUSEMOVE){
         tnsTranslateViewingCamera(ex->ViewingCamera, ex->ParentUi->R - ex->ParentUi->L, ex->ParentUi->B - ex->ParentUi->U, -e->x + uex->LastX, e->y - uex->LastY);
         tnsTranslateViewingCamera(ex->ViewingCamera, ex->ParentUi->R - ex->ParentUi->L, ex->ParentUi->B - ex->ParentUi->U, -e->x + uex->LastX, e->y - uex->LastY);
         uex->LastX = e->x; uex->LastY = e->y;
         uex->LastX = e->x; uex->LastY = e->y;
         laRedrawCurrentPanel();
         laRedrawCurrentPanel();