Revert "Revert "use mapping between vims id and keybinding to avoid iteration""

This reverts commit 642fac48cf.
This commit is contained in:
c0ntrol
2018-12-29 18:38:51 +01:00
parent 642fac48cf
commit c88c703c84

View File

@@ -128,11 +128,12 @@ typedef struct
} vj_keyboard_event; } vj_keyboard_event;
static hash_t *keyboard_events = NULL; static hash_t *keyboard_events = NULL;
static hash_t *keyboard_eventid_map = NULL;
// WARNING size depend on this formula (modifier * SDLK_LAST) + key
// FIXME should be max modifier value when modifier combinaison possible ? // maximum number of key combinations
// here : 15 * 330 + 330 = 5280 + align*1024 #define MAX_KEY_MNE (SDLK_LAST * 16)
static vj_keyboard_event *keyboard_event_map_[6144]; static vj_keyboard_event *keyboard_event_map_[MAX_KEY_MNE];
typedef struct typedef struct
{ {
@@ -865,11 +866,15 @@ int keyboard_event_exists(int id)
static void destroy_keyboard_event( vj_keyboard_event *ev ) static void destroy_keyboard_event( vj_keyboard_event *ev )
{ {
if( ev ) { if( ev ) {
if( ev->vims ) if( ev->vims ) {
free( ev->vims ); free( ev->vims );
}
if( ev->arguments ) if( ev->arguments ) {
free( ev->arguments ); free( ev->arguments );
}
memset(ev, 0, sizeof(vj_keyboard_event));
free(ev); free(ev);
} }
@@ -2172,8 +2177,6 @@ void vj_event_read_file( void *ptr, const char format[], va_list ap )
vims_key_list *vj_event_get_keys( int event_id ) vims_key_list *vj_event_get_keys( int event_id )
{ {
vims_key_list *list = vj_calloc( sizeof(vims_key_list)); vims_key_list *list = vj_calloc( sizeof(vims_key_list));
vims_key_list *tree = list;
vims_key_list *next = NULL;
if ( event_id >= VIMS_BUNDLE_START && event_id < VIMS_BUNDLE_END ) if ( event_id >= VIMS_BUNDLE_START && event_id < VIMS_BUNDLE_END )
{ {
if( vj_event_bundle_exists( event_id )) if( vj_event_bundle_exists( event_id ))
@@ -2187,30 +2190,25 @@ vims_key_list *vj_event_get_keys( int event_id )
} }
return list; return list;
} }
#ifdef ARCH_X86_64
uint64_t eid = (uint64_t) event_id;
#else
uint32_t eid = (uint32_t) event_id;
#endif
hnode_t *node = hash_lookup(keyboard_eventid_map, (void*) eid);
if(node == NULL) {
return list;
}
if(!hash_isempty( keyboard_events )) vj_keyboard_event *ev = hnode_get( node );
{ if(ev)
hscan_t scan; {
hash_scan_begin( &scan, keyboard_events ); list->key_symbol = ev->key_symbol;
hnode_t *node; list->key_mod = ev->key_mod;
while( ( node = hash_scan_next(&scan)) != NULL ) list->args = ev->arguments;
{ list->arg_len = ev->arg_len;
vj_keyboard_event *ev = NULL; }
ev = hnode_get( node );
if(ev && ev->event_id == event_id)
{
next = vj_calloc( sizeof(vims_key_list));
tree->key_symbol = ev->key_symbol;
tree->key_mod = ev->key_mod;
tree->args = ev->arguments;
tree->arg_len = ev->arg_len;
tree->next = next;
tree = next;
}
}
}
return list; return list;
} }
@@ -2311,8 +2309,10 @@ int vj_event_register_keyb_event(int event_id, int symbol, int modifier, con
#ifdef ARCH_X86_64 #ifdef ARCH_X86_64
uint64_t tid = (uint64_t) index; uint64_t tid = (uint64_t) index;
uint64_t eid = (uint64_t) ev->event_id;
#else #else
uint32_t tid = (uint32_t) index; uint32_t tid = (uint32_t) index;
uint32_t eid = (uint32_t) ev->event_id;
#endif #endif
hnode_t *old = hash_lookup( keyboard_events, (void*) tid ); hnode_t *old = hash_lookup( keyboard_events, (void*) tid );
@@ -2320,8 +2320,17 @@ int vj_event_register_keyb_event(int event_id, int symbol, int modifier, con
hash_delete( keyboard_events, old ); hash_delete( keyboard_events, old );
} }
old = hash_lookup( keyboard_eventid_map, (void*) eid );
if(old) {
hash_delete( keyboard_eventid_map, old );
}
//register keybinding by index (SDLK key mne)
hash_insert( keyboard_events, node, (void*) tid ); hash_insert( keyboard_events, node, (void*) tid );
//register keybinding by event id
hash_insert( keyboard_eventid_map, node, (void*) eid );
return 1; return 1;
} }
#endif #endif
@@ -2424,11 +2433,15 @@ void vj_event_init(void *ptr)
#endif #endif
vj_init_vevo_events(); vj_init_vevo_events();
#ifdef HAVE_SDL #ifdef HAVE_SDL
if( !(keyboard_events = hash_create( HASHCOUNT_T_MAX, int_bundle_compare, int_bundle_hash))) if( !(keyboard_events = hash_create( MAX_KEY_MNE, int_bundle_compare, int_bundle_hash)))
{ {
veejay_msg(VEEJAY_MSG_ERROR, "Cannot initialize hash for keyboard events"); veejay_msg(VEEJAY_MSG_ERROR, "Cannot initialize hash for keyboard events");
return; return;
} }
if( !(keyboard_eventid_map = hash_create( MAX_KEY_MNE, int_bundle_compare, int_bundle_hash))) {
veejay_msg(VEEJAY_MSG_ERROR, "Cannot creating mapping between keyboard events and VIMS event identifiers");
return;
}
#endif #endif
for(i=0; i < VIMS_MAX; i++) for(i=0; i < VIMS_MAX; i++)
{ {
@@ -2436,7 +2449,7 @@ void vj_event_init(void *ptr)
net_list[i].list_id = 0; net_list[i].list_id = 0;
} }
if( !(BundleHash = hash_create(HASHCOUNT_T_MAX, int_bundle_compare, int_bundle_hash))) if( !(BundleHash = hash_create(MAX_KEY_MNE, int_bundle_compare, int_bundle_hash)))
{ {
veejay_msg(VEEJAY_MSG_ERROR, "Cannot initialize hashtable for message bundles"); veejay_msg(VEEJAY_MSG_ERROR, "Cannot initialize hashtable for message bundles");
return; return;
@@ -2489,7 +2502,7 @@ static void vj_event_destroy_bundles( hash_t *h )
void vj_event_destroy() void vj_event_destroy()
{ {
#ifdef HAVE_SDL #ifdef HAVE_SDL
if(keyboard_events) vj_event_destroy_hash( keyboard_events ); //let's not destroy keyboard mappings, we are shutting down anyway so why bother
#endif #endif
if(BundleHash) vj_event_destroy_bundles( BundleHash ); if(BundleHash) vj_event_destroy_bundles( BundleHash );