changeset 4842:b048e303e8f1

Really take tab as a space in cmd parsing. Now config file override the defaults bindings :)
author albeu
date Sun, 24 Feb 2002 16:31:27 +0000
parents 5928e94c0d5f
children 00c875a22d10
files input/input.c
diffstat 1 files changed, 72 insertions(+), 19 deletions(-) [+]
line wrap: on
line diff
--- a/input/input.c	Sun Feb 24 16:28:44 2002 +0000
+++ b/input/input.c	Sun Feb 24 16:31:27 2002 +0000
@@ -209,7 +209,7 @@
 } mp_input_fd_t;
 
 
-static mp_cmd_bind_t* cmd_binds = def_cmd_binds;
+static mp_cmd_bind_t* cmd_binds = NULL;
 
 static mp_input_fd_t key_fds[MP_MAX_KEY_FD];
 static unsigned int num_key_fd = 0;
@@ -337,8 +337,9 @@
   assert(str != NULL);
 #endif
 
-  ptr = strchr(str,' ');
-  if(ptr)
+  for(ptr = str ; ptr[0] != '\0'  && ptr[0] != '\t' && ptr[0] != ' ' ; ptr++)
+    /* NOTHING */;
+  if(ptr[0] != '\0')
     l = ptr-str;
   else
     l = strlen(str);
@@ -498,31 +499,44 @@
     return MP_INPUT_NOTHING;
 }
 
-static mp_cmd_t*
-mp_input_get_cmd_from_keys(int n,int* keys, int paused) {
+static char*
+mp_input_find_bind_for_key(mp_cmd_bind_t* binds, int n,int* keys) {
   int j;
-  // In pause mode we return pause for the first key wich come
-  if(paused)
-    return mp_input_parse_cmd("pause");
-  for(j = 0; cmd_binds[j].cmd != NULL; j++) {
+
+  for(j = 0; binds[j].cmd != NULL; j++) {
     if(n > 0) {
       int found = 1,s;
-      for(s = 0; s < n && cmd_binds[j].input[s] != 0; s++) {
-	if(cmd_binds[j].input[s] != keys[s]) {
+      for(s = 0; s < n && binds[j].input[s] != 0; s++) {
+	if(binds[j].input[s] != keys[s]) {
 	  found = 0;
 	  break;
 	}
       }
-      if(found && cmd_binds[j].input[s] == 0 && s == n)
+      if(found && binds[j].input[s] == 0 && s == n)
 	break;
       else
 	continue;
     } else if(n == 1){
-      if(cmd_binds[j].input[0] == keys[0] && cmd_binds[j].input[1] == 0)
+      if(binds[j].input[0] == keys[0] && binds[j].input[1] == 0)
 	break;
     }
   }
-  if(cmd_binds[j].cmd == NULL) {
+  return binds[j].cmd;
+}
+
+static mp_cmd_t*
+mp_input_get_cmd_from_keys(int n,int* keys, int paused) {
+  char* cmd = NULL;
+  // In pause mode we return pause for the first key wich come
+  if(paused)
+    return mp_input_parse_cmd("pause");
+
+  if(cmd_binds)
+    cmd = mp_input_find_bind_for_key(cmd_binds,n,keys);
+  if(cmd == NULL)
+    cmd = mp_input_find_bind_for_key(def_cmd_binds,n,keys);
+
+  if(cmd == NULL) {
     printf("No bind found for key %s",mp_input_get_key_name(keys[0]));
     if(n > 1) {
       int s;
@@ -532,7 +546,7 @@
     printf("                         \n");
     return NULL;
   }
-  return  mp_input_parse_cmd(cmd_binds[j].cmd);
+  return  mp_input_parse_cmd(cmd);
 }
 
 static mp_cmd_t*
@@ -646,6 +660,15 @@
     } 
     // We ignore key from last combination
     ret = last_key_down ? mp_input_get_cmd_from_keys(num_key_down,key_down,paused) : NULL;
+    if(last_key_down && !ret) {     
+      printf("Invalid command for binded key %s",mp_input_get_key_name(key_down[0]));
+      if(  num_key_down > 1) {
+	unsigned int s;
+	for(s=1; s < num_key_down; s++)
+	  printf("-%s",mp_input_get_key_name(key_down[s]));
+      }
+      printf("             \n");
+    }
     // Remove the key
     if(j+1 < num_key_down)
       memmove(&key_down[j],&key_down[j+1],(num_key_down-(j+1))*sizeof(int));
@@ -902,6 +925,39 @@
   return 1;
 }
 
+void
+mp_input_bind_keys(int keys[MP_MAX_KEY_DOWN+1], char* cmd) {
+  int i = 0,j;
+  mp_cmd_bind_t* bind = NULL;
+
+#ifdef MP_DEBUG
+  assert(keys != NULL);
+  assert(cmd != NULL);
+#endif
+
+  if(cmd_binds) {
+    for(i = 0; cmd_binds[i].cmd != NULL ; i++) {
+      for(j = 0 ; cmd_binds[i].input[j] == keys[j]  && keys[j] != 0 ; j++)
+	/* NOTHING */;
+      if(keys[j] == 0 && cmd_binds[i].input[j] == 0 ) {
+	bind = &cmd_binds[i];
+	break;
+      }
+    }
+  }
+  
+  if(!bind) {
+    cmd_binds = (mp_cmd_bind_t*)realloc(cmd_binds,(i+2)*sizeof(mp_cmd_bind_t));
+    memset(&cmd_binds[i],0,2*sizeof(mp_cmd_bind_t));
+    bind = &cmd_binds[i];
+  }
+  if(bind->cmd)
+    free(bind->cmd);
+  bind->cmd = strdup(cmd);
+  memcpy(bind->input,keys,MP_MAX_KEY_DOWN+1);
+}
+
+
 static void
 mp_input_free_binds(mp_cmd_bind_t* binds) {
   int i;
@@ -1058,11 +1114,8 @@
 	strncpy(cmd,iter,end-iter);
 	cmd[end-iter] = '\0';
 	//printf("Set bind %d => %s\n",code,cmd);
-	binds = (mp_cmd_bind_t*)realloc(binds,(n_binds+2)*sizeof(mp_cmd_bind_t));
-	memcpy(&binds[n_binds].input,keys,MP_MAX_KEY_DOWN+1);
-	binds[n_binds].cmd = strdup(cmd);
+	mp_input_bind_keys(keys,cmd);
 	n_binds++;
-	memset(&binds[n_binds],0,sizeof(mp_cmd_bind_t));
       }
       keys[0] = 0;
       end++;