Commit 06005e87 authored by Edward Wang's avatar Edward Wang Committed by Rafaël Carré

xcb: fix some memory leaks

According to xcb docs, we are responsible for freeing this memory.
Signed-off-by: default avatarRafaël Carré <funman@videolan.org>
parent 7d7890ed
...@@ -181,10 +181,17 @@ static unsigned GetModifier( xcb_connection_t *p_connection, xcb_key_symbols_t * ...@@ -181,10 +181,17 @@ static unsigned GetModifier( xcb_connection_t *p_connection, xcb_key_symbols_t *
if( sym == 0 ) if( sym == 0 )
return 0; /* no modifier */ return 0; /* no modifier */
const xcb_keycode_t *p_keys = xcb_key_symbols_get_keycode( p_symbols, sym ); xcb_get_modifier_mapping_cookie_t r =
if( !p_keys ) xcb_get_modifier_mapping( p_connection );
xcb_get_modifier_mapping_reply_t *p_map =
xcb_get_modifier_mapping_reply( p_connection, r, NULL );
if( !p_map )
return 0; return 0;
xcb_keycode_t *p_keys = xcb_key_symbols_get_keycode( p_symbols, sym );
if( !p_keys )
goto end;
int i = 0; int i = 0;
bool no_modifier = true; bool no_modifier = true;
while( p_keys[i] != XCB_NO_SYMBOL ) while( p_keys[i] != XCB_NO_SYMBOL )
...@@ -198,28 +205,24 @@ static unsigned GetModifier( xcb_connection_t *p_connection, xcb_key_symbols_t * ...@@ -198,28 +205,24 @@ static unsigned GetModifier( xcb_connection_t *p_connection, xcb_key_symbols_t *
} }
if( no_modifier ) if( no_modifier )
return 0; goto end;
xcb_get_modifier_mapping_cookie_t r =
xcb_get_modifier_mapping( p_connection );
xcb_get_modifier_mapping_reply_t *p_map =
xcb_get_modifier_mapping_reply( p_connection, r, NULL );
if( !p_map )
return 0;
xcb_keycode_t *p_keycode = xcb_get_modifier_mapping_keycodes( p_map ); xcb_keycode_t *p_keycode = xcb_get_modifier_mapping_keycodes( p_map );
if( !p_keycode ) if( !p_keycode )
return 0; goto end;
for( int i = 0; i < 8; i++ ) for( int i = 0; i < 8; i++ )
for( int j = 0; j < p_map->keycodes_per_modifier; j++ ) for( int j = 0; j < p_map->keycodes_per_modifier; j++ )
for( int k = 0; p_keys[k] != XCB_NO_SYMBOL; k++ ) for( int k = 0; p_keys[k] != XCB_NO_SYMBOL; k++ )
if( p_keycode[i*p_map->keycodes_per_modifier + j] == p_keys[k]) if( p_keycode[i*p_map->keycodes_per_modifier + j] == p_keys[k])
{ {
free( p_keys );
free( p_map ); free( p_map );
return pi_mask[i]; return pi_mask[i];
} }
end:
free( p_keys );
free( p_map ); // FIXME to check free( p_map ); // FIXME to check
return 0; return 0;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment