]> git.sesse.net Git - vlc/blobdiff - modules/control/globalhotkeys/xcb.c
auhal: updated to the latest API
[vlc] / modules / control / globalhotkeys / xcb.c
index b47431af3814d71e33045644a1117e84b1350e80..f35ce67cf707b83810c6ee6e562e5b05885bd450 100644 (file)
@@ -27,7 +27,6 @@
 #include <vlc_plugin.h>
 #include <vlc_interface.h>
 #include <vlc_keys.h>
-#include <ctype.h>
 #include <errno.h>
 
 #include <xcb/xcb.h>
@@ -57,13 +56,9 @@ vlc_module_end()
 
 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
@@ -80,7 +75,6 @@ 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 );
 
 /*****************************************************************************
@@ -96,11 +90,8 @@ static int Open( vlc_object_t *p_this )
     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;
@@ -135,12 +126,11 @@ static int Open( vlc_object_t *p_this )
 
     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;
@@ -167,13 +157,11 @@ static void Close( vlc_object_t *p_this )
     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 );
@@ -193,11 +181,6 @@ static unsigned GetModifier( xcb_connection_t *p_connection, xcb_key_symbols_t *
     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;
@@ -216,7 +199,6 @@ static unsigned GetModifier( xcb_connection_t *p_connection, xcb_key_symbols_t *
 
     if( no_modifier )
         return 0;
-#endif
 
     xcb_get_modifier_mapping_cookie_t r =
             xcb_get_modifier_mapping( p_connection );
@@ -231,20 +213,12 @@ static unsigned GetModifier( xcb_connection_t *p_connection, xcb_key_symbols_t *
 
     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;
@@ -276,36 +250,7 @@ static const struct
 
 } 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 )
@@ -343,25 +288,23 @@ static bool Mapping( intf_thread_t *p_intf )
             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 );
 
@@ -384,13 +327,9 @@ static bool Mapping( intf_thread_t *p_intf )
             }
             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;
         }
     }
@@ -404,35 +343,12 @@ static void Register( intf_thread_t *p_intf )
     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
     }
 }
 
@@ -478,29 +394,16 @@ static void *Thread( void *p_data )
             {
                 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 );
         }
     }