*/}}
Forráskód Böngészése

Calling operator from keymap

YimingWu 4 hónapja
szülő
commit
073f950aff

+ 1 - 1
la_animation.c

@@ -595,7 +595,7 @@ int LAMOD_AnimationActionsCanvas(laOperator *a, laEvent *e){
             la_AnimationActionSetOwnFrame(aa,SetFrame,0);
         }
     }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_KEY_DOWN && e->key==LA_KEY_ESCAPE)){ ex->UiMode=0; ex->Dragging=0;
             la_ActionRestoreKeyOriginalAt(aa); laNotifyUsers("la.animation.current_action");
         }elif(e->type==LA_L_MOUSE_DOWN){ la_ActionRemoveDuplicatedFrames(aa);
             laNotifyUsers("la.animation.current_action"); ex->UiMode=0; ex->Dragging=0;

+ 8 - 18
la_interface.h

@@ -130,8 +130,10 @@
 #define LA_KEY_NUMDOT    (LA_KEY_EXTRA+15)
 #define LA_KEY_NUMENTER  (LA_KEY_EXTRA+16)
 
-#define LA_KEY_PANNING   (1<<26)
-#define LA_SIGNAL_EVENT  (1<<31)
+#define LA_KEY_PANNING    (1<<26)
+
+#define LA_OPERATOR_EVENT (1<<30)
+#define LA_SIGNAL_EVENT   (1<<31)
 
 #ifdef _WIN32
 #define XK_F1  1
@@ -200,21 +202,6 @@
 #define LA_PANNING_UP (LA_KEYBOARD_EVENT | LA_KEY_PANNING | LA_KEY_ARRUP)
 #define LA_PANNING_DOWN (LA_KEYBOARD_EVENT | LA_KEY_PANNING | LA_KEY_ARRDOWN)
 
-#define LA_LEFT_DOWN (LA_KEYBOARD_EVENT | LA_KEY_ARRLEFT | LA_STATE_DOWN)
-#define LA_RIGHT_DOWN (LA_KEYBOARD_EVENT | LA_KEY_ARRRIGHT | LA_STATE_DOWN)
-#define LA_UP_DOWN (LA_KEYBOARD_EVENT | LA_KEY_ARRUP | LA_STATE_DOWN)
-#define LA_DOWN_DOWN (LA_KEYBOARD_EVENT | LA_KEY_ARRDOWN | LA_STATE_DOWN)
-#define LA_LEFT_UP (LA_KEYBOARD_EVENT | LA_KEY_ARRLEFT | LA_STATE_UP)
-#define LA_RIGHT_UP (LA_KEYBOARD_EVENT | LA_KEY_ARRRIGHT | LA_STATE_UP)
-#define LA_UP_UP (LA_KEYBOARD_EVENT | LA_KEY_ARRUP | LA_STATE_UP)
-#define LA_DOWN_UP (LA_KEYBOARD_EVENT | LA_KEY_ARRDOWN | LA_STATE_UP)
-#define LA_BACKSPACE_DOWN (LA_KEYBOARD_EVENT | LA_KEY_BACKSPACE | LA_STATE_DOWN)
-#define LA_BACKSPACE_UP (LA_KEYBOARD_EVENT | LA_KEY_BACKSPACE | LA_STATE_UP)
-#define LA_ESCAPE_DOWN (LA_KEYBOARD_EVENT | LA_KEY_ESCAPE | LA_STATE_DOWN)
-#define LA_ESCAPE_UP (LA_KEYBOARD_EVENT | LA_KEY_ESCAPE | LA_STATE_UP)
-#define LA_ENTER_DOWN (LA_KEYBOARD_EVENT | LA_KEY_ENTER | LA_STATE_DOWN)
-#define LA_ENTER_UP (LA_KEYBOARD_EVENT | LA_KEY_ENTER | LA_STATE_UP)
-
 #define LA_ONLY_BITS_AND(orig, yours) \
     ((orig & yours) == yours)
 
@@ -257,6 +244,7 @@ STRUCTURE(laEvent){
     real Pressure,Orientation,Deviation,Twist,Hover;
 
     void *Localized;
+    laOperatorType* Operator; int OperatorBase; char* OperatorInstructions;
 };
 
 typedef int (*laInputProcessF)(laEvent* e);
@@ -1554,7 +1542,8 @@ STRUCTURE(laOperator){
 };
 
 #define LA_INPUT_DEVICE_KEYBOARD 0
-#define LA_INPUT_DEVICE_JOYSTICK 1
+#define LA_INPUT_DEVICE_MOUSE 1
+#define LA_INPUT_DEVICE_JOYSTICK 2
 
 STRUCTURE(laInputMapping){
     laListItem Item;
@@ -1572,6 +1561,7 @@ STRUCTURE(laInputMappingEntry){
     laSafeString* Signal; int SignalValue;
     int UseOperator;
     laSafeString* Operator,*OperatorName,*OperatorArguments;
+    laOperatorType* OperatorType;
     int OperatorBase;
 };
 STRUCTURE(laInputMappingBundle){

+ 40 - 3
la_kernel.c

@@ -1684,6 +1684,11 @@ void la_InputMappingGetKeyName(int key, int special, char* name){
     case LA_KEY_F10: strcat(name,"F10"); break;
     case LA_KEY_F11: strcat(name,"F11"); break;
     case LA_KEY_F12: strcat(name,"F12"); break;
+    case LA_KEY_MOUSE_LEFT: strcat(name,"Mouse1"); break;
+    case LA_KEY_MOUSE_MIDDLE: strcat(name,"Mouse2"); break;
+    case LA_KEY_MOUSE_RIGHT: strcat(name,"Mouse3"); break;
+    case LA_KEY_MOUSE_SCROLL|LA_STATE_UP: strcat(name,"MouseWheelUp"); break;
+    case LA_KEY_MOUSE_SCROLL|LA_STATE_DOWN: strcat(name,"MouseWheelDown"); break;
     default:
         name = name+strlen(name); _next=name;
         laToUTF8(key,name,&_next); *_next=0; break;
@@ -1736,6 +1741,11 @@ int la_InputMappingGetKeyFromName(char* name, int* special){
     if(strSame(p,"F10")) return LA_KEY_F10;
     if(strSame(p,"F11")) return LA_KEY_F11;
     if(strSame(p,"F12")) return LA_KEY_F12;
+    if(strSame(p,"Mouse1")) return LA_KEY_MOUSE_LEFT;
+    if(strSame(p,"Mouse2")) return LA_KEY_MOUSE_MIDDLE;
+    if(strSame(p,"Mouse3")) return LA_KEY_MOUSE_RIGHT;
+    if(strSame(p,"MouseWheelUp")) return LA_KEY_MOUSE_SCROLL|LA_STATE_UP;
+    if(strSame(p,"MouseWheelDown")) return LA_KEY_MOUSE_SCROLL|LA_STATE_DOWN;
     int adv;
     return laToUnicode(p,&adv);
 }
@@ -1748,9 +1758,10 @@ laCustomSignal* laFindSignalByID(int ID){
     return 0;
 }
 void laInputMappingUpdateSignal(laInputMappingEntry* ime){
-    if(ime->DeviceType == LA_INPUT_DEVICE_KEYBOARD){ char* str=SSTR(ime->Key);
+    if(ime->DeviceType == LA_INPUT_DEVICE_KEYBOARD || ime->DeviceType==LA_INPUT_DEVICE_MOUSE){ char* str=SSTR(ime->Key);
         if(str&&str[0]){ int adv; ime->KeyValue=la_InputMappingGetKeyFromName(str,&ime->SpecialKeyBits); }else{ ime->KeyValue=0; }
-    }elif(ime->DeviceType == LA_INPUT_DEVICE_JOYSTICK){ int key=0; sscanf(SSTR(ime->Key),"%d",&key); ime->KeyValue=key; }
+    }
+    elif(ime->DeviceType == LA_INPUT_DEVICE_JOYSTICK){ int key=0; sscanf(SSTR(ime->Key),"%d",&key); ime->KeyValue=key; }
     char* signal = SSTR(ime->Signal);
     laCustomSignal *cs=laFindSignal(signal); if(cs){ ime->SignalValue=cs->Signal; }else{ ime->SignalValue=0;}
 }
@@ -1795,13 +1806,24 @@ void laRemoveCustomSignal(laCustomSignal* cs){
 }
 
 void la_SendSignalEvent(SYSWINDOW* hwnd, int signal);
+void la_SendOperatorEvent(SYSWINDOW* hwnd, laOperatorType* at, int use_base, char* instructions);
+void la_SendInputMappingSignalsAuto(SYSWINDOW* hwnd, laInputMappingEntry* ime){
+    if(ime->UseOperator){ la_SendOperatorEvent(hwnd, ime->OperatorType, ime->OperatorBase, SSTR(ime->OperatorArguments)); }
+    else{ la_SendSignalEvent(hwnd, ime->SignalValue); }
+}
 void la_SendSignalsFromEvent(laEvent* e){
     laInputMapping* im = MAIN.InputMapping->CurrentInputMapping;
     if(!im){return;}
     for(laInputMappingEntry* ime = im->Entries.pFirst;ime;ime=ime->Item.pNext){
         if(e->type==LA_KEY_DOWN && ime->DeviceType == LA_INPUT_DEVICE_KEYBOARD){
             if(e->key == ime->KeyValue && e->SpecialKeyBit == ime->SpecialKeyBits){
-                la_SendSignalEvent(e->window->win,ime->SignalValue);
+                la_SendInputMappingSignalsAuto(e->window->win,ime);
+            }
+        }elif((e->type&LA_MOUSE_EVENT) && ime->DeviceType == LA_INPUT_DEVICE_MOUSE){
+            int matchkey; if(!(e->type&LA_KEY_MOUSE_SCROLL)){ matchkey = (e->type&ime->KeyValue); }
+            else{ matchkey= (e->type==(ime->KeyValue&LA_MOUSE_EVENT)); }
+            if(e->SpecialKeyBit == ime->SpecialKeyBits && matchkey){
+                la_SendInputMappingSignalsAuto(e->window->win,ime);
             }
         }
     }
@@ -2127,6 +2149,13 @@ void la_SendSignalEvent(SYSWINDOW* hwnd, int signal){
     e->key = signal;
     la_SaveEvent(hwnd, e, 1);
 };
+void la_SendOperatorEvent(SYSWINDOW* hwnd, laOperatorType* at, int use_base, char* instructions){
+    if(!at){ return; }
+    laEvent *e = memAcquireSimple(sizeof(laEvent));
+    e->type = LA_OPERATOR_EVENT;
+    e->Operator = at; e->OperatorBase = use_base; e->OperatorInstructions = instructions;
+    la_SaveEvent(hwnd, e, 1);
+};
 void laRetriggerOperators(){
     MAIN.ReTriggerOperators = 1;
 }
@@ -7117,6 +7146,14 @@ int laKeyMapExecuteEventEx(laOperator *from, laPropPack *UiExtra, laKeyMapper *k
     char *instructions;
     int inv = 0; int lx = -1, ly = -1;
     if(e->type==LA_MOUSEMOVE) return 0;
+    if(e->type == LA_OPERATOR_EVENT && e->OperatorBase){
+        if (e->OperatorBase == LA_KM_SEL_UI_EXTRA){
+            laInvokeP(from, e->Operator, e, UiExtra, e->OperatorInstructions, 0);
+        }elif (e->OperatorBase == LA_KM_SEL_PANEL){
+            laInvokeP(from, e->Operator, e, &((laPanel *)MAIN.ToPanel)->PP, e->OperatorInstructions, 0);
+        }
+        return 1;
+    }
     for (kmi = km->Items.pFirst; kmi; kmi = kmi->Item.pNext){
         if ((kmi->SpecialKeyBits == e->SpecialKeyBit||kmi->EventType==LA_SIGNAL_EVENT) &&
             kmi->EventType == e->type && ((kmi->Key == e->Input) || (kmi->Key == e->key))){

+ 1 - 1
resources/la_modelling.c

@@ -968,7 +968,7 @@ int OPMOD_Transformation(laOperator *a, laEvent *e){
         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_KEY_DOWN && e->key==LA_KEY_ESCAPE)){ ex->DrawCursor=0;
         la_CancelTransformObjects(td); laNotifyUsers("tns.world"); la_FreeTransformData(td); return LA_FINISHED;
     }
 

+ 21 - 3
resources/la_operators.c

@@ -647,7 +647,7 @@ int OPMOD_FileBrowser(laOperator *a, laEvent *e){
         }
     }
 
-    if (e->type == LA_ESCAPE_DOWN){
+    if (e->type == LA_KEY_DOWN && e->key==LA_KEY_ESCAPE){
         laConfirmInt(a, 0, LA_CONFIRM_CANCEL);
         return LA_FINISHED;
     }
@@ -1067,6 +1067,14 @@ int OPMOD_InputMappingEntrySelectKey(laOperator *a, laEvent *e){
         }
     }
     if(a->ConfirmData){
+        if(a->ConfirmData->Mode == laConfirmString){
+            a->ConfirmData->StrData;
+            strSafeSet(&ime->Key,SSTR(kdd->Str));
+            if(kdd->IsController){ ime->DeviceType = LA_INPUT_DEVICE_JOYSTICK; ime->Axis=kdd->Axis; ime->Button=kdd->Button; ime->JoystickDevice = kdd->Device; }
+            else{ ime->DeviceType = LA_INPUT_DEVICE_KEYBOARD; ime->KeyValue = kdd->Key; ime->SpecialKeyBits=kdd->SpecialKeyBit; }
+            laNotifyInstanceUsers(ime);
+            return LA_RUNNING_PASS;
+        }
         if(a->ConfirmData->Mode == LA_CONFIRM_OK){
             strSafeSet(&ime->Key,SSTR(kdd->Str));
             if(kdd->IsController){ ime->DeviceType = LA_INPUT_DEVICE_JOYSTICK; ime->Axis=kdd->Axis; ime->Button=kdd->Button; ime->JoystickDevice = kdd->Device; }
@@ -1457,7 +1465,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_KEY_DOWN && e->key==LA_KEY_ESCAPE) return LA_FINISHED;
     if (a->ConfirmData){
         if (!b) b = laDetectBlockRecursive(l->FirstBlock, e->x, e->y);
         if (!b) return LA_CANCELED;
@@ -1854,6 +1862,11 @@ int OPMOD_Window(laOperator *a, laEvent *e){
     if (!uid) uid = memAcquireSimple(sizeof(laGeneralUiExtraData));
     a->CustomData = uid;
 
+    if(e->type == LA_OPERATOR_EVENT && (!e->OperatorBase)){
+        laInvokeP(a, e->Operator, e, 0, e->OperatorInstructions, 0);
+        return LA_RUNNING;
+    }
+
     if(laKeyMapExecuteEvent(a, &MAIN.KeyMap, e)) return LA_RUNNING_PASS;
 
     if(w->IsDocking && MAIN.DockingPanel){
@@ -2019,6 +2032,11 @@ int OPMOD_Panel(laOperator *a, laEvent *e){
 
     int NoPrimaryUI=(p==MAIN.CurrentWindow->MaximizedUiPanel);
 
+    if(e->type == LA_OPERATOR_EVENT && e->OperatorBase==LA_KM_SEL_PANEL){
+        laInvokeP(a, e->Operator, e, &p->PP, e->OperatorInstructions, 0);
+        return LA_RUNNING;
+    }
+
     if(p->PanelTemplate && laKeyMapExecuteEvent(a, &p->PanelTemplate->KeyMap, e)) return RET;
 
     int IsTop=laIsTopPanel(p);
@@ -2133,7 +2151,7 @@ int OPMOD_MenuPanel(laOperator *a, laEvent *e){
         laDestroySinglePanel(p,0);
         return LA_FINISHED_PASS;
     }
-    if (e->type == LA_ESCAPE_DOWN || (e->type == LA_L_MOUSE_DOWN && !IsIn)){
+    if ((e->type == LA_KEY_DOWN && e->key==LA_KEY_ESCAPE) || (e->type == LA_L_MOUSE_DOWN && !IsIn)){
         laConfirmInt(a, 1, LA_CONFIRM_DATA);
         la_StopUiOperatorService(p);
         laDestroySinglePanel(p,0);

+ 2 - 0
resources/la_properties.c

@@ -867,6 +867,7 @@ void laset_InputMappingEntryOperatorString(laInputMappingEntry* ime, char* strin
     laOperatorType* at=laGetOperatorType(string);
     if(at){
         strSafeSet(&ime->OperatorName, at->Name);
+        ime->OperatorType = at;
     }else{
         strSafeDestroy(&ime->OperatorName);
     }
@@ -1860,6 +1861,7 @@ void la_RegisterInternalProps(){
             laAddEnumItemAs(ep, "DISABLED", "Disabled", "Entry disabled", 1, U'✗');
             ep=laAddEnumProperty(p,"device_type","Device Type","Device type of the input event",0,0,0,0,0,offsetof(laInputMappingEntry,DeviceType),0,0,0,0,0,0,0,0,0,0);
             laAddEnumItemAs(ep, "KEYBOARD", "Keyboard", "Keyboard input", LA_INPUT_DEVICE_KEYBOARD, U'🖮');
+            laAddEnumItemAs(ep, "MOUSE", "Mouse", "Mouse input", LA_INPUT_DEVICE_MOUSE, U'🖱');
             laAddEnumItemAs(ep, "JOYSTICK", "Joystick", "Joystick input", LA_INPUT_DEVICE_JOYSTICK, U'🕹');
             laAddIntProperty(p,"joystick_device","Joystick Device","Joystick device number",0,0,0,0,0,0,0,0,offsetof(laInputMappingEntry,JoystickDevice),0,0,0,0,0,0,0,0,0,0,0);
             laAddStringProperty(p,"key","Key","Event key",0,0,0,0,1,offsetof(laInputMappingEntry,Key),0,0,laset_InputMappingEntryKeyString,0,0);

+ 1 - 1
resources/la_widgets.c

@@ -2788,7 +2788,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_KEY_DOWN && e->key==LA_KEY_ESCAPE) || 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;