From: Geoffroy Couprie Date: Thu, 21 May 2009 15:08:54 +0000 (+0200) Subject: win32 vout: factorize code X-Git-Tag: 1.1.0-ff~5840 X-Git-Url: https://git.sesse.net/?a=commitdiff_plain;h=0f2826187da505da4c207e2eada88da53c455d41;p=vlc win32 vout: factorize code --- diff --git a/modules/video_output/msw/direct3d.c b/modules/video_output/msw/direct3d.c index 7d385468c2..85d2f16667 100644 --- a/modules/video_output/msw/direct3d.c +++ b/modules/video_output/msw/direct3d.c @@ -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_height = p_vout->i_window_height; - /* 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 ) ) + if ( CreateEventThread( p_vout ) ) { - 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; - } + /* Variable to indicate if the window should be on top of others */ + /* Trigger a callback right now */ + var_TriggerCallback( p_vout, "video-on-top" ); - vlc_object_attach( p_vout->p_sys->p_event, p_vout ); + DisableScreensaver ( p_vout ); - msg_Dbg( p_vout, "Vout EventThread running" ); - - /* Variable to indicate if the window should be on top of others */ - /* Trigger a callback right now */ - var_TriggerCallback( p_vout, "video-on-top" ); - - /* 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); - } + return VLC_SUCCESS; + } + else + { + CloseVideo( VLC_OBJECT(p_vout) ); + return VLC_EGENERIC; } - return VLC_SUCCESS; - -error: - CloseVideo( VLC_OBJECT(p_vout) ); - return VLC_EGENERIC; } /***************************************************************************** @@ -280,47 +230,9 @@ static void CloseVideo( vlc_object_t *p_this ) Direct3DVoutRelease( 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 ); + StopEventThread( p_vout ); - /* 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 ); - - /* 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); - } + RestoreScreensaver( p_vout ); free( p_vout->p_sys ); p_vout->p_sys = NULL; diff --git a/modules/video_output/msw/directx.c b/modules/video_output/msw/directx.c index 5844a6f53c..9494de9178 100644 --- a/modules/video_output/msw/directx.c +++ b/modules/video_output/msw/directx.c @@ -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_height = p_vout->i_window_height; - /* 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. - * 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; + if ( !CreateEventThread( p_vout ) ) 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 */ if( DirectXInitDDraw( p_vout ) ) @@ -326,28 +295,7 @@ static int OpenVideo( vlc_object_t *p_this ) var_AddCallback( p_vout, "directx-wallpaper", WallpaperCallback, NULL ); var_TriggerCallback( p_vout, "directx-wallpaper" ); - /* 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); - } - } + DisableScreensaver ( p_vout ); return VLC_SUCCESS; @@ -482,50 +430,12 @@ static void CloseVideo( vlc_object_t *p_this ) { vout_thread_t * p_vout = (vout_thread_t *)p_this; - 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 ); + StopEventThread( p_vout ); /* Make sure the wallpaper is restored */ SwitchWallpaperMode( p_vout, false ); - /* 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); - } + RestoreScreensaver( p_vout ); free( p_vout->p_sys ); p_vout->p_sys = NULL; diff --git a/modules/video_output/msw/events.c b/modules/video_output/msw/events.c index a35bdee45c..9dac1f4326 100644 --- a/modules/video_output/msw/events.c +++ b/modules/video_output/msw/events.c @@ -1211,3 +1211,116 @@ void Win32ToggleFullscreen( vout_thread_t *p_vout ) /* Update the object variable and trigger callback */ 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 ); +} diff --git a/modules/video_output/msw/glwin32.c b/modules/video_output/msw/glwin32.c index 4f1d81e7a9..38a7b19b20 100644 --- a/modules/video_output/msw/glwin32.c +++ b/modules/video_output/msw/glwin32.c @@ -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_height = p_vout->i_window_height; - /* 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 ) ) + if ( CreateEventThread( p_vout ) ) { - 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 ); + /* Variable to indicate if the window should be on top of others */ + /* Trigger a callback right now */ + var_TriggerCallback( p_vout, "video-on-top" ); - if( p_vout->p_sys->p_event->b_error ) + return VLC_SUCCESS; + } + else { - msg_Err( p_vout, "Vout EventThread failed" ); - goto error; + CloseVideo( VLC_OBJECT(p_vout) ); + return VLC_EGENERIC; } - - 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 */ - /* Trigger a callback right now */ - var_TriggerCallback( p_vout, "video-on-top" ); - - return VLC_SUCCESS; - - error: - CloseVideo( VLC_OBJECT(p_vout) ); - return VLC_EGENERIC; } /***************************************************************************** @@ -221,33 +191,7 @@ static void CloseVideo( vlc_object_t *p_this ) { vout_thread_t * p_vout = (vout_thread_t *)p_this; - 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 ); + StopEventThread( p_vout ); free( p_vout->p_sys ); p_vout->p_sys = NULL; diff --git a/modules/video_output/msw/vout.h b/modules/video_output/msw/vout.h index b2b1f82bf9..9fbca15002 100644 --- a/modules/video_output/msw/vout.h +++ b/modules/video_output/msw/vout.h @@ -256,6 +256,10 @@ int DirectDrawUpdateOverlay( vout_thread_t *p_vout ); void* EventThread ( vlc_object_t *p_this ); void UpdateRects ( vout_thread_t *p_vout, bool b_force ); 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 diff --git a/modules/video_output/msw/wingdi.c b/modules/video_output/msw/wingdi.c index 706aded172..5db738e522 100644 --- a/modules/video_output/msw/wingdi.c +++ b/modules/video_output/msw/wingdi.c @@ -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_height = p_vout->i_window_height; - /* Create the 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 ) ) + if ( CreateEventThread( p_vout ) ) { - 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 - /* Variable to indicate if the window should be on top of others */ - /* Trigger a callback right now */ - var_TriggerCallback( p_vout, "video-on-top" ); - - /* 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); - } - } -#endif - return VLC_SUCCESS; + /* Variable to indicate if the window should be on top of others */ + /* Trigger a callback right now */ + var_TriggerCallback( p_vout, "video-on-top" ); -error: - CloseVideo( VLC_OBJECT(p_vout) ); - return VLC_EGENERIC; + DisableScreensaver ( p_vout ); +#endif + return VLC_SUCCESS; + } + else + { + CloseVideo( VLC_OBJECT(p_vout) ); + return VLC_EGENERIC; + } } /***************************************************************************** @@ -307,47 +257,10 @@ static void CloseVideo ( vlc_object_t *p_this ) { vout_thread_t * p_vout = (vout_thread_t *)p_this; - 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 ); + StopEventThread( p_vout ); #ifndef UNDER_CE - /* 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); - } + RestoreScreensaver( p_vout ); #endif #ifdef MODULE_NAME_IS_wingapi