/*****************************************************************************
* vout_macosx.m: MacOS X video output plugin
*****************************************************************************
- * Copyright (C) 2001 VideoLAN
+ * Copyright (C) 2001, 2002 VideoLAN
+ * $Id: vout_macosx.m,v 1.8 2002/07/15 01:54:04 jlj Exp $
*
* Authors: Colin Delacroix <colin@zoy.org>
* Florian G. Pflug <fgp@phlo.org>
#include <vlc/vout.h>
#include <vlc/intf.h>
-#include "macosx.h"
+#include <Cocoa/Cocoa.h>
+#include <QuickTime/QuickTime.h>
+
+#include "intf_macosx.h"
+#include "vout_macosx.h"
#define QT_MAX_DIRECTBUFFERS 10
static int vout_Create( vout_thread_t *p_vout )
{
OSErr err;
- intf_thread_t *p_intf;
-
- p_intf = vlc_object_find( p_vout, VLC_OBJECT_INTF, FIND_ANYWHERE );
- if( p_intf == NULL )
- {
- msg_Err( p_vout, "no interface present" );
- return 1;
- }
-
- if( p_intf->p_module == NULL
- || strcmp( p_intf->p_module->psz_object_name, MODULE_STRING ) != 0 )
- {
- msg_Err( p_vout, "MacOS X interface module required" );
- vlc_object_release( p_intf );
- return 1;
- }
p_vout->p_sys = malloc( sizeof( vout_sys_t ) );
if( p_vout->p_sys == NULL )
{
msg_Err( p_vout, "out of memory" );
- vlc_object_release( p_intf );
- return 1;
+ return( 1 );
}
memset( p_vout->p_sys, 0, sizeof( vout_sys_t ) );
- p_vout->p_sys->p_intf = p_intf;
+ p_vout->p_sys->p_intf = vlc_object_find( p_vout, VLC_OBJECT_INTF,
+ FIND_ANYWHERE );
+ if( p_vout->p_sys->p_intf == NULL )
+ {
+ msg_Err( p_vout, "no interface present" );
+ free( p_vout->p_sys );
+ return( 1 );
+ }
+
+ if( p_vout->p_sys->p_intf->p_module == NULL ||
+ strcmp( p_vout->p_sys->p_intf->p_module->psz_object_name,
+ MODULE_STRING ) != 0 )
+ {
+ msg_Err( p_vout, "MacOS X interface module required" );
+ vlc_object_release( p_vout->p_sys->p_intf );
+ free( p_vout->p_sys );
+ return( 1 );
+ }
p_vout->p_sys->h_img_descr =
(ImageDescriptionHandle)NewHandleClear( sizeof(ImageDescription) );
msg_Err( p_vout, "EnterMovies failed: %d", err );
free( p_vout->p_sys->p_matrix );
DisposeHandle( (Handle)p_vout->p_sys->h_img_descr );
- vlc_object_release( p_intf );
free( p_vout->p_sys );
- return 1;
+ return( 1 );
}
if( vout_ChromaCmp( p_vout->render.i_chroma, FOURCC_I420 ) )
{
free( p_vout->p_sys->p_matrix );
DisposeHandle( (Handle)p_vout->p_sys->h_img_descr );
- vlc_object_release( p_intf );
free( p_vout->p_sys );
- return 1;
+ 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 );
- vlc_object_release( p_intf );
free( p_vout->p_sys );
- return 1;
+ return( 1 );
}
- return 0;
+ return( 0 );
}
/*****************************************************************************
if( QTCreateSequence( p_vout ) )
{
msg_Err( p_vout, "unable to create sequence" );
- return 1;
+ return( 1 );
}
/* Try to initialize up to QT_MAX_DIRECTBUFFERS direct buffers */
I_OUTPUTPICTURES++;
}
- return 0;
+ return( 0 );
}
/*****************************************************************************
free( p_vout->p_sys->p_matrix );
DisposeHandle( (Handle)p_vout->p_sys->h_img_descr );
+
vlc_object_release( p_vout->p_sys->p_intf );
+
free( p_vout->p_sys );
}
{
if( CoToggleFullscreen( p_vout ) )
{
- return 1;
+ return( 1 );
}
p_vout->i_changes &= ~VOUT_FULLSCREEN_CHANGE;
}
}
- return 0;
+ return( 0 );
}
/*****************************************************************************
o_array = [NSArray arrayWithObject:
[NSData dataWithBytes: &p_req length: sizeof(void *)]];
o_msg = [[NSPortMessage alloc]
- initWithSendPort: p_vout->p_sys->p_intf->p_sys->o_port
- receivePort: recvPort
- components: o_array];
+ initWithSendPort: p_vout->p_sys->p_intf->p_sys->o_sendport
+ receivePort: recvPort components: o_array];
[o_msg sendBeforeDate: [NSDate distantPast]];
+
[req.o_lock lockWhenCondition: 1];
[req.o_lock unlock];
[recvPort release];
[o_pool release];
- return !req.i_result;
+ return( !req.i_result );
}
/*****************************************************************************
if( CoSendRequest( p_vout, VOUT_REQ_CREATE_WINDOW ) )
{
msg_Err( p_vout, "CoSendRequest (CREATE_WINDOW) failed" );
- return 1;
+ return( 1 );
}
- return 0;
+ return( 0 );
}
/*****************************************************************************
if( CoSendRequest( p_vout, VOUT_REQ_DESTROY_WINDOW ) )
{
msg_Err( p_vout, "CoSendRequest (DESTROY_WINDOW) failed" );
- return 1;
+ return( 1 );
}
- return 0;
+ return( 0 );
}
/*****************************************************************************
if( CoDestroyWindow( p_vout ) )
{
msg_Err( p_vout, "unable to destroy window" );
- return 1;
+ return( 1 );
}
p_vout->b_fullscreen = !p_vout->b_fullscreen;
+ if( p_vout->b_fullscreen )
+ {
+ HideMenuBar();
+ }
+ else
+ {
+ ShowMenuBar();
+ }
+
if( CoCreateWindow( p_vout ) )
{
msg_Err( p_vout, "unable to create window" );
- return 1;
+ return( 1 );
}
SetPort( p_vout->p_sys->p_qdport );
if( QTCreateSequence( p_vout ) )
{
msg_Err( p_vout, "unable to create sequence" );
- return 1;
+ return( 1 );
}
- return 0;
+ return( 0 );
}
/*****************************************************************************
p_vout->p_sys->img_dc ) ) )
{
msg_Err( p_vout, "DecompressSequenceBeginS failed: %d", err );
- return 1;
+ return( 1 );
}
- return 0;
+ return( 0 );
}
/*****************************************************************************
if( p_pic->p_sys == NULL )
{
- return -1;
+ return( -1 );
}
switch( p_vout->output.i_chroma )
msg_Err( p_vout, "never heard of chroma 0x%.8x (%4.4s)",
p_vout->output.i_chroma, (char*)&p_vout->output.i_chroma );
p_pic->i_planes = 0;
- return -1;
+ return( -1 );
}
- return 0;
+ return( 0 );
}
/*****************************************************************************
free( p_pic->p_sys );
}
+/*****************************************************************************
+ * VLCWindow implementation
+ *****************************************************************************/
+@implementation VLCWindow
+
+- (void)setVout:(vout_thread_t *)_p_vout
+{
+ p_vout = _p_vout;
+}
+
+- (void)toggleFullscreen
+{
+ p_vout->i_changes |= VOUT_FULLSCREEN_CHANGE;
+}
+
+- (BOOL)isFullscreen
+{
+ return( p_vout->b_fullscreen );
+}
+
+- (BOOL)canBecomeKeyWindow
+{
+ return( YES );
+}
+
+- (void)keyDown:(NSEvent *)o_event
+{
+ unichar key = 0;
+
+ if( [[o_event characters] length] )
+ {
+ key = [[o_event characters] characterAtIndex: 0];
+ }
+
+ switch( key )
+ {
+ 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 = 1;
+ break;
+
+ default:
+ [super keyDown: o_event];
+ break;
+ }
+}
+
+@end
+
+/*****************************************************************************
+ * VLCView implementation
+ *****************************************************************************/
+@implementation VLCView
+
+- (void)setVout:(vout_thread_t *)_p_vout
+{
+ p_vout = _p_vout;
+}
+
+- (void)drawRect:(NSRect)rect
+{
+ [[NSColor blackColor] set];
+ NSRectFill( rect );
+ [super drawRect: rect];
+
+ p_vout->i_changes |= VOUT_SIZE_CHANGE;
+}
+
+@end