#include <vlc_plugin.h>
#include <vlc_interface.h>
#include <vlc_keys.h>
-#include <ctype.h>
#include <errno.h>
#include <xcb/xcb.h>
typedef struct
{
-#ifdef XCB_KEYSYM_OLD_API /* as seen in Debian Lenny */
- xcb_keycode_t i_x11;
-#else
xcb_keycode_t *p_keys;
-#endif
unsigned i_modifier;
- int i_action;
+ uint32_t i_vlc;
} hotkey_mapping_t;
struct intf_sys_t
static bool Mapping( intf_thread_t *p_intf );
static void Register( intf_thread_t *p_intf );
-static void Unregister( intf_thread_t *p_intf );
static void *Thread( void *p_data );
/*****************************************************************************
if( !p_sys )
return VLC_ENOMEM;
- char *psz_display = var_CreateGetNonEmptyString( p_intf, "x11-display" );
-
int i_screen_default;
- p_sys->p_connection = xcb_connect( psz_display, &i_screen_default );
- free( psz_display );
+ p_sys->p_connection = xcb_connect( NULL, &i_screen_default );
if( xcb_connection_has_error( p_sys->p_connection ) )
goto error;
if( vlc_clone( &p_sys->thread, Thread, p_intf, VLC_THREAD_PRIORITY_LOW ) )
{
- Unregister( p_intf );
-#ifndef XCB_KEYSYM_OLD_API /* as seen in Debian Lenny */
if( p_sys->p_map )
+ {
free( p_sys->p_map->p_keys );
-#endif
- free( p_sys->p_map );
+ free( p_sys->p_map );
+ }
goto error;
}
return VLC_SUCCESS;
vlc_cancel( p_sys->thread );
vlc_join( p_sys->thread, NULL );
- Unregister( p_intf );
-#ifndef XCB_KEYSYM_OLD_API /* as seen in Debian Lenny */
if( p_sys->p_map )
+ {
free( p_sys->p_map->p_keys );
-#endif
- free( p_sys->p_map );
-
+ free( p_sys->p_map );
+ }
xcb_key_symbols_free( p_sys->p_symbols );
xcb_disconnect( p_sys->p_connection );
free( p_sys );
if( sym == 0 )
return 0; /* no modifier */
-#ifdef XCB_KEYSYM_OLD_API /* as seen in Debian Lenny */
- const xcb_keycode_t key = xcb_key_symbols_get_keycode( p_symbols, sym );
- if( key == 0 )
- return 0;
-#else
const xcb_keycode_t *p_keys = xcb_key_symbols_get_keycode( p_symbols, sym );
if( !p_keys )
return 0;
if( no_modifier )
return 0;
-#endif
xcb_get_modifier_mapping_cookie_t r =
xcb_get_modifier_mapping( p_connection );
for( int i = 0; i < 8; i++ )
for( int j = 0; j < p_map->keycodes_per_modifier; j++ )
-#ifdef XCB_KEYSYM_OLD_API /* as seen in Debian Lenny */
- if( p_keycode[i * p_map->keycodes_per_modifier + j] == key )
- {
- free( p_map );
- return pi_mask[i];
- }
-#else
for( int k = 0; p_keys[k] != XCB_NO_SYMBOL; k++ )
if( p_keycode[i*p_map->keycodes_per_modifier + j] == p_keys[k])
{
free( p_map );
return pi_mask[i];
}
-#endif
free( p_map ); // FIXME to check
return 0;
} x11keys_to_vlckeys[] =
{
- { XK_F1, KEY_F1 }, { XK_F2, KEY_F2 }, { XK_F3, KEY_F3 }, { XK_F4, KEY_F4 },
- { XK_F5, KEY_F5 }, { XK_F6, KEY_F6 }, { XK_F7, KEY_F7 }, { XK_F8, KEY_F8 },
- { XK_F9, KEY_F9 }, { XK_F10, KEY_F10 }, { XK_F11, KEY_F11 },
- { XK_F12, KEY_F12 },
-
- { XK_Return, KEY_ENTER },
- { XK_KP_Enter, KEY_ENTER },
- { XK_Escape, KEY_ESC },
-
- { XK_Menu, KEY_MENU },
- { XK_Left, KEY_LEFT },
- { XK_Right, KEY_RIGHT },
- { XK_Up, KEY_UP },
- { XK_Down, KEY_DOWN },
-
- { XK_Home, KEY_HOME },
- { XK_End, KEY_END },
- { XK_Page_Up, KEY_PAGEUP },
- { XK_Page_Down, KEY_PAGEDOWN },
-
- { XK_Insert, KEY_INSERT },
- { XK_Delete, KEY_DELETE },
- { XF86XK_AudioNext, KEY_MEDIA_NEXT_TRACK},
- { XF86XK_AudioPrev, KEY_MEDIA_PREV_TRACK},
- { XF86XK_AudioMute, KEY_VOLUME_MUTE },
- { XF86XK_AudioLowerVolume, KEY_VOLUME_DOWN },
- { XF86XK_AudioRaiseVolume, KEY_VOLUME_UP },
- { XF86XK_AudioPlay, KEY_MEDIA_PLAY_PAUSE },
- { XF86XK_AudioPause, KEY_MEDIA_PLAY_PAUSE },
-
+#include "../../video_output/xcb/xcb_keysym.h"
{ 0, 0 }
};
static xcb_keysym_t GetX11Key( unsigned i_vlc )
p_hotkey->psz_action != NULL;
p_hotkey++ )
{
- char *psz_hotkey;
- if( asprintf( &psz_hotkey, "global-%s", p_hotkey->psz_action ) < 0 )
- break;
+ char varname[12 + strlen( p_hotkey->psz_action )];
+ sprintf( varname, "global-key-%s", p_hotkey->psz_action );
- const int i_vlc_action = p_hotkey->i_action;
- const int i_vlc_key = config_GetInt( p_intf, psz_hotkey );
- free( psz_hotkey );
+ char *key = var_InheritString( p_intf, varname );
+ if( key == NULL )
+ continue;
- if( !i_vlc_key )
+ uint_fast32_t i_vlc_key = vlc_str2keycode( key );
+ free( key );
+ if( i_vlc_key == KEY_UNSET )
continue;
-#ifdef XCB_KEYSYM_OLD_API /* as seen in Debian Lenny */
- const xcb_keycode_t key = xcb_key_symbols_get_keycode(
- p_sys->p_symbols, GetX11Key( i_vlc_key & ~KEY_MODIFIER ) );
-#else
+
xcb_keycode_t *p_keys = xcb_key_symbols_get_keycode(
p_sys->p_symbols, GetX11Key( i_vlc_key & ~KEY_MODIFIER ) );
if( !p_keys )
continue;
-#endif
+
const unsigned i_modifier = GetX11Modifier( p_sys->p_connection,
p_sys->p_symbols, i_vlc_key & KEY_MODIFIER );
}
hotkey_mapping_t *p_map = &p_sys->p_map[p_sys->i_map++];
-#ifdef XCB_KEYSYM_OLD_API /* as seen in Debian Lenny */
- p_map->i_x11 = key;
-#else
p_map->p_keys = p_keys;
-#endif
p_map->i_modifier = i_modifier|i_ignored;
- p_map->i_action = i_vlc_action;
+ p_map->i_vlc = i_vlc_key;
active = true;
}
}
for( int i = 0; i < p_sys->i_map; i++ )
{
const hotkey_mapping_t *p_map = &p_sys->p_map[i];
-#ifdef XCB_KEYSYM_OLD_API /* as seen in Debian Lenny */
- xcb_grab_key( p_sys->p_connection, true, p_sys->root,
- p_map->i_modifier, p_map->i_x11,
- XCB_GRAB_MODE_ASYNC, XCB_GRAB_MODE_ASYNC );
-#else
for( int j = 0; p_map->p_keys[j] != XCB_NO_SYMBOL; j++ )
{
xcb_grab_key( p_sys->p_connection, true, p_sys->root,
p_map->i_modifier, p_map->p_keys[j],
XCB_GRAB_MODE_ASYNC, XCB_GRAB_MODE_ASYNC );
}
-#endif
- }
-}
-static void Unregister( intf_thread_t *p_intf )
-{
- intf_sys_t *p_sys = p_intf->p_sys;
-
- for( int i = 0; i < p_sys->i_map; i++ )
- {
- const hotkey_mapping_t *p_map = &p_sys->p_map[i];
-#ifdef XCB_KEYSYM_OLD_API /* as seen in Debian Lenny */
- xcb_ungrab_key( p_sys->p_connection, p_map->i_x11, p_sys->root,
- p_map->i_modifier );
-#else
- for( int j = 0; p_map->p_keys[j] != XCB_NO_SYMBOL; j++ )
- xcb_ungrab_key( p_sys->p_connection, p_map->p_keys[j], p_sys->root,
- p_map->i_modifier );
-#endif
}
}
{
hotkey_mapping_t *p_map = &p_sys->p_map[i];
-#ifdef XCB_KEYSYM_OLD_API /* as seen in Debian Lenny */
- if( p_map->i_x11 == e->detail &&
- p_map->i_modifier == e->state )
- {
- var_SetInteger( p_intf->p_libvlc, "key-action",
- p_map->i_action );
- break;
- }
-#else
- bool loop_break = false;
- for( int j = 0; p_map->p_keys[j] != XCB_NO_SYMBOL; j++ )
- if( p_map->p_keys[j] == e->detail &&
- p_map->i_modifier == e->state )
- {
- var_SetInteger( p_intf->p_libvlc, "key-action",
- p_map->i_action );
- loop_break = true;
- break;
- }
- if( loop_break )
- break;
-#endif
+ for( int j = 0; p_map->p_keys[j] != XCB_NO_SYMBOL; j++ )
+ if( p_map->p_keys[j] == e->detail &&
+ p_map->i_modifier == e->state )
+ {
+ var_SetInteger( p_intf->p_libvlc, "global-key-pressed",
+ p_map->i_vlc );
+ goto done;
+ }
}
+ done:
free( p_event );
}
}