Commit 5c983d98 authored by Gildas Bazin's avatar Gildas Bazin

* fixed the resizing and scaling of the X11 video output.
* clicking on the video doesn't pause it anymore (use spacebar for this), but
  double-clicking will now switch between fullscreen and window mode.
parent dbc3f265
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* xcommon.c: Functions common to the X11 and XVideo plugins * xcommon.c: Functions common to the X11 and XVideo plugins
***************************************************************************** *****************************************************************************
* Copyright (C) 1998-2001 VideoLAN * Copyright (C) 1998-2001 VideoLAN
* $Id: xcommon.c,v 1.29 2002/04/28 11:56:13 sam Exp $ * $Id: xcommon.c,v 1.30 2002/05/05 08:25:15 gbazin Exp $
* *
* Authors: Vincent Seguin <seguin@via.ecp.fr> * Authors: Vincent Seguin <seguin@via.ecp.fr>
* Samuel Hocevar <sam@zoy.org> * Samuel Hocevar <sam@zoy.org>
...@@ -142,16 +142,15 @@ typedef struct vout_sys_s ...@@ -142,16 +142,15 @@ typedef struct vout_sys_s
Visual * p_visual; /* visual pointer */ Visual * p_visual; /* visual pointer */
int i_screen; /* screen number */ int i_screen; /* screen number */
Window window; /* root window */
GC gc; /* graphic context instance handler */ GC gc; /* graphic context instance handler */
Window window; /* root window */
Window video_window; /* sub-window for displaying video */
#ifdef HAVE_SYS_SHM_H #ifdef HAVE_SYS_SHM_H
boolean_t b_shm; /* shared memory extension flag */ boolean_t b_shm; /* shared memory extension flag */
#endif #endif
#ifdef MODULE_NAME_IS_xvideo #ifdef MODULE_NAME_IS_xvideo
Window yuv_window; /* sub-window for displaying yuv video
data */
int i_xvport; int i_xvport;
#else #else
Colormap colormap; /* colormap used (8bpp only) */ Colormap colormap; /* colormap used (8bpp only) */
...@@ -192,6 +191,7 @@ typedef struct vout_sys_s ...@@ -192,6 +191,7 @@ typedef struct vout_sys_s
boolean_t b_mouse_pointer_visible; boolean_t b_mouse_pointer_visible;
mtime_t i_time_mouse_last_moved; /* used to auto-hide pointer*/ mtime_t i_time_mouse_last_moved; /* used to auto-hide pointer*/
Cursor blank_cursor; /* the hidden cursor */ Cursor blank_cursor; /* the hidden cursor */
mtime_t i_time_button_last_pressed; /* to track dbl-clicks */
Pixmap cursor_pixmap; Pixmap cursor_pixmap;
} vout_sys_t; } vout_sys_t;
...@@ -378,6 +378,7 @@ static int vout_Create( vout_thread_t *p_vout ) ...@@ -378,6 +378,7 @@ static int vout_Create( vout_thread_t *p_vout )
/* Misc init */ /* Misc init */
p_vout->p_sys->b_altfullscreen = 0; p_vout->p_sys->b_altfullscreen = 0;
p_vout->p_sys->i_time_button_last_pressed = 0;
return( 0 ); return( 0 );
} }
...@@ -470,12 +471,14 @@ static int vout_Init( vout_thread_t *p_vout ) ...@@ -470,12 +471,14 @@ static int vout_Init( vout_thread_t *p_vout )
return( 0 ); return( 0 );
} }
p_vout->output.i_width = p_vout->p_sys->i_width; vout_PlacePicture( p_vout, p_vout->p_sys->i_width,
p_vout->output.i_height = p_vout->p_sys->i_height; p_vout->p_sys->i_height,
&i_index, &i_index,
&p_vout->output.i_width, &p_vout->output.i_height );
/* Assume we have square pixels */ /* Assume we have square pixels */
p_vout->output.i_aspect = p_vout->p_sys->i_width p_vout->output.i_aspect = p_vout->output.i_width
* VOUT_ASPECT_FACTOR / p_vout->p_sys->i_height; * VOUT_ASPECT_FACTOR / p_vout->output.i_height;
#endif #endif
/* Try to initialize up to MAX_DIRECTBUFFERS direct buffers */ /* Try to initialize up to MAX_DIRECTBUFFERS direct buffers */
...@@ -537,13 +540,13 @@ static void vout_Display( vout_thread_t *p_vout, picture_t *p_pic ) ...@@ -537,13 +540,13 @@ static void vout_Display( vout_thread_t *p_vout, picture_t *p_pic )
/* Display rendered image using shared memory extension */ /* Display rendered image using shared memory extension */
# ifdef MODULE_NAME_IS_xvideo # ifdef MODULE_NAME_IS_xvideo
XvShmPutImage( p_vout->p_sys->p_display, p_vout->p_sys->i_xvport, XvShmPutImage( p_vout->p_sys->p_display, p_vout->p_sys->i_xvport,
p_vout->p_sys->yuv_window, p_vout->p_sys->gc, p_vout->p_sys->video_window, p_vout->p_sys->gc,
p_pic->p_sys->p_image, 0 /*src_x*/, 0 /*src_y*/, p_pic->p_sys->p_image, 0 /*src_x*/, 0 /*src_y*/,
p_vout->output.i_width, p_vout->output.i_height, p_vout->output.i_width, p_vout->output.i_height,
0 /*dest_x*/, 0 /*dest_y*/, i_width, i_height, 0 /*dest_x*/, 0 /*dest_y*/, i_width, i_height,
False /* Don't put True here or you'll waste your CPU */ ); False /* Don't put True here or you'll waste your CPU */ );
# else # else
XShmPutImage( p_vout->p_sys->p_display, p_vout->p_sys->window, XShmPutImage( p_vout->p_sys->p_display, p_vout->p_sys->video_window,
p_vout->p_sys->gc, p_pic->p_sys->p_image, p_vout->p_sys->gc, p_pic->p_sys->p_image,
0 /*src_x*/, 0 /*src_y*/, 0 /*dest_x*/, 0 /*dest_y*/, 0 /*src_x*/, 0 /*src_y*/, 0 /*dest_x*/, 0 /*dest_y*/,
p_vout->output.i_width, p_vout->output.i_height, p_vout->output.i_width, p_vout->output.i_height,
...@@ -556,12 +559,12 @@ static void vout_Display( vout_thread_t *p_vout, picture_t *p_pic ) ...@@ -556,12 +559,12 @@ static void vout_Display( vout_thread_t *p_vout, picture_t *p_pic )
/* Use standard XPutImage -- this is gonna be slow ! */ /* Use standard XPutImage -- this is gonna be slow ! */
#ifdef MODULE_NAME_IS_xvideo #ifdef MODULE_NAME_IS_xvideo
XvPutImage( p_vout->p_sys->p_display, p_vout->p_sys->i_xvport, XvPutImage( p_vout->p_sys->p_display, p_vout->p_sys->i_xvport,
p_vout->p_sys->yuv_window, p_vout->p_sys->gc, p_vout->p_sys->video_window, p_vout->p_sys->gc,
p_pic->p_sys->p_image, 0 /*src_x*/, 0 /*src_y*/, p_pic->p_sys->p_image, 0 /*src_x*/, 0 /*src_y*/,
p_vout->output.i_width, p_vout->output.i_height, p_vout->output.i_width, p_vout->output.i_height,
0 /*dest_x*/, 0 /*dest_y*/, i_width, i_height ); 0 /*dest_x*/, 0 /*dest_y*/, i_width, i_height );
#else #else
XPutImage( p_vout->p_sys->p_display, p_vout->p_sys->window, XPutImage( p_vout->p_sys->p_display, p_vout->p_sys->video_window,
p_vout->p_sys->gc, p_pic->p_sys->p_image, p_vout->p_sys->gc, p_pic->p_sys->p_image,
0 /*src_x*/, 0 /*src_y*/, 0 /*dest_x*/, 0 /*dest_y*/, 0 /*src_x*/, 0 /*src_y*/, 0 /*dest_x*/, 0 /*dest_y*/,
p_vout->output.i_width, p_vout->output.i_height ); p_vout->output.i_width, p_vout->output.i_height );
...@@ -726,10 +729,17 @@ static int vout_Manage( vout_thread_t *p_vout ) ...@@ -726,10 +729,17 @@ static int vout_Manage( vout_thread_t *p_vout )
{ {
case Button1: case Button1:
/* In this part we will eventually manage /* In this part we will eventually manage
* clicks for DVD navigation for instance. For the * clicks for DVD navigation for instance. */
* moment just pause the stream. */
input_SetStatus( p_input_bank->pp_input[0], /* detect double-clicks */
INPUT_STATUS_PAUSE ); if( ( ((XButtonEvent *)&xevent)->time -
p_vout->p_sys->i_time_button_last_pressed ) < 300 )
{
p_vout->i_changes |= VOUT_FULLSCREEN_CHANGE;
}
p_vout->p_sys->i_time_button_last_pressed =
((XButtonEvent *)&xevent)->time;
break; break;
case Button4: case Button4:
...@@ -773,10 +783,9 @@ static int vout_Manage( vout_thread_t *p_vout ) ...@@ -773,10 +783,9 @@ static int vout_Manage( vout_thread_t *p_vout )
} }
} }
#ifdef MODULE_NAME_IS_xvideo /* Handle events for video output sub-window */
/* Handle events for YUV video output sub-window */
while( XCheckWindowEvent( p_vout->p_sys->p_display, while( XCheckWindowEvent( p_vout->p_sys->p_display,
p_vout->p_sys->yuv_window, p_vout->p_sys->video_window,
ExposureMask, &xevent ) == True ) ExposureMask, &xevent ) == True )
{ {
/* Window exposed (only handled if stream playback is paused) */ /* Window exposed (only handled if stream playback is paused) */
...@@ -790,13 +799,12 @@ static int vout_Manage( vout_thread_t *p_vout ) ...@@ -790,13 +799,12 @@ static int vout_Manage( vout_thread_t *p_vout )
if( PAUSE_S == if( PAUSE_S ==
p_input_bank->pp_input[0]->stream.control.i_status ) p_input_bank->pp_input[0]->stream.control.i_status )
{ {
/* XVideoDisplay( p_vout )*/; /* XVideoDisplay( p_vout )*/;
} }
} }
} }
} }
} }
#endif
/* ClientMessage event - only WM_PROTOCOLS with WM_DELETE_WINDOW data /* ClientMessage event - only WM_PROTOCOLS with WM_DELETE_WINDOW data
* are handled - according to the man pages, the format is always 32 * are handled - according to the man pages, the format is always 32
...@@ -822,49 +830,28 @@ static int vout_Manage( vout_thread_t *p_vout ) ...@@ -822,49 +830,28 @@ static int vout_Manage( vout_thread_t *p_vout )
} }
#ifdef MODULE_NAME_IS_x11
/*
* Handle vout window resizing
*/
#if 0
if( b_resized )
{
/* If interface window has been resized, change vout size */
p_vout->i_width = p_vout->p_sys->i_width;
p_vout->i_height = p_vout->p_sys->i_height;
p_vout->i_changes |= VOUT_SIZE_CHANGE;
}
else if( (p_vout->i_width != p_vout->p_sys->i_width) ||
(p_vout->i_height != p_vout->p_sys->i_height) )
{
/* If video output size has changed, change interface window size */
p_vout->p_sys->i_width = p_vout->i_width;
p_vout->p_sys->i_height = p_vout->i_height;
XResizeWindow( p_vout->p_sys->p_display, p_vout->p_sys->window,
p_vout->p_sys->i_width, p_vout->p_sys->i_height );
}
/*
* Color/Grayscale or gamma change: in 8bpp, just change the colormap
*/
if( (p_vout->i_changes & VOUT_GRAYSCALE_CHANGE)
&& (p_vout->i_screen_depth == 8) )
{
/* FIXME: clear flags ?? */
}
/* /*
* Size change * Size change
*
* (Needs to be placed after VOUT_FULLSREEN_CHANGE because we can activate
* the size flag inside the fullscreen routine)
*/ */
if( p_vout->i_changes & VOUT_SIZE_CHANGE ) if( p_vout->i_changes & VOUT_SIZE_CHANGE )
{ {
int i_width, i_height, i_x, i_y;
p_vout->i_changes &= ~VOUT_SIZE_CHANGE; p_vout->i_changes &= ~VOUT_SIZE_CHANGE;
/* Resize window */ intf_WarnMsg( 3, "vout: video display resized (%dx%d)",
XResizeWindow( p_vout->p_sys->p_display, p_vout->p_sys->window, p_vout->p_sys->i_width,
p_vout->i_width, p_vout->i_height ); p_vout->p_sys->i_height );
#ifdef MODULE_NAME_IS_x11
/* Destroy XImages to change their size */ /* Destroy XImages to change their size */
vout_End( p_vout ); vout_End( p_vout );
for( i_x = 0; i_x < I_OUTPUTPICTURES; i_x++ )
p_vout->p_picture[ i_x ].i_status = FREE_PICTURE;
/* Recreate XImages. If SysInit failed, the thread can't go on. */ /* Recreate XImages. If SysInit failed, the thread can't go on. */
if( vout_Init( p_vout ) ) if( vout_Init( p_vout ) )
...@@ -873,43 +860,22 @@ static int vout_Manage( vout_thread_t *p_vout ) ...@@ -873,43 +860,22 @@ static int vout_Manage( vout_thread_t *p_vout )
return( 1 ); return( 1 );
} }
/* Tell the video output thread that it will need to rebuild YUV /* Need to reinitialise the chroma plugin */
* tables. This is needed since conversion buffer size may have p_vout->chroma.pf_end( p_vout );
* changed */ p_vout->chroma.pf_init( p_vout );
p_vout->i_changes |= VOUT_YUV_CHANGE;
intf_Msg( "vout: video display resized (%dx%d)",
p_vout->i_width, p_vout->i_height);
}
#endif /* #if 0 */
#else
/*
* Size change
*
* (Needs to be placed after VOUT_FULLSREEN_CHANGE because we can activate
* the size flag inside the fullscreen routine)
*/
if( p_vout->i_changes & VOUT_SIZE_CHANGE )
{
int i_width, i_height, i_x, i_y;
p_vout->i_changes &= ~VOUT_SIZE_CHANGE;
intf_WarnMsg( 3, "vout: video display resized (%dx%d)", #endif
p_vout->p_sys->i_width,
p_vout->p_sys->i_height );
vout_PlacePicture( p_vout, p_vout->p_sys->i_width, vout_PlacePicture( p_vout, p_vout->p_sys->i_width,
p_vout->p_sys->i_height, p_vout->p_sys->i_height,
&i_x, &i_y, &i_width, &i_height ); &i_x, &i_y, &i_width, &i_height );
XResizeWindow( p_vout->p_sys->p_display, p_vout->p_sys->yuv_window, XResizeWindow( p_vout->p_sys->p_display, p_vout->p_sys->video_window,
i_width, i_height ); i_width, i_height );
XMoveWindow( p_vout->p_sys->p_display, p_vout->p_sys->yuv_window, XMoveWindow( p_vout->p_sys->p_display, p_vout->p_sys->video_window,
i_x, i_y ); i_x, i_y );
} }
#endif
/* Autohide Cursour */ /* Autohide Cursour */
if( mdate() - p_vout->p_sys->i_time_mouse_last_moved > 2000000 ) if( mdate() - p_vout->p_sys->i_time_mouse_last_moved > 2000000 )
...@@ -1076,9 +1042,10 @@ static int CreateWindow( vout_thread_t *p_vout ) ...@@ -1076,9 +1042,10 @@ static int CreateWindow( vout_thread_t *p_vout )
CWColormap, &xwindow_attributes ); CWColormap, &xwindow_attributes );
} }
#else #endif
/* Create YUV output sub-window. */ /* Create video output sub-window. */
p_vout->p_sys->yuv_window = XCreateSimpleWindow( p_vout->p_sys->p_display, p_vout->p_sys->video_window = XCreateSimpleWindow(
p_vout->p_sys->p_display,
p_vout->p_sys->window, 0, 0, p_vout->p_sys->window, 0, 0,
p_vout->p_sys->i_width, p_vout->p_sys->i_width,
p_vout->p_sys->i_height, p_vout->p_sys->i_height,
...@@ -1088,16 +1055,18 @@ static int CreateWindow( vout_thread_t *p_vout ) ...@@ -1088,16 +1055,18 @@ static int CreateWindow( vout_thread_t *p_vout )
WhitePixel( p_vout->p_sys->p_display, WhitePixel( p_vout->p_sys->p_display,
p_vout->p_sys->i_screen ) ); p_vout->p_sys->i_screen ) );
XSetWindowBackground( p_vout->p_sys->p_display, p_vout->p_sys->yuv_window, XSetWindowBackground( p_vout->p_sys->p_display,
BlackPixel(p_vout->p_sys->p_display, p_vout->p_sys->i_screen ) ); p_vout->p_sys->video_window,
BlackPixel( p_vout->p_sys->p_display,
p_vout->p_sys->i_screen ) );
XMapWindow( p_vout->p_sys->p_display, p_vout->p_sys->yuv_window ); XMapWindow( p_vout->p_sys->p_display, p_vout->p_sys->video_window );
XSelectInput( p_vout->p_sys->p_display, p_vout->p_sys->yuv_window, XSelectInput( p_vout->p_sys->p_display, p_vout->p_sys->video_window,
ExposureMask ); ExposureMask );
/* make sure the YUV window will be centered in the next vout_Manage() */ /* make sure the video window will be centered in the next vout_Manage() */
p_vout->i_changes |= VOUT_SIZE_CHANGE; p_vout->i_changes |= VOUT_SIZE_CHANGE;
#endif
/* If the cursor was formerly blank than blank it again */ /* If the cursor was formerly blank than blank it again */
if( !p_vout->p_sys->b_mouse_pointer_visible ) if( !p_vout->p_sys->b_mouse_pointer_visible )
...@@ -1125,10 +1094,7 @@ static void DestroyWindow( vout_thread_t *p_vout ) ...@@ -1125,10 +1094,7 @@ static void DestroyWindow( vout_thread_t *p_vout )
/* Do NOT use XFlush here ! */ /* Do NOT use XFlush here ! */
XSync( p_vout->p_sys->p_display, False ); XSync( p_vout->p_sys->p_display, False );
#ifdef MODULE_NAME_IS_xvideo XDestroyWindow( p_vout->p_sys->p_display, p_vout->p_sys->video_window );
XDestroyWindow( p_vout->p_sys->p_display, p_vout->p_sys->yuv_window );
#endif
XUnmapWindow( p_vout->p_sys->p_display, p_vout->p_sys->window ); XUnmapWindow( p_vout->p_sys->p_display, p_vout->p_sys->window );
XFreeGC( p_vout->p_sys->p_display, p_vout->p_sys->gc ); XFreeGC( p_vout->p_sys->p_display, p_vout->p_sys->gc );
XDestroyWindow( p_vout->p_sys->p_display, p_vout->p_sys->window ); XDestroyWindow( p_vout->p_sys->p_display, p_vout->p_sys->window );
......
...@@ -5,7 +5,7 @@ ...@@ -5,7 +5,7 @@
* thread, and destroy a previously oppened video output thread. * thread, and destroy a previously oppened video output thread.
***************************************************************************** *****************************************************************************
* Copyright (C) 2000-2001 VideoLAN * Copyright (C) 2000-2001 VideoLAN
* $Id: video_output.c,v 1.173 2002/04/25 21:52:42 sam Exp $ * $Id: video_output.c,v 1.174 2002/05/05 08:25:15 gbazin Exp $
* *
* Authors: Vincent Seguin <seguin@via.ecp.fr> * Authors: Vincent Seguin <seguin@via.ecp.fr>
* *
...@@ -433,6 +433,7 @@ static int InitThread( vout_thread_t *p_vout ) ...@@ -433,6 +433,7 @@ static int InitThread( vout_thread_t *p_vout )
} }
#define f p_vout->chroma.p_module->p_functions->chroma.functions.chroma #define f p_vout->chroma.p_module->p_functions->chroma.functions.chroma
p_vout->chroma.pf_init = f.pf_init;
p_vout->chroma.pf_end = f.pf_end; p_vout->chroma.pf_end = f.pf_end;
#undef f #undef f
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment