}
-- (VLCVoutView *)setupVout:(vout_window_t *)p_wnd
+- (VLCVoutView *)setupVoutForWindow:(vout_window_t *)p_wnd withProposedVideoViewPosition:(NSRect)videoViewPosition
{
BOOL b_nonembedded = NO;
BOOL b_nativeFullscreenMode = [[VLCMain sharedInstance] nativeFullscreenMode];
VLCVoutView *o_vout_view;
VLCVideoWindowCommon *o_new_video_window;
+
// TODO: make lion fullscreen compatible with video-wallpaper and !embedded-video
if ((b_video_wallpaper || !b_video_deco) && !b_nativeFullscreenMode) {
// b_video_wallpaper is priorized over !b_video_deco
}
if (!b_video_wallpaper) {
+ // set window size
+ NSSize videoViewSize = NSMakeSize(videoViewPosition.size.width, videoViewPosition.size.height);
+
+ if (b_nonembedded) {
+ NSRect window_rect = [o_new_video_window getWindowRectForProposedVideoViewSize:videoViewSize];
+ [o_new_video_window setFrame:window_rect display:YES];
+ }
+ [o_new_video_window setNativeVideoSize:videoViewSize];
+
[o_new_video_window makeKeyAndOrderFront: self];
vout_thread_t *p_vout = getVout();
vlc_object_release(p_vout);
}
}
+
[o_new_video_window setAlphaValue: config_GetFloat(VLCIntf, "macosx-opaqueness")];
if (!b_multiple_vout_windows)
#pragma mark -
#pragma mark Video window resizing logic
-- (void)resizeWindow
+- (NSRect)getWindowRectForProposedVideoViewSize:(NSSize)size
{
- if ([[VLCMainWindow sharedInstance] fullscreen])
- return;
-
NSSize windowMinSize = [self minSize];
NSRect screenFrame = [[self screen] visibleFrame];
NSPoint topleftbase = NSMakePoint(0, [self frame].size.height);
NSPoint topleftscreen = [self convertBaseToScreen: topleftbase];
- unsigned int i_width = nativeVideoSize.width;
- unsigned int i_height = nativeVideoSize.height;
+ unsigned int i_width = size.width;
+ unsigned int i_height = size.height;
if (i_width < windowMinSize.width)
i_width = windowMinSize.width;
if (i_height < f_min_video_height)
if (right_window_point > right_screen_point)
new_frame.origin.x -= (right_window_point - right_screen_point);
- [[self animator] setFrame:new_frame display:YES];
+ return new_frame;
+}
+
+- (void)resizeWindow
+{
+ if ([[VLCMainWindow sharedInstance] fullscreen])
+ return;
+
+ NSRect window_rect = [self getWindowRectForProposedVideoViewSize:nativeVideoSize];
+ [[self animator] setFrame:window_rect display:YES];
}
- (void)setNativeVideoSize:(NSSize)size
return VLC_EGENERIC;
}
- int i_x = cfg->x;
- int i_y = cfg->y;
- unsigned i_width = cfg->width;
- unsigned i_height = cfg->height;
- p_wnd->handle.nsobject = [[VLCMain sharedInstance] getVideoViewAtPositionX: &i_x Y: &i_y withWidth: &i_width andHeight: &i_height forWindow: p_wnd];
+ NSRect proposedVideoViewPosition = NSMakeRect(cfg->x, cfg->y, cfg->width, cfg->height);
- if (!p_wnd->handle.nsobject) {
+ VLCVoutWindowController *o_vout_controller = [[VLCMain sharedInstance] voutController];
+ SEL sel = @selector(setupVoutForWindow:withProposedVideoViewPosition:);
+ NSInvocation *inv = [NSInvocation invocationWithMethodSignature:[o_vout_controller methodSignatureForSelector:sel]];
+ [inv setTarget:o_vout_controller];
+ [inv setSelector:sel];
+ [inv setArgument:&p_wnd atIndex:2]; // starting at 2!
+ [inv setArgument:&proposedVideoViewPosition atIndex:3];
+
+ [inv performSelectorOnMainThread:@selector(invoke) withObject:nil
+ waitUntilDone:YES];
+
+ VLCVoutView *videoView = nil;
+ [inv getReturnValue:&videoView];
+
+ if (!videoView) {
msg_Err(p_wnd, "got no video view from the interface");
[o_pool release];
return VLC_EGENERIC;
}
- // TODO: this seems to be strange. Why not just allocating in the right size?
- // This could avoid strange resize-animations...
- NSSize newSize = NSMakeSize(cfg->width, cfg->height);
- SEL sel = @selector(setNativeVideoSize:forWindow:);
- NSInvocation *inv = [NSInvocation invocationWithMethodSignature:[[[VLCMain sharedInstance] voutController] methodSignatureForSelector:sel]];
- [inv setTarget:[[VLCMain sharedInstance] voutController]];
- [inv setSelector:sel];
- [inv setArgument:&newSize atIndex:2]; // starting at 2!
- [inv setArgument:&p_wnd atIndex:3];
- [inv performSelectorOnMainThread:@selector(invoke) withObject:nil
- waitUntilDone:NO];
+ msg_Dbg(VLCIntf, "returning videoview with proposed position x=%i, y=%i, width=%i, height=%i", cfg->x, cfg->y, cfg->width, cfg->height);
+ p_wnd->handle.nsobject = videoView;
+
// TODO: find a cleaner way for "start in fullscreen"
if (var_GetBool(pl_Get(VLCIntf), "fullscreen")) {
[[VLCMain sharedInstance] setActiveVideoPlayback: YES];
p_wnd->control = WindowControl;
- p_wnd->sys = (vout_window_sys_t *)VLCIntf;
+
[o_pool release];
return VLC_SUCCESS;
}
[inv performSelectorOnMainThread:@selector(invoke) withObject:nil
waitUntilDone:NO];
-
- //[[VLCMain sharedInstance] performSelectorOnMainThread:@selector(fullscreenChanged:) withObject:[NSValue valueWithPointer:p_wnd] waitUntilDone:NO];
[o_pool release];
return VLC_SUCCESS;
}
return o_wizard;
}
-- (id)getVideoViewAtPositionX: (int *)pi_x Y: (int *)pi_y withWidth: (unsigned int*)pi_width andHeight: (unsigned int*)pi_height forWindow:(vout_window_t *)p_wnd
-{
- SEL sel = @selector(setupVout:);
- NSInvocation *inv = [NSInvocation invocationWithMethodSignature:[o_vout_controller methodSignatureForSelector:sel]];
- [inv setTarget:o_vout_controller];
- [inv setSelector:sel];
- [inv setArgument:&p_wnd atIndex:2]; // starting at 2!
-
- [inv performSelectorOnMainThread:@selector(invoke) withObject:nil
- waitUntilDone:YES];
-
- VLCVoutView *videoView;
- [inv getReturnValue:&videoView];
-
- NSRect videoRect = [videoView frame];
- int i_x = (int)videoRect.origin.x;
- int i_y = (int)videoRect.origin.y;
- unsigned int i_width = (int)videoRect.size.width;
- unsigned int i_height = (int)videoRect.size.height;
- pi_x = &i_x;
- pi_y = &i_y;
- pi_width = &i_width;
- pi_height = &i_height;
- msg_Dbg(VLCIntf, "returning videoview with x=%i, y=%i, width=%i, height=%i", i_x, i_y, i_width, i_height);
- return videoView;
-}
-
- (id)coreDialogProvider
{
if (o_coredialogs)