X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Fgui%2Fmacosx%2Fvout.m;h=750990e24ea750ea0ababe7d020ad66a07e69c31;hb=764f9e8b0e6799686fb6509269784baa734dfdfb;hp=c000d539776d8e1e1a3da0dcf374f8dceb812798;hpb=e559e8c8c1c188a38726b8cf8778b666b01c1680;p=vlc diff --git a/modules/gui/macosx/vout.m b/modules/gui/macosx/vout.m index c000d53977..750990e24e 100644 --- a/modules/gui/macosx/vout.m +++ b/modules/gui/macosx/vout.m @@ -1,8 +1,9 @@ + /***************************************************************************** * vout.m: MacOS X video output plugin ***************************************************************************** * Copyright (C) 2001-2003 VideoLAN - * $Id: vout.m,v 1.43 2003/03/19 13:55:43 hartman Exp $ + * $Id: vout.m,v 1.64 2003/11/11 23:50:41 hartman Exp $ * * Authors: Colin Delacroix * Florian G. Pflug @@ -33,6 +34,8 @@ #include +#include + #include "intf.h" #include "vout.h" @@ -51,6 +54,7 @@ struct picture_sys_t /***************************************************************************** * Local prototypes *****************************************************************************/ + static int vout_Init ( vout_thread_t * ); static void vout_End ( vout_thread_t * ); static int vout_Manage ( vout_thread_t * ); @@ -79,6 +83,9 @@ int E_(OpenVideo) ( vlc_object_t *p_this ) vout_thread_t * p_vout = (vout_thread_t *)p_this; OSErr err; int i_timeout; + vlc_value_t value_drawable; + + var_Get( p_vout->p_vlc, "drawable", &value_drawable ); p_vout->p_sys = malloc( sizeof( vout_sys_t ) ); if( p_vout->p_sys == NULL ) @@ -89,41 +96,46 @@ int E_(OpenVideo) ( vlc_object_t *p_this ) memset( p_vout->p_sys, 0, sizeof( vout_sys_t ) ); - /* Wait for a MacOS X interface to appear. Timeout is 2 seconds. */ - for( i_timeout = 20 ; i_timeout-- ; ) + /* We don't need an intf in mozilla plugin */ + if( value_drawable.i_int == 0 ) { - if( NSApp == NULL ) + /* Wait for a MacOS X interface to appear. Timeout is 2 seconds. */ + for( i_timeout = 20 ; i_timeout-- ; ) { - msleep( INTF_IDLE_SLEEP ); - } - } - - if( NSApp == NULL ) - { - /* no MacOS X intf, unable to communicate with MT */ - msg_Err( p_vout, "no MacOS X interface present" ); - free( p_vout->p_sys ); - return( 1 ); - } - - if( [NSApp respondsToSelector: @selector(getIntf)] ) - { - intf_thread_t * p_intf; - - for( i_timeout = 10 ; i_timeout-- ; ) - { - if( ( p_intf = [NSApp getIntf] ) == NULL ) + if( NSApp == NULL ) { msleep( INTF_IDLE_SLEEP ); } } - - if( p_intf == NULL ) + + if( NSApp == NULL ) { - msg_Err( p_vout, "MacOS X intf has getIntf, but is NULL" ); + /* no MacOS X intf, unable to communicate with MT */ + msg_Err( p_vout, "no MacOS X interface present" ); free( p_vout->p_sys ); return( 1 ); } + + + if( [NSApp respondsToSelector: @selector(getIntf)] ) + { + intf_thread_t * p_intf; + + for( i_timeout = 10 ; i_timeout-- ; ) + { + if( ( p_intf = [NSApp getIntf] ) == NULL ) + { + msleep( INTF_IDLE_SLEEP ); + } + } + + if( p_intf == NULL ) + { + msg_Err( p_vout, "MacOS X intf has getIntf, but is NULL" ); + free( p_vout->p_sys ); + return( 1 ); + } + } } p_vout->p_sys->h_img_descr = @@ -131,10 +143,25 @@ int E_(OpenVideo) ( vlc_object_t *p_this ) p_vout->p_sys->p_matrix = (MatrixRecordPtr)malloc( sizeof(MatrixRecord) ); p_vout->p_sys->p_fullscreen_state = NULL; - p_vout->p_sys->b_mouse_pointer_visible = YES; - p_vout->p_sys->b_mouse_moved = YES; + p_vout->p_sys->b_mouse_moved = VLC_TRUE; p_vout->p_sys->i_time_mouse_last_moved = mdate(); + if( value_drawable.i_int != 0 ) + { + p_vout->p_sys->mask = NewRgn(); + p_vout->p_sys->rect.left = 0 ; + p_vout->p_sys->rect.right = 0 ; + p_vout->p_sys->rect.top = 0 ; + p_vout->p_sys->rect.bottom = 0 ; + + p_vout->p_sys->isplugin = VLC_TRUE ; + + } else + { + p_vout->p_sys->mask = NULL; + p_vout->p_sys->isplugin = VLC_FALSE ; + } + /* set window size */ p_vout->p_sys->s_rect.size.width = p_vout->i_window_width; p_vout->p_sys->s_rect.size.height = p_vout->i_window_height; @@ -148,24 +175,21 @@ int E_(OpenVideo) ( vlc_object_t *p_this ) return( 1 ); } - if( vout_ChromaCmp( p_vout->render.i_chroma, VLC_FOURCC('I','4','2','0') ) ) + /* Damn QT isn't thread safe. so keep a lock in the p_vlc object */ + vlc_mutex_lock( &p_vout->p_vlc->quicktime_lock ); + + err = FindCodec( kYUV420CodecType, bestSpeedCodec, + nil, &p_vout->p_sys->img_dc ); + + vlc_mutex_unlock( &p_vout->p_vlc->quicktime_lock ); + if( err == noErr && p_vout->p_sys->img_dc != 0 ) { - err = FindCodec( kYUV420CodecType, bestSpeedCodec, - nil, &p_vout->p_sys->img_dc ); - if( err == noErr && p_vout->p_sys->img_dc != 0 ) - { - p_vout->output.i_chroma = VLC_FOURCC('I','4','2','0'); - p_vout->p_sys->i_codec = kYUV420CodecType; - } - else - { - msg_Err( p_vout, "failed to find an appropriate codec" ); - } + p_vout->output.i_chroma = VLC_FOURCC('I','4','2','0'); + p_vout->p_sys->i_codec = kYUV420CodecType; } else { - msg_Err( p_vout, "chroma 0x%08x not supported", - p_vout->render.i_chroma ); + msg_Err( p_vout, "failed to find an appropriate codec" ); } if( p_vout->p_sys->img_dc == 0 ) @@ -173,7 +197,7 @@ int E_(OpenVideo) ( vlc_object_t *p_this ) free( p_vout->p_sys->p_matrix ); DisposeHandle( (Handle)p_vout->p_sys->h_img_descr ); free( p_vout->p_sys ); - return( 1 ); + return VLC_EGENERIC; } NSAutoreleasePool * o_pool = [[NSAutoreleasePool alloc] init]; @@ -181,14 +205,16 @@ int E_(OpenVideo) ( vlc_object_t *p_this ) if( [o_screens count] > 0 && var_Type( p_vout, "video-device" ) == 0 ) { int i = 1; - vlc_value_t val; + vlc_value_t val, text; NSScreen * o_screen; int i_option = config_GetInt( p_vout, "macosx-vdev" ); - var_Create( p_vout, "video-device", VLC_VAR_STRING | + var_Create( p_vout, "video-device", VLC_VAR_INTEGER | VLC_VAR_HASCHOICE ); - + text.psz_string = _("Video device"); + var_Change( p_vout, "video-device", VLC_VAR_SETTEXT, &text, NULL ); + NSEnumerator * o_enumerator = [o_screens objectEnumerator]; while( (o_screen = [o_enumerator nextObject]) != NULL ) @@ -200,14 +226,15 @@ int E_(OpenVideo) ( vlc_object_t *p_this ) "%s %d (%dx%d)", _("Screen"), i, (int)s_rect.size.width, (int)s_rect.size.height ); - val.psz_string = psz_temp; - var_Change( p_vout, "video-device", VLC_VAR_ADDCHOICE, &val ); + text.psz_string = psz_temp; + val.i_int = i; + var_Change( p_vout, "video-device", + VLC_VAR_ADDCHOICE, &val, &text ); if( ( i - 1 ) == i_option ) { var_Set( p_vout, "video-device", val ); } - i++; } @@ -219,13 +246,17 @@ int E_(OpenVideo) ( vlc_object_t *p_this ) } [o_pool release]; - if( CoCreateWindow( p_vout ) ) + /* We don't need a window either in the mozilla plugin */ + if( p_vout->p_sys->isplugin == 0 ) { - msg_Err( p_vout, "unable to create window" ); - free( p_vout->p_sys->p_matrix ); - DisposeHandle( (Handle)p_vout->p_sys->h_img_descr ); - free( p_vout->p_sys ); - return( 1 ); + if( CoCreateWindow( p_vout ) ) + { + msg_Err( p_vout, "unable to create window" ); + free( p_vout->p_sys->p_matrix ); + DisposeHandle( (Handle)p_vout->p_sys->h_img_descr ); + free( p_vout->p_sys ); + return( 1 ); + } } p_vout->pf_init = vout_Init; @@ -244,6 +275,7 @@ static int vout_Init( vout_thread_t *p_vout ) { int i_index; picture_t *p_pic; + vlc_value_t val; I_OUTPUTPICTURES = 0; @@ -254,6 +286,13 @@ static int vout_Init( vout_thread_t *p_vout ) p_vout->output.i_height = p_vout->render.i_height; p_vout->output.i_aspect = p_vout->render.i_aspect; + var_Get( p_vout->p_vlc, "drawable", &val ); + + if( p_vout->p_sys->isplugin ) + { + p_vout->p_sys->p_qdport = val.i_int; + } + SetPort( p_vout->p_sys->p_qdport ); QTScaleMatrix( p_vout ); @@ -317,11 +356,14 @@ static void vout_End( vout_thread_t *p_vout ) *****************************************************************************/ void E_(CloseVideo) ( vlc_object_t *p_this ) { - vout_thread_t * p_vout = (vout_thread_t *)p_this; + vout_thread_t * p_vout = (vout_thread_t *)p_this; - if( CoDestroyWindow( p_vout ) ) + if ( !p_vout->p_sys->isplugin ) { - msg_Err( p_vout, "unable to destroy window" ); + if( CoDestroyWindow( p_vout ) ) + { + msg_Err( p_vout, "unable to destroy window" ); + } } if ( p_vout->p_sys->p_fullscreen_state != NULL ) @@ -343,6 +385,9 @@ void E_(CloseVideo) ( vlc_object_t *p_this ) *****************************************************************************/ static int vout_Manage( vout_thread_t *p_vout ) { + vlc_value_t val1; + var_Get( p_vout->p_vlc, "drawableredraw", &val1 ); + if( p_vout->i_changes & VOUT_FULLSCREEN_CHANGE ) { if( CoToggleFullscreen( p_vout ) ) @@ -353,13 +398,23 @@ static int vout_Manage( vout_thread_t *p_vout ) p_vout->i_changes &= ~VOUT_FULLSCREEN_CHANGE; } - if( p_vout->i_changes & VOUT_SIZE_CHANGE ) + if( (p_vout->i_changes & VOUT_SIZE_CHANGE) || + ( p_vout->p_sys->isplugin && val1.i_int == 1) ) { - QTScaleMatrix( p_vout ); - SetDSequenceMatrix( p_vout->p_sys->i_seq, - p_vout->p_sys->p_matrix ); - - p_vout->i_changes &= ~VOUT_SIZE_CHANGE; + if( p_vout->p_sys->isplugin ) + { + val1.i_int = 0; + var_Set( p_vout->p_vlc, "drawableredraw", val1 ); + QTScaleMatrix( p_vout ); + SetDSequenceMask( p_vout->p_sys->i_seq , p_vout->p_sys->mask ); + } + else + { + QTScaleMatrix( p_vout ); + SetDSequenceMatrix( p_vout->p_sys->i_seq, + p_vout->p_sys->p_matrix ); + p_vout->i_changes &= ~VOUT_SIZE_CHANGE; + } } /* hide/show mouse cursor @@ -367,45 +422,14 @@ static int vout_Manage( vout_thread_t *p_vout ) * it has to deal with multiple monitors and therefore checks a lot */ if( !p_vout->p_sys->b_mouse_moved && p_vout->b_fullscreen ) { - if( mdate() - p_vout->p_sys->i_time_mouse_last_moved > 2000000 && - p_vout->p_sys->b_mouse_pointer_visible ) + if( mdate() - p_vout->p_sys->i_time_mouse_last_moved > 3000000 ) { VLCHideMouse( p_vout, YES ); } - else if ( !p_vout->p_sys->b_mouse_pointer_visible ) - { - vlc_bool_t b_playing = NO; - playlist_t * p_playlist = vlc_object_find( p_vout, VLC_OBJECT_PLAYLIST, - FIND_ANYWHERE ); - - if ( p_playlist != nil ) - { - vlc_mutex_lock( &p_playlist->object_lock ); - if( p_playlist->p_input != NULL ) - { - vlc_mutex_lock( &p_playlist->p_input->stream.stream_lock ); - b_playing = p_playlist->p_input->stream.control.i_status != PAUSE_S; - vlc_mutex_unlock( &p_playlist->p_input->stream.stream_lock ); - } - vlc_mutex_unlock( &p_playlist->object_lock ); - vlc_object_release( p_playlist ); - } - if ( !b_playing ) - { - VLCHideMouse( p_vout, NO ); - } - } } else if ( p_vout->p_sys->b_mouse_moved && p_vout->b_fullscreen ) { - if( !p_vout->p_sys->b_mouse_pointer_visible ) - { - VLCHideMouse( p_vout, NO ); - } - else - { - p_vout->p_sys->b_mouse_moved = NO; - } + VLCHideMouse( p_vout, NO ); } return( 0 ); @@ -420,18 +444,62 @@ static void vout_Display( vout_thread_t *p_vout, picture_t *p_pic ) { OSErr err; CodecFlags flags; + Rect oldrect; + RgnHandle oldClip; - if( ( err = DecompressSequenceFrameS( - p_vout->p_sys->i_seq, - p_pic->p_sys->p_info, - p_pic->p_sys->i_size, - codecFlagUseImageBuffer, &flags, nil ) != noErr ) ) + if( p_vout->p_sys->isplugin ) { - msg_Warn( p_vout, "DecompressSequenceFrameS failed: %d", err ); + oldClip = NewRgn(); + + /* In mozilla plugin, mozilla browser also draws things in + * the windows. So we have to update the port/Origin for each + * picture. FIXME : the vout should lock something ! */ + GetPort( &p_vout->p_sys->p_qdportold ); + GetPortBounds( p_vout->p_sys->p_qdportold, &oldrect ); + GetClip( oldClip ); + + LockPortBits( p_vout->p_sys->p_qdport ); + + SetPort( p_vout->p_sys->p_qdport ); + SetOrigin( p_vout->p_sys->portx , p_vout->p_sys->porty ); + ClipRect( &p_vout->p_sys->rect ); + + + if( ( err = DecompressSequenceFrameS( + p_vout->p_sys->i_seq, + p_pic->p_sys->p_info, + p_pic->p_sys->i_size, + codecFlagUseImageBuffer, &flags, nil ) != noErr ) ) + { + msg_Warn( p_vout, "DecompressSequenceFrameS failed: %d", err ); + } + else + { + QDFlushPortBuffer( p_vout->p_sys->p_qdport, p_vout->p_sys->mask ); + } + + + SetOrigin( oldrect.left , oldrect.top ); + SetClip( oldClip ); + SetPort( p_vout->p_sys->p_qdportold ); + + UnlockPortBits( p_vout->p_sys->p_qdport ); + } else - { - QDFlushPortBuffer( p_vout->p_sys->p_qdport, nil ); + { + if( ( err = DecompressSequenceFrameS( + p_vout->p_sys->i_seq, + p_pic->p_sys->p_info, + p_pic->p_sys->i_size, + codecFlagUseImageBuffer, &flags, nil ) != noErr ) ) + { + msg_Warn( p_vout, "DecompressSequenceFrameS failed: %d", err ); + } + else + { + QDFlushPortBuffer( p_vout->p_sys->p_qdport, nil ); + } } } @@ -479,7 +547,7 @@ static int CoCreateWindow( vout_thread_t *p_vout ) *****************************************************************************/ static int CoDestroyWindow( vout_thread_t *p_vout ) { - if( !p_vout->p_sys->b_mouse_pointer_visible ) + if( [[NSCursor currentCursor] image] == NULL ) { VLCHideMouse( p_vout, NO ); } @@ -518,9 +586,6 @@ static int CoToggleFullscreen( vout_thread_t *p_vout ) return( 1 ); } - SetPort( p_vout->p_sys->p_qdport ); - QTScaleMatrix( p_vout ); - if( QTCreateSequence( p_vout ) ) { msg_Err( p_vout, "unable to create sequence" ); @@ -549,13 +614,11 @@ static void VLCHideMouse ( vout_thread_t *p_vout, BOOL b_hide ) if ( b_hide && b_inside ) { /* only hide if mouse over VLCView */ - [NSCursor hide]; - p_vout->p_sys->b_mouse_pointer_visible = 0; + [NSCursor setHiddenUntilMouseMoves: YES]; } else if ( !b_hide ) { - [NSCursor unhide]; - p_vout->p_sys->b_mouse_pointer_visible = 1; + [NSCursor setHiddenUntilMouseMoves: NO]; } p_vout->p_sys->b_mouse_moved = NO; p_vout->p_sys->i_time_mouse_last_moved = mdate(); @@ -572,12 +635,51 @@ static void QTScaleMatrix( vout_thread_t *p_vout ) Fixed factor_x, factor_y; unsigned int i_offset_x = 0; unsigned int i_offset_y = 0; + vlc_value_t val; + vlc_value_t valt; + vlc_value_t vall; + vlc_value_t valb; + vlc_value_t valr; + vlc_value_t valx; + vlc_value_t valy; + vlc_value_t valw; + vlc_value_t valh; + vlc_value_t valportx; + vlc_value_t valporty; GetPortBounds( p_vout->p_sys->p_qdport, &s_rect ); - i_width = s_rect.right - s_rect.left; i_height = s_rect.bottom - s_rect.top; + var_Get( p_vout->p_vlc, "drawable", &val ); + var_Get( p_vout->p_vlc, "drawablet", &valt ); + var_Get( p_vout->p_vlc, "drawablel", &vall ); + var_Get( p_vout->p_vlc, "drawableb", &valb ); + var_Get( p_vout->p_vlc, "drawabler", &valr ); + var_Get( p_vout->p_vlc, "drawablex", &valx ); + var_Get( p_vout->p_vlc, "drawabley", &valy ); + var_Get( p_vout->p_vlc, "drawablew", &valw ); + var_Get( p_vout->p_vlc, "drawableh", &valh ); + var_Get( p_vout->p_vlc, "drawableportx", &valportx ); + var_Get( p_vout->p_vlc, "drawableporty", &valporty ); + + if( p_vout->p_sys->isplugin ) + { + p_vout->p_sys->portx = valportx.i_int; + p_vout->p_sys->porty = valporty.i_int; + p_vout->p_sys->p_qdport = val.i_int; + i_width = valw.i_int; + i_height = valh.i_int; + + SetRectRgn( p_vout->p_sys->mask , vall.i_int - valx.i_int , + valt.i_int - valy.i_int , valr.i_int - valx.i_int , + valb.i_int - valy.i_int ); + p_vout->p_sys->rect.top = 0; + p_vout->p_sys->rect.left = 0; + p_vout->p_sys->rect.bottom = valb.i_int - valt.i_int; + p_vout->p_sys->rect.right = valr.i_int - vall.i_int; + } + if( i_height * p_vout->output.i_aspect < i_width * VOUT_ASPECT_FACTOR ) { int i_adj_width = i_height * p_vout->output.i_aspect / @@ -588,7 +690,7 @@ static void QTScaleMatrix( vout_thread_t *p_vout ) factor_y = FixDiv( Long2Fix( i_height ), Long2Fix( p_vout->output.i_height ) ); - i_offset_x = (i_width - i_adj_width) / 2; + i_offset_x = (i_width - i_adj_width) / 2 + i_offset_x; } else { @@ -600,7 +702,7 @@ static void QTScaleMatrix( vout_thread_t *p_vout ) factor_y = FixDiv( Long2Fix( i_adj_height ), Long2Fix( p_vout->output.i_height ) ); - i_offset_y = (i_height - i_adj_height) / 2; + i_offset_y = (i_height - i_adj_height) / 2 + i_offset_y; } SetIdentityMatrix( p_vout->p_sys->p_matrix ); @@ -612,6 +714,7 @@ static void QTScaleMatrix( vout_thread_t *p_vout ) TranslateMatrix( p_vout->p_sys->p_matrix, Long2Fix(i_offset_x), Long2Fix(i_offset_y) ); + } /***************************************************************************** @@ -642,8 +745,10 @@ static int QTCreateSequence( vout_thread_t *p_vout ) p_descr->dataSize = 0; p_descr->depth = 24; + HUnlock( (Handle)p_vout->p_sys->h_img_descr ); + if( ( err = DecompressSequenceBeginS( &p_vout->p_sys->i_seq, p_vout->p_sys->h_img_descr, @@ -651,7 +756,7 @@ static int QTCreateSequence( vout_thread_t *p_vout ) p_vout->p_sys->p_qdport, NULL, NULL, p_vout->p_sys->p_matrix, - 0, NULL, + 0, p_vout->p_sys->mask, codecFlagUseImageBuffer, codecLosslessQuality, p_vout->p_sys->img_dc ) ) ) @@ -660,6 +765,7 @@ static int QTCreateSequence( vout_thread_t *p_vout ) return( 1 ); } + return( 0 ); } @@ -810,7 +916,7 @@ static void QTFreePicture( vout_thread_t *p_vout, picture_t *p_pic ) newsize.width = (int) ( p_vout->render.i_width * factor ); newsize.height = (int) ( i_corrected_height * factor ); } - + [self setContentSize: newsize]; [self setFrameTopLeftPoint: topleftscreen]; @@ -818,6 +924,20 @@ static void QTFreePicture( vout_thread_t *p_vout, picture_t *p_pic ) } } +- (void)toggleFloatOnTop +{ + if( config_GetInt( p_vout, "macosx-float" ) ) + { + config_PutInt( p_vout, "macosx-float", 0 ); + [p_vout->p_sys->o_window setLevel: NSNormalWindowLevel]; + } + else + { + config_PutInt( p_vout, "macosx-float", 1 ); + [p_vout->p_sys->o_window setLevel: NSStatusWindowLevel]; + } +} + - (void)toggleFullscreen { p_vout->i_changes |= VOUT_FULLSCREEN_CHANGE; @@ -836,36 +956,52 @@ static void QTFreePicture( vout_thread_t *p_vout, picture_t *p_pic ) - (void)keyDown:(NSEvent *)o_event { unichar key = 0; + vlc_value_t val; + unsigned int i_pressed_modifiers = 0; + val.i_int = 0; + + i_pressed_modifiers = [o_event modifierFlags]; - if( [[o_event characters] length] ) + if( i_pressed_modifiers & NSShiftKeyMask ) + val.i_int |= KEY_MODIFIER_SHIFT; + if( i_pressed_modifiers & NSControlKeyMask ) + val.i_int |= KEY_MODIFIER_CTRL; + if( i_pressed_modifiers & NSAlternateKeyMask ) + val.i_int |= KEY_MODIFIER_ALT; + if( i_pressed_modifiers & NSCommandKeyMask ) + val.i_int |= KEY_MODIFIER_COMMAND; + + key = [[o_event charactersIgnoringModifiers] characterAtIndex: 0]; + + if( key ) { - key = [[o_event characters] characterAtIndex: 0]; + /* Escape should always get you out of fullscreen */ + if( key == (unichar) 0x1b ) + { + if( [self isFullscreen] ) + { + [self toggleFullscreen]; + } + } + else if ( key == ' ' ) + { + playlist_t *p_playlist = vlc_object_find( p_vout, VLC_OBJECT_PLAYLIST, + FIND_ANYWHERE ); + if ( p_playlist != NULL ) + { + playlist_Pause( p_playlist ); + vlc_object_release( p_playlist); + } + } + else + { + val.i_int |= CocoaKeyToVLC( key ); + var_Set( p_vout->p_vlc, "key-pressed", val ); + } } - - switch( key ) + else { - case 'f': case 'F': - [self toggleFullscreen]; - break; - - case (unichar)0x1b: /* escape */ - if( [self isFullscreen] ) - { - [self toggleFullscreen]; - } - break; - - case 'q': case 'Q': - p_vout->p_vlc->b_die = VLC_TRUE; - break; - - case ' ': - input_SetStatus( p_vout, INPUT_STATUS_PAUSE ); - break; - - default: - [super keyDown: o_event]; - break; + [super keyDown: o_event]; } } @@ -882,7 +1018,7 @@ static void QTFreePicture( vout_thread_t *p_vout, picture_t *p_pic ) vlc_mutex_lock( &p_playlist->object_lock ); o_title = [NSMutableString stringWithUTF8String: - p_playlist->pp_items[p_playlist->i_index]->psz_name]; + p_playlist->pp_items[p_playlist->i_index]->psz_uri]; vlc_mutex_unlock( &p_playlist->object_lock ); vlc_object_release( p_playlist ); @@ -1162,13 +1298,7 @@ static void QTFreePicture( vout_thread_t *p_vout, picture_t *p_pic ) p_vout->p_sys->i_time_mouse_last_moved = mdate(); p_vout->p_sys->b_mouse_moved = YES; } - else if ( !b_inside && !p_vout->p_sys->b_mouse_pointer_visible ) - { - /* people with multiple monitors need their mouse, - * even if VLCView in fullscreen. */ - VLCHideMouse( p_vout, NO ); - } - + [super mouseMoved: o_event]; } @@ -1200,11 +1330,10 @@ static void QTFreePicture( vout_thread_t *p_vout, picture_t *p_pic ) } else { - unsigned int i_index = 0; NSArray *o_screens = [NSScreen screens]; - - if( !sscanf( val.psz_string, _("Screen %d"), &i_index ) || - [o_screens count] < i_index ) + unsigned int i_index = val.i_int; + + if( [o_screens count] < i_index ) { o_screen = [NSScreen mainScreen]; b_main_screen = 1; @@ -1215,9 +1344,7 @@ static void QTFreePicture( vout_thread_t *p_vout, picture_t *p_pic ) o_screen = [o_screens objectAtIndex: i_index]; config_PutInt( p_vout, "macosx-vdev", i_index ); b_main_screen = (i_index == 0); - } - - free( val.psz_string ); + } } if( p_vout->b_fullscreen ) @@ -1235,7 +1362,7 @@ static void QTFreePicture( vout_thread_t *p_vout, picture_t *p_pic ) backing: NSBackingStoreBuffered defer: NO screen: o_screen]; - [p_vout->p_sys->o_window setLevel: NSPopUpMenuWindowLevel - 1]; + //[p_vout->p_sys->o_window setLevel: NSPopUpMenuWindowLevel - 1]; p_vout->p_sys->b_mouse_moved = YES; p_vout->p_sys->i_time_mouse_last_moved = mdate(); } @@ -1256,6 +1383,13 @@ static void QTFreePicture( vout_thread_t *p_vout, picture_t *p_pic ) backing: NSBackingStoreBuffered defer: NO screen: o_screen]; + [p_vout->p_sys->o_window setAlphaValue: config_GetFloat( p_vout, "macosx-opaqueness" )]; + + if( config_GetInt( p_vout, "macosx-float" ) ) + { + [p_vout->p_sys->o_window setLevel: NSStatusWindowLevel]; + } + if( !p_vout->p_sys->b_pos_saved ) { [p_vout->p_sys->o_window center]; @@ -1263,12 +1397,14 @@ static void QTFreePicture( vout_thread_t *p_vout, picture_t *p_pic ) } o_view = [[VLCView alloc] init]; + /* FIXME: [o_view setMenu:] */ [p_vout->p_sys->o_window setContentView: o_view]; [o_view autorelease]; [o_view lockFocus]; p_vout->p_sys->p_qdport = [o_view qdPort]; + [o_view unlockFocus]; [p_vout->p_sys->o_window updateTitle];