aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIOhannes m zmölnig <zmoelnig@users.sourceforge.net>2006-04-06 16:50:42 +0000
committerIOhannes m zmölnig <zmoelnig@users.sourceforge.net>2006-04-06 16:50:42 +0000
commit30b29d5e76f9907ca4d691fd2ab8e4bc07c020da (patch)
treea9b1d40f10bc19c9357eb6b294e9a7c189c36d09
parente208ff26e3ac63946064d22dd77f0511d93f9492 (diff)
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... svn path=/trunk/externals/hcs/hid/; revision=4823
-rw-r--r--hid_linux.c128
1 files changed, 75 insertions, 53 deletions
diff --git a/hid_linux.c b/hid_linux.c
index 3a83a36..c1dab26 100644
--- a/hid_linux.c
+++ b/hid_linux.c
@@ -43,8 +43,21 @@
/* LINUX-SPECIFIC SUPPORT FUNCTIONS */
/* ------------------------------------------------------------------------------ */
-void hid_convert_linux_buttons_to_numbers(__u16 linux_code, char *hid_code)
+/* 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)
{
if(linux_code < BTN_MOUSE)
@@ -59,58 +72,62 @@ void hid_convert_linux_buttons_to_numbers(__u16 linux_code, char *hid_code)
sprintf(hid_code,"btn_%d",linux_code - BTN_DIGI); /* tablet buttons */
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 */
-void hid_convert_linux_keys(__u16 linux_code, char *hid_code)
+/* 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;
-
+ return 0;
/* quick hack to get the keys */
/* (in future this should be auto-generated) */
- char key_names[227][20] =
+ static 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",
+ "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",
- "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",
+ "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",
- "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"
+ "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"
};
-
- sprintf(hid_code,"key_%s",key_names[linux_code]);
+ return gensym(key_names[linux_code]);
}
void hid_print_element_list(t_hid *x)
@@ -174,13 +191,14 @@ void hid_print_element_list(t_hid *x)
{
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",
+ 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_code,
+ hid_codesym->s_name,
event_names[i] ? (event_names[i][j] ? event_names[i][j] : "?") : "?");
- }
+ }
+ }
else if (i != EV_SYN)
{
post(" %s\t%s\t%s",
@@ -337,7 +355,7 @@ t_int hid_get_events(t_hid *x)
/* for debugging, counts how many events are processed each time hid_read() is called */
DEBUG(t_int event_counter = 0;);
- char hid_code[7];
+ t_symbol*hid_code=0;
/* this will go into the generic read function declared in hid.h and
* implemented in hid_linux.c
@@ -348,10 +366,15 @@ t_int hid_get_events(t_hid *x)
while( read (x->x_fd, &(hid_input_event), sizeof(struct input_event)) > -1 )
{
+ hid_code=0;
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);
+ /* 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 )
{
@@ -359,15 +382,14 @@ t_int hid_get_events(t_hid *x)
}
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]);
+ hid_code=gensym(event_names[hid_input_event.type][hid_input_event.code]);
}
else
{
- strcpy(hid_code, "unknown");
+ hid_code=gensym("unknown");
}
-
- if( hid_input_event.type != EV_SYN )
- hid_output_event(x, ev[hid_input_event.type], hid_code,
+ 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;);
}