X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Fmisc%2Fscreensaver.c;h=782333070579c3580f586f2040fe25baae510777;hb=5d313c65e44d8963262fdbc5d5d52f5169f3f787;hp=28b6196a4b63875e7cf24fe94f207aaa36a7f395;hpb=4c7f87a7abd8efa1e374187e6037bdb7a8dae246;p=vlc diff --git a/modules/misc/screensaver.c b/modules/misc/screensaver.c index 28b6196a4b..7823330705 100644 --- a/modules/misc/screensaver.c +++ b/modules/misc/screensaver.c @@ -25,16 +25,28 @@ /***************************************************************************** * Preamble *****************************************************************************/ -#include -#include -#include -#include -#include +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#ifdef HAVE_SIGNAL_H +# include +#endif #ifdef HAVE_DBUS -#define DBUS_API_SUBJECT_TO_CHANGE #include #define GS_SERVICE "org.gnome.ScreenSaver" @@ -43,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 *****************************************************************************/ @@ -64,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 @@ -78,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(); @@ -110,21 +117,46 @@ static void Deactivate( vlc_object_t *p_this ) if( p_intf->p_sys->p_connection ) { -# ifdef HAVE_DBUS_2 - dbus_connection_close( p_intf->p_sys->p_connection ); -# else - dbus_connection_disconnect( p_intf->p_sys->p_connection ); -# endif + dbus_connection_unref( p_intf->p_sys->p_connection ); } - 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 *const *ppsz_args ) +{ + 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 */ + 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( EXIT_FAILURE ); + } + case -1: /* we're the error */ + 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 &" */ + while( waitpid( pid, NULL, 0 ) != pid); + break; + } +} /***************************************************************************** * Run: main thread @@ -134,42 +166,57 @@ static void Deactivate( vlc_object_t *p_this ) *****************************************************************************/ static void Run( intf_thread_t *p_intf ) { - int i_lastcall = 0; + mtime_t deadline = mdate(); + vlc_object_lock( p_intf ); #ifdef HAVE_DBUS p_intf->p_sys->p_connection = dbus_init( p_intf ); #endif - while( !p_intf->b_die ) + while( vlc_object_alive( p_intf ) ) { - msleep( INTF_IDLE_SLEEP*5 ); // 250ms + vlc_object_t *p_vout; - /* Check screensaver every 30 seconds */ - if( ++i_lastcall > 300 ) - { - vlc_object_t *p_vout; - p_vout = vlc_object_find( p_intf, VLC_OBJECT_VOUT, FIND_ANYWHERE ); - /* If there is a video output, disable xscreensaver */ - if( p_vout ) - { - vlc_object_release( p_vout ); + if( vlc_object_timedwait( p_intf, deadline ) == 0 ) + continue; - /* http://www.jwz.org/xscreensaver/faq.html#dvd */ - system( "xscreensaver-command -deactivate >&- 2>&- &" ); + p_vout = vlc_object_find( p_intf, VLC_OBJECT_VOUT, FIND_ANYWHERE ); -/* If we have dbug support, let's communicate directly with gnome-screensaver - else, run gnome-screensaver-command */ + /* If there is a video output, disable xscreensaver */ + if( p_vout ) + { + input_thread_t *p_input; + p_input = vlc_object_find( p_vout, VLC_OBJECT_INPUT, FIND_PARENT ); + vlc_object_release( p_vout ); + if( p_input ) + { + if( PLAYING_S == p_input->i_state ) + { + /* http://www.jwz.org/xscreensaver/faq.html#dvd */ + const char *const ppsz_xsargs[] = { "/bin/sh", "-c", + "xscreensaver-command -deactivate &", (char*)NULL }; + Execute( p_intf, ppsz_xsargs ); + + /* If we have dbus support, let's communicate directly + with gnome-screensave else, run + gnome-screensaver-command */ #ifdef HAVE_DBUS - poke_screensaver( p_intf, p_intf->p_sys->p_connection ); + poke_screensaver( p_intf, p_intf->p_sys->p_connection ); #else - system( "gnome-screensaver-command --poke >&- 2>&- &" ); + const char *const ppsz_gsargs[] = { "/bin/sh", "-c", + "gnome-screensaver-command --poke &", (char*)NULL }; + Execute( p_intf, ppsz_gsargs ); #endif - /* FIXME: add support for other screensavers */ + /* FIXME: add support for other screensavers */ + } + vlc_object_release( p_input ); } - - i_lastcall = 0; } + + /* Check screensaver every 30 seconds */ + deadline = mdate() + 30000000; } + vlc_object_unlock( p_intf ); } #ifdef HAVE_DBUS @@ -200,7 +247,10 @@ static void poke_screensaver( intf_thread_t *p_intf, # ifdef SCREENSAVER_DEBUG msg_Dbg( p_intf, "found a running gnome-screensaver instance" ); # endif + /* gnome-screensaver changed it's D-Bus interface, so we need both */ screensaver_send_message_void( p_intf, p_connection, "Poke" ); + screensaver_send_message_void( p_intf, p_connection, + "SimulateUserActivity" ); } # ifdef SCREENSAVER_DEBUG else @@ -236,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 );