Mercurial > audlegacy-plugins
diff src/evdev-plug/ed_bindings_store.c @ 422:5e46b57d1eda trunk
[svn] - added evdev-plug, written-from-scratch plugin that allows to control the player via event devices on linux systems
author | giacomo |
---|---|
date | Sun, 14 Jan 2007 17:55:24 -0800 |
parents | |
children | 581a057768c2 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/evdev-plug/ed_bindings_store.c Sun Jan 14 17:55:24 2007 -0800 @@ -0,0 +1,137 @@ +/* +* +* Author: Giacomo Lozito <james@develia.org>, (C) 2005-2007 +* +* This program is free software; you can redistribute it and/or modify it +* under the terms of the GNU General Public License as published by the +* Free Software Foundation; either version 2 of the License, or (at your +* option) any later version. +* +* This program is distributed in the hope that it will be useful, but +* WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* General Public License for more details. +* +* You should have received a copy of the GNU General Public License along +* with this program; if not, write to the Free Software Foundation, Inc., +* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +*/ + +#include "ed_bindings_store.h" +#include "ed_common.h" +#include <stdlib.h> + + +/* currently, the bindings store is implemented as a string-based Hash Table; + however, a change of implementation would only require to re-write the + public API defined in this source file; + the rest of the code in EvDev-Plug doesn't care about the + implementation at all, and access it in a transparent fashion */ + + +gpointer +ed_bindings_store_new ( void ) +{ + GHashTable *hashtable = g_hash_table_new_full( g_str_hash , g_str_equal , g_free , NULL ); + return hashtable; +} + + +/* associate a triplet ev_type:ev_code:ev_value + (identifying an input event) to an action code in our bindings store; + bindings store should keep its own copy of ed_inputevent_t objects! */ +gint +ed_bindings_store_insert ( gpointer hashtable_gp , + ed_inputevent_t * inputev , + gint action_code ) +{ + gchar *input_str; + input_str = g_strdup_printf( "%i:%i:%i" , inputev->type , inputev->code , inputev->value ); + g_hash_table_insert( (GHashTable*)hashtable_gp , input_str , GINT_TO_POINTER(action_code) ); + + DEBUGMSG( "storing code %i -> event: %i:%i:%i\n" , + action_code , inputev->type, inputev->code, inputev->value ); + return 0; +} + + +typedef struct +{ + ed_bindings_store_foreach_func callback; + gpointer data1; + gpointer data2; +} +hashfunc_foreach_container_t; + +static void +hashfunc_foreach( gpointer key , gpointer value , gpointer container_gp ) +{ + hashfunc_foreach_container_t *container = container_gp; + ed_inputevent_t inputev; + gchar **toks; + + /* convert key (it's a string in the "type:code:value" form) back to ed_inputevent_t object */ + toks = g_strsplit( (gchar*)key , ":" , 3 ); + inputev.type = atoi( toks[0] ); + inputev.code = atoi( toks[1] ); + inputev.value = atoi( toks[2] ); + g_strfreev( toks ); + + container->callback( &inputev , GPOINTER_TO_INT(value) , container->data1 , container->data2 ); + return; +} + +gint +ed_bindings_store_foreach ( gpointer hashtable_gp , + ed_bindings_store_foreach_func callback , + gpointer user_data1 , + gpointer user_data2 ) +{ + hashfunc_foreach_container_t *container = g_malloc(sizeof(hashfunc_foreach_container_t)); + container->callback = callback; + container->data1 = user_data1; + container->data2 = user_data2; + g_hash_table_foreach( (GHashTable*)hashtable_gp , hashfunc_foreach , container ); + g_free( container ); +} + + +guint +ed_bindings_store_size ( gpointer hashtable_gp ) +{ + return g_hash_table_size( (GHashTable*)hashtable_gp ); +} + + +gboolean +ed_bindings_store_lookup( gpointer hashtable_gp , + ed_inputevent_t * inputev , + gint * action_code ) +{ + gpointer p; + gchar *input_str; + + input_str = g_strdup_printf( "%i:%i:%i" , inputev->type , inputev->code , inputev->value ); + + if ( g_hash_table_lookup_extended( (GHashTable*)hashtable_gp , input_str , NULL , &p ) == TRUE ) + { + *action_code = GPOINTER_TO_INT(p); + g_free( input_str ); + return TRUE; + } + else + { + g_free( input_str ); + return FALSE; + } +} + + +gint +ed_bindings_store_delete ( gpointer hashtable_gp ) +{ + if ( hashtable_gp != NULL ) + g_hash_table_destroy( hashtable_gp ); + return 0; +}