From 8ac58f00b9e493bb1cd0cf1618d09e9461acceae Mon Sep 17 00:00:00 2001 From: Benjamin Pracht Date: Sun, 30 Apr 2006 19:26:25 +0000 Subject: [PATCH] * Patch from Basil Achermann to handle esc and space keyboard events in VLCControl when the controller is active * It seems that corrects a bug when the controller was the acrtive window in fullscreen (that shouldn't happen, but well...) * Best thing to do would be to handle the keypresses from the vout here too, I guess... --- THANKS | 1 + modules/gui/macosx/controls.h | 1 + modules/gui/macosx/controls.m | 118 +++++++++++++++++++++++----------- modules/gui/macosx/misc.m | 4 +- 4 files changed, 84 insertions(+), 40 deletions(-) diff --git a/THANKS b/THANKS index cd7a0bde47..b6e8a94bfc 100644 --- a/THANKS +++ b/THANKS @@ -21,6 +21,7 @@ Arkadiusz Lipiec - Polish translation Arkadiusz Miskiewicz - autoconf and Makefile patches Arnaud Gomes-do-Vale - autoconf patches Arwed v. Merkatz - Gamma correction for adjust filter +Basil Achermann - Patch to handle esc and space key events from VLCControl (OSX) Barak Ori - Bidi fixes Benjamin Mironer - Mac OS X fixes Benoit Steiner - MPEG system input, network input diff --git a/modules/gui/macosx/controls.h b/modules/gui/macosx/controls.h index a56313d666..f7a190cb60 100644 --- a/modules/gui/macosx/controls.h +++ b/modules/gui/macosx/controls.h @@ -63,6 +63,7 @@ - (IBAction)volumeSliderUpdated:(id)sender; - (IBAction)windowAction:(id)sender; +- (BOOL)keyEvent:(NSEvent *)o_event; - (void)setupVarMenuItem:(NSMenuItem *)o_mi target:(vlc_object_t *)p_object diff --git a/modules/gui/macosx/controls.m b/modules/gui/macosx/controls.m index e6c0c9d391..1870c19af6 100644 --- a/modules/gui/macosx/controls.m +++ b/modules/gui/macosx/controls.m @@ -37,6 +37,7 @@ #include "controls.h" #include + /***************************************************************************** * VLCControls implementation *****************************************************************************/ @@ -77,6 +78,32 @@ var_Set( p_intf->p_vlc, "key-pressed", val ); } +/* Small helper method */ + +-(id) getVoutView +{ + id o_window; + id o_vout_view = nil; + id o_embedded_vout_list = [[VLCMain sharedInstance] getEmbeddedList]; + NSEnumerator *o_enumerator = [[NSApp orderedWindows] objectEnumerator]; + while( !o_vout_view && ( o_window = [o_enumerator nextObject] ) ) + { + /* We have an embedded vout */ + if( [o_embedded_vout_list windowContainsEmbedded: o_window] ) + { + o_vout_view = [o_embedded_vout_list getViewForWindow: o_window]; + } + /* We have a detached vout */ + else if( [[o_window className] isEqualToString: @"VLCWindow"] ) + { + msg_Dbg( VLCIntf, "detached vout controls.m call getVoutView" ); + o_vout_view = [o_window getVoutView]; + } + } + return o_vout_view; +} + + - (IBAction)stop:(id)sender { vlc_value_t val; @@ -269,55 +296,36 @@ - (IBAction)windowAction:(id)sender { - id o_window = [NSApp keyWindow]; NSString *o_title = [sender title]; - NSArray *o_windows = [NSApp orderedWindows]; - NSEnumerator *o_enumerator = [o_windows objectEnumerator]; + vout_thread_t *p_vout = vlc_object_find( VLCIntf, VLC_OBJECT_VOUT, FIND_ANYWHERE ); - if( p_vout != NULL ) { - id o_embedded_vout_list = [[VLCMain sharedInstance] getEmbeddedList]; - while ((o_window = [o_enumerator nextObject])) + id o_vout_view = [self getVoutView]; + if( o_vout_view ) { - id o_vout_view = nil; - /* We have an embedded vout */ - if( [o_embedded_vout_list windowContainsEmbedded: o_window] ) + if( [o_title isEqualToString: _NS("Half Size") ] ) + [o_vout_view scaleWindowWithFactor: 0.5]; + else if( [o_title isEqualToString: _NS("Normal Size") ] ) + [o_vout_view scaleWindowWithFactor: 1.0]; + else if( [o_title isEqualToString: _NS("Double Size") ] ) + [o_vout_view scaleWindowWithFactor: 2.0]; + else if( [o_title isEqualToString: _NS("Float on Top") ] ) + [o_vout_view toggleFloatOnTop]; + else if( [o_title isEqualToString: _NS("Fit to Screen") ] ) { - o_vout_view = [o_embedded_vout_list getViewForWindow: o_window]; + id o_window = [o_vout_view getWindow]; + if( ![o_window isZoomed] ) + [o_window performZoom:self]; } - /* We have a detached Vout */ - else if( [[o_window className] isEqualToString: @"VLCWindow"] ) + else if( [o_title isEqualToString: _NS("Snapshot") ] ) { - msg_Dbg( VLCIntf, "detached vout controls.m call getVoutView" ); - o_vout_view = [o_window getVoutView]; + [o_vout_view snapshot]; } - - if( o_vout_view ) + else { - if( [o_title isEqualToString: _NS("Half Size") ] ) - [o_vout_view scaleWindowWithFactor: 0.5]; - else if( [o_title isEqualToString: _NS("Normal Size") ] ) - [o_vout_view scaleWindowWithFactor: 1.0]; - else if( [o_title isEqualToString: _NS("Double Size") ] ) - [o_vout_view scaleWindowWithFactor: 2.0]; - else if( [o_title isEqualToString: _NS("Float on Top") ] ) - [o_vout_view toggleFloatOnTop]; - else if( [o_title isEqualToString: _NS("Fit to Screen") ] ) - { - if( ![o_window isZoomed] ) - [o_window performZoom:self]; - } - else if( [o_title isEqualToString: _NS("Snapshot") ] ) - { - [o_vout_view snapshot]; - } - else - { - [o_vout_view toggleFullscreen]; - } - break; + [o_vout_view toggleFullscreen]; } } vlc_object_release( (vlc_object_t *)p_vout ); @@ -339,6 +347,38 @@ } +- (BOOL)keyEvent:(NSEvent *)o_event +{ + BOOL eventHandled = NO; + unichar key = [[o_event charactersIgnoringModifiers] characterAtIndex: 0]; + + if( key ) + { + vout_thread_t *p_vout = vlc_object_find( VLCIntf, VLC_OBJECT_VOUT, + FIND_ANYWHERE ); + if( p_vout != NULL ) + { + /* Escape */ + if( key == (unichar) 0x1b ) + { + id o_vout_view = [self getVoutView]; + if( o_vout_view && [o_vout_view isFullscreen] ) + { + [o_vout_view toggleFullscreen]; + eventHandled = YES; + } + } + else if( key == ' ' ) + { + [self play:self]; + eventHandled = YES; + } + vlc_object_release( (vlc_object_t *)p_vout ); + } + } + return eventHandled; +} + - (void)setupVarMenuItem:(NSMenuItem *)o_mi target:(vlc_object_t *)p_object var:(const char *)psz_variable @@ -747,7 +787,7 @@ [o_mi setState: val.b_bool]; bEnabled = TRUE; } - [o_main setupMenus]; /* Make sure video menu is up to date */ + [o_main setupMenus]; /* Make sure video menu is up to date */ } vlc_mutex_unlock( &p_playlist->object_lock ); diff --git a/modules/gui/macosx/misc.m b/modules/gui/macosx/misc.m index fd25b6d786..89cb25ed2c 100644 --- a/modules/gui/macosx/misc.m +++ b/modules/gui/macosx/misc.m @@ -26,6 +26,7 @@ #include "intf.h" /* VLCApplication */ #include "misc.h" #include "playlist.h" +#include "controls.h" /***************************************************************************** * VLCControllerWindow @@ -46,7 +47,8 @@ - (BOOL)performKeyEquivalent:(NSEvent *)o_event { - return [[VLCMain sharedInstance] hasDefinedShortcutKey:o_event]; + return [[VLCMain sharedInstance] hasDefinedShortcutKey:o_event] || + [(VLCControls *)[[VLCMain sharedInstance] getControls] keyEvent:o_event]; } @end -- 2.39.2