X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Fmisc%2Fscreensaver.c;h=782333070579c3580f586f2040fe25baae510777;hb=62dd14548820fb0966e6b90d586183f74a427e4b;hp=f1d51a8e2deaa9b475a79998ad910e51b19022ea;hpb=f3f44132e01c95cd764c51904f08a0beaeae0700;p=vlc diff --git a/modules/misc/screensaver.c b/modules/misc/screensaver.c index f1d51a8e2d..7823330705 100644 --- a/modules/misc/screensaver.c +++ b/modules/misc/screensaver.c @@ -26,7 +26,12 @@ * Preamble *****************************************************************************/ -#include +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include +#include #include #include #include @@ -36,9 +41,12 @@ #include #include +#ifdef HAVE_SIGNAL_H +# include +#endif + #ifdef HAVE_DBUS -#define DBUS_API_SUBJECT_TO_CHANGE #include #define GS_SERVICE "org.gnome.ScreenSaver" @@ -47,11 +55,6 @@ #endif -/* this is for dbus < 0.3 */ -#ifndef HAVE_DBUS_1 -#define dbus_bus_name_has_owner(connection, name, err) dbus_bus_service_exists(connection, name, err) -#endif - /***************************************************************************** * Local prototypes *****************************************************************************/ @@ -68,7 +71,7 @@ static void poke_screensaver( intf_thread_t *p_intf, static void screensaver_send_message_void ( intf_thread_t *p_intf, DBusConnection *p_connection, const char *psz_name ); -static vlc_bool_t screensaver_is_running( DBusConnection *p_connection ); +static bool screensaver_is_running( DBusConnection *p_connection ); struct intf_sys_t @@ -82,7 +85,7 @@ struct intf_sys_t * Module descriptor *****************************************************************************/ vlc_module_begin(); - set_description( _("X Screensaver disabler") ); + set_description( N_("X Screensaver disabler") ); set_capability( "interface", 0 ); set_callbacks( Activate, Deactivate ); vlc_module_end(); @@ -114,45 +117,43 @@ static void Deactivate( vlc_object_t *p_this ) if( p_intf->p_sys->p_connection ) { -# ifdef HAVE_DBUS_2 dbus_connection_unref( p_intf->p_sys->p_connection ); -# else - dbus_connection_disconnect( p_intf->p_sys->p_connection ); -# endif } - if( p_intf->p_sys ) - { - free( p_intf->p_sys ); - p_intf->p_sys = NULL; - } + free( p_intf->p_sys ); + p_intf->p_sys = NULL; #endif } /***************************************************************************** * Execute: Spawns a process using execv() *****************************************************************************/ -static void Execute( intf_thread_t *p_this, const char *psz_path, - const char *const *ppsz_args ) +static void Execute( intf_thread_t *p_this, const char *const *ppsz_args ) { - pid_t pid; - switch( pid = fork() ) + pid_t pid = fork(); + switch( pid ) { case 0: /* we're the child */ + { + sigset_t set; + sigemptyset (&set); + pthread_sigmask (SIG_SETMASK, &set, NULL); + /* We don't want output */ - fclose( stdout ); - fclose( stderr ); - execv( psz_path, (char *const *)ppsz_args ); + if( ( freopen( "/dev/null", "w", stdout ) != NULL ) + && ( freopen( "/dev/null", "w", stderr ) != NULL ) ) + execv( ppsz_args[0] , (char *const *)ppsz_args ); /* If the file we want to execute doesn't exist we exit() */ - exit( -1 ); - break; + exit( EXIT_FAILURE ); + } case -1: /* we're the error */ - msg_Dbg( p_this, "Couldn't fork() while launching %s", psz_path ); + msg_Dbg( p_this, "Couldn't fork() while launching %s", + ppsz_args[0] ); break; default: /* we're the parent */ /* Wait for the child to exit. * We will not deadlock because we ran "/bin/sh &" */ - waitpid( pid, NULL, 0 ); + while( waitpid( pid, NULL, 0 ) != pid); break; } } @@ -165,18 +166,19 @@ static void Execute( intf_thread_t *p_this, const char *psz_path, *****************************************************************************/ static void Run( intf_thread_t *p_intf ) { + mtime_t deadline = mdate(); + + vlc_object_lock( p_intf ); #ifdef HAVE_DBUS p_intf->p_sys->p_connection = dbus_init( p_intf ); #endif - vlc_object_lock( p_intf ); - for(;;) + while( vlc_object_alive( p_intf ) ) { vlc_object_t *p_vout; - /* Check screensaver every 30 seconds */ - if( vlc_object_timedwait( p_intf, mdate() + 30000000 ) < 0 ) - break; + if( vlc_object_timedwait( p_intf, deadline ) == 0 ) + continue; p_vout = vlc_object_find( p_intf, VLC_OBJECT_VOUT, FIND_ANYWHERE ); @@ -193,7 +195,7 @@ static void Run( intf_thread_t *p_intf ) /* http://www.jwz.org/xscreensaver/faq.html#dvd */ const char *const ppsz_xsargs[] = { "/bin/sh", "-c", "xscreensaver-command -deactivate &", (char*)NULL }; - Execute( p_intf, "/bin/sh", ppsz_xsargs ); + Execute( p_intf, ppsz_xsargs ); /* If we have dbus support, let's communicate directly with gnome-screensave else, run @@ -203,13 +205,16 @@ static void Run( intf_thread_t *p_intf ) #else const char *const ppsz_gsargs[] = { "/bin/sh", "-c", "gnome-screensaver-command --poke &", (char*)NULL }; - Execute( p_intf, "/bin/sh", ppsz_gsargs ); + Execute( p_intf, ppsz_gsargs ); #endif /* FIXME: add support for other screensavers */ } vlc_object_release( p_input ); } } + + /* Check screensaver every 30 seconds */ + deadline = mdate() + 30000000; } vlc_object_unlock( p_intf ); } @@ -281,12 +286,12 @@ static void screensaver_send_message_void ( intf_thread_t *p_intf, dbus_message_unref( p_message ); } -static vlc_bool_t screensaver_is_running( DBusConnection *p_connection ) +static bool screensaver_is_running( DBusConnection *p_connection ) { DBusError error; - vlc_bool_t b_return; + bool b_return; - if( !p_connection ) return VLC_FALSE; + if( !p_connection ) return false; dbus_error_init( &error ); b_return = dbus_bus_name_has_owner( p_connection, GS_SERVICE, &error );