Commit 0f282618 authored by Geoffroy Couprie's avatar Geoffroy Couprie

win32 vout: factorize code

parent b1501cfe
...@@ -202,71 +202,21 @@ static int OpenVideo( vlc_object_t *p_this ) ...@@ -202,71 +202,21 @@ static int OpenVideo( vlc_object_t *p_this )
p_vout->p_sys->i_window_width = p_vout->i_window_width; p_vout->p_sys->i_window_width = p_vout->i_window_width;
p_vout->p_sys->i_window_height = p_vout->i_window_height; p_vout->p_sys->i_window_height = p_vout->i_window_height;
/* Create the Vout EventThread, this thread is created by us to isolate if ( CreateEventThread( p_vout ) )
* the Win32 PeekMessage function calls. We want to do this because
* Windows can stay blocked inside this call for a long time, and when
* this happens it thus blocks vlc's video_output thread.
* Vout EventThread will take care of the creation of the video
* window (because PeekMessage has to be called from the same thread which
* created the window). */
msg_Dbg( p_vout, "creating Vout EventThread" );
p_vout->p_sys->p_event =
vlc_object_create( p_vout, sizeof(event_thread_t) );
p_vout->p_sys->p_event->p_vout = p_vout;
p_vout->p_sys->p_event->window_ready = CreateEvent( NULL, TRUE, FALSE, NULL );
if( vlc_thread_create( p_vout->p_sys->p_event, "Vout Events Thread",
EventThread, 0 ) )
{ {
msg_Err( p_vout, "cannot create Vout EventThread" );
CloseHandle( p_vout->p_sys->p_event->window_ready );
vlc_object_release( p_vout->p_sys->p_event );
p_vout->p_sys->p_event = NULL;
goto error;
}
WaitForSingleObject( p_vout->p_sys->p_event->window_ready, INFINITE );
CloseHandle( p_vout->p_sys->p_event->window_ready );
if( p_vout->p_sys->p_event->b_error )
{
msg_Err( p_vout, "Vout EventThread failed" );
goto error;
}
vlc_object_attach( p_vout->p_sys->p_event, p_vout );
msg_Dbg( p_vout, "Vout EventThread running" );
/* Variable to indicate if the window should be on top of others */ /* Variable to indicate if the window should be on top of others */
/* Trigger a callback right now */ /* Trigger a callback right now */
var_TriggerCallback( p_vout, "video-on-top" ); var_TriggerCallback( p_vout, "video-on-top" );
/* disable screensaver by temporarily changing system settings */ DisableScreensaver ( p_vout );
p_vout->p_sys->i_spi_lowpowertimeout = 0;
p_vout->p_sys->i_spi_powerofftimeout = 0;
p_vout->p_sys->i_spi_screensavetimeout = 0;
if( var_GetBool( p_vout, "disable-screensaver" ) ) {
msg_Dbg(p_vout, "disabling screen saver");
SystemParametersInfo(SPI_GETLOWPOWERTIMEOUT,
0, &(p_vout->p_sys->i_spi_lowpowertimeout), 0);
if( 0 != p_vout->p_sys->i_spi_lowpowertimeout ) {
SystemParametersInfo(SPI_SETLOWPOWERTIMEOUT, 0, NULL, 0);
}
SystemParametersInfo(SPI_GETPOWEROFFTIMEOUT, 0,
&(p_vout->p_sys->i_spi_powerofftimeout), 0);
if( 0 != p_vout->p_sys->i_spi_powerofftimeout ) {
SystemParametersInfo(SPI_SETPOWEROFFTIMEOUT, 0, NULL, 0);
}
SystemParametersInfo(SPI_GETSCREENSAVETIMEOUT, 0,
&(p_vout->p_sys->i_spi_screensavetimeout), 0);
if( 0 != p_vout->p_sys->i_spi_screensavetimeout ) {
SystemParametersInfo(SPI_SETSCREENSAVETIMEOUT, 0, NULL, 0);
}
}
return VLC_SUCCESS;
error: return VLC_SUCCESS;
}
else
{
CloseVideo( VLC_OBJECT(p_vout) ); CloseVideo( VLC_OBJECT(p_vout) );
return VLC_EGENERIC; return VLC_EGENERIC;
}
} }
/***************************************************************************** /*****************************************************************************
...@@ -280,47 +230,9 @@ static void CloseVideo( vlc_object_t *p_this ) ...@@ -280,47 +230,9 @@ static void CloseVideo( vlc_object_t *p_this )
Direct3DVoutRelease( p_vout ); Direct3DVoutRelease( p_vout );
if( p_vout->b_fullscreen ) StopEventThread( p_vout );
{
msg_Dbg( p_vout, "Quitting fullscreen" );
Win32ToggleFullscreen( p_vout );
/* Force fullscreen in the core for the next video */
var_SetBool( p_vout, "fullscreen", true );
}
if( p_vout->p_sys->p_event )
{
vlc_object_detach( p_vout->p_sys->p_event );
/* Kill Vout EventThread */
vlc_object_kill( p_vout->p_sys->p_event );
/* we need to be sure Vout EventThread won't stay stuck in
* GetMessage, so we send a fake message */
if( p_vout->p_sys->hwnd )
{
PostMessage( p_vout->p_sys->hwnd, WM_NULL, 0, 0);
}
vlc_thread_join( p_vout->p_sys->p_event );
vlc_object_release( p_vout->p_sys->p_event );
}
vlc_mutex_destroy( &p_vout->p_sys->lock ); RestoreScreensaver( p_vout );
/* restore screensaver system settings */
if( 0 != p_vout->p_sys->i_spi_lowpowertimeout ) {
SystemParametersInfo(SPI_SETLOWPOWERTIMEOUT,
p_vout->p_sys->i_spi_lowpowertimeout, NULL, 0);
}
if( 0 != p_vout->p_sys->i_spi_powerofftimeout ) {
SystemParametersInfo(SPI_SETPOWEROFFTIMEOUT,
p_vout->p_sys->i_spi_powerofftimeout, NULL, 0);
}
if( 0 != p_vout->p_sys->i_spi_screensavetimeout ) {
SystemParametersInfo(SPI_SETSCREENSAVETIMEOUT,
p_vout->p_sys->i_spi_screensavetimeout, NULL, 0);
}
free( p_vout->p_sys ); free( p_vout->p_sys );
p_vout->p_sys = NULL; p_vout->p_sys = NULL;
......
...@@ -266,39 +266,8 @@ static int OpenVideo( vlc_object_t *p_this ) ...@@ -266,39 +266,8 @@ static int OpenVideo( vlc_object_t *p_this )
p_vout->p_sys->i_window_width = p_vout->i_window_width; p_vout->p_sys->i_window_width = p_vout->i_window_width;
p_vout->p_sys->i_window_height = p_vout->i_window_height; p_vout->p_sys->i_window_height = p_vout->i_window_height;
/* Create the Vout EventThread, this thread is created by us to isolate if ( !CreateEventThread( p_vout ) )
* the Win32 PeekMessage function calls. We want to do this because
* Windows can stay blocked inside this call for a long time, and when
* this happens it thus blocks vlc's video_output thread.
* DirectXEventThread will take care of the creation of the video
* window (because PeekMessage has to be called from the same thread which
* created the window). */
msg_Dbg( p_vout, "creating DirectXEventThread" );
p_vout->p_sys->p_event =
vlc_object_create( p_vout, sizeof(event_thread_t) );
p_vout->p_sys->p_event->p_vout = p_vout;
p_vout->p_sys->p_event->window_ready = CreateEvent( NULL, TRUE, FALSE, NULL );
if( vlc_thread_create( p_vout->p_sys->p_event, "Vout Events Thread",
EventThread, 0 ) )
{
msg_Err( p_vout, "cannot create Vout EventThread" );
CloseHandle( p_vout->p_sys->p_event->window_ready );
vlc_object_release( p_vout->p_sys->p_event );
p_vout->p_sys->p_event = NULL;
goto error; goto error;
}
WaitForSingleObject( p_vout->p_sys->p_event->window_ready, INFINITE );
CloseHandle( p_vout->p_sys->p_event->window_ready );
if( p_vout->p_sys->p_event->b_error )
{
msg_Err( p_vout, "Vout EventThread failed" );
goto error;
}
vlc_object_attach( p_vout->p_sys->p_event, p_vout );
msg_Dbg( p_vout, "Vout EventThread running" );
/* Initialise DirectDraw */ /* Initialise DirectDraw */
if( DirectXInitDDraw( p_vout ) ) if( DirectXInitDDraw( p_vout ) )
...@@ -326,28 +295,7 @@ static int OpenVideo( vlc_object_t *p_this ) ...@@ -326,28 +295,7 @@ static int OpenVideo( vlc_object_t *p_this )
var_AddCallback( p_vout, "directx-wallpaper", WallpaperCallback, NULL ); var_AddCallback( p_vout, "directx-wallpaper", WallpaperCallback, NULL );
var_TriggerCallback( p_vout, "directx-wallpaper" ); var_TriggerCallback( p_vout, "directx-wallpaper" );
/* disable screensaver by temporarily changing system settings */ DisableScreensaver ( p_vout );
p_vout->p_sys->i_spi_lowpowertimeout = 0;
p_vout->p_sys->i_spi_powerofftimeout = 0;
p_vout->p_sys->i_spi_screensavetimeout = 0;
if( var_GetBool( p_vout, "disable-screensaver" ) ) {
msg_Dbg(p_vout, "disabling screen saver");
SystemParametersInfo(SPI_GETLOWPOWERTIMEOUT,
0, &(p_vout->p_sys->i_spi_lowpowertimeout), 0);
if( 0 != p_vout->p_sys->i_spi_lowpowertimeout ) {
SystemParametersInfo(SPI_SETLOWPOWERTIMEOUT, 0, NULL, 0);
}
SystemParametersInfo(SPI_GETPOWEROFFTIMEOUT, 0,
&(p_vout->p_sys->i_spi_powerofftimeout), 0);
if( 0 != p_vout->p_sys->i_spi_powerofftimeout ) {
SystemParametersInfo(SPI_SETPOWEROFFTIMEOUT, 0, NULL, 0);
}
SystemParametersInfo(SPI_GETSCREENSAVETIMEOUT, 0,
&(p_vout->p_sys->i_spi_screensavetimeout), 0);
if( 0 != p_vout->p_sys->i_spi_screensavetimeout ) {
SystemParametersInfo(SPI_SETSCREENSAVETIMEOUT, 0, NULL, 0);
}
}
return VLC_SUCCESS; return VLC_SUCCESS;
...@@ -482,50 +430,12 @@ static void CloseVideo( vlc_object_t *p_this ) ...@@ -482,50 +430,12 @@ static void 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( p_vout->b_fullscreen ) StopEventThread( p_vout );
{
msg_Dbg( p_vout, "Quitting fullscreen" );
Win32ToggleFullscreen( p_vout );
/* Force fullscreen in the core for the next video */
var_SetBool( p_vout, "fullscreen", true );
}
if( p_vout->p_sys->p_event )
{
vlc_object_detach( p_vout->p_sys->p_event );
/* Kill Vout EventThread */
vlc_object_kill( p_vout->p_sys->p_event );
/* we need to be sure Vout EventThread won't stay stuck in
* GetMessage, so we send a fake message */
if( p_vout->p_sys->hwnd )
{
PostMessage( p_vout->p_sys->hwnd, WM_NULL, 0, 0);
}
vlc_thread_join( p_vout->p_sys->p_event );
vlc_object_release( p_vout->p_sys->p_event );
}
vlc_mutex_destroy( &p_vout->p_sys->lock );
/* Make sure the wallpaper is restored */ /* Make sure the wallpaper is restored */
SwitchWallpaperMode( p_vout, false ); SwitchWallpaperMode( p_vout, false );
/* restore screensaver system settings */ RestoreScreensaver( p_vout );
if( 0 != p_vout->p_sys->i_spi_lowpowertimeout ) {
SystemParametersInfo(SPI_SETLOWPOWERTIMEOUT,
p_vout->p_sys->i_spi_lowpowertimeout, NULL, 0);
}
if( 0 != p_vout->p_sys->i_spi_powerofftimeout ) {
SystemParametersInfo(SPI_SETPOWEROFFTIMEOUT,
p_vout->p_sys->i_spi_powerofftimeout, NULL, 0);
}
if( 0 != p_vout->p_sys->i_spi_screensavetimeout ) {
SystemParametersInfo(SPI_SETSCREENSAVETIMEOUT,
p_vout->p_sys->i_spi_screensavetimeout, NULL, 0);
}
free( p_vout->p_sys ); free( p_vout->p_sys );
p_vout->p_sys = NULL; p_vout->p_sys = NULL;
......
...@@ -1211,3 +1211,116 @@ void Win32ToggleFullscreen( vout_thread_t *p_vout ) ...@@ -1211,3 +1211,116 @@ void Win32ToggleFullscreen( vout_thread_t *p_vout )
/* Update the object variable and trigger callback */ /* Update the object variable and trigger callback */
var_SetBool( p_vout, "fullscreen", p_vout->b_fullscreen ); var_SetBool( p_vout, "fullscreen", p_vout->b_fullscreen );
} }
void DisableScreensaver( vout_thread_t *p_vout )
{
/* disable screensaver by temporarily changing system settings */
p_vout->p_sys->i_spi_lowpowertimeout = 0;
p_vout->p_sys->i_spi_powerofftimeout = 0;
p_vout->p_sys->i_spi_screensavetimeout = 0;
if( var_GetBool( p_vout, "disable-screensaver" ) )
{
msg_Dbg(p_vout, "disabling screen saver");
SystemParametersInfo(SPI_GETLOWPOWERTIMEOUT,
0, &(p_vout->p_sys->i_spi_lowpowertimeout), 0);
if( 0 != p_vout->p_sys->i_spi_lowpowertimeout ) {
SystemParametersInfo(SPI_SETLOWPOWERTIMEOUT, 0, NULL, 0);
}
SystemParametersInfo(SPI_GETPOWEROFFTIMEOUT, 0,
&(p_vout->p_sys->i_spi_powerofftimeout), 0);
if( 0 != p_vout->p_sys->i_spi_powerofftimeout ) {
SystemParametersInfo(SPI_SETPOWEROFFTIMEOUT, 0, NULL, 0);
}
SystemParametersInfo(SPI_GETSCREENSAVETIMEOUT, 0,
&(p_vout->p_sys->i_spi_screensavetimeout), 0);
if( 0 != p_vout->p_sys->i_spi_screensavetimeout ) {
SystemParametersInfo(SPI_SETSCREENSAVETIMEOUT, 0, NULL, 0);
}
}
}
void RestoreScreensaver( vout_thread_t *p_vout )
{
/* restore screensaver system settings */
if( 0 != p_vout->p_sys->i_spi_lowpowertimeout ) {
SystemParametersInfo(SPI_SETLOWPOWERTIMEOUT,
p_vout->p_sys->i_spi_lowpowertimeout, NULL, 0);
}
if( 0 != p_vout->p_sys->i_spi_powerofftimeout ) {
SystemParametersInfo(SPI_SETPOWEROFFTIMEOUT,
p_vout->p_sys->i_spi_powerofftimeout, NULL, 0);
}
if( 0 != p_vout->p_sys->i_spi_screensavetimeout ) {
SystemParametersInfo(SPI_SETSCREENSAVETIMEOUT,
p_vout->p_sys->i_spi_screensavetimeout, NULL, 0);
}
}
int CreateEventThread( vout_thread_t *p_vout )
{
/* Create the Vout EventThread, this thread is created by us to isolate
* the Win32 PeekMessage function calls. We want to do this because
* Windows can stay blocked inside this call for a long time, and when
* this happens it thus blocks vlc's video_output thread.
* Vout EventThread will take care of the creation of the video
* window (because PeekMessage has to be called from the same thread which
* created the window). */
msg_Dbg( p_vout, "creating Vout EventThread" );
p_vout->p_sys->p_event =
vlc_object_create( p_vout, sizeof(event_thread_t) );
p_vout->p_sys->p_event->p_vout = p_vout;
p_vout->p_sys->p_event->window_ready = CreateEvent( NULL, TRUE, FALSE, NULL );
if( vlc_thread_create( p_vout->p_sys->p_event, "Vout Events Thread",
EventThread, 0 ) )
{
msg_Err( p_vout, "cannot create Vout EventThread" );
CloseHandle( p_vout->p_sys->p_event->window_ready );
vlc_object_release( p_vout->p_sys->p_event );
p_vout->p_sys->p_event = NULL;
return 0;
}
WaitForSingleObject( p_vout->p_sys->p_event->window_ready, INFINITE );
CloseHandle( p_vout->p_sys->p_event->window_ready );
if( p_vout->p_sys->p_event->b_error )
{
msg_Err( p_vout, "Vout EventThread failed" );
return 0;
}
vlc_object_attach( p_vout->p_sys->p_event, p_vout );
msg_Dbg( p_vout, "Vout EventThread running" );
return 1;
}
void StopEventThread( vout_thread_t *p_vout )
{
if( p_vout->b_fullscreen )
{
msg_Dbg( p_vout, "Quitting fullscreen" );
Win32ToggleFullscreen( p_vout );
/* Force fullscreen in the core for the next video */
var_SetBool( p_vout, "fullscreen", true );
}
if( p_vout->p_sys->p_event )
{
vlc_object_detach( p_vout->p_sys->p_event );
/* Kill Vout EventThread */
vlc_object_kill( p_vout->p_sys->p_event );
/* we need to be sure Vout EventThread won't stay stuck in
* GetMessage, so we send a fake message */
if( p_vout->p_sys->hwnd )
{
PostMessage( p_vout->p_sys->hwnd, WM_NULL, 0, 0);
}
vlc_thread_join( p_vout->p_sys->p_event );
vlc_object_release( p_vout->p_sys->p_event );
}
vlc_mutex_destroy( &p_vout->p_sys->lock );
}
...@@ -121,49 +121,19 @@ static int OpenVideo( vlc_object_t *p_this ) ...@@ -121,49 +121,19 @@ static int OpenVideo( vlc_object_t *p_this )
p_vout->p_sys->i_window_width = p_vout->i_window_width; p_vout->p_sys->i_window_width = p_vout->i_window_width;
p_vout->p_sys->i_window_height = p_vout->i_window_height; p_vout->p_sys->i_window_height = p_vout->i_window_height;
/* Create the Vout EventThread, this thread is created by us to isolate if ( CreateEventThread( p_vout ) )
* the Win32 PeekMessage function calls. We want to do this because
* Windows can stay blocked inside this call for a long time, and when
* this happens it thus blocks vlc's video_output thread.
* Vout EventThread will take care of the creation of the video
* window (because PeekMessage has to be called from the same thread which
* created the window). */
msg_Dbg( p_vout, "creating Vout EventThread" );
p_vout->p_sys->p_event =
vlc_object_create( p_vout, sizeof(event_thread_t) );
p_vout->p_sys->p_event->p_vout = p_vout;
p_vout->p_sys->p_event->window_ready = CreateEvent( NULL, TRUE, FALSE, NULL );
if( vlc_thread_create( p_vout->p_sys->p_event, "Vout Events Thread",
EventThread, 0 ) )
{ {
msg_Err( p_vout, "cannot create Vout EventThread" );
CloseHandle( p_vout->p_sys->p_event->window_ready );
vlc_object_release( p_vout->p_sys->p_event );
p_vout->p_sys->p_event = NULL;
goto error;
}
WaitForSingleObject( p_vout->p_sys->p_event->window_ready, INFINITE );
CloseHandle( p_vout->p_sys->p_event->window_ready );
if( p_vout->p_sys->p_event->b_error )
{
msg_Err( p_vout, "Vout EventThread failed" );
goto error;
}
vlc_object_attach( p_vout->p_sys->p_event, p_vout );
msg_Dbg( p_vout, "Vout EventThread running" );
/* Variable to indicate if the window should be on top of others */ /* Variable to indicate if the window should be on top of others */
/* Trigger a callback right now */ /* Trigger a callback right now */
var_TriggerCallback( p_vout, "video-on-top" ); var_TriggerCallback( p_vout, "video-on-top" );
return VLC_SUCCESS; return VLC_SUCCESS;
}
error: else
{
CloseVideo( VLC_OBJECT(p_vout) ); CloseVideo( VLC_OBJECT(p_vout) );
return VLC_EGENERIC; return VLC_EGENERIC;
}
} }
/***************************************************************************** /*****************************************************************************
...@@ -221,33 +191,7 @@ static void CloseVideo( vlc_object_t *p_this ) ...@@ -221,33 +191,7 @@ static void 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( p_vout->b_fullscreen ) StopEventThread( p_vout );
{
msg_Dbg( p_vout, "Quitting fullscreen" );
Win32ToggleFullscreen( p_vout );
/* Force fullscreen in the core for the next video */
var_SetBool( p_vout, "fullscreen", true );
}
if( p_vout->p_sys->p_event )
{
vlc_object_detach( p_vout->p_sys->p_event );
/* Kill Vout EventThread */
vlc_object_kill( p_vout->p_sys->p_event );
/* we need to be sure Vout EventThread won't stay stuck in
* GetMessage, so we send a fake message */
if( p_vout->p_sys->hwnd )
{
PostMessage( p_vout->p_sys->hwnd, WM_NULL, 0, 0);
}
vlc_thread_join( p_vout->p_sys->p_event );
vlc_object_release( p_vout->p_sys->p_event );
}
vlc_mutex_destroy( &p_vout->p_sys->lock );
free( p_vout->p_sys ); free( p_vout->p_sys );
p_vout->p_sys = NULL; p_vout->p_sys = NULL;
......
...@@ -256,6 +256,10 @@ int DirectDrawUpdateOverlay( vout_thread_t *p_vout ); ...@@ -256,6 +256,10 @@ int DirectDrawUpdateOverlay( vout_thread_t *p_vout );
void* EventThread ( vlc_object_t *p_this ); void* EventThread ( vlc_object_t *p_this );
void UpdateRects ( vout_thread_t *p_vout, bool b_force ); void UpdateRects ( vout_thread_t *p_vout, bool b_force );
void Win32ToggleFullscreen ( vout_thread_t *p_vout ); void Win32ToggleFullscreen ( vout_thread_t *p_vout );
void DisableScreensaver ( vout_thread_t *p_vout );
void RestoreScreensaver ( vout_thread_t *p_vout );
int CreateEventThread( vout_thread_t *p_vout );
void StopEventThread ( vout_thread_t *p_vout );
/***************************************************************************** /*****************************************************************************
* Constants * Constants
......
...@@ -231,73 +231,23 @@ static int OpenVideo ( vlc_object_t *p_this ) ...@@ -231,73 +231,23 @@ static int OpenVideo ( vlc_object_t *p_this )
p_vout->p_sys->i_window_width = p_vout->i_window_width; p_vout->p_sys->i_window_width = p_vout->i_window_width;
p_vout->p_sys->i_window_height = p_vout->i_window_height; p_vout->p_sys->i_window_height = p_vout->i_window_height;
/* Create the EventThread, this thread is created by us to isolate if ( CreateEventThread( p_vout ) )
* the Win32 PeekMessage function calls. We want to do this because
* Windows can stay blocked inside this call for a long time, and when
* this happens it thus blocks vlc's video_output thread.
* Vout EventThread will take care of the creation of the video
* window (because PeekMessage has to be called from the same thread which
* created the window). */
msg_Dbg( p_vout, "creating Vout EventThread" );
p_vout->p_sys->p_event =
vlc_object_create( p_vout, sizeof(event_thread_t) );
p_vout->p_sys->p_event->p_vout = p_vout;
p_vout->p_sys->p_event->window_ready = CreateEvent( NULL, TRUE, FALSE, NULL );
if( vlc_thread_create( p_vout->p_sys->p_event, "Vout Events Thread",
EventThread, 0 ) )
{ {
msg_Err( p_vout, "cannot create Vout EventThread" );
CloseHandle( p_vout->p_sys->p_event->window_ready );
vlc_object_release( p_vout->p_sys->p_event );
p_vout->p_sys->p_event = NULL;
goto error;
}
WaitForSingleObject( p_vout->p_sys->p_event->window_ready, INFINITE );
CloseHandle( p_vout->p_sys->p_event->window_ready );
if( p_vout->p_sys->p_event->b_error )
{
msg_Err( p_vout, "Vout EventThread failed" );
goto error;
}
vlc_object_attach( p_vout->p_sys->p_event, p_vout );
msg_Dbg( p_vout, "Vout EventThread running" );
#ifndef UNDER_CE #ifndef UNDER_CE
/* Variable to indicate if the window should be on top of others */ /* Variable to indicate if the window should be on top of others */
/* Trigger a callback right now */ /* Trigger a callback right now */
var_TriggerCallback( p_vout, "video-on-top" ); var_TriggerCallback( p_vout, "video-on-top" );
/* disable screensaver by temporarily changing system settings */ DisableScreensaver ( p_vout );
p_vout->p_sys->i_spi_lowpowertimeout = 0;
p_vout->p_sys->i_spi_powerofftimeout = 0;
p_vout->p_sys->i_spi_screensavetimeout = 0;
if( var_GetBool( p_vout, "disable-screensaver" ) ) {
msg_Dbg(p_vout, "disabling screen saver");
SystemParametersInfo(SPI_GETLOWPOWERTIMEOUT,
0, &(p_vout->p_sys->i_spi_lowpowertimeout), 0);
if( 0 != p_vout->p_sys->i_spi_lowpowertimeout ) {
SystemParametersInfo(SPI_SETLOWPOWERTIMEOUT, 0, NULL, 0);
}
SystemParametersInfo(SPI_GETPOWEROFFTIMEOUT, 0,
&(p_vout->p_sys->i_spi_powerofftimeout), 0);
if( 0 != p_vout->p_sys->i_spi_powerofftimeout ) {
SystemParametersInfo(SPI_SETPOWEROFFTIMEOUT, 0, NULL, 0);
}
SystemParametersInfo(SPI_GETSCREENSAVETIMEOUT, 0,
&(p_vout->p_sys->i_spi_screensavetimeout), 0);
if( 0 != p_vout->p_sys->i_spi_screensavetimeout ) {
SystemParametersInfo(SPI_SETSCREENSAVETIMEOUT, 0, NULL, 0);
}
}
#endif #endif
return VLC_SUCCESS; return VLC_SUCCESS;
}
error: else
{
CloseVideo( VLC_OBJECT(p_vout) ); CloseVideo( VLC_OBJECT(p_vout) );
return VLC_EGENERIC; return VLC_EGENERIC;
}
} }
/***************************************************************************** /*****************************************************************************
...@@ -307,47 +257,10 @@ static void CloseVideo ( vlc_object_t *p_this ) ...@@ -307,47 +257,10 @@ static void 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( p_vout->b_fullscreen ) StopEventThread( p_vout );
{
msg_Dbg( p_vout, "Quitting fullscreen" );
Win32ToggleFullscreen( p_vout );
/* Force fullscreen in the core for the next video */
var_SetBool( p_vout, "fullscreen", true );
}
if( p_vout->p_sys->p_event )
{
vlc_object_detach( p_vout->p_sys->p_event );
/* Kill Vout EventThread */
vlc_object_kill( p_vout->p_sys->p_event );
/* we need to be sure Vout EventThread won't stay stuck in
* GetMessage, so we send a fake message */
if( p_vout->p_sys->hwnd )
{
PostMessage( p_vout->p_sys->hwnd, WM_NULL, 0, 0);
}
vlc_thread_join( p_vout->p_sys->p_event );
vlc_object_release( p_vout->p_sys->p_event );
}
vlc_mutex_destroy( &p_vout->p_sys->lock );
#ifndef UNDER_CE #ifndef UNDER_CE
/* restore screensaver system settings */ RestoreScreensaver( p_vout );
if( 0 != p_vout->p_sys->i_spi_lowpowertimeout ) {
SystemParametersInfo(SPI_SETLOWPOWERTIMEOUT,
p_vout->p_sys->i_spi_lowpowertimeout, NULL, 0);
}
if( 0 != p_vout->p_sys->i_spi_powerofftimeout ) {
SystemParametersInfo(SPI_SETPOWEROFFTIMEOUT,
p_vout->p_sys->i_spi_powerofftimeout, NULL, 0);
}
if( 0 != p_vout->p_sys->i_spi_screensavetimeout ) {
SystemParametersInfo(SPI_SETSCREENSAVETIMEOUT,
p_vout->p_sys->i_spi_screensavetimeout, NULL, 0);
}
#endif #endif
#ifdef MODULE_NAME_IS_wingapi #ifdef MODULE_NAME_IS_wingapi
......
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