From 764f9e8b0e6799686fb6509269784baa734dfdfb Mon Sep 17 00:00:00 2001 From: Derk-Jan Hartman Date: Tue, 11 Nov 2003 23:50:41 +0000 Subject: [PATCH] * include/vlc_keys.h: added StringToKey() * src/libvlc.h: added macosx defaults and changed the quit shortcut to ctrl-q * modeules/gui/macosx/controls.m: now jump 10 seconds. works better than 5 * REST: implemented configurable hotkeys for OS X. --- .../English.lproj/MainMenu.nib/objects.nib | Bin 49846 -> 48969 bytes include/vlc_keys.h | 17 +- modules/gui/macosx/controls.m | 6 +- modules/gui/macosx/intf.h | 7 +- modules/gui/macosx/intf.m | 96 ++++++++++-- modules/gui/macosx/prefs.h | 3 +- modules/gui/macosx/prefs.m | 147 +++++++++++++++++- modules/gui/macosx/vout.m | 4 +- src/libvlc.h | 30 +++- 9 files changed, 280 insertions(+), 30 deletions(-) diff --git a/extras/MacOSX/Resources/English.lproj/MainMenu.nib/objects.nib b/extras/MacOSX/Resources/English.lproj/MainMenu.nib/objects.nib index 25a88169d4dfaeb954764ca2c6cb008d6080ad4e..a295bf21d7217f24726dd9dd99589fbdf86eed4f 100644 GIT binary patch literal 48969 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

fElYUW>%U_g4 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 literal 49846 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 diff --git a/include/vlc_keys.h b/include/vlc_keys.h index ae3cea6e24..2ceb90c58d 100644 --- a/include/vlc_keys.h +++ b/include/vlc_keys.h @@ -2,7 +2,7 @@ * hotkeys.h: keycode defines ***************************************************************************** * Copyright (C) 2003 VideoLAN - * $Id: vlc_keys.h,v 1.7 2003/11/08 18:23:40 titer Exp $ + * $Id: vlc_keys.h,v 1.8 2003/11/11 23:50:41 hartman Exp $ * * Authors: Sigmund Augdal * @@ -146,7 +146,6 @@ static const struct key_descriptor_s vlc_keys[] = { "[", '[' }, { "]", ']' }, { "*", '*' } - }; static inline char *KeyToString( int i_key ) @@ -162,6 +161,20 @@ static inline char *KeyToString( int i_key ) return NULL; } +static inline int StringToKey( char *psz_key ) +{ + unsigned int i = 0; + for ( i = 0; i < sizeof(vlc_keys) / sizeof(key_descriptor_t); i++ ) + { + if ( !strcmp( vlc_keys[i].psz_key_string, psz_key )) + { + return vlc_keys[i].i_key_code; + } + } + return NULL; +} + + #define ACTIONID_QUIT 1 #define ACTIONID_PLAY_PAUSE 2 #define ACTIONID_PLAY 3 diff --git a/modules/gui/macosx/controls.m b/modules/gui/macosx/controls.m index 8e404b2a11..8c385ac28b 100644 --- a/modules/gui/macosx/controls.m +++ b/modules/gui/macosx/controls.m @@ -2,7 +2,7 @@ * controls.m: MacOS X interface plugin ***************************************************************************** * Copyright (C) 2002-2003 VideoLAN - * $Id: controls.m,v 1.52 2003/11/06 18:55:22 hartman Exp $ + * $Id: controls.m,v 1.53 2003/11/11 23:50:41 hartman Exp $ * * Authors: Jon Lech Johansen * Christophe Massiot @@ -301,7 +301,7 @@ if( p_input != NULL ) { vlc_value_t time; - time.i_time = 5 * 1000000; + time.i_time = 10 * 1000000; var_Set( p_input, "time-offset", time ); vlc_object_release( p_input ); } @@ -315,7 +315,7 @@ if( p_input != NULL ) { vlc_value_t time; - time.i_time = -5 * 1000000; + time.i_time = -10 * 1000000; var_Set( p_input, "time-offset", time ); vlc_object_release( p_input ); } diff --git a/modules/gui/macosx/intf.h b/modules/gui/macosx/intf.h index 4204f1df4b..9c328132c2 100644 --- a/modules/gui/macosx/intf.h +++ b/modules/gui/macosx/intf.h @@ -2,7 +2,7 @@ * intf.h: MacOS X interface plugin ***************************************************************************** * Copyright (C) 2002-2003 VideoLAN - * $Id: intf.h,v 1.47 2003/11/03 15:27:28 hartman Exp $ + * $Id: intf.h,v 1.48 2003/11/11 23:50:41 hartman Exp $ * * Authors: Jon Lech Johansen * Christophe Massiot @@ -56,7 +56,7 @@ int ExecuteOnMainThread( id target, SEL sel, void * p_arg ); int PlaylistChanged( vlc_object_t *p_this, const char *psz_variable, vlc_value_t old_val, vlc_value_t new_val, void *param ); -int CocoaConvertKey( unichar i_key); +unsigned int CocoaKeyToVLC( unichar i_key ); /***************************************************************************** * intf_sys_t: description and status of the interface @@ -226,9 +226,10 @@ struct intf_sys_t } - (id)getControls; - - (void)terminate; +- (void)initStrings; + - (void)manage; - (void)manageIntf:(NSTimer *)o_timer; - (void)setupMenus; diff --git a/modules/gui/macosx/intf.m b/modules/gui/macosx/intf.m index 85ecad16c9..8d958bf118 100644 --- a/modules/gui/macosx/intf.m +++ b/modules/gui/macosx/intf.m @@ -2,7 +2,7 @@ * intf.m: MacOS X interface plugin ***************************************************************************** * Copyright (C) 2002-2003 VideoLAN - * $Id: intf.m,v 1.99 2003/11/06 18:35:19 hartman Exp $ + * $Id: intf.m,v 1.100 2003/11/11 23:50:41 hartman Exp $ * * Authors: Jon Lech Johansen * Christophe Massiot @@ -293,7 +293,7 @@ int PlaylistChanged( vlc_object_t *p_this, const char *psz_variable, static struct { unichar i_nskey; - int i_vlckey; + unsigned int i_vlckey; } nskeys_to_vlckeys[] = { { NSUpArrowFunctionKey, KEY_UP }, @@ -325,9 +325,23 @@ static struct {0,0} }; -int CocoaConvertKey( unichar i_key ) +unichar VLCKeyToCocoa( unsigned int i_key ) { - int i; + unsigned int i; + + for( i = 0; nskeys_to_vlckeys[i].i_vlckey != 0; i++ ) + { + if( nskeys_to_vlckeys[i].i_vlckey == (i_key & ~KEY_MODIFIER) ) + { + return nskeys_to_vlckeys[i].i_nskey; + } + } + return (unichar)(i_key & ~KEY_MODIFIER); +} + +unsigned int CocoaKeyToVLC( unichar i_key ) +{ + unsigned int i; for( i = 0; nskeys_to_vlckeys[i].i_nskey != 0; i++ ) { @@ -336,7 +350,21 @@ int CocoaConvertKey( unichar i_key ) return nskeys_to_vlckeys[i].i_vlckey; } } - return (int)i_key; + return (unsigned int)i_key; +} + +unsigned int VLCModifiersToCocoa( unsigned int i_key ) +{ + unsigned int new = 0; + if( i_key & KEY_MODIFIER_COMMAND ) + new |= NSCommandKeyMask; + if( i_key & KEY_MODIFIER_ALT ) + new |= NSAlternateKeyMask; + if( i_key & KEY_MODIFIER_SHIFT ) + new |= NSShiftKeyMask; + if( i_key & KEY_MODIFIER_CTRL ) + new |= NSControlKeyMask; + return new; } /***************************************************************************** @@ -346,8 +374,59 @@ int CocoaConvertKey( unichar i_key ) - (void)awakeFromNib { - [o_window setTitle: _NS("VLC - Controller")]; + unsigned int i_key; + intf_thread_t * p_intf = [NSApp getIntf]; + + [self initStrings]; [o_window setExcludedFromWindowsMenu: TRUE]; + [o_msgs_panel setExcludedFromWindowsMenu: TRUE]; + [o_msgs_panel setDelegate: self]; + + i_key = config_GetInt( p_intf, "key-quit" ); + [o_mi_quit setKeyEquivalent: [NSString stringWithFormat:@"%C", VLCKeyToCocoa( i_key )]]; + [o_mi_quit setKeyEquivalentModifierMask: VLCModifiersToCocoa(i_key)]; + i_key = config_GetInt( p_intf, "key-play-pause" ); + [o_mi_play setKeyEquivalent: [NSString stringWithFormat:@"%C", VLCKeyToCocoa( i_key )]]; + [o_mi_play setKeyEquivalentModifierMask: VLCModifiersToCocoa(i_key)]; + i_key = config_GetInt( p_intf, "key-stop" ); + [o_mi_stop setKeyEquivalent: [NSString stringWithFormat:@"%C", VLCKeyToCocoa( i_key )]]; + [o_mi_stop setKeyEquivalentModifierMask: VLCModifiersToCocoa(i_key)]; + i_key = config_GetInt( p_intf, "key-faster" ); + [o_mi_faster setKeyEquivalent: [NSString stringWithFormat:@"%C", VLCKeyToCocoa( i_key )]]; + [o_mi_faster setKeyEquivalentModifierMask: VLCModifiersToCocoa(i_key)]; + i_key = config_GetInt( p_intf, "key-slower" ); + [o_mi_slower setKeyEquivalent: [NSString stringWithFormat:@"%C", VLCKeyToCocoa( i_key )]]; + [o_mi_slower setKeyEquivalentModifierMask: VLCModifiersToCocoa(i_key)]; + i_key = config_GetInt( p_intf, "key-prev" ); + [o_mi_previous setKeyEquivalent: [NSString stringWithFormat:@"%C", VLCKeyToCocoa( i_key )]]; + [o_mi_previous setKeyEquivalentModifierMask: VLCModifiersToCocoa(i_key)]; + i_key = config_GetInt( p_intf, "key-next" ); + [o_mi_next setKeyEquivalent: [NSString stringWithFormat:@"%C", VLCKeyToCocoa( i_key )]]; + [o_mi_next setKeyEquivalentModifierMask: VLCModifiersToCocoa(i_key)]; + i_key = config_GetInt( p_intf, "key-jump+10sec" ); + [o_mi_fwd setKeyEquivalent: [NSString stringWithFormat:@"%C", VLCKeyToCocoa( i_key )]]; + [o_mi_fwd setKeyEquivalentModifierMask: VLCModifiersToCocoa(i_key)]; + i_key = config_GetInt( p_intf, "key-jump-10sec" ); + [o_mi_bwd setKeyEquivalent: [NSString stringWithFormat:@"%C", VLCKeyToCocoa( i_key )]]; + [o_mi_bwd setKeyEquivalentModifierMask: VLCModifiersToCocoa(i_key)]; + i_key = config_GetInt( p_intf, "key-vol-up" ); + [o_mi_vol_up setKeyEquivalent: [NSString stringWithFormat:@"%C", VLCKeyToCocoa( i_key )]]; + [o_mi_vol_up setKeyEquivalentModifierMask: VLCModifiersToCocoa(i_key)]; + i_key = config_GetInt( p_intf, "key-vol-down" ); + [o_mi_vol_down setKeyEquivalent: [NSString stringWithFormat:@"%C", VLCKeyToCocoa( i_key )]]; + [o_mi_vol_down setKeyEquivalentModifierMask: VLCModifiersToCocoa(i_key)]; + i_key = config_GetInt( p_intf, "key-fullscreen" ); + [o_mi_fullscreen setKeyEquivalent: [NSString stringWithFormat:@"%C", VLCKeyToCocoa( i_key )]]; + [o_mi_fullscreen setKeyEquivalentModifierMask: VLCModifiersToCocoa(i_key)]; + + [self setSubmenusEnabled: FALSE]; + [self manageVolumeSlider]; + +} + +- (void)initStrings +{ + [o_window setTitle: _NS("VLC - Controller")]; /* button controls */ [o_btn_playlist setToolTip: _NS("Playlist")]; @@ -362,9 +441,7 @@ int CocoaConvertKey( unichar i_key ) [o_timeslider setToolTip: _NS("Position")]; /* messages panel */ - [o_msgs_panel setDelegate: self]; [o_msgs_panel setTitle: _NS("Messages")]; - [o_msgs_panel setExcludedFromWindowsMenu: TRUE]; [o_msgs_btn_crashlog setTitle: _NS("Open CrashLog")]; /* main menu */ @@ -469,9 +546,6 @@ int CocoaConvertKey( unichar i_key ) [o_err_btn_dismiss setTitle: _NS("Dismiss")]; [o_info_window setTitle: _NS("Info")]; - - [self setSubmenusEnabled: FALSE]; - [self manageVolumeSlider]; } - (void)applicationWillFinishLaunching:(NSNotification *)o_notification diff --git a/modules/gui/macosx/prefs.h b/modules/gui/macosx/prefs.h index 5b060e1a4b..3400f2e271 100644 --- a/modules/gui/macosx/prefs.h +++ b/modules/gui/macosx/prefs.h @@ -2,7 +2,7 @@ * prefs.h: MacOS X plugin for vlc ***************************************************************************** * Copyright (C) 2002-2003 VideoLAN - * $Id: prefs.h,v 1.11 2003/06/21 22:30:21 hartman Exp $ + * $Id: prefs.h,v 1.12 2003/11/11 23:50:41 hartman Exp $ * * Authors: Jon Lech Johansen * @@ -160,6 +160,7 @@ INTF_CONTROL_CONFIG(PopUpButton); INTF_CONTROL_CONFIG(ComboBox); INTF_CONTROL_CONFIG(TextField); INTF_CONTROL_CONFIG(Slider); +INTF_CONTROL_CONFIG(Matrix); #define CONTROL_CONFIG( obj, mname, ctype, cname ) \ { \ diff --git a/modules/gui/macosx/prefs.m b/modules/gui/macosx/prefs.m index af481b75e7..540d5f30b8 100644 --- a/modules/gui/macosx/prefs.m +++ b/modules/gui/macosx/prefs.m @@ -2,7 +2,7 @@ * prefs.m: MacOS X plugin for vlc ***************************************************************************** * Copyright (C) 2002-2003 VideoLAN - * $Id: prefs.m,v 1.34 2003/09/19 23:03:27 hartman Exp $ + * $Id: prefs.m,v 1.35 2003/11/11 23:50:41 hartman Exp $ * * Authors: Jon Lech Johansen * Derk-Jan Hartman @@ -31,6 +31,7 @@ #include "intf.h" #include "prefs.h" +#include "vlc_keys.h" /***************************************************************************** * VLCPrefs implementation @@ -128,9 +129,7 @@ case CONFIG_ITEM_DIRECTORY: { char *psz_value; - NSString *o_value; - - o_value = [o_vlc_config stringValue]; + NSString *o_value = [o_vlc_config stringValue]; psz_value = (char *)[o_value UTF8String]; config_PutPsz( p_intf, psz_name, psz_value ); @@ -153,7 +152,43 @@ config_PutFloat( p_intf, psz_name, f_value ); } break; - + + case CONFIG_ITEM_KEY: + { + unsigned int i_key = config_GetInt( p_intf, psz_name ); + unsigned int i_new_key = 0; + + if( [o_vlc_config class] == [VLCMatrix class] ) + { + int i; + NSButtonCell *o_current_cell; + NSArray *o_cells = [o_vlc_config cells]; + i_new_key = (i_key & ~KEY_MODIFIER); + for( i = 0; i < [o_cells count]; i++ ) + { + o_current_cell = [o_cells objectAtIndex:i]; + if( [[o_current_cell title] isEqualToString:_NS("Command")] && + [o_current_cell state] == NSOnState ) + i_new_key |= KEY_MODIFIER_COMMAND; + if( [[o_current_cell title] isEqualToString:_NS("Control")] && + [o_current_cell state] == NSOnState ) + i_new_key |= KEY_MODIFIER_CTRL; + if( [[o_current_cell title] isEqualToString:_NS("Option/Alt")] && + [o_current_cell state] == NSOnState ) + i_new_key |= KEY_MODIFIER_ALT; + if( [[o_current_cell title] isEqualToString:_NS("Shift")] && + [o_current_cell state] == NSOnState ) + i_new_key |= KEY_MODIFIER_SHIFT; + } + } + else + { + i_new_key = (i_key & KEY_MODIFIER); + i_new_key |= StringToKey([[o_vlc_config stringValue] cString]); + } + config_PutInt( p_intf, psz_name, i_new_key ); + } + break; } } config_SaveConfigFile( p_intf, NULL ); @@ -516,7 +551,7 @@ if ( p_item->psz_longtext != NULL ) psz_duptip = strdup( p_item->psz_longtext ); - s_rc.size.height = 27; + s_rc.size.height = 25; s_rc.size.width = 200; s_rc.origin.y += 10; @@ -528,6 +563,10 @@ [o_combo_box setTarget: self]; [o_combo_box setAction: @selector(configChanged:)]; [o_combo_box sendActionOn:NSLeftMouseUpMask]; + [[NSNotificationCenter defaultCenter] addObserver: self + selector: @selector(configChanged:) + name: NSControlTextDidChangeNotification + object: o_combo_box]; if ( psz_duptip != NULL ) { @@ -675,6 +714,101 @@ s_rc.origin.y += s_rc.size.height; } break; + + case CONFIG_ITEM_KEY: + { + int i; + char *psz_duptip = NULL; + VLCComboBox *o_combo_box; + + if ( p_item->psz_longtext != NULL ) + psz_duptip = strdup( p_item->psz_longtext ); + + s_rc.origin.y += 10; + s_rc.size.width = - 10; + s_rc.size.height = 20; + CHECK_VIEW_HEIGHT; + CONTROL_LABEL( p_item->psz_text ); + s_rc.origin.x = X_ORIGIN; + s_rc.origin.y += s_rc.size.height; + s_rc.size.width = s_vrc.size.width - X_ORIGIN * 2; + CHECK_VIEW_HEIGHT; + VLCMatrix *o_matrix = [[VLCMatrix alloc] initWithFrame: s_rc mode: NSHighlightModeMatrix cellClass: [NSButtonCell class] numberOfRows:2 numberOfColumns:2]; + NSArray *o_cells = [o_matrix cells]; + for( i=0; i < [o_cells count]; i++ ) + { + NSButtonCell *o_current_cell = [o_cells objectAtIndex:i]; + [o_current_cell setButtonType: NSSwitchButton]; + [o_current_cell setControlSize: NSSmallControlSize]; + if( psz_duptip != NULL ) + { + [o_matrix setToolTip: [NSApp wrapString: [NSApp localizedString: psz_duptip] toWidth: PREFS_WRAP] forCell: o_current_cell]; + } + switch( i ) + { + case 0: + [o_current_cell setTitle:_NS("Command")]; + [o_current_cell setState: p_item->i_value & KEY_MODIFIER_COMMAND]; + break; + case 1: + [o_current_cell setTitle:_NS("Control")]; + [o_current_cell setState: p_item->i_value & KEY_MODIFIER_CTRL]; + break; + case 2: + [o_current_cell setTitle:_NS("Option/Alt")]; + [o_current_cell setState: p_item->i_value & KEY_MODIFIER_ALT]; + break; + case 3: + [o_current_cell setTitle:_NS("Shift")]; + [o_current_cell setState: p_item->i_value & KEY_MODIFIER_SHIFT]; + break; + } + [o_current_cell setTarget: self]; + [o_current_cell setAction: @selector(configChanged:)]; + [o_current_cell sendActionOn:NSLeftMouseUpMask]; + } + CONTROL_CONFIG( o_matrix, o_module_name, + CONFIG_ITEM_KEY, p_item->psz_name ); + [o_matrix sizeToCells]; + [o_view addSubview: [o_matrix autorelease]]; + + s_rc.origin.x += [o_matrix frame].size.width + 20; + s_rc.size.height = 25; + s_rc.size.width = 100; + + CHECK_VIEW_HEIGHT; + + o_combo_box = [[VLCComboBox alloc] initWithFrame: s_rc]; + CONTROL_CONFIG( o_combo_box, o_module_name, + CONFIG_ITEM_KEY, p_item->psz_name ); + [o_combo_box setTarget: self]; + [o_combo_box setAction: @selector(configChanged:)]; + [o_combo_box sendActionOn:NSLeftMouseUpMask]; + [[NSNotificationCenter defaultCenter] addObserver: self + selector: @selector(configChanged:) + name: NSControlTextDidChangeNotification + object: o_combo_box]; + + if ( psz_duptip != NULL ) + { + [o_combo_box setToolTip: [NSApp wrapString: [NSApp localizedString: psz_duptip] toWidth: PREFS_WRAP]]; + } + [o_view addSubview: [o_combo_box autorelease]]; + + for( i = 0; i < sizeof(vlc_keys) / sizeof(key_descriptor_t); i++ ) + { + + if( vlc_keys[i].psz_key_string && *vlc_keys[i].psz_key_string ) + [o_combo_box addItemWithObjectValue: [NSApp localizedString:vlc_keys[i].psz_key_string]]; + } + + [o_combo_box setStringValue: [NSApp localizedString:KeyToString(( ((unsigned int)p_item->i_value) & ~KEY_MODIFIER ))]]; + + s_rc.origin.y += s_rc.size.height; + s_rc.origin.x = X_ORIGIN; + if( psz_duptip ) free( psz_duptip ); + } + break; } @@ -1009,3 +1143,4 @@ IMPL_CONTROL_CONFIG(PopUpButton); IMPL_CONTROL_CONFIG(ComboBox); IMPL_CONTROL_CONFIG(TextField); IMPL_CONTROL_CONFIG(Slider); +IMPL_CONTROL_CONFIG(Matrix); diff --git a/modules/gui/macosx/vout.m b/modules/gui/macosx/vout.m index 607d3ec220..750990e24e 100644 --- a/modules/gui/macosx/vout.m +++ b/modules/gui/macosx/vout.m @@ -3,7 +3,7 @@ * vout.m: MacOS X video output plugin ***************************************************************************** * Copyright (C) 2001-2003 VideoLAN - * $Id: vout.m,v 1.63 2003/11/06 16:28:28 hartman Exp $ + * $Id: vout.m,v 1.64 2003/11/11 23:50:41 hartman Exp $ * * Authors: Colin Delacroix * Florian G. Pflug @@ -995,7 +995,7 @@ static void QTFreePicture( vout_thread_t *p_vout, picture_t *p_pic ) } else { - val.i_int |= CocoaConvertKey( key ); + val.i_int |= CocoaKeyToVLC( key ); var_Set( p_vout->p_vlc, "key-pressed", val ); } } diff --git a/src/libvlc.h b/src/libvlc.h index c496418db0..e3a09c0c4b 100644 --- a/src/libvlc.h +++ b/src/libvlc.h @@ -2,7 +2,7 @@ * libvlc.h: main libvlc header ***************************************************************************** * Copyright (C) 1998-2002 VideoLAN - * $Id: libvlc.h,v 1.103 2003/11/10 00:49:48 hartman Exp $ + * $Id: libvlc.h,v 1.104 2003/11/11 23:50:41 hartman Exp $ * * Authors: Vincent Seguin * Samuel Hocevar @@ -769,6 +769,31 @@ vlc_module_begin(); /* Hotkey options*/ add_category_hint( N_("Hot keys"), HOTKEY_CAT_LONGTEXT , VLC_FALSE ); +#if defined(SYS_DARWIN) + add_key( "key-fullscreen", KEY_MODIFIER_COMMAND|'f', NULL, FULLSCREEN_KEY_TEXT, FULLSCREEN_KEY_LONGTEXT, VLC_FALSE ); + add_key( "key-play-pause", KEY_MODIFIER_COMMAND|'p', NULL, PLAY_PAUSE_KEY_TEXT, PLAY_PAUSE_KEY_LONGTEXT, VLC_FALSE ); + add_key( "key-pause", 0, NULL, PAUSE_KEY_TEXT, PAUSE_KEY_LONGTEXT, VLC_TRUE ); + add_key( "key-play", 0, NULL, PLAY_KEY_TEXT, PLAY_KEY_LONGTEXT, VLC_TRUE ); + add_key( "key-faster", KEY_MODIFIER_COMMAND|'=', NULL, FASTER_KEY_TEXT, FASTER_KEY_LONGTEXT, VLC_FALSE ); + add_key( "key-slower", KEY_MODIFIER_COMMAND|'-', NULL, SLOWER_KEY_TEXT, SLOWER_KEY_LONGTEXT, VLC_FALSE ); + add_key( "key-next", KEY_MODIFIER_COMMAND|KEY_RIGHT, NULL, NEXT_KEY_TEXT, NEXT_KEY_LONGTEXT, VLC_FALSE ); + add_key( "key-prev", KEY_MODIFIER_COMMAND|KEY_LEFT, NULL, PREV_KEY_TEXT, PREV_KEY_LONGTEXT, VLC_FALSE ); + add_key( "key-stop", KEY_MODIFIER_COMMAND|'.', NULL, STOP_KEY_TEXT, STOP_KEY_LONGTEXT, VLC_FALSE ); + add_key( "key-jump-10sec", KEY_MODIFIER_COMMAND|KEY_MODIFIER_ALT|KEY_LEFT, NULL, JB10SEC_KEY_TEXT, JB10SEC_KEY_LONGTEXT, VLC_FALSE ); + add_key( "key-jump+10sec", KEY_MODIFIER_COMMAND|KEY_MODIFIER_ALT|KEY_RIGHT, NULL, JF10SEC_KEY_TEXT, JF10SEC_KEY_LONGTEXT, VLC_FALSE ); + add_key( "key-jump-1min", KEY_MODIFIER_COMMAND|KEY_MODIFIER_SHIFT|KEY_LEFT, NULL, JB1MIN_KEY_TEXT, JB1MIN_KEY_LONGTEXT, VLC_FALSE ); + add_key( "key-jump+1min", KEY_MODIFIER_COMMAND|KEY_MODIFIER_SHIFT|KEY_RIGHT, NULL, JF1MIN_KEY_TEXT, JF1MIN_KEY_LONGTEXT, VLC_FALSE ); + add_key( "key-jump-5min", KEY_MODIFIER_COMMAND|KEY_MODIFIER_SHIFT|KEY_MODIFIER_ALT|KEY_LEFT, NULL, JB5MIN_KEY_TEXT, JB5MIN_KEY_LONGTEXT, VLC_FALSE ); + add_key( "key-jump+5min", KEY_MODIFIER_COMMAND|KEY_MODIFIER_SHIFT|KEY_MODIFIER_ALT|KEY_RIGHT, NULL, JF5MIN_KEY_TEXT, JF5MIN_KEY_LONGTEXT, VLC_FALSE ); + add_key( "key-nav-activate", KEY_ENTER, NULL, NAV_ACTIVATE_KEY_TEXT, NAV_ACTIVATE_KEY_LONGTEXT, VLC_FALSE ); + add_key( "key-nav-up", KEY_UP, NULL, NAV_UP_KEY_TEXT, NAV_UP_KEY_LONGTEXT, VLC_FALSE ); + add_key( "key-nav-down", KEY_DOWN, NULL, NAV_DOWN_KEY_TEXT, NAV_DOWN_KEY_LONGTEXT, VLC_FALSE ); + add_key( "key-nav-left", KEY_LEFT, NULL, NAV_LEFT_KEY_TEXT, NAV_LEFT_KEY_LONGTEXT, VLC_FALSE ); + add_key( "key-nav-right", KEY_RIGHT, NULL, NAV_RIGHT_KEY_TEXT, NAV_RIGHT_KEY_LONGTEXT, VLC_FALSE ); + add_key( "key-quit", KEY_MODIFIER_COMMAND|'q', NULL, QUIT_KEY_TEXT, QUIT_KEY_LONGTEXT, VLC_FALSE ); + add_key( "key-vol-up", KEY_MODIFIER_COMMAND|KEY_UP, NULL, VOL_UP_KEY_TEXT, VOL_UP_KEY_LONGTEXT, VLC_FALSE ); + add_key( "key-vol-down", KEY_MODIFIER_COMMAND|KEY_DOWN, NULL, VOL_DOWN_KEY_TEXT, VOL_DOWN_KEY_LONGTEXT, VLC_FALSE ); +#else add_key( "key-fullscreen", 'f', NULL, FULLSCREEN_KEY_TEXT, FULLSCREEN_KEY_LONGTEXT, VLC_FALSE ); add_key( "key-play-pause", KEY_SPACE, NULL, PLAY_PAUSE_KEY_TEXT, PLAY_PAUSE_KEY_LONGTEXT, VLC_FALSE ); add_key( "key-pause", 0, NULL, PAUSE_KEY_TEXT, PAUSE_KEY_LONGTEXT, VLC_TRUE ); @@ -789,9 +814,10 @@ vlc_module_begin(); add_key( "key-nav-down", KEY_DOWN, NULL, NAV_DOWN_KEY_TEXT, NAV_DOWN_KEY_LONGTEXT, VLC_FALSE ); add_key( "key-nav-left", KEY_LEFT, NULL, NAV_LEFT_KEY_TEXT, NAV_LEFT_KEY_LONGTEXT, VLC_FALSE ); add_key( "key-nav-right", KEY_RIGHT, NULL, NAV_RIGHT_KEY_TEXT, NAV_RIGHT_KEY_LONGTEXT, VLC_FALSE ); - add_key( "key-quit", KEY_MODIFIER_CTRL|KEY_SPACE, NULL, QUIT_KEY_TEXT, QUIT_KEY_LONGTEXT, VLC_FALSE ); + add_key( "key-quit", KEY_MODIFIER_CTRL|'q', NULL, QUIT_KEY_TEXT, QUIT_KEY_LONGTEXT, VLC_FALSE ); add_key( "key-vol-up", 'a', NULL, VOL_UP_KEY_TEXT, VOL_UP_KEY_LONGTEXT, VLC_FALSE ); add_key( "key-vol-down", 'z', NULL, VOL_DOWN_KEY_TEXT, VOL_DOWN_KEY_LONGTEXT, VLC_FALSE ); +#endif /* Usage (mainly useful for cmd line stuff) */ add_usage_hint( PLAYLIST_USAGE ); -- 2.39.5