Commit 849c0ed3 authored by Sam Hocevar's avatar Sam Hocevar

* ./modules/video_output/x11/xcommon.c: if we do not own the X window, like

    in the Mozilla plugin, we do not try to unmap it.
parent e710eca6
...@@ -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.3 2002/08/19 08:19:31 gbazin Exp $ * $Id: xcommon.c,v 1.4 2002/09/10 12:15:07 sam 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,7 +142,7 @@ int E_(Activate) ( vlc_object_t *p_this ) ...@@ -142,7 +142,7 @@ int E_(Activate) ( vlc_object_t *p_this )
if( p_vout->p_sys == NULL ) if( p_vout->p_sys == NULL )
{ {
msg_Err( p_vout, "out of memory" ); msg_Err( p_vout, "out of memory" );
return( 1 ); return VLC_ENOMEM;
} }
/* Open display, unsing the "display" config variable or the DISPLAY /* Open display, unsing the "display" config variable or the DISPLAY
...@@ -157,7 +157,7 @@ int E_(Activate) ( vlc_object_t *p_this ) ...@@ -157,7 +157,7 @@ int E_(Activate) ( vlc_object_t *p_this )
XDisplayName( psz_display ) ); XDisplayName( psz_display ) );
free( p_vout->p_sys ); free( p_vout->p_sys );
if( psz_display ) free( psz_display ); if( psz_display ) free( psz_display );
return( 1 ); return VLC_EGENERIC;
} }
if( psz_display ) free( psz_display ); if( psz_display ) free( psz_display );
...@@ -197,12 +197,12 @@ int E_(Activate) ( vlc_object_t *p_this ) ...@@ -197,12 +197,12 @@ int E_(Activate) ( vlc_object_t *p_this )
if( p_vout->p_sys->i_xvport < 0 ) if( p_vout->p_sys->i_xvport < 0 )
{ {
/* If a specific chroma format was requested, then we don't try to /* If a specific chroma format was requested, then we don't try to
* be cleverer than the user. He knows pretty well what he wants. */ * be cleverer than the user. He knew pretty well what he wanted. */
if( b_chroma ) if( b_chroma )
{ {
XCloseDisplay( p_vout->p_sys->p_display ); XCloseDisplay( p_vout->p_sys->p_display );
free( p_vout->p_sys ); free( p_vout->p_sys );
return 1; return VLC_EGENERIC;
} }
/* It failed, but it's not completely lost ! We try to open an /* It failed, but it's not completely lost ! We try to open an
...@@ -223,7 +223,7 @@ int E_(Activate) ( vlc_object_t *p_this ) ...@@ -223,7 +223,7 @@ int E_(Activate) ( vlc_object_t *p_this )
{ {
XCloseDisplay( p_vout->p_sys->p_display ); XCloseDisplay( p_vout->p_sys->p_display );
free( p_vout->p_sys ); free( p_vout->p_sys );
return 1; return VLC_EGENERIC;
} }
} }
} }
...@@ -246,7 +246,7 @@ int E_(Activate) ( vlc_object_t *p_this ) ...@@ -246,7 +246,7 @@ int E_(Activate) ( vlc_object_t *p_this )
DestroyCursor( p_vout ); DestroyCursor( p_vout );
XCloseDisplay( p_vout->p_sys->p_display ); XCloseDisplay( p_vout->p_sys->p_display );
free( p_vout->p_sys ); free( p_vout->p_sys );
return( 1 ); return VLC_EGENERIC;
} }
/* Open and initialize device. */ /* Open and initialize device. */
...@@ -257,7 +257,7 @@ int E_(Activate) ( vlc_object_t *p_this ) ...@@ -257,7 +257,7 @@ int E_(Activate) ( vlc_object_t *p_this )
DestroyWindow( p_vout, &p_vout->p_sys->original_window ); DestroyWindow( p_vout, &p_vout->p_sys->original_window );
XCloseDisplay( p_vout->p_sys->p_display ); XCloseDisplay( p_vout->p_sys->p_display );
free( p_vout->p_sys ); free( p_vout->p_sys );
return( 1 ); return VLC_EGENERIC;
} }
/* Disable screen saver */ /* Disable screen saver */
...@@ -267,7 +267,7 @@ int E_(Activate) ( vlc_object_t *p_this ) ...@@ -267,7 +267,7 @@ int E_(Activate) ( vlc_object_t *p_this )
p_vout->p_sys->b_altfullscreen = 0; p_vout->p_sys->b_altfullscreen = 0;
p_vout->p_sys->i_time_button_last_pressed = 0; p_vout->p_sys->i_time_button_last_pressed = 0;
return( 0 ); return VLC_SUCCESS;
} }
/***************************************************************************** /*****************************************************************************
...@@ -364,7 +364,7 @@ static int InitVideo( vout_thread_t *p_vout ) ...@@ -364,7 +364,7 @@ static int InitVideo( vout_thread_t *p_vout )
default: default:
msg_Err( p_vout, "unknown screen depth %i", msg_Err( p_vout, "unknown screen depth %i",
p_vout->p_sys->i_screen_depth ); p_vout->p_sys->i_screen_depth );
return( 0 ); return VLC_SUCCESS;
} }
vout_PlacePicture( p_vout, p_vout->p_sys->p_win->i_width, vout_PlacePicture( p_vout, p_vout->p_sys->p_win->i_width,
...@@ -406,7 +406,7 @@ static int InitVideo( vout_thread_t *p_vout ) ...@@ -406,7 +406,7 @@ static int InitVideo( vout_thread_t *p_vout )
I_OUTPUTPICTURES++; I_OUTPUTPICTURES++;
} }
return( 0 ); return VLC_SUCCESS;
} }
/***************************************************************************** /*****************************************************************************
...@@ -849,7 +849,7 @@ static int CreateWindow( vout_thread_t *p_vout, x11_window_t *p_win ) ...@@ -849,7 +849,7 @@ static int CreateWindow( vout_thread_t *p_vout, x11_window_t *p_win )
if( i_drawable == -1 ) if( i_drawable == -1 )
{ {
p_vout->p_sys->b_createwindow = 1; p_win->b_owned = VLC_TRUE;
/* Create the window and set hints - the window must receive /* Create the window and set hints - the window must receive
* ConfigureNotify events, and until it is displayed, Expose and * ConfigureNotify events, and until it is displayed, Expose and
...@@ -885,7 +885,7 @@ static int CreateWindow( vout_thread_t *p_vout, x11_window_t *p_win ) ...@@ -885,7 +885,7 @@ static int CreateWindow( vout_thread_t *p_vout, x11_window_t *p_win )
} }
else else
{ {
p_vout->p_sys->b_createwindow = 0; p_win->b_owned = VLC_FALSE;
p_win->base_window = i_drawable; p_win->base_window = i_drawable;
XChangeWindowAttributes( p_vout->p_sys->p_display, XChangeWindowAttributes( p_vout->p_sys->p_display,
...@@ -910,7 +910,7 @@ static int CreateWindow( vout_thread_t *p_vout, x11_window_t *p_win ) ...@@ -910,7 +910,7 @@ static int CreateWindow( vout_thread_t *p_vout, x11_window_t *p_win )
p_win->base_window, p_win->base_window,
GCGraphicsExposures, &xgcvalues ); GCGraphicsExposures, &xgcvalues );
if( p_vout->p_sys->b_createwindow ) if( p_win->b_owned )
{ {
/* Send orders to server, and wait until window is displayed - three /* Send orders to server, and wait until window is displayed - three
* events must be received: a MapNotify event, an Expose event allowing * events must be received: a MapNotify event, an Expose event allowing
...@@ -961,7 +961,7 @@ static int CreateWindow( vout_thread_t *p_vout, x11_window_t *p_win ) ...@@ -961,7 +961,7 @@ static int CreateWindow( vout_thread_t *p_vout, x11_window_t *p_win )
PointerMotionMask ); PointerMotionMask );
#ifdef MODULE_NAME_IS_x11 #ifdef MODULE_NAME_IS_x11
if( p_vout->p_sys->b_createwindow && if( p_win->b_owned &&
XDefaultDepth(p_vout->p_sys->p_display, p_vout->p_sys->i_screen) == 8 ) XDefaultDepth(p_vout->p_sys->p_display, p_vout->p_sys->i_screen) == 8 )
{ {
/* Allocate a new palette */ /* Allocate a new palette */
...@@ -1014,7 +1014,7 @@ static int CreateWindow( vout_thread_t *p_vout, x11_window_t *p_win ) ...@@ -1014,7 +1014,7 @@ static int CreateWindow( vout_thread_t *p_vout, x11_window_t *p_win )
* receive data */ * receive data */
p_vout->p_sys->p_win = p_win; p_vout->p_sys->p_win = p_win;
return( 0 ); return VLC_SUCCESS;
} }
/***************************************************************************** /*****************************************************************************
...@@ -1028,9 +1028,13 @@ static void DestroyWindow( vout_thread_t *p_vout, x11_window_t *p_win ) ...@@ -1028,9 +1028,13 @@ static void DestroyWindow( vout_thread_t *p_vout, x11_window_t *p_win )
XSync( p_vout->p_sys->p_display, False ); XSync( p_vout->p_sys->p_display, False );
XDestroyWindow( p_vout->p_sys->p_display, p_win->video_window ); XDestroyWindow( p_vout->p_sys->p_display, p_win->video_window );
XUnmapWindow( p_vout->p_sys->p_display, p_win->base_window );
XFreeGC( p_vout->p_sys->p_display, p_win->gc ); XFreeGC( p_vout->p_sys->p_display, p_win->gc );
if( p_win->b_owned )
{
XUnmapWindow( p_vout->p_sys->p_display, p_win->base_window );
XDestroyWindow( p_vout->p_sys->p_display, p_win->base_window ); XDestroyWindow( p_vout->p_sys->p_display, p_win->base_window );
}
} }
/***************************************************************************** /*****************************************************************************
...@@ -1304,9 +1308,11 @@ static void ToggleFullScreen ( vout_thread_t *p_vout ) ...@@ -1304,9 +1308,11 @@ static void ToggleFullScreen ( vout_thread_t *p_vout )
p_vout->p_sys->b_altfullscreen = p_vout->p_sys->b_altfullscreen =
config_GetInt( p_vout, MODULE_STRING "-altfullscreen" ); config_GetInt( p_vout, MODULE_STRING "-altfullscreen" );
if( p_vout->p_sys->b_createwindow ) if( p_vout->p_sys->p_win->b_owned )
{
XUnmapWindow( p_vout->p_sys->p_display, XUnmapWindow( p_vout->p_sys->p_display,
p_vout->p_sys->p_win->base_window); p_vout->p_sys->p_win->base_window);
}
p_vout->p_sys->p_win = &p_vout->p_sys->fullscreen_window; p_vout->p_sys->p_win = &p_vout->p_sys->fullscreen_window;
...@@ -1371,7 +1377,7 @@ static void ToggleFullScreen ( vout_thread_t *p_vout ) ...@@ -1371,7 +1377,7 @@ static void ToggleFullScreen ( vout_thread_t *p_vout )
DestroyWindow( p_vout, &p_vout->p_sys->fullscreen_window ); DestroyWindow( p_vout, &p_vout->p_sys->fullscreen_window );
p_vout->p_sys->p_win = &p_vout->p_sys->original_window; p_vout->p_sys->p_win = &p_vout->p_sys->original_window;
if( p_vout->p_sys->b_createwindow ) if( p_vout->p_sys->p_win->b_owned )
{ {
XMapWindow( p_vout->p_sys->p_display, XMapWindow( p_vout->p_sys->p_display,
p_vout->p_sys->p_win->base_window); p_vout->p_sys->p_win->base_window);
...@@ -1382,12 +1388,19 @@ static void ToggleFullScreen ( vout_thread_t *p_vout ) ...@@ -1382,12 +1388,19 @@ static void ToggleFullScreen ( vout_thread_t *p_vout )
* window has already been mapped because the XMapWindow() request * window has already been mapped because the XMapWindow() request
* has not necessarily been sent directly to our window (remember, * has not necessarily been sent directly to our window (remember,
* the call is first redirected to the window manager) */ * the call is first redirected to the window manager) */
if( p_vout->p_sys->p_win->b_owned )
{
do do
{ {
XWindowEvent( p_vout->p_sys->p_display, XWindowEvent( p_vout->p_sys->p_display,
p_vout->p_sys->p_win->base_window, p_vout->p_sys->p_win->base_window,
StructureNotifyMask, &xevent ); StructureNotifyMask, &xevent );
} while( xevent.type != MapNotify ); } while( xevent.type != MapNotify );
}
else
{
XSync( p_vout->p_sys->p_display, False );
}
/* Becareful, this can generate a BadMatch error if the window is not /* Becareful, this can generate a BadMatch error if the window is not
* already mapped by the server (see above) */ * already mapped by the server (see above) */
...@@ -1546,15 +1559,15 @@ static int XVideoGetPort( vout_thread_t *p_vout, ...@@ -1546,15 +1559,15 @@ static int XVideoGetPort( vout_thread_t *p_vout,
case XvBadExtension: case XvBadExtension:
msg_Warn( p_vout, "XvBadExtension" ); msg_Warn( p_vout, "XvBadExtension" );
return( -1 ); return -1;
case XvBadAlloc: case XvBadAlloc:
msg_Warn( p_vout, "XvBadAlloc" ); msg_Warn( p_vout, "XvBadAlloc" );
return( -1 ); return -1;
default: default:
msg_Warn( p_vout, "XvQueryExtension failed" ); msg_Warn( p_vout, "XvQueryExtension failed" );
return( -1 ); return -1;
} }
switch( XvQueryAdaptors( p_vout->p_sys->p_display, switch( XvQueryAdaptors( p_vout->p_sys->p_display,
...@@ -1566,15 +1579,15 @@ static int XVideoGetPort( vout_thread_t *p_vout, ...@@ -1566,15 +1579,15 @@ static int XVideoGetPort( vout_thread_t *p_vout,
case XvBadExtension: case XvBadExtension:
msg_Warn( p_vout, "XvBadExtension for XvQueryAdaptors" ); msg_Warn( p_vout, "XvBadExtension for XvQueryAdaptors" );
return( -1 ); return -1;
case XvBadAlloc: case XvBadAlloc:
msg_Warn( p_vout, "XvBadAlloc for XvQueryAdaptors" ); msg_Warn( p_vout, "XvBadAlloc for XvQueryAdaptors" );
return( -1 ); return -1;
default: default:
msg_Warn( p_vout, "XvQueryAdaptors failed" ); msg_Warn( p_vout, "XvQueryAdaptors failed" );
return( -1 ); return -1;
} }
i_selected_port = -1; i_selected_port = -1;
...@@ -1725,7 +1738,7 @@ static int XVideoGetPort( vout_thread_t *p_vout, ...@@ -1725,7 +1738,7 @@ static int XVideoGetPort( vout_thread_t *p_vout,
} }
} }
return( i_selected_port ); return i_selected_port;
} }
/***************************************************************************** /*****************************************************************************
...@@ -1809,7 +1822,7 @@ static int InitDisplay( vout_thread_t *p_vout ) ...@@ -1809,7 +1822,7 @@ static int InitDisplay( vout_thread_t *p_vout )
if( p_xvisual == NULL ) if( p_xvisual == NULL )
{ {
msg_Err( p_vout, "no PseudoColor visual available" ); msg_Err( p_vout, "no PseudoColor visual available" );
return( 1 ); return VLC_EGENERIC;
} }
p_vout->p_sys->i_bytes_per_pixel = 1; p_vout->p_sys->i_bytes_per_pixel = 1;
p_vout->output.pf_setpalette = SetPalette; p_vout->output.pf_setpalette = SetPalette;
...@@ -1829,7 +1842,7 @@ static int InitDisplay( vout_thread_t *p_vout ) ...@@ -1829,7 +1842,7 @@ static int InitDisplay( vout_thread_t *p_vout )
if( p_xvisual == NULL ) if( p_xvisual == NULL )
{ {
msg_Err( p_vout, "no TrueColor visual available" ); msg_Err( p_vout, "no TrueColor visual available" );
return( 1 ); return VLC_EGENERIC;
} }
p_vout->output.i_rmask = p_xvisual->red_mask; p_vout->output.i_rmask = p_xvisual->red_mask;
...@@ -1862,7 +1875,7 @@ static int InitDisplay( vout_thread_t *p_vout ) ...@@ -1862,7 +1875,7 @@ static int InitDisplay( vout_thread_t *p_vout )
XFree( p_xvisual ); XFree( p_xvisual );
#endif #endif
return( 0 ); return VLC_SUCCESS;
} }
#ifdef HAVE_SYS_SHM_H #ifdef HAVE_SYS_SHM_H
...@@ -1891,7 +1904,7 @@ static IMAGE_TYPE * CreateShmImage( vout_thread_t *p_vout, ...@@ -1891,7 +1904,7 @@ static IMAGE_TYPE * CreateShmImage( vout_thread_t *p_vout,
if( p_image == NULL ) if( p_image == NULL )
{ {
msg_Err( p_vout, "image creation failed" ); msg_Err( p_vout, "image creation failed" );
return( NULL ); return NULL;
} }
/* Allocate shared memory segment - 0776 set the access permission /* Allocate shared memory segment - 0776 set the access permission
...@@ -1902,7 +1915,7 @@ static IMAGE_TYPE * CreateShmImage( vout_thread_t *p_vout, ...@@ -1902,7 +1915,7 @@ static IMAGE_TYPE * CreateShmImage( vout_thread_t *p_vout,
msg_Err( p_vout, "cannot allocate shared image data (%s)", msg_Err( p_vout, "cannot allocate shared image data (%s)",
strerror( errno ) ); strerror( errno ) );
IMAGE_FREE( p_image ); IMAGE_FREE( p_image );
return( NULL ); return NULL;
} }
/* Attach shared memory segment to process (read/write) */ /* Attach shared memory segment to process (read/write) */
...@@ -1913,7 +1926,7 @@ static IMAGE_TYPE * CreateShmImage( vout_thread_t *p_vout, ...@@ -1913,7 +1926,7 @@ static IMAGE_TYPE * CreateShmImage( vout_thread_t *p_vout,
strerror(errno)); strerror(errno));
IMAGE_FREE( p_image ); IMAGE_FREE( p_image );
shmctl( p_shm->shmid, IPC_RMID, 0 ); shmctl( p_shm->shmid, IPC_RMID, 0 );
return( NULL ); return NULL;
} }
/* Read-only data. We won't be using XShmGetImage */ /* Read-only data. We won't be using XShmGetImage */
...@@ -1926,7 +1939,7 @@ static IMAGE_TYPE * CreateShmImage( vout_thread_t *p_vout, ...@@ -1926,7 +1939,7 @@ static IMAGE_TYPE * CreateShmImage( vout_thread_t *p_vout,
IMAGE_FREE( p_image ); IMAGE_FREE( p_image );
shmctl( p_shm->shmid, IPC_RMID, 0 ); shmctl( p_shm->shmid, IPC_RMID, 0 );
shmdt( p_shm->shmaddr ); shmdt( p_shm->shmaddr );
return( NULL ); return NULL;
} }
/* Send image to X server. This instruction is required, since having /* Send image to X server. This instruction is required, since having
...@@ -1940,7 +1953,7 @@ static IMAGE_TYPE * CreateShmImage( vout_thread_t *p_vout, ...@@ -1940,7 +1953,7 @@ static IMAGE_TYPE * CreateShmImage( vout_thread_t *p_vout,
shmctl( p_shm->shmid, IPC_RMID, 0 ); shmctl( p_shm->shmid, IPC_RMID, 0 );
#endif #endif
return( p_image ); return p_image;
} }
#endif #endif
...@@ -1970,7 +1983,7 @@ static IMAGE_TYPE * CreateImage( vout_thread_t *p_vout, ...@@ -1970,7 +1983,7 @@ static IMAGE_TYPE * CreateImage( vout_thread_t *p_vout,
if( !p_data ) if( !p_data )
{ {
msg_Err( p_vout, "out of memory" ); msg_Err( p_vout, "out of memory" );
return( NULL ); return NULL;
} }
#ifdef MODULE_NAME_IS_x11 #ifdef MODULE_NAME_IS_x11
...@@ -2002,7 +2015,7 @@ static IMAGE_TYPE * CreateImage( vout_thread_t *p_vout, ...@@ -2002,7 +2015,7 @@ static IMAGE_TYPE * CreateImage( vout_thread_t *p_vout,
{ {
msg_Err( p_vout, "XCreateImage() failed" ); msg_Err( p_vout, "XCreateImage() failed" );
free( p_data ); free( p_data );
return( NULL ); return NULL;
} }
return p_image; return p_image;
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* xcommon.h: Defines common to the X11 and XVideo plugins * xcommon.h: Defines common to the X11 and XVideo plugins
***************************************************************************** *****************************************************************************
* Copyright (C) 1998-2001 VideoLAN * Copyright (C) 1998-2001 VideoLAN
* $Id: xcommon.h,v 1.2 2002/08/08 00:35:11 sam Exp $ * $Id: xcommon.h,v 1.3 2002/09/10 12:15:07 sam 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>
...@@ -51,11 +51,13 @@ typedef struct x11_window_t ...@@ -51,11 +51,13 @@ typedef struct x11_window_t
Window base_window; /* base window */ Window base_window; /* base window */
Window video_window; /* sub-window for displaying video */ Window video_window; /* sub-window for displaying video */
GC gc; /* graphic context instance handler */ GC gc; /* graphic context instance handler */
int i_width; /* width of main window */ int i_width; /* window width */
int i_height; /* height of main window */ int i_height; /* window height */
Atom wm_protocols; Atom wm_protocols;
Atom wm_delete_window; Atom wm_delete_window;
vlc_bool_t b_owned; /* do we own this window? */
} x11_window_t; } x11_window_t;
/***************************************************************************** /*****************************************************************************
...@@ -81,7 +83,6 @@ struct vout_sys_t ...@@ -81,7 +83,6 @@ struct vout_sys_t
/* X11 generic properties */ /* X11 generic properties */
vlc_bool_t b_altfullscreen; /* which fullscreen method */ vlc_bool_t b_altfullscreen; /* which fullscreen method */
vlc_bool_t b_createwindow; /* are we the base window's owner ? */
#ifdef HAVE_SYS_SHM_H #ifdef HAVE_SYS_SHM_H
vlc_bool_t b_shm; /* shared memory extension flag */ vlc_bool_t b_shm; /* shared memory extension flag */
#endif #endif
......
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