Commit bbb63fe9 authored by David Fuhrmann's avatar David Fuhrmann

macosx: several fixes and improvements for hotkey handling

- volume and mute hotkeys are handled by core now, providing a proper osd screen
- some fixes in detection if key combo is valid hotkey
- fix for mem leak
(cherry picked from commit 1536ed21be0f545840bf8b15e89e4f81fd1908a8)
Signed-off-by: default avatarDavid Fuhrmann <david.fuhrmann@googlemail.com>
parent bff6ee5e
......@@ -102,14 +102,39 @@ static VLCMainWindow *_o_sharedInstance = nil;
return self;
}
- (BOOL)isEvent:(NSEvent *)o_event forKey:(const char *)keyString
{
char *key;
NSString *o_key;
key = config_GetPsz( VLCIntf, keyString );
o_key = [NSString stringWithFormat:@"%s", key];
FREENULL( key );
unsigned int i_keyModifiers = [[VLCMain sharedInstance] VLCModifiersToCocoa:o_key];
return [[[o_event charactersIgnoringModifiers] lowercaseString] isEqualToString: [[VLCMain sharedInstance] VLCKeyToString: o_key]] &&
(i_keyModifiers & NSShiftKeyMask) == ([o_event modifierFlags] & NSShiftKeyMask) &&
(i_keyModifiers & NSControlKeyMask) == ([o_event modifierFlags] & NSControlKeyMask) &&
(i_keyModifiers & NSAlternateKeyMask) == ([o_event modifierFlags] & NSAlternateKeyMask) &&
(i_keyModifiers & NSCommandKeyMask) == ([o_event modifierFlags] & NSCommandKeyMask);
}
- (BOOL)performKeyEquivalent:(NSEvent *)o_event
{
/* We indeed want to prioritize Cocoa key equivalent against libvlc,
so we perform the menu equivalent now. */
if([[NSApp mainMenu] performKeyEquivalent:o_event])
return TRUE;
// these are key events which should be handled by vlc core, but are attached to a main menu item
if( ![self isEvent: o_event forKey: "key-vol-up"] &&
![self isEvent: o_event forKey: "key-vol-down"] &&
![self isEvent: o_event forKey: "key-vol-mute"] )
{
/* We indeed want to prioritize some Cocoa key equivalent against libvlc,
so we perform the menu equivalent now. */
if([[NSApp mainMenu] performKeyEquivalent:o_event])
return TRUE;
}
return [[VLCMain sharedInstance] hasDefinedShortcutKey:o_event] || [(VLCControls *)[[VLCMain sharedInstance] controls] keyEvent:o_event];
return [[VLCMain sharedInstance] hasDefinedShortcutKey:o_event] ||
[(VLCControls *)[[VLCMain sharedInstance] controls] keyEvent:o_event];
}
- (void)dealloc
......
......@@ -35,6 +35,7 @@
#import "VideoView.h"
#import "CoreInteraction.h"
#import "MainMenu.h"
#import "MainWindow.h"
#import <vlc_common.h>
#import <vlc_keys.h>
......@@ -174,6 +175,11 @@ int DeviceCallback( vlc_object_t *p_this, const char *psz_variable,
[super keyDown: o_event];
}
- (BOOL)performKeyEquivalent:(NSEvent *)o_event
{
return [[VLCMainWindow sharedInstance] performKeyEquivalent: o_event];
}
- (void)mouseDown:(NSEvent *)o_event
{
if( ( [o_event type] == NSLeftMouseDown ) &&
......
......@@ -798,6 +798,8 @@ static VLCMain *_o_sharedMainInstance = nil;
[o_msg_arr removeAllObjects];
[o_msg_arr release];
o_msg_arr = NULL;
[o_usedHotkeys release];
o_usedHotkeys = NULL;
[o_msg_lock release];
......@@ -1299,88 +1301,81 @@ unsigned int CocoaKeyToVLC( unichar i_key )
unichar key = 0;
vlc_value_t val;
unsigned int i_pressed_modifiers = 0;
const struct hotkey *p_hotkeys;
int i;
NSMutableString *tempString = [[NSMutableString alloc] init];
NSMutableString *tempStringPlus = [[NSMutableString alloc] init];
val.i_int = 0;
p_hotkeys = p_intf->p_libvlc->p_hotkeys;
i_pressed_modifiers = [o_event modifierFlags];
if( i_pressed_modifiers & NSShiftKeyMask ) {
val.i_int |= KEY_MODIFIER_SHIFT;
[tempString appendString:@"Shift-"];
[tempStringPlus appendString:@"Shift+"];
}
if( i_pressed_modifiers & NSControlKeyMask ) {
val.i_int |= KEY_MODIFIER_CTRL;
[tempString appendString:@"Ctrl-"];
[tempStringPlus appendString:@"Ctrl+"];
}
if( i_pressed_modifiers & NSAlternateKeyMask ) {
val.i_int |= KEY_MODIFIER_ALT;
[tempString appendString:@"Alt-"];
[tempStringPlus appendString:@"Alt+"];
}
if( i_pressed_modifiers & NSShiftKeyMask ) {
val.i_int |= KEY_MODIFIER_SHIFT;
}
if( i_pressed_modifiers & NSCommandKeyMask ) {
val.i_int |= KEY_MODIFIER_COMMAND;
[tempString appendString:@"Command-"];
[tempStringPlus appendString:@"Command+"];
}
[tempString appendString:[[o_event charactersIgnoringModifiers] lowercaseString]];
[tempStringPlus appendString:[[o_event charactersIgnoringModifiers] lowercaseString]];
key = [[o_event charactersIgnoringModifiers] characterAtIndex: 0];
/* handle Lion's default key combo for fullscreen-toggle in addition to our own hotkeys */
if( key == 'f' && i_pressed_modifiers & NSControlKeyMask && i_pressed_modifiers & NSCommandKeyMask )
{
[[VLCCoreInteraction sharedInstance] toggleFullscreen];
[tempString release];
[tempStringPlus release];
return YES;
}
switch( key )
if( val.i_int == 0 ) // ignore only when no modifier is pressed
{
case NSDeleteCharacter:
case NSDeleteFunctionKey:
case NSDeleteCharFunctionKey:
case NSBackspaceCharacter:
case NSUpArrowFunctionKey:
case NSDownArrowFunctionKey:
case NSRightArrowFunctionKey:
case NSLeftArrowFunctionKey:
case NSEnterCharacter:
case NSCarriageReturnCharacter:
[tempString release];
[tempStringPlus release];
return NO;
switch( key )
{
case NSDeleteCharacter:
case NSDeleteFunctionKey:
case NSDeleteCharFunctionKey:
case NSBackspaceCharacter:
case NSUpArrowFunctionKey:
case NSDownArrowFunctionKey:
case NSRightArrowFunctionKey:
case NSLeftArrowFunctionKey:
case NSEnterCharacter:
case NSCarriageReturnCharacter:
return NO;
}
}
if( key == 0x0020 ) // space key
{
[[VLCCoreInteraction sharedInstance] play];
[tempString release];
[tempStringPlus release];
return YES;
}
val.i_int |= CocoaKeyToVLC( key );
if( [o_usedHotkeys indexOfObject: tempString] != NSNotFound || [o_usedHotkeys indexOfObject: tempStringPlus] != NSNotFound )
BOOL b_found_key = NO;
for( int i = 0; i < [o_usedHotkeys count]; i++ )
{
NSString *str = [o_usedHotkeys objectAtIndex: i];
unsigned int i_keyModifiers = [self VLCModifiersToCocoa: str];
if( [[[o_event charactersIgnoringModifiers] lowercaseString] isEqualToString: [self VLCKeyToString: str]] &&
(i_keyModifiers & NSShiftKeyMask) == (i_pressed_modifiers & NSShiftKeyMask) &&
(i_keyModifiers & NSControlKeyMask) == (i_pressed_modifiers & NSControlKeyMask) &&
(i_keyModifiers & NSAlternateKeyMask) == (i_pressed_modifiers & NSAlternateKeyMask) &&
(i_keyModifiers & NSCommandKeyMask) == (i_pressed_modifiers & NSCommandKeyMask) )
{
b_found_key = YES;
break;
}
}
if( b_found_key )
{
var_SetInteger( p_intf->p_libvlc, "key-pressed", val.i_int );
[tempString release];
[tempStringPlus release];
return YES;
}
[tempString release];
[tempStringPlus release];
return NO;
}
......@@ -1404,10 +1399,15 @@ unsigned int CocoaKeyToVLC( unichar i_key )
&& !EMPTY_STR( p_item->psz_text ) )
{
if (p_item->value.psz)
{
[o_tempArray addObject: [NSString stringWithUTF8String:p_item->value.psz]];
}
}
}
module_config_free (p_config);
if( o_usedHotkeys )
[o_usedHotkeys release];
o_usedHotkeys = [[NSArray alloc] initWithArray: o_tempArray copyItems: YES];
[o_tempArray release];
}
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment