*/}}

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

作者 SHA1 備註 提交日期
  YimingWu 72d8f0db9c Audio channel structure and ui 11 小時之前
  YimingWu 69c964207e Event handling of the lua script 13 小時之前
共有 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 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;
-    }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;
     }
     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->ClickedX=e->x; ex->ClickedY=e->y; 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;
             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*3){ ex->LW=LA_RH*3;}
         }
     }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;
             la_AnimationActionSetOwnFrame(aa,SetFrame);
         }
     }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");
-        }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;
-        }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;
             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;
     if(!Modal){
         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->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;
                 }
             }else{ if(ex->TargetIndexVali){ ex->TargetIndexVali=0; Modal=1; } }
         }elif(aa){
             if((!ex->ShowLegend)&&e->x<=ll+LA_SEAM_W*2){
                 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; } }
-            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;
                 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;
                 if(!(e->SpecialKeyBit&LA_KEY_SHIFT)){ la_ActionDeselectFrames(aa); }
                 la_ActionSelectFrame(aa,row,at,ex->ZoomX);
                 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);
                 if(any){ ex->ClickedX=e->x; ex->ClickedY=e->y; ex->UiMode=4; Modal=1; ex->Dragging=13;
                     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);
                 if(any){
                     laNotifyUsers("la.animation.current_action");

+ 100 - 1
la_audio.c

@@ -24,6 +24,7 @@
 extern LA MAIN;
 
 laPropContainer* LA_PC_SYNTH;
+laPropContainer* LA_PC_CHANNEL;
 
 laNodeCategory* LA_NODE_CATEGORY_SYNTHESIZER;
 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;
     if(strSame(strGetArgumentString(a->ExtraInstructionsP,"confirm"),"true")){
         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;
     }
     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;
 }
 
+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){
     la_MakeDetachedProp(p, "la.detached_view_switch", "detached");
     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
 }
+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){
     return MAIN.Audio->AudioDevices.pFirst;
@@ -725,10 +796,21 @@ void laset_CurrentSynth(laAudio* a,laSynth* s){
 void laset_CurrentAudioDevice(laAudio* a,laAudioDevice* 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){
     if(n->EnabledBits[index] & 0x1){ n->EnabledBits[index]=0; }
     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(){
     if(MAIN.GraphNeedsRebuild){ laRebuildSynthGraphs(); }
@@ -746,6 +828,7 @@ void laInitAudio(){
     laInitMiniAudio();
 
     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_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_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);{
         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);
     }
 
+    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);
     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);
@@ -823,6 +920,8 @@ void laInitAudio(){
     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,"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);
     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){
     laListItem Item;
 
-    int Type;
+    laWindow* window;
+
+    int type;
     int state;
     int x, y;
     int key;
@@ -206,6 +208,8 @@ STRUCTURE(laEvent){
     void *Localized;
 };
 
+typedef int (*laInputProcessF)(laEvent* e);
+
 NEED_STRUCTURE(laWindow)
 NEED_STRUCTURE(laRoot)
 NEED_STRUCTURE(laPanel)
@@ -323,6 +327,7 @@ STRUCTURE(LA){
     u8bit LastControllerKey, LastControllerKeyDevice, ControllerHasNewKey;
     u8bit LastControllerAxis, LastControllerAxisDevice, ControllerHasNewAxis;
 
+    laInputProcessF InputProcess;
     laListHandle Windows;
     laListHandle WastedPanels;
 
@@ -1845,6 +1850,7 @@ STRUCTURE(laSynthNodeScope){
 STRUCTURE(laSynthNodeOutput){
     laBaseNode Base;
     laNodeInSocket* In;
+    int Send;
 };
 
 STRUCTURE(laSynthNodeEnvelope){
@@ -1869,6 +1875,14 @@ STRUCTURE(laSynthNodeQuantize){
 
 #include "miniaudio.h"
 
+STRUCTURE(laAudioChannel){
+    laListItem Item;
+    laSafeString* Name;
+    real Volume;
+    int ID;
+    int OutputChannel;
+};
+
 STRUCTURE(laAudioDevice){
     laListItem Item;
     int MiniAudioID;
@@ -1881,6 +1895,9 @@ STRUCTURE(laAudio){
     laListHandle Synths;
     laSynth* CurrentSynth;
 
+    laListHandle Channels;
+    laAudioChannel* ChannelPtr[32];
+
     SYSLOCK AudioStatusLock;
     ma_context MiniAudioContext;
     ma_device AudioDevice;
@@ -2134,6 +2151,7 @@ void laAddExtraPreferencePath(const char* path);
 void laAddExtraPreferencePage(const char* name, laUiDefineFunc Func);
 void laSetFrameCallbacks(laPreFrameF PreFrame, laPreDrawF PreDraw, laPostFrameF PostFrame);
 void laSetCleanupCallback(laCleanupF Cleanup);
+void laSetInputProcessCallback(laInputProcessF InputProcess);
 void laSetMenuBarTemplates(laUiDefineFunc MenuButtons, laUiDefineFunc MenuExtras, const char* ProgramName);
 void laSetAboutTemplates(laUiDefineFunc AboutContent, laUiDefineFunc AboutVersion, laUiDefineFunc AboutAuthor);
 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);
     if(use_last_pos){ e->x=MAIN.evLastX; e->y=MAIN.evLastY; }
 
+    e->window = wnd;
     e->Twist=MAIN.StylusTwist; e->HasTwist = MAIN.StylusHasTwist;
     e->Pressure=MAIN.IsPen?(MAIN.PointerIsEraser?MAIN.EraserPressure:MAIN.StylusPressure):0.5f;
     e->Orientation=MAIN.PointerIsEraser?MAIN.EraserOrientation:MAIN.StylusOrientation;
@@ -1590,19 +1591,19 @@ void la_SaveEvent(SYSWINDOW hwnd, laEvent *e, int use_last_pos){
     laMappingRequestEval();
 };
 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);
 };
 void la_SendInputEvent(SYSWINDOW hwnd, uint32_t Input){
     laEvent *e = memAcquireSimple(sizeof(laEvent));
-    e->Type = LA_INPUT; e->Input=Input;
+    e->type = LA_INPUT; e->Input=Input;
 
     la_SaveEvent(hwnd, e, 1);
 }
 void la_SendEmptyEvent(SYSWINDOW hwnd){
     laEvent *e = memAcquireSimple(sizeof(laEvent));
 
-    e->Type = LA_EMPTY;
+    e->type = LA_EMPTY;
 
     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));
-    e->Type = type; e->x = x; e->y = y;
+    e->type = type; e->x = x; e->y = y;
     la_SaveEvent(hwnd, e, 0);
     MAIN.evLastX=x; MAIN.evLastY=y;
 };
 void la_SendTimerEvent(SYSWINDOW hwnd, int type){
     laEvent *e = memAcquireSimple(sizeof(laEvent));
-    e->Type = type;
+    e->type = type;
     la_SaveEvent(hwnd, e, 1);
 };
 void laRetriggerOperators(){
@@ -1681,6 +1682,9 @@ void laSetFrameCallbacks(laPreFrameF PreFrame, laPreDrawF PreDraw, laPostFrameF
 void laSetCleanupCallback(laCleanupF 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){
     laKeyMapItem *kmi; int inv=0;
     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){
         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;
             if (kmi->Operation)
                 laInvoke(from, kmi->Operation->Ptr, e, 0, instructions, 0);
@@ -6556,10 +6560,10 @@ int laKeyMapExecuteEventEx(laOperator *from, laPropPack *UiExtra, laKeyMapper *k
     laKeyMapItem *kmi;
     char *instructions;
     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){
         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){
                 lx = e->x;
                 ly = e->y;
@@ -7334,6 +7338,8 @@ int la_HandleSingleEvent(laEvent *e, laListHandle *Operators){
     int Result = 0;
     laConfirmData *ConfirmData = 0, *NextConfirmData = 0;
 
+    if(MAIN.InputProcess){ MAIN.InputProcess(e); }
+
     a = Operators->pFirst;
 
     la_DestroyConfirmData(&MAIN.InvokeConfirmData);

+ 2 - 0
la_tns.h

@@ -1280,6 +1280,8 @@ void tnsFreeEvaluatedArray(tnsEvaluateData* ed);
 void tnsEvaluateThisObject(tnsObject *o, tnsEvaluateData* ed);
 void tnsSetObjectTreeEvaluationArgs(tnsObject* from, tnsObject* Active, int FillOutline, int FillSelectionID, int W, int H);
 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, 
     int IsActive, int MeshSelectionType, int InstanceSelectionID);
 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
 
+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){
-    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){
-    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_newtable(L); lua_setglobal(L,"scene");
     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_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); } }
-        }
+        }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,3);
@@ -4239,6 +4263,16 @@ void tnsEvaluateObjectTree(tnsObject* from, tnsEvaluateData* UseED, int Evaluate
         //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){
     tnsEvaluatedInstance* ei; int next=0;
     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;
     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;
     }
 
@@ -438,7 +438,7 @@ int OPMOD_Select(laOperator *a, laEvent *e){
     int Remove=e->SpecialKeyBit&LA_KEY_ALT; if(Remove) DeselectAll=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;
             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);
@@ -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); 
     }
 
-    if(e->Type==LA_KEY_DOWN){
+    if(e->type==LA_KEY_DOWN){
         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=='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->Type==LA_MOUSEMOVE || e->Type==LA_KEY_DOWN){
+    if(e->type==LA_MOUSEMOVE || e->type==LA_KEY_DOWN){
         switch(td->mode){
             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;
@@ -964,11 +964,11 @@ int OPMOD_Transformation(laOperator *a, laEvent *e){
         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);
         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;
     }
 
@@ -1793,11 +1793,11 @@ int OPMOD_Knife(laOperator *a, laEvent *e){
     tnsMeshObject* mo=root->Active;
     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;
     }
 
-    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;
         void* p=la_SelectGetRef(se->sd,id,elemtype);
         if(se->IsLoop){
@@ -1809,11 +1809,11 @@ int OPMOD_Knife(laOperator *a, laEvent *e){
             if(la_KnifeIsDuplicated(se,p)) p=0;
             if(se->PendingElem!=p){ changed=1; }
             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);
             tnsInvalidateMeshBatch(mo); laNotifyUsers("tns.world");
             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);
         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;
     laKeyDetectorData* kdd=a->CustomData; if(!kdd){ return LA_FINISHED; }
     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;
         laNotifyInstanceUsers(kdd);
         return LA_RUNNING;
-    }elif(e->Type == LA_EMPTY){
+    }elif(e->type == LA_EMPTY){
         if(MAIN.ControllerHasNewAxis){
             kdd->Axis = MAIN.LastControllerAxis; kdd->Device = MAIN.LastControllerAxisDevice; kdd->Button =-1; kdd->IsController=1;
             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){
     laLayout *l = MAIN.CurrentWindow->CurrentLayout;
     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 (!b) b = laDetectBlockRecursive(l->FirstBlock, e->x, e->y);
         if (!b) return LA_CANCELED;
@@ -1404,9 +1404,9 @@ int la_ProcessBlockEvent(laOperator *a, laBlock *b, laEvent *e){
         MAIN.CurrentWindow->CurrentLayout->OperatingBlock = b;
 
         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;
-            }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;
             }
         }
@@ -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); }
             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->LastY = e->y;
                 int LT=0,RT=0;
@@ -1426,7 +1426,7 @@ int la_ProcessBlockEvent(laOperator *a, laBlock *b, laEvent *e){
                     }
                     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 (MAIN.CurrentWindow->CurrentLayout->ClickedPanel){
                         l = MAIN.CurrentWindow->CurrentLayout;
@@ -1435,7 +1435,7 @@ int la_ProcessBlockEvent(laOperator *a, laBlock *b, laEvent *e){
                         laRefreshWindow();
                     }
                 }
-            }elif (e->Type == LA_L_MOUSE_UP){
+            }elif (e->type == LA_L_MOUSE_UP){
                 l = MAIN.CurrentWindow->CurrentLayout;
                 if (l->DropToBlock){
                     l->DropToBlock = la_MakeDropBlock(l->DropToBlock,l->DropLocation);
@@ -1468,8 +1468,8 @@ int la_ProcessBlockEvent(laOperator *a, laBlock *b, laEvent *e){
             }
         }else{
             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){
@@ -1477,7 +1477,7 @@ int la_ProcessBlockEvent(laOperator *a, laBlock *b, laEvent *e){
             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);
         }
         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){
     laBlock *ob = l->MovingBlock;
     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);
         else ob->SplitRatio = (real)(e->x - ob->X) / (real)(ob->W);
         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;
         if(l->MovingBlock!=ob){ laRefreshWindow(); }
         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;
-        }elif (e->Type == LA_L_MOUSE_UP){
+        }elif (e->type == LA_L_MOUSE_UP){
             l->IsMoving = 0;
-        }elif (e->Type == LA_R_MOUSE_DOWN){
+        }elif (e->type == LA_R_MOUSE_DOWN){
             l->OnBlockSeperator = ob;
             laui_BlockEdgeMenu(WindowAct, l, ob, e);
         }
@@ -1631,13 +1631,13 @@ int OPMOD_Window(laOperator *a, laEvent *e){
             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);
             laDockPanel(w->DockingFrom, l->DropToBlock, MAIN.DockingPanel);
             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;
         }
         return LA_RUNNING;
@@ -1651,7 +1651,7 @@ int OPMOD_Window(laOperator *a, laEvent *e){
             return LA_RUNNING;
         }
         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{
         if(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 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;
         if(upui){ laPanUiListFree(uuil, ex->LastX-e->x, ex->LastY-e->y);
             //if(uuil->HeightCoeff){
@@ -1708,28 +1708,28 @@ int la_ScrollPanel(laGeneralUiExtraData*ex, laPanel*p, laEvent* e){
         laRedrawCurrentPanel();
         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;
         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;
         laRecalcCurrentPanel();
         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;
-        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);
         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->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; } 
                 if(uuil) { ex->TargetIndexVali=5; ex->Ptr1=uuil; ex->Ptr2=upui; ex->LastX=e->x; ex->LastY=e->y; ret= 1;}
             }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; } 
                 if(uuil) { ex->TargetIndexVali=4; ex->Ptr1=uuil; ex->Ptr2=upui; ex->LastX=e->x; ex->LastY=e->y; ret= 1;}
             }else{
@@ -1762,7 +1762,7 @@ int OPMOD_Panel(laOperator *a, laEvent *e){
 
     if (!p->Show || (!laIsInPanel(p, x, y) && !uid->TargetIndexVali)){
         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;
             }
             return LA_RUNNING;
@@ -1781,13 +1781,13 @@ int OPMOD_Panel(laOperator *a, laEvent *e){
         dp = laDetectPanel(x, y);
         if (dp->Mode && dp != p){
             return LA_FINISHED;
-        }else if ((e->Type & LA_MOUSEDOWN) == LA_MOUSEDOWN){
+        }else if ((e->type & LA_MOUSEDOWN) == LA_MOUSEDOWN){
             laPopPanel(p); IsTop=1;
         }else if(p->Mode) return LA_RUNNING;
         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};
         laUiList *duil = la_DetectUiListRecursiveDeep(&p->UI, e->x, e->y, 10000, &pui, &suil, 0, 0, 0, &levels);
         while(duil=lstPopPointer(&levels));
@@ -1817,18 +1817,18 @@ int OPMOD_Panel(laOperator *a, laEvent *e){
     }
     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((!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;
         }else{
             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 (!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;
@@ -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);
         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;
 }
@@ -1882,12 +1882,12 @@ int OPMOD_MenuPanel(laOperator *a, laEvent *e){
     int IsClose=laIsCloseToPanel(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);
         laDestroySinglePanel(p,0);
         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);
         la_StopUiOperatorService(p);
         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 (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};
         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));
@@ -1908,14 +1908,14 @@ int OPMOD_MenuPanel(laOperator *a, laEvent *e){
             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;
         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){
             laUiList *suil = uid->Ptr1; laUiItem *pui = uid->Ptr2;
             int IsVertical=uid->On;
@@ -1964,7 +1964,7 @@ int OPMOD_ModalPanel(laOperator *a, laEvent *e){
 
     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);
         la_StopUiOperatorService(p);
         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 (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};
         laUiList *duil = la_DetectUiListRecursiveDeep(&p->UI, e->x, e->y, 10000, &pui, &suil, 0, 0, 0, &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;
         if((!a->Item.pPrev) && (!p->ShowCorner)){ p->ShowCorner=1; laSetWindowCursor(LA_CORNER); 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->LastY = e->y;
         if(insize){ uid->TargetIndexVali = 2; laSetWindowCursor(LA_CORNER); }
         else uid->TargetIndexVali = 1;
         return LA_RUNNING;
     }
-    if (e->Type == LA_MOUSEMOVE){
+    if (e->type == LA_MOUSEMOVE){
         if (uid->TargetIndexVali == 1){
             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;
@@ -2058,7 +2058,7 @@ int OPMOD_ModalPanel(laOperator *a, laEvent *e){
         }
         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);
         return LA_RUNNING;
     }

+ 1 - 0
resources/la_properties.c

@@ -1552,6 +1552,7 @@ void la_RegisterInternalProps(){
                 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, "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"(
 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;
 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 Select=e->SpecialKeyBit&LA_KEY_SHIFT;
     real _L, MonoWidth;
-    switch (e->Type){
+    switch (e->type){
     case LA_INPUT:
         switch (e->Input){
         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;
         MonoWidth=tnsGetMonoFontAdvance(); _L=(*ui->Type->Theme)->LM*2+ui->L;
         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);
             se->MouseSelecting=1; se->CursorPreferBefore=se->CursorBefore; return 1;
         }else{
@@ -2283,7 +2283,7 @@ int OPMOD_IntArrayHorizon(laOperator *a, laEvent *e){
         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);
         laPanel *p = laEnableIdlePanel(a->ToPanel, a, 0, 0, &ui->PP, GX, GX + 150, GY, 600, 200, e);
         return LA_RUNNING;
@@ -2291,7 +2291,7 @@ int OPMOD_IntArrayHorizon(laOperator *a, laEvent *e){
 
     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 (uit->Edit){
             if (!laIsInUiItem(ui, e->x, e->y)){
@@ -2313,7 +2313,7 @@ int OPMOD_IntArrayHorizon(laOperator *a, laEvent *e){
         laRedrawCurrentPanel();
         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; }
         int dist=abs(e->x - uit->LastX + uit->LastY - e->y);
         if (dist > MAIN.ValuatorThreshold || uit->Dragging){
@@ -2331,7 +2331,7 @@ int OPMOD_IntArrayHorizon(laOperator *a, laEvent *e){
         }
         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 (uit->Dragging){
             if (ui->Extra->On){
@@ -2356,7 +2356,7 @@ int OPMOD_IntArrayHorizon(laOperator *a, laEvent *e){
         return LA_RUNNING;
     }
 
-    if(e->Type ==LA_KEY_DOWN){
+    if(e->type ==LA_KEY_DOWN){
         if (e->key == LA_KEY_ENTER && uit->Edit){
             char* buf=strEndEdit(&uit->Edit, 0);
             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;
         ui->PP.LastIndex = la_DetectColumn(ui, e->x, Len);
         laLocalToWindow(a, a->ToPanel, &GX, &GY);
@@ -2406,7 +2406,7 @@ int OPMOD_FloatArrayHorizon(laOperator *a, laEvent *e){
         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);
         laPanel *p = laEnableIdlePanel(a->ToPanel, a, 0, 0, &ui->PP, GX, GX + 150, GY, 600, 200, e);
         return LA_RUNNING;
@@ -2414,7 +2414,7 @@ int OPMOD_FloatArrayHorizon(laOperator *a, laEvent *e){
 
     if(NoEvent){ return LA_RUNNING_PASS; }
 
-    if (e->Type == LA_L_MOUSE_DOWN){
+    if (e->type == LA_L_MOUSE_DOWN){
         if (uit->Edit){
             if (!laIsInUiItem(ui, e->x, e->y)){
                 strEndEdit(&uit->Edit, 1);
@@ -2437,7 +2437,7 @@ int OPMOD_FloatArrayHorizon(laOperator *a, laEvent *e){
 
         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; }
         int dist=abs(e->x - uit->LastX - e->y + uit->LastY);
         if (dist > MAIN.ValuatorThreshold || uit->Dragging){
@@ -2455,7 +2455,7 @@ int OPMOD_FloatArrayHorizon(laOperator *a, laEvent *e){
         }
         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 (uit->Dragging){
             if (ui->Extra->On){
@@ -2480,7 +2480,7 @@ int OPMOD_FloatArrayHorizon(laOperator *a, laEvent *e){
         return LA_RUNNING;
     }
 
-    if(e->Type ==LA_KEY_DOWN){
+    if(e->type ==LA_KEY_DOWN){
         if (e->key == LA_KEY_ENTER && uit->Edit){
             char* buf=strEndEdit(&uit->Edit, 0);
             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;
         ui->PP.LastIndex = la_DetectColumn(ui, e->x, laGetArrayLength(&ui->PP));
         laLocalToWindow(a, a->ToPanel, &GX, &GY);
@@ -2521,7 +2521,7 @@ int OPMOD_FloatColor(laOperator *a, laEvent *e){
         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);
         laPanel *p = laEnableIdlePanel(a->ToPanel, a, 0, 0, &ui->PP, GX, GX + 150, GY, 600, 200, e);
         return LA_RUNNING;
@@ -2529,7 +2529,7 @@ int OPMOD_FloatColor(laOperator *a, laEvent *e){
     
     if(NoEvent){ return LA_RUNNING_PASS; }
 
-    if (e->Type == LA_L_MOUSE_DOWN){
+    if (e->type == LA_L_MOUSE_DOWN){
         laUiList *uil;
         laColumn *col;
         laPanel *p;
@@ -2545,7 +2545,7 @@ int OPMOD_FloatColor(laOperator *a, laEvent *e){
         }
         return LA_RUNNING;
     }
-    if (e->Type == LA_R_MOUSE_DOWN){
+    if (e->type == LA_R_MOUSE_DOWN){
         int GX = e->x, GY = e->y;
         laLocalToWindow(a, a->ToPanel, &GX, &GY);
         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;
     }
 
-    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;
     }
     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();}
-        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(); }
         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 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();
         laRecordAndPushProp(&ui->PP,0); laMarkPropChanged(&ui->PP);
         return LA_RUNNING_PASS;
     }
 
-    if (e->Type & LA_MOUSE_EVENT && es->Dragging){
+    if (e->type & LA_MOUSE_EVENT && es->Dragging){
         laGetFloatArray(&ui->PP, Color);
         if(ui->PP.LastPs->p->Tag&LA_PROP_IS_LINEAR_SRGB){ tns2LogsRGB(Color); }
         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 (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);
         laPanel *p = laEnableIdlePanel(a->ToPanel, a, 0, 0, &ui->PP, GX, GX + 150, GY, 600, 200, e);
         return LA_RUNNING;
@@ -2661,7 +2661,7 @@ int OPMOD_EnumSelector(laOperator *a, laEvent *e){
 
     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;
 
         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);
             if(!ei){ ei=((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);
             laConfirmInt(a,EnumTarget,LA_CONFIRM_DATA);
             laRecordAndPushProp(&ui->PP,0); laMarkPropChanged(&ui->PP);
@@ -2715,7 +2715,7 @@ int OPMOD_EnumSelector(laOperator *a, laEvent *e){
         return LA_RUNNING;
     }
 
-    if(e->Type==LA_R_MOUSE_DOWN){
+    if(e->type==LA_R_MOUSE_DOWN){
         int GX = e->x, GY = e->y;
         laLocalToWindow(a, a->ToPanel, &GX, &GY);
         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 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);
         laPanel *p = laEnableIdlePanel(a->ToPanel, a,  &ui->ExtraPP, 0,  &ui->PP, GX, GX + 150, GY, 600, 200, e);
         return LA_RUNNING;
@@ -2738,7 +2738,7 @@ int OPMOD_Button(laOperator *a, laEvent *e){
     
     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*/){
         ui->State = LA_UI_NORMAL;
@@ -2746,7 +2746,7 @@ int OPMOD_Button(laOperator *a, laEvent *e){
         return LA_FINISHED_PASS;
     }
 
-    if (e->Type == LA_L_MOUSE_DOWN){
+    if (e->type == LA_L_MOUSE_DOWN){
         ui->State = LA_UI_ACTIVE;
         laRedrawCurrentPanel();
         return LA_RUNNING;
@@ -2756,7 +2756,7 @@ int OPMOD_Button(laOperator *a, laEvent *e){
 
     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;
         if (ui->AT){
             if (!ui->Instructions){
@@ -2841,7 +2841,7 @@ int OPMOD_MenuItem(laOperator *a, laEvent *e){
         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;
         laLocalToWindow(a, a->ToPanel, &GX, &GY);
         ui->State = LA_UI_ACTIVE;
@@ -2863,7 +2863,7 @@ int OPMOD_ConditionToggle(laOperator *a, laEvent *e){
         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;
         laRecalcCurrentPanel();
         return LA_RUNNING;
@@ -2889,8 +2889,8 @@ int OPMOD_SingleLineString(laOperator *a, laEvent *e){
             laRedrawCurrentPanel();
             return LA_FINISHED_PASS;
         }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);
                 laSetString(&ui->PP, buf); free(buf);
                 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);
         laPanel *p = laEnableIdlePanel(a->ToPanel, a, 0, 0, &ui->PP, GX, GX + 150, GY, 600, 200, e);
         return LA_RUNNING;
@@ -2909,7 +2909,7 @@ int OPMOD_SingleLineString(laOperator *a, laEvent *e){
     
     if(NoEvent){ return LA_RUNNING_PASS; }
 
-    if(e->Type ==LA_KEY_DOWN){
+    if(e->type ==LA_KEY_DOWN){
         if (e->key == LA_KEY_ENTER){
             buf=IsTerminal?strGetEditString(uit->Edit,0):strEndEdit(&uit->Edit, 0);
             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 (e->Type == LA_L_MOUSE_DOWN){
+    if (e->type == LA_L_MOUSE_DOWN){
         if (ui->State == LA_UI_NORMAL){
             if(laIsPropertyReadOnly(&ui->PP)) return LA_RUNNING;
             ui->State = LA_UI_EDITING;
@@ -2949,7 +2949,7 @@ int OPMOD_SingleLineString(laOperator *a, laEvent *e){
         return LA_RUNNING;
     }
 
-    if (e->Type == LA_R_MOUSE_DOWN){
+    if (e->type == LA_R_MOUSE_DOWN){
         int GX = e->x, GY = e->y;
         ui->PP.LastIndex = la_DetectColumn(ui, e->x, laGetArrayLength(&ui->PP));
         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;
 
     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);
             laRecordAndPushProp(&ui->PP,0); laMarkPropChanged(&ui->PP);
             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 (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);
         laPanel *p = laEnableIdlePanel(a->ToPanel, a, 0, 0, &ui->PP, GX, GX + 150, GY, 600, 200, e);
         return LA_RUNNING;
@@ -3005,7 +3005,7 @@ int OPMOD_MultiString(laOperator *a, laEvent *e){
 
     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(ui->State != LA_UI_NORMAL){
                 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(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;
         return LA_RUNNING;
     }
     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);}
-        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); }
         return LA_RUNNING;
     }
     
     int NoInactiveScroll=ui->Flags&LA_UI_FLAGS_NO_SCROLL_INACTIVE;
     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){
             ui->State = LA_UI_ACTIVE;
             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;
         ui->PP.LastIndex = la_DetectColumn(ui, e->x, laGetArrayLength(&ui->PP));
         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 (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;
         for (uil = ui->Subs.pFirst; uil; uil = uil->Item.pNext){ count++; }
         page = la_DetectColumn(ui, e->x, count);
@@ -3116,7 +3116,7 @@ int OPMOD_Collection(laOperator *a, laEvent *e) {
     return LA_FINISHED;
   }
 
-  if (e->Type & LA_MOUSE_EVENT) {
+  if (e->type & LA_MOUSE_EVENT) {
     laUiList *sub;
     laUiItem *tui;
     int LimHeight = 10000;
@@ -3142,7 +3142,7 @@ int OPMOD_Collection(laOperator *a, laEvent *e) {
     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) {
     laUiList *uil;
     for (uil = ui->Subs.pFirst; uil; uil = uil->Item.pNext) {
@@ -3168,7 +3168,7 @@ int OPMOD_Collection(laOperator *a, laEvent *e) {
     }
     return LA_RUNNING;
   }
-  elif (e->Type == LA_R_MOUSE_DOWN) {
+  elif (e->type == LA_R_MOUSE_DOWN) {
     laUiList *uil;
     for (uil = ui->Subs.pFirst; uil; uil = uil->Item.pNext) {
       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;
     }
 
-    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);
         laPanel *p = laEnableIdlePanel(a->ToPanel, a, 0, 0, &ui->PP, GX, GX + 150, GY, 600, 200, e);
         return LA_RUNNING;
     }
 
-    if (e->Type == LA_L_MOUSE_DOWN){
+    if (e->type == LA_L_MOUSE_DOWN){
         laUiList *uil;
         laColumn *col;
         laPanel *p;
@@ -3253,19 +3253,19 @@ int OPMOD_ColumnAdjuster(laOperator *a, laEvent *e){
         return LA_FINISHED_PASS;
     }
 
-    if (e->Type == LA_L_MOUSE_DOWN){
+    if (e->type == LA_L_MOUSE_DOWN){
         uit->Ptr1 = c;
         uit->LastX = e->x;
         uit->Dragging=1;
         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);
         uit->LastX = e->x;
         laRecalcCurrentPanel();
         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;
         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 (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;
         if(pc==LA_PC_SOCKET_IN)   {
             laNodeInSocket* s=ui->PP.EndInstance;
@@ -3318,7 +3318,7 @@ int OPMOD_NodeSocket(laOperator *a, laEvent *e){
         laRedrawCurrentPanel();
         return LA_RUNNING;
     }
-    if (uit->Dragging && e->Type == LA_MOUSEMOVE){
+    if (uit->Dragging && e->type == LA_MOUSEMOVE){
         laPanel* p=MAIN.CurrentPanel;
         laLocalToPanel(a, &lx, &ly);
         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();
         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;
         laRecalcCurrentPanel();
         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 (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;
     }
-    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;
         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;
     }
-    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;
     }
 
@@ -3470,11 +3470,11 @@ int OPMOD_ValueMapper(laOperator *a, laEvent *e){
 
     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;
         return LA_RUNNING;
     }
-    if (uit->Dragging && e->Type == LA_MOUSEMOVE){
+    if (uit->Dragging && e->type == LA_MOUSEMOVE){
         laValueMapperPoint* vmp=uit->Ptr1;
         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; }
@@ -3487,7 +3487,7 @@ int OPMOD_ValueMapper(laOperator *a, laEvent *e){
         }
         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;
         if(vmp->x>1||vmp->x<0) {
             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;
     //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;
             return LA_RUNNING;
         }
         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(); }
-            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;
         }
 
         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==1){
                 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);
 
-            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);
                 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){
@@ -895,12 +895,12 @@ int OPMOD_CanvasZoom(laOperator *a, laEvent *e){
     laCanvasExtra *ex = a->This->EndInstance;
     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);
         return LA_FINISHED;
     }
 
-    if (e->Type == LA_MOUSEMOVE){
+    if (e->type == LA_MOUSEMOVE){
         if (strArgumentMatch(a->ExtraInstructionsP, "axis", "x")){
             ex->ZoomX *= (1.0 - (e->x - uex->LastX) * MAIN.ZoomSpeed2D);
         }elif(strArgumentMatch(a->ExtraInstructionsP, "lock", "true")){
@@ -923,13 +923,13 @@ int OPMOD_CanvasMove(laOperator *a, laEvent *e){
     laCanvasExtra *ex = a->This->EndInstance;
     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);
         return LA_FINISHED;
     }
 
-    if (e->Type == LA_MOUSEMOVE){
+    if (e->type == LA_MOUSEMOVE){
         if (strArgumentMatch(a->ExtraInstructionsP, "axis", "x")){
             ex->PanX -= (e->x - uex->LastX) * ex->ZoomX;
         }else{
@@ -947,7 +947,7 @@ int OPINV_CanvasClick(laOperator *a, laEvent *e){
     laCanvasExtra *ex = a->This->EndInstance;
     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->ClickedY = ((ex->ParentUi->B - ex->ParentUi->U) / 2 - e->y + ex->ParentUi->U) * ex->ZoomY + ex->PanY;
         laRedrawCurrentPanel();
@@ -999,9 +999,9 @@ int OPMOD_3DViewCameraRotate(laOperator *a, laEvent *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);
         uex->LastX = e->x;
         uex->LastY = e->y;
@@ -1018,11 +1018,11 @@ int OPMOD_3DViewCameraMove(laOperator *a, laEvent *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);
         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);
         uex->LastX = e->x; uex->LastY = e->y;
         laRedrawCurrentPanel();