[vlc-devel] commit: hotkeys: use key-action ( Rémi Denis-Courmont )

git version control git at videolan.org
Thu Mar 27 21:42:51 CET 2008


vlc | branch: master | Rémi Denis-Courmont <rem at videolan.org> | Thu Mar 27 22:00:47 2008 +0200| [5223eff99a813e93876cd87fa01a8a47a99e0aa8]

hotkeys: use key-action

> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=5223eff99a813e93876cd87fa01a8a47a99e0aa8
---

 modules/control/hotkeys.c |  127 ++++++++++++++++++++++++++-------------------
 1 files changed, 73 insertions(+), 54 deletions(-)

diff --git a/modules/control/hotkeys.c b/modules/control/hotkeys.c
index 6817e96..cf9356c 100644
--- a/modules/control/hotkeys.c
+++ b/modules/control/hotkeys.c
@@ -51,8 +51,8 @@
  *****************************************************************************/
 struct intf_sys_t
 {
-    int                 p_keys[ BUFFER_SIZE ]; /* buffer that contains
-                                                * keyevents */
+    int                 p_actions[ BUFFER_SIZE ]; /* buffer that contains
+                                                   * action events */
     int                 i_size;        /* number of events in buffer */
     int                 p_channels[ CHANNELS_NUMBER ]; /* contains registered
                                                         * channel IDs */
@@ -66,9 +66,11 @@ struct intf_sys_t
 static int  Open    ( vlc_object_t * );
 static void Close   ( vlc_object_t * );
 static void Run     ( intf_thread_t * );
-static int  GetKey  ( intf_thread_t *);
-static int  KeyEvent( vlc_object_t *, char const *,
-                      vlc_value_t, vlc_value_t, void * );
+static int  GetAction( intf_thread_t *);
+static int  ActionEvent( vlc_object_t *, char const *,
+                         vlc_value_t, vlc_value_t, void * );
+static int  SpecialKeyEvent( vlc_object_t *, char const *,
+                             vlc_value_t, vlc_value_t, void * );
 static int  ActionKeyCB( vlc_object_t *, char const *,
                          vlc_value_t, vlc_value_t, void * );
 static void PlayBookmark( intf_thread_t *, int );
@@ -110,7 +112,8 @@ static int Open( vlc_object_t *p_this )
     p_intf->p_sys->i_size = 0;
     p_intf->pf_run = Run;
 
-    var_AddCallback( p_intf->p_libvlc, "key-pressed", KeyEvent, p_intf );
+    var_AddCallback( p_intf->p_libvlc, "key-pressed", SpecialKeyEvent, p_intf );
+    var_AddCallback( p_intf->p_libvlc, "key-action", ActionEvent, p_intf );
     return VLC_SUCCESS;
 }
 
@@ -121,7 +124,8 @@ static void Close( vlc_object_t *p_this )
 {
     intf_thread_t *p_intf = (intf_thread_t *)p_this;
 
-    var_DelCallback( p_intf->p_libvlc, "key-pressed", KeyEvent, p_intf );
+    var_DelCallback( p_intf->p_libvlc, "key-action", ActionEvent, p_intf );
+    var_DelCallback( p_intf->p_libvlc, "key-pressed", SpecialKeyEvent, p_intf );
 
     /* Destroy structure */
     free( p_intf->p_sys );
@@ -155,49 +159,22 @@ static void Run( intf_thread_t *p_intf )
         input_thread_t *p_input;
         vout_thread_t *p_last_vout;
         int i_times = 0;
-        int i_action = 0;
-        int i_key = GetKey( p_intf );
+        int i_action = GetAction( p_intf );
 
-        if( i_key == -1 )
+        if( i_action == -1 )
             break; /* die */
 
-        /* Special action for mouse event */
-        /* FIXME: This should probably be configurable */
-        /* FIXME: rework hotkeys handling to allow more than 1 event
-         * to trigger one same action */
-        switch (i_key & KEY_SPECIAL)
-        {
-            case KEY_MOUSEWHEELUP:
-                i_action = ACTIONID_VOL_UP;
-                break;
-            case KEY_MOUSEWHEELDOWN:
-                i_action = ACTIONID_VOL_DOWN;
-                break;
-            case KEY_MOUSEWHEELLEFT:
-                i_action = ACTIONID_JUMP_BACKWARD_EXTRASHORT;
-                break;
-            case KEY_MOUSEWHEELRIGHT:
-                i_action = ACTIONID_JUMP_FORWARD_EXTRASHORT;
-                break;
-            default: break;
-        }
-
-        /* No mouse action, find action triggered by hotkey */
-        if(!i_action)
+        for( i = 0; p_hotkeys[i].psz_action != NULL; i++ )
         {
-            for( i = 0; i_key != -1 && p_hotkeys[i].psz_action != NULL; i++ )
+            if( p_hotkeys[i].i_action == i_action )
             {
-                if( p_hotkeys[i].i_key == i_key )
-                {
-                    i_action = p_hotkeys[i].i_action;
-                    i_times  = p_hotkeys[i].i_times;
-                    /* times key pressed within max. delta time */
-                    p_hotkeys[i].i_times = 0;
-                    break;
-                }
+                i_times  = p_hotkeys[i].i_times;
+                /* times key pressed within max. delta time */
+                p_hotkeys[i].i_times = 0;
+                break;
             }
         }
-
+ 
         /* Update the input */
         PL_LOCK;
         p_input = p_playlist->p_input;
@@ -857,7 +834,7 @@ static void Run( intf_thread_t *p_intf )
     pl_Release( p_intf );
 }
 
-static int GetKey( intf_thread_t *p_intf )
+static int GetAction( intf_thread_t *p_intf )
 {
     intf_sys_t *p_sys = p_intf->p_sys;
     int i_ret = -1;
@@ -870,26 +847,26 @@ static int GetKey( intf_thread_t *p_intf )
         vlc_object_wait( p_intf );
     }
 
-    i_ret = p_intf->p_sys->p_keys[ 0 ];
+    i_ret = p_sys->p_actions[ 0 ];
     p_sys->i_size--;
     for( int i = 0; i < p_sys->i_size; i++ )
-        p_sys->p_keys[i] = p_sys->p_keys[i + 1];
+        p_sys->p_actions[i] = p_sys->p_actions[i + 1];
 
 out:
     vlc_object_unlock( p_intf );
     return i_ret;
 }
 
-static int PutKey( intf_thread_t *p_intf, int i_key )
+static int PutAction( intf_thread_t *p_intf, int i_action )
 {
     intf_sys_t *p_sys = p_intf->p_sys;
     int i_ret = VLC_EGENERIC;
 
     vlc_object_lock( p_intf );
     if ( p_sys->i_size >= BUFFER_SIZE )
-        msg_Warn( p_intf, "event buffer full, dropping keypress" );
+        msg_Warn( p_intf, "event buffer full, dropping key actions" );
     else
-        p_sys->p_keys[p_sys->i_size++] = i_key;
+        p_sys->p_actions[p_sys->i_size++] = i_action;
 
     vlc_object_signal_unlocked( p_intf );
     vlc_object_unlock( p_intf );
@@ -897,15 +874,57 @@ static int PutKey( intf_thread_t *p_intf, int i_key )
 }
 
 /*****************************************************************************
- * KeyEvent: callback for keyboard events
+ * SpecialKeyEvent: callback for mouse events
+ *****************************************************************************/
+static int SpecialKeyEvent( vlc_object_t *libvlc, char const *psz_var,
+                            vlc_value_t oldval, vlc_value_t newval,
+                            void *p_data )
+{
+    intf_thread_t *p_intf = (intf_thread_t *)p_data;
+    int i_action;
+
+    (void)libvlc;
+    (void)psz_var;
+    (void)oldval;
+
+    /* Special action for mouse event */
+    /* FIXME: This should probably be configurable */
+    /* FIXME: rework hotkeys handling to allow more than 1 event
+     * to trigger one same action */
+    switch (newval.i_int & KEY_SPECIAL)
+    {
+        case KEY_MOUSEWHEELUP:
+            i_action = ACTIONID_VOL_UP;
+            break;
+        case KEY_MOUSEWHEELDOWN:
+            i_action = ACTIONID_VOL_DOWN;
+            break;
+        case KEY_MOUSEWHEELLEFT:
+            i_action = ACTIONID_JUMP_BACKWARD_EXTRASHORT;
+            break;
+        case KEY_MOUSEWHEELRIGHT:
+            i_action = ACTIONID_JUMP_FORWARD_EXTRASHORT;
+            break;
+        default:
+          return VLC_SUCCESS;
+    }
+
+    return PutAction( p_intf, i_action );
+}
+
+/*****************************************************************************
+ * ActionEvent: callback for hotkey actions
  *****************************************************************************/
-static int KeyEvent( vlc_object_t *p_this, char const *psz_var,
-                     vlc_value_t oldval, vlc_value_t newval, void *p_data )
+static int ActionEvent( vlc_object_t *libvlc, char const *psz_var,
+                        vlc_value_t oldval, vlc_value_t newval, void *p_data )
 {
-    VLC_UNUSED(psz_var); VLC_UNUSED(oldval);
     intf_thread_t *p_intf = (intf_thread_t *)p_data;
 
-    return PutKey( p_intf, newval.i_int );
+    (void)libvlc;
+    (void)psz_var;
+    (void)oldval;
+
+    return PutAction( p_intf, newval.i_int );
 }
 
 static int ActionKeyCB( vlc_object_t *libvlc, char const *psz_var,




More information about the vlc-devel mailing list