X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Fgui%2Fmacosx%2Fcontrols.m;h=b59df439d11c5023db725849b8ff67615de33282;hb=ba714bedc852cc4a04c422b1dce3fa69e083a236;hp=da7f5d4391ce66bb007833c2e3cecc2829c62f6a;hpb=74fd152da0cc0b9fe5dd856239da6967ce28e6e0;p=vlc diff --git a/modules/gui/macosx/controls.m b/modules/gui/macosx/controls.m index da7f5d4391..b59df439d1 100644 --- a/modules/gui/macosx/controls.m +++ b/modules/gui/macosx/controls.m @@ -1,20 +1,20 @@ /***************************************************************************** * controls.m: MacOS X interface module ***************************************************************************** - * Copyright (C) 2002-2006 the VideoLAN team + * Copyright (C) 2002-2007 the VideoLAN team * $Id$ * * Authors: Jon Lech Johansen * Christophe Massiot * Derk-Jan Hartman * Benjamin Pracht - * Felix KŸhne + * Felix Kühne * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. - * + * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the @@ -38,9 +38,10 @@ #import "controls.h" #import "playlist.h" #include +#include /***************************************************************************** - * VLCControls implementation + * VLCControls implementation *****************************************************************************/ @implementation VLCControls @@ -58,6 +59,60 @@ [o_specificTime_ok_btn setTitle: _NS("OK")]; [o_specificTime_sec_lbl setStringValue: _NS("sec.")]; [o_specificTime_goTo_lbl setStringValue: _NS("Jump to time")]; + + o_repeat_off = [NSImage imageNamed:@"repeat_embedded"]; + + [self controlTintChanged]; + + [[NSNotificationCenter defaultCenter] addObserver: self + selector: @selector( controlTintChanged ) + name: NSControlTintDidChangeNotification + object: nil]; +} + +- (void)controlTintChanged +{ + int i_repeat = 0; + if( [o_btn_repeat image] == o_repeat_single ) + i_repeat = 1; + else if( [o_btn_repeat image] == o_repeat_all ) + i_repeat = 2; + + if( [NSColor currentControlTint] == NSGraphiteControlTint ) + { + o_repeat_single = [NSImage imageNamed:@"repeat_single_embedded_graphite"]; + o_repeat_all = [NSImage imageNamed:@"repeat_embedded_graphite"]; + + [o_btn_shuffle setAlternateImage: [NSImage imageNamed: @"shuffle_embedded_graphite"]]; + [o_btn_addNode setAlternateImage: [NSImage imageNamed: @"add_embedded_graphite"]]; + } + else + { + o_repeat_single = [NSImage imageNamed:@"repeat_single_embedded_blue"]; + o_repeat_all = [NSImage imageNamed:@"repeat_embedded_blue"]; + + [o_btn_shuffle setAlternateImage: [NSImage imageNamed: @"shuffle_embedded_blue"]]; + [o_btn_addNode setAlternateImage: [NSImage imageNamed: @"add_embedded_blue"]]; + } + + /* update the repeat button, but keep its state */ + if( i_repeat == 1 ) + [self repeatOne]; + else if( i_repeat == 2 ) + [self repeatAll]; + else + [self repeatOff]; +} + +- (void)dealloc +{ + [[NSNotificationCenter defaultCenter] removeObserver: self]; + + [o_repeat_single release]; + [o_repeat_all release]; + [o_repeat_off release]; + + [super dealloc]; } - (IBAction)play:(id)sender @@ -66,16 +121,16 @@ intf_thread_t * p_intf = VLCIntf; playlist_t * p_playlist = pl_Yield( p_intf ); - vlc_mutex_lock( &p_playlist->object_lock ); + vlc_object_lock( p_playlist ); if( playlist_IsEmpty( p_playlist ) ) { - vlc_mutex_unlock( &p_playlist->object_lock ); + vlc_object_unlock( p_playlist ); vlc_object_release( p_playlist ); [o_main intfOpenFileGeneric: (id)sender]; } else { - vlc_mutex_unlock( &p_playlist->object_lock ); + vlc_object_unlock( p_playlist ); vlc_object_release( p_playlist ); } @@ -169,26 +224,26 @@ config_PutInt( p_playlist, "random", 0 ); } - p_intf->p_sys->b_playmode_update = VLC_TRUE; - p_intf->p_sys->b_intf_update = VLC_TRUE; + p_intf->p_sys->b_playmode_update = true; + p_intf->p_sys->b_intf_update = true; vlc_object_release( p_playlist ); } /* three little ugly helpers */ - (void)repeatOne { - [o_btn_repeat setImage: [NSImage imageNamed:@"repeat_single_embedded_blue"]]; - [o_btn_repeat setAlternateImage: [NSImage imageNamed:@"repeat_embedded_blue"]]; + [o_btn_repeat setImage: o_repeat_single]; + [o_btn_repeat setAlternateImage: o_repeat_all]; } - (void)repeatAll { - [o_btn_repeat setImage: [NSImage imageNamed:@"repeat_embedded_blue"]]; - [o_btn_repeat setAlternateImage: [NSImage imageNamed:@"repeat_embedded"]]; + [o_btn_repeat setImage: o_repeat_all]; + [o_btn_repeat setAlternateImage: o_repeat_off]; } - (void)repeatOff { - [o_btn_repeat setImage: [NSImage imageNamed:@"repeat_embedded"]]; - [o_btn_repeat setAlternateImage: [NSImage imageNamed:@"repeat_single_embedded_blue"]]; + [o_btn_repeat setImage: o_repeat_off]; + [o_btn_repeat setAlternateImage: o_repeat_single]; } - (void)shuffle { @@ -211,57 +266,57 @@ if( !repeating.b_bool && !looping.b_bool ) { /* was: no repeating at all, switching to Repeat One */ - + /* set our button's look */ [self repeatOne]; - + /* prepare core communication */ - repeating.b_bool = VLC_TRUE; - looping.b_bool = VLC_FALSE; + repeating.b_bool = true; + looping.b_bool = false; config_PutInt( p_playlist, "repeat", 1 ); - config_PutInt( p_playlist, "loop", 0 ); - + config_PutInt( p_playlist, "loop", 0 ); + /* show the change */ vout_OSDMessage( p_intf, DEFAULT_CHAN, _( "Repeat One" ) ); } else if( repeating.b_bool && !looping.b_bool ) { /* was: Repeat One, switching to Repeat All */ - + /* set our button's look */ [self repeatAll]; - + /* prepare core communication */ - repeating.b_bool = VLC_FALSE; - looping.b_bool = VLC_TRUE; - config_PutInt( p_playlist, "repeat", 0 ); - config_PutInt( p_playlist, "loop", 1 ); - + repeating.b_bool = false; + looping.b_bool = true; + config_PutInt( p_playlist, "repeat", 0 ); + config_PutInt( p_playlist, "loop", 1 ); + /* show the change */ vout_OSDMessage( p_intf, DEFAULT_CHAN, _( "Repeat All" ) ); } else { /* was: Repeat All or bug in VLC, switching to Repeat Off */ - + /* set our button's look */ [self repeatOff]; - + /* prepare core communication */ - repeating.b_bool = VLC_FALSE; - looping.b_bool = VLC_FALSE; - config_PutInt( p_playlist, "repeat", 0 ); - config_PutInt( p_playlist, "loop", 0 ); - + repeating.b_bool = false; + looping.b_bool = false; + config_PutInt( p_playlist, "repeat", 0 ); + config_PutInt( p_playlist, "loop", 0 ); + /* show the change */ vout_OSDMessage( p_intf, DEFAULT_CHAN, _( "Repeat Off" ) ); } /* communicate with core and the main intf loop */ var_Set( p_playlist, "repeat", repeating ); - var_Set( p_playlist, "loop", looping ); - p_intf->p_sys->b_playmode_update = VLC_TRUE; - p_intf->p_sys->b_intf_update = VLC_TRUE; + var_Set( p_playlist, "loop", looping ); + p_intf->p_sys->b_playmode_update = true; + p_intf->p_sys->b_intf_update = true; vlc_object_release( p_playlist ); } @@ -290,9 +345,9 @@ vout_OSDMessage( p_intf, DEFAULT_CHAN, _( "Repeat Off" ) ); config_PutInt( p_playlist, "repeat", 0 ); } - - p_intf->p_sys->b_playmode_update = VLC_TRUE; - p_intf->p_sys->b_intf_update = VLC_TRUE; + + p_intf->p_sys->b_playmode_update = true; + p_intf->p_sys->b_intf_update = true; vlc_object_release( p_playlist ); } @@ -320,8 +375,8 @@ config_PutInt( p_playlist, "loop", 0 ); } - p_intf->p_sys->b_playmode_update = VLC_TRUE; - p_intf->p_sys->b_intf_update = VLC_TRUE; + p_intf->p_sys->b_playmode_update = true; + p_intf->p_sys->b_intf_update = true; vlc_object_release( p_playlist ); } @@ -393,12 +448,13 @@ intf_thread_t * p_intf = VLCIntf; val.i_int = config_GetInt( p_intf, "key-position" ); var_Set( p_intf, "key-pressed", val ); + vlc_object_release( (vlc_object_t *)p_vout ); } } - (IBAction)toogleFullscreen:(id)sender { - NSMenuItem *o_mi = [[NSMenuItem alloc] initWithTitle: _NS("Fullscreen") action: nil keyEquivalent:@""]; - [self windowAction: [o_mi autorelease]]; + NSMenuItem *o_mi = [[NSMenuItem alloc] initWithTitle: _NS("Fullscreen") action: nil keyEquivalent:@""]; + [self windowAction: [o_mi autorelease]]; } - (BOOL) isFullscreen { @@ -463,6 +519,35 @@ } +- (void)scrollWheel:(NSEvent *)theEvent +{ + intf_thread_t * p_intf = VLCIntf; + float f_yabsvalue = [theEvent deltaY] > 0.0f ? [theEvent deltaY] : -[theEvent deltaY]; + float f_xabsvalue = [theEvent deltaX] > 0.0f ? [theEvent deltaX] : -[theEvent deltaX]; + int i, i_yvlckey, i_xvlckey; + + if ([theEvent deltaY] < 0.0f) + i_yvlckey = KEY_MOUSEWHEELDOWN; + else + i_yvlckey = KEY_MOUSEWHEELUP; + + if ([theEvent deltaX] < 0.0f) + i_xvlckey = KEY_MOUSEWHEELRIGHT; + else + i_xvlckey = KEY_MOUSEWHEELLEFT; + + /* Send multiple key event, depending on the intensity of the event */ + for (i = 0; i < (int)(f_yabsvalue/4.+1.) && f_yabsvalue > 0.05 ; i++) + var_SetInteger( p_intf->p_libvlc, "key-pressed", i_yvlckey ); + + /* Prioritize Y event (sound volume) over X event */ + if (f_yabsvalue < 0.05) + { + for (i = 0; i < (int)(f_xabsvalue/6.+1.) && f_xabsvalue > 0.05; i++) + var_SetInteger( p_intf->p_libvlc, "key-pressed", i_xvlckey ); + } +} + - (BOOL)keyEvent:(NSEvent *)o_event { BOOL eventHandled = NO; @@ -515,7 +600,7 @@ /* Variable doesn't exist or isn't handled */ return; } - + /* Make sure we want to display the variable */ if( i_type & VLC_VAR_HASCHOICE ) { @@ -524,7 +609,7 @@ if( (i_type & VLC_VAR_TYPE) != VLC_VAR_VARIABLE && val.i_int == 1 ) return; } - + /* Get the descriptive name of the variable */ var_Change( p_object, psz_variable, VLC_VAR_GETTEXT, &text, NULL ); [o_mi setTitle: [[VLCMain sharedInstance] localizedString: text.psz_string ? @@ -537,8 +622,8 @@ [self setupVarMenu: o_menu forMenuItem: o_mi target:p_object var:psz_variable selector:pf_callback]; - - if( text.psz_string ) free( text.psz_string ); + + free( text.psz_string ); return; } @@ -560,12 +645,12 @@ break; default: - if( text.psz_string ) free( text.psz_string ); + free( text.psz_string ); return; } if( ( i_type & VLC_VAR_TYPE ) == VLC_VAR_STRING ) free( val.psz_string ); - if( text.psz_string ) free( text.psz_string ); + free( text.psz_string ); } @@ -701,15 +786,14 @@ vlc_thread_set_priority( VLCIntf , VLC_THREAD_PRIORITY_LOW ); - p_object = (vlc_object_t *)vlc_object_get( VLCIntf, - [o_data objectID] ); + p_object = (vlc_object_t *)vlc_object_get( [o_data objectID] ); if( p_object != NULL ) { var_Set( p_object, strdup([o_data name]), [o_data value] ); vlc_object_release( p_object ); [o_pool release]; - return VLC_TRUE; + return true; } [o_pool release]; return VLC_EGENERIC; @@ -730,7 +814,7 @@ { unsigned int timeInSec = 0; NSString * fieldContent = [o_specificTime_enter_fld stringValue]; - if( [[fieldContent componentsSeparatedByString: @":"] count] > 1 && + if( [[fieldContent componentsSeparatedByString: @":"] count] > 1 && [[fieldContent componentsSeparatedByString: @":"] count] <= 3 ) { NSArray * ourTempArray = \ @@ -754,7 +838,7 @@ input_Control( p_input, INPUT_SET_TIME, (int64_t)(timeInSec * 1000000)); vlc_object_release( p_input ); } - + [NSApp endSheet: o_specificTime_win]; [o_specificTime_win close]; } @@ -802,7 +886,7 @@ intf_thread_t * p_intf = VLCIntf; playlist_t * p_playlist = pl_Yield( p_intf ); - vlc_mutex_lock( &p_playlist->object_lock ); + vlc_object_lock( p_playlist ); #define p_input p_playlist->p_input @@ -829,8 +913,8 @@ else if( [[o_mi title] isEqualToString: _NS("Previous")] || [[o_mi title] isEqualToString: _NS("Next")] ) { - /** \todo fix i_size use */ - bEnabled = p_playlist->items.i_size > 1; + /** \todo fix i_size use */ + bEnabled = p_playlist->items.i_size > 1; } else if( [[o_mi title] isEqualToString: _NS("Random")] ) { @@ -881,7 +965,7 @@ NSArray *o_windows = [NSApp orderedWindows]; NSEnumerator *o_enumerator = [o_windows objectEnumerator]; bEnabled = FALSE; - + vout_thread_t *p_vout = vlc_object_find( p_intf, VLC_OBJECT_VOUT, FIND_ANYWHERE ); if( p_vout != NULL ) @@ -913,7 +997,7 @@ [o_main setupMenus]; /* Make sure video menu is up to date */ } - vlc_mutex_unlock( &p_playlist->object_lock ); + vlc_object_unlock( p_playlist ); vlc_object_release( p_playlist ); return( bEnabled ); @@ -922,7 +1006,7 @@ @end /***************************************************************************** - * VLCMenuExt implementation + * VLCMenuExt implementation ***************************************************************************** * Object connected to a playlistitem which remembers the data belonging to * the variable of the autogenerated menu @@ -975,7 +1059,7 @@ /***************************************************************************** - * VLCTimeField implementation + * VLCTimeField implementation ***************************************************************************** * we need this to catch our click-event in the controller window *****************************************************************************/