[PD-cvs] externals/hcs/hid hid_linux.c,1.13,1.14

IOhannes m zmölnig zmoelnig at users.sourceforge.net
Thu Apr 6 18:50:46 CEST 2006


Update of /cvsroot/pure-data/externals/hcs/hid
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv12154

Modified Files:
	hid_linux.c 
Log Message:

wow! how did this object survive that long with event_names restricted to 7 characters and simply ignoring this when writing to the memory?
I exchanged (char hid_name[7]) by (t_symbol* hid_name), so now we can have event_names of arbitrary length without crashing.
furthermore i prepend "key_" to Georg's key_names and made them static, so we don't have to do this each time we need one of them...


Index: hid_linux.c
===================================================================
RCS file: /cvsroot/pure-data/externals/hcs/hid/hid_linux.c,v
retrieving revision 1.13
retrieving revision 1.14
diff -C2 -d -r1.13 -r1.14
*** hid_linux.c	25 Jan 2006 08:40:35 -0000	1.13
--- hid_linux.c	6 Apr 2006 16:50:42 -0000	1.14
***************
*** 44,49 ****
  /* ------------------------------------------------------------------------------ */
  
! void hid_convert_linux_buttons_to_numbers(__u16 linux_code, char *hid_code)
  {
      if(linux_code >= 0x100) 
      {
--- 44,62 ----
  /* ------------------------------------------------------------------------------ */
  
! /* JMZ: i changed the convert functions (and the get-event function too!) to return
!  * t_symbol* instead of writing into a fixed-sized buffer (which was way too
!  * small and those made this object crash)
!  * in order to change as little lines as possible the callback functions to the
!  * hid-object still use (char*): so we convert a char[] into a symbol and then 
!  * extract the (char*) out of it to make it a symbol again
!  * LATER: use t_symbol's all over, since it is very flexible (with respect to length)
!  * and sooner or later the strings are converted to t_symbol anyhow...
!  *
!  * Why? bug-fixing
!  */
! 
! t_symbol* hid_convert_linux_buttons_to_numbers(__u16 linux_code)
  {
+   char hid_code[10];
      if(linux_code >= 0x100) 
      {
***************
*** 60,115 ****
          else if(linux_code < KEY_OK)
              sprintf(hid_code,"btn_%d",linux_code - BTN_WHEEL);  /* wheel buttons */
      }
  }
  
  /* Georg Holzmann: implementation of the keys */
! void hid_convert_linux_keys(__u16 linux_code, char *hid_code)
  {  
      if(linux_code > 226)
!         return;
!   
      /*         quick hack to get the keys         */
      /* (in future this should be auto-generated)  */
  
!     char key_names[227][20] =
          { 
!             "reserved", "esc", "1", "2", "3", "4", "5", "6", "7",
!             "8", "9", "0", "minus", "equal", "backspace", "tab",
!             "q", "w", "e", "r", "t", "y", "u", "i", "o", "p",
!             "leftbrace", "rightbrace", "enter", "leftctrl", "a",
!             "s", "d", "f", "g", "h", "j", "k", "l", "semicolon",
!             "apostrophe", "grave", "leftshift", "backslash", "z",
!             "x", "c", "v", "b", "n", "m", "comma", "dot", "slash",
!             "rightshift", "kpasterisk", "leftalt", "space", "capslock",
!             "f1", "f2", "f3", "f4", "f5", "f6", "f7", "f8", "f9", "f10",
!             "numlock", "scrolllock", "kp7", "kp8", "kp9", "kpminus",
!             "kp4", "kp5", "kp6", "kpplus", "kp1", "kp2", "kp3", "kp3",  "kpdot",
!             "103rd", "f13", "102nd", "f11", "f12", "f14", "f15", "f16",
!             "f17", "f18", "f19", "f20", "kpenter", "rightctrl", "kpslash",
!             "sysrq", "rightalt", "linefeed", "home", "up", "pageup", "left",
!             "right", "end", "down", "pagedown", "insert", "delete", "macro",
!             "mute", "volumedown", "volumeup", "power", "kpequal", "kpplusminus",
!             "pause", "f21", "f22", "f23", "f24", "kpcomma", "leftmeta",
!             "rightmeta", "compose",
      
!             "stop", "again", "props", "undo", "front", "copy", "open",
!             "paste", "find", "cut", "help", "menu", "calc", "setup", "sleep", "wakeup",
!             "file", "sendfile", "deletefile", "xfer", "prog1", "prog2", "www",
!             "msdos", "coffee", "direction", "cyclewindows", "mail", "bookmarks",
!             "computer", "back", "forward", "colsecd", "ejectcd", "ejectclosecd",
!             "nextsong", "playpause", "previoussong", "stopcd", "record",
!             "rewind", "phone", "iso", "config", "homepage", "refresh", "exit",
!             "move", "edit", "scrollup", "scrolldown", "kpleftparen", "kprightparen",
      
!             "intl1", "intl2", "intl3", "intl4", "intl5", "intl6", "intl7",
!             "intl8", "intl9", "lang1", "lang2", "lang3", "lang4", "lang5",
!             "lang6", "lang7", "lang8", "lang9", "playcd", "pausecd", "prog3",
!             "prog4", "suspend", "close", "play", "fastforward", "bassboost",
!             "print", "hp", "camera", "sound", "question", "email", "chat",
!             "search", "connect", "finance", "sport", "shop", "alterase",
!             "cancel", "brightnessdown", "brightnessup", "media"
          };
!   
!     sprintf(hid_code,"key_%s",key_names[linux_code]);
  }
  
--- 73,132 ----
          else if(linux_code < KEY_OK)
              sprintf(hid_code,"btn_%d",linux_code - BTN_WHEEL);  /* wheel buttons */
+ 	else return 0;
      }
+     return gensym(hid_code);
  }
  
  /* Georg Holzmann: implementation of the keys */
! /* JMZ: use t_symbol instead of char[] (s.a.) AND 
!  * appended "key_" in the array so we don't have to append it each time AND
!  * made the table static
!  */
! t_symbol* hid_convert_linux_keys(__u16 linux_code)
  {  
      if(linux_code > 226)
!         return 0;
      /*         quick hack to get the keys         */
      /* (in future this should be auto-generated)  */
  
!     static char key_names[227][20] =
          { 
!             "key_reserved", "key_esc", "key_1", "key_2", "key_3", "key_4", "key_5", "key_6", "key_7",
!             "key_8", "key_9", "key_0", "key_minus", "key_equal", "key_backspace", "key_tab",
!             "key_q", "key_w", "key_e", "key_r", "key_t", "key_y", "key_u", "key_i", "key_o", "key_p",
!             "key_leftbrace", "key_rightbrace", "key_enter", "key_leftctrl", "key_a",
!             "key_s", "key_d", "key_f", "key_g", "key_h", "key_j", "key_k", "key_l", "key_semicolon",
!             "key_apostrophe", "key_grave", "key_leftshift", "key_backslash", "key_z",
!             "key_x", "key_c", "key_v", "key_b", "key_n", "key_m", "key_comma", "key_dot", "key_slash",
!             "key_rightshift", "key_kpasterisk", "key_leftalt", "key_space", "key_capslock",
!             "key_f1", "key_f2", "key_f3", "key_f4", "key_f5", "key_f6", "key_f7", "key_f8", "key_f9", "key_f10",
!             "key_numlock", "key_scrolllock", "key_kp7", "key_kp8", "key_kp9", "key_kpminus",
!             "key_kp4", "key_kp5", "key_kp6", "key_kpplus", "key_kp1", "key_kp2", "key_kp3", "key_kp3",  "key_kpdot",
!             "key_103rd", "key_f13", "key_102nd", "key_f11", "key_f12", "key_f14", "key_f15", "key_f16",
!             "key_f17", "key_f18", "key_f19", "key_f20", "key_kpenter", "key_rightctrl", "key_kpslash",
!             "key_sysrq", "key_rightalt", "key_linefeed", "key_home", "key_up", "key_pageup", "key_left",
!             "key_right", "key_end", "key_down", "key_pagedown", "key_insert", "key_delete", "key_macro",
!             "key_mute", "key_volumedown", "key_volumeup", "key_power", "key_kpequal", "key_kpplusminus",
!             "key_pause", "key_f21", "key_f22", "key_f23", "key_f24", "key_kpcomma", "key_leftmeta",
!             "key_rightmeta", "key_compose",
      
!             "key_stop", "key_again", "key_props", "key_undo", "key_front", "key_copy", "key_open",
!             "key_paste", "key_find", "key_cut", "key_help", "key_menu", "key_calc", "key_setup", "key_sleep", "key_wakeup",
!             "key_file", "key_sendfile", "key_deletefile", "key_xfer", "key_prog1", "key_prog2", "key_www",
!             "key_msdos", "key_coffee", "key_direction", "key_cyclewindows", "key_mail", "key_bookmarks",
!             "key_computer", "key_back", "key_forward", "key_colsecd", "key_ejectcd", "key_ejectclosecd",
!             "key_nextsong", "key_playpause", "key_previoussong", "key_stopcd", "key_record",
!             "key_rewind", "key_phone", "key_iso", "key_config", "key_homepage", "key_refresh", "key_exit",
!             "key_move", "key_edit", "key_scrollup", "key_scrolldown", "key_kpleftparen", "key_kprightparen",
      
!             "key_intl1", "key_intl2", "key_intl3", "key_intl4", "key_intl5", "key_intl6", "key_intl7",
!             "key_intl8", "key_intl9", "key_lang1", "key_lang2", "key_lang3", "key_lang4", "key_lang5",
!             "key_lang6", "key_lang7", "key_lang8", "key_lang9", "key_playcd", "key_pausecd", "key_prog3",
!             "key_prog4", "key_suspend", "key_close", "key_play", "key_fastforward", "key_bassboost",
!             "key_print", "key_hp", "key_camera", "key_sound", "key_question", "key_email", "key_chat",
!             "key_search", "key_connect", "key_finance", "key_sport", "key_shop", "key_alterase",
!             "key_cancel", "key_brightnessdown", "key_brightnessup", "key_media"
          };
!     return gensym(key_names[linux_code]);
  }
  
***************
*** 175,185 ****
                      if ((i == EV_KEY) && (j >= BTN_MISC) && (j < KEY_OK) )
                      {
!                         char hid_code[7];
!                         hid_convert_linux_buttons_to_numbers(j,hid_code);
!                         post("  %s\t%s\t%s",
                               ev[i] ? ev[i] : "?", 
!                              hid_code,
                               event_names[i] ? (event_names[i][j] ? event_names[i][j] : "?") : "?");
!                     }
                      else if (i != EV_SYN)
                      {
--- 192,203 ----
                      if ((i == EV_KEY) && (j >= BTN_MISC) && (j < KEY_OK) )
                      {
! 			t_symbol*hid_codesym=hid_convert_linux_buttons_to_numbers(j);
! 			if(hid_codesym){
! 			  post("  %s\t%s\t%s",
                               ev[i] ? ev[i] : "?", 
!                              hid_codesym->s_name,
                               event_names[i] ? (event_names[i][j] ? event_names[i][j] : "?") : "?");
! 			}
! 		    }
                      else if (i != EV_SYN)
                      {
***************
*** 338,342 ****
      DEBUG(t_int event_counter = 0;);
  
!     char hid_code[7];
  
  /* this will go into the generic read function declared in hid.h and
--- 356,360 ----
      DEBUG(t_int event_counter = 0;);
  
!     t_symbol*hid_code=0;
  
  /* this will go into the generic read function declared in hid.h and
***************
*** 349,356 ****
      while( read (x->x_fd, &(hid_input_event), sizeof(struct input_event)) > -1 )
      {
          if( hid_input_event.type == EV_KEY )
          {
!             hid_convert_linux_buttons_to_numbers(hid_input_event.code,hid_code);
!             hid_convert_linux_keys(hid_input_event.code,hid_code);
          }
          else if( hid_input_event.type == EV_SYN )
--- 367,379 ----
      while( read (x->x_fd, &(hid_input_event), sizeof(struct input_event)) > -1 )
      {
+         hid_code=0;
          if( hid_input_event.type == EV_KEY )
          {
! 	  /* JMZ: originally both functions were called, the latter evtl. overwriting
! 	   * the former; now i only call the latter if the former does not return 
! 	   * a valid result
! 	   */
! 	  if(!(hid_code=hid_convert_linux_buttons_to_numbers(hid_input_event.code)))
!             hid_code=hid_convert_linux_keys(hid_input_event.code);
          }
          else if( hid_input_event.type == EV_SYN )
***************
*** 360,372 ****
          else if( event_names[hid_input_event.type][hid_input_event.code] != NULL )
          {
!             strcpy(hid_code, event_names[hid_input_event.type][hid_input_event.code]);
          }
          else 
          {
!             strcpy(hid_code, "unknown");
          }
! 		
!         if( hid_input_event.type != EV_SYN )
!             hid_output_event(x, ev[hid_input_event.type], hid_code, 
                               (t_float)hid_input_event.value);
          DEBUG(++event_counter;);
--- 383,394 ----
          else if( event_names[hid_input_event.type][hid_input_event.code] != NULL )
          {
! 	  hid_code=gensym(event_names[hid_input_event.type][hid_input_event.code]);
          }
          else 
          {
! 	  hid_code=gensym("unknown");
          }
!         if( hid_code && hid_input_event.type != EV_SYN )
!             hid_output_event(x, ev[hid_input_event.type], hid_code->s_name, 
                               (t_float)hid_input_event.value);
          DEBUG(++event_counter;);





More information about the Pd-cvs mailing list