vlc | branch: master | Rémi Denis-Courmont <[email protected]> | Thu Jan 31 23:16:35 2013 +0200| [d83927d402e835ead4159bc673179a182a78f733] | committer: Rémi Denis-Courmont
hotkeys: map mouse wheel actions in core > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=d83927d402e835ead4159bc673179a182a78f733 --- modules/control/hotkeys.c | 29 +------------------- src/config/keys.c | 66 ++++++++++++++++++++++++++++++++------------- 2 files changed, 48 insertions(+), 47 deletions(-) diff --git a/modules/control/hotkeys.c b/modules/control/hotkeys.c index e9348e3..7196352 100644 --- a/modules/control/hotkeys.c +++ b/modules/control/hotkeys.c @@ -55,7 +55,6 @@ struct intf_sys_t vout_thread_t *p_last_vout; int p_channels[ CHANNELS_NUMBER ]; /* contains registered * channel IDs */ - int i_mousewheel_mode; }; /***************************************************************************** @@ -108,8 +107,6 @@ static int Open( vlc_object_t *p_this ) p_intf->p_sys = p_sys; p_sys->p_last_vout = NULL; - p_intf->p_sys->i_mousewheel_mode = - var_InheritInteger( p_intf, "hotkeys-mousewheel-mode" ); var_AddCallback( p_intf->p_libvlc, "key-pressed", SpecialKeyEvent, p_intf ); var_AddCallback( p_intf->p_libvlc, "key-action", ActionEvent, p_intf ); @@ -924,44 +921,20 @@ 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 = 0; - + (void)p_data; (void)psz_var; (void)oldval; - int i_mode = p_intf->p_sys->i_mousewheel_mode; - /* Special action for mouse event */ /* FIXME: rework hotkeys handling to allow more than 1 event * to trigger one same action */ switch (newval.i_int & ~KEY_MODIFIER) { - case KEY_MOUSEWHEELUP: - i_action = (i_mode == MOUSEWHEEL_VOLUME ) ? ACTIONID_VOL_UP - : ACTIONID_JUMP_FORWARD_EXTRASHORT; - break; - case KEY_MOUSEWHEELDOWN: - i_action = (i_mode == MOUSEWHEEL_VOLUME ) ? ACTIONID_VOL_DOWN - : ACTIONID_JUMP_BACKWARD_EXTRASHORT; - break; - case KEY_MOUSEWHEELLEFT: - i_action = (i_mode == MOUSEWHEEL_VOLUME ) ? - ACTIONID_JUMP_BACKWARD_EXTRASHORT : ACTIONID_VOL_DOWN; - break; - case KEY_MOUSEWHEELRIGHT: - i_action = (i_mode == MOUSEWHEEL_VOLUME ) ? - ACTIONID_JUMP_FORWARD_EXTRASHORT : ACTIONID_VOL_UP; - break; case KEY_MENU: var_SetBool( libvlc, "intf-popupmenu", true ); break; } - if( i_mode == NO_MOUSEWHEEL ) return VLC_SUCCESS; - - if( i_action ) - return PutAction( p_intf, i_action ); return VLC_SUCCESS; } diff --git a/src/config/keys.c b/src/config/keys.c index 7b429ed..e1a568a 100644 --- a/src/config/keys.c +++ b/src/config/keys.c @@ -38,6 +38,7 @@ #ifdef HAVE_SEARCH_H # include <search.h> #endif +#include <errno.h> #include <vlc_common.h> #include <vlc_keys.h> @@ -406,13 +407,35 @@ static int vlc_key_to_action (vlc_object_t *obj, const char *varname, } /** + * Adds a mapping from a certain key code to a certain action. + */ +static int vlc_AddMapping (void **map, uint32_t keycode, vlc_action_t action) +{ + struct mapping *entry = malloc (sizeof (*entry)); + if (entry == NULL) + return ENOMEM; + entry->key = keycode; + entry->action = action; + + struct mapping **pent = tsearch (entry, map, keycmp); + if (unlikely(pent == NULL)) + return ENOMEM; + if (*pent != entry) + { + free (entry); + return EEXIST; + } + return 0; +} + +/** * Sets up all key mappings for a given action. * \param map tree (of struct mapping entries) to write mappings to * \param confname VLC configuration item to read mappings from * \param action action ID */ -static void vlc_MapAction (vlc_object_t *obj, void **map, - const char *confname, vlc_action_t action) +static void vlc_InitAction (vlc_object_t *obj, void **map, + const char *confname, vlc_action_t action) { char *keys = var_InheritString (obj, confname); if (keys == NULL) @@ -429,25 +452,12 @@ static void vlc_MapAction (vlc_object_t *obj, void **map, continue; } - struct mapping *entry = malloc (sizeof (*entry)); - if (entry == NULL) - continue; - entry->key = code; - entry->action = action; - - struct mapping **pent = tsearch (entry, map, keycmp); - if (unlikely(pent == NULL)) - continue; - if (*pent != entry) - { - free (entry); + if (vlc_AddMapping (map, code, action) == EEXIST) msg_Warn (obj, "Key \"%s\" bound to multiple actions", key); - } } free (keys); } - /** * Initializes the key map from configuration. */ @@ -485,12 +495,30 @@ struct vlc_actions *vlc_InitActions (libvlc_int_t *libvlc) char name[12 + MAXACTION]; snprintf (name, sizeof (name), "global-key-%s", actions[i].name); - vlc_MapAction (obj, &as->map, name + 7, actions[i].value); - vlc_MapAction (obj, &as->global_map, name, actions[i].value); + vlc_InitAction (obj, &as->map, name + 7, actions[i].value); + vlc_InitAction (obj, &as->global_map, name, actions[i].value); } - keys->psz_action = NULL; + /* Initialize mouse wheel events */ + int mousemode = var_InheritInteger (obj, "hotkeys-mousewheel-mode"); + if (mousemode < 2) + { + vlc_AddMapping (&as->map, + mousemode ? KEY_MOUSEWHEELLEFT : KEY_MOUSEWHEELUP, + ACTIONID_VOL_UP); + vlc_AddMapping (&as->map, + mousemode ? KEY_MOUSEWHEELRIGHT : KEY_MOUSEWHEELDOWN, + ACTIONID_VOL_DOWN); + vlc_AddMapping (&as->map, + mousemode ? KEY_MOUSEWHEELUP : KEY_MOUSEWHEELLEFT, + ACTIONID_JUMP_FORWARD_EXTRASHORT); + vlc_AddMapping (&as->map, + mousemode ? KEY_MOUSEWHEELDOWN : KEY_MOUSEWHEELRIGHT, + ACTIONID_JUMP_BACKWARD_EXTRASHORT); + } + + libvlc->p_hotkeys = as->keys; var_AddCallback (obj, "key-pressed", vlc_key_to_action, &as->map); var_AddCallback (obj, "global-key-pressed", vlc_key_to_action, _______________________________________________ vlc-commits mailing list [email protected] http://mailman.videolan.org/listinfo/vlc-commits
