[MPlayer-dev-eng] [PATCH] Add support for GNOME screensaver

Reynaldo H. Verdejo Pinochet reynaldo at opendot.cl
Thu Apr 27 01:16:53 CEST 2006


On Wed, Apr 26, 2006 at 04:31:04PM +0200, Piotr Kaczuba wrote:
> On Wed, Apr 26, 2006 at 04:08:32PM +0200, Attila Kinali wrote:
> > On Wed, 26 Apr 2006 15:50:17 +0200
> > Piotr Kaczuba <pepe at attika.ath.cx> wrote:
> > 
> > > +#ifdef HAVE_DBUS_GLIB
> > > +        gnome_screensaver_enable();
> > > +#endif
> > > +    }
> > >      if (kdescreensaver_was_running && stop_xscreensaver)
> > >      {
> > >          system
> > > @@ -1738,8 +1746,12 @@
> > >                              allow_exp);
> > >      }
> > >      // turning off screensaver
> > > -    if (stop_xscreensaver)
> > > +    if (stop_xscreensaver) {
> > >          xscreensaver_disable(mDisplay);
> > > +#ifdef HAVE_DBUS_GLIB
> > > +        gnome_screensaver_disable();
> > > +#endif
> > > +    }
> > 
> > Shouldn't you check whether the screensaver is actualy running
> > before disabling it, to prevent enabling it when it wasnt
> > enabled?
> > 
> > And how does your patch behave, when gnome is installed, but
> > not running ?
> 
> Actually, I'm sending an InhibitActivation message to the screensaver,
> it's not a real disable. So, when it's not enabled, InhibitActivation
> doesn't do anything. Similarly, AllowActivation is sent when stopping
> playing: it won't enable/start the screensaver when it isn't running.
> See the last question at
> http://live.gnome.org/GnomeScreensaver/FrequentlyAskedQuestions, which
> gives some examples of how to do it.
> 
> Attached there is the proper patch, as the previous one has two files
> missing.

> diff -uNr main/Makefile main.new/Makefile
> --- main/Makefile	2006-04-25 04:01:21.000000000 +0200
> +++ main.new/Makefile	2006-04-26 14:44:57.303825307 +0200
> @@ -74,6 +74,7 @@
>            $(DIRECTFB_LIB) \
>            $(CACA_LIB) \
>  	  $(VESA_LIB) \
> +	  $(DBUS_GLIB_LIB) \
>  
>  ifeq ($(EXTERNAL_VIDIX),yes)
>  VO_LIBS += $(EXTERNAL_VIDIX_LIB)
> @@ -307,7 +308,7 @@
>  	$(MAKE) -C libmpeg2
>  
>  libvo/libvo.a:
> -	$(MAKE) -C libvo
> +	$(MAKE) -C libvo all
>  
>  libao2/libao2.a:
>  	$(MAKE) -C libao2
> diff -uNr main/configure main.new/configure
> --- main/configure	2006-04-26 03:59:05.000000000 +0200
> +++ main.new/configure	2006-04-26 14:40:07.527783461 +0200
> @@ -6815,6 +6815,23 @@
>  fi
>  echores "$_gethostbyname2"
>  
> +# Check for D-BUS GLib interface
> +echocheck "D-BUS GLib interface"
> +if pkg-config --exists dbus-glib-1; then
> +  _dbus_glib=yes
> +  _inc_dbus_glib=`pkg-config --cflags dbus-glib-1 2>/dev/null`
> +  _ld_dbus_glib=`pkg-config --libs dbus-glib-1 2>/dev/null`
> +  _def_dbus_glib='#define HAVE_DBUS_GLIB 1'
> +else
> +  _dbus_glib=no
> +  _def_dbus_glib='#undef HAVE_DBUS_GLIB'
> +fi
> +echores "$_dbus_glib"
> +
> +if test "$_x11" = yes -a "$_dbus_glib" = yes; then
> +  _vosrc="$_vosrc gnome_screensaver.c"
> +fi
> +
>  # --------------- GUI specific tests begin -------------------
>  echocheck "GUI"
>  echo "$_gui"
> @@ -7290,6 +7307,8 @@
>  AA_LIB = $_ld_aa
>  CACA_INC = $_inc_caca
>  CACA_LIB = $_ld_caca
> +DBUS_GLIB_INC = $_inc_dbus_glib
> +DBUS_GLIB_LIB = $_ld_dbus_glib
>  
>  # audio output
>  ALSA_LIB = $_ld_alsa
> @@ -8116,6 +8135,14 @@
>  OPTIONAL_OBJS = $_voobj
>  EOF
>  
> +if test "$_x11" = yes -a "$_dbus_glib" = yes; then
> +  cat >> libvo/config.mak << EOF
> +
> +gnome_screensaver.o: gnome_screensaver.c
> +	\$(CC) -c \$(CFLAGS) \$(DBUS_GLIB_INC) -o \$@ $<
> +EOF
> +fi
> +
>  #############################################################################
>  
>  echo "Creating libao2/config.mak"
> diff -uNr main/libvo/gnome_screensaver.c main.new/libvo/gnome_screensaver.c
> --- main/libvo/gnome_screensaver.c	1970-01-01 01:00:00.000000000 +0100
> +++ main.new/libvo/gnome_screensaver.c	2006-04-26 13:39:18.290095378 +0200
> @@ -0,0 +1,98 @@
> +#include <stdlib.h>
> +#include <unistd.h>
> +#include <dbus/dbus-glib.h>
> +
> +#include "gnome_screensaver.h"
> +
> +#define GS_SERVICE   "org.gnome.ScreenSaver"
> +#define GS_PATH      "/org/gnome/ScreenSaver"
> +#define GS_INTERFACE "org.gnome.ScreenSaver"
> +
> +void gnome_screensaver_enable()
> +{
> +    DBusGConnection *connection;
> +    GError *error;
> +    DBusGProxy *proxy;
> +
> +    g_type_init();
> +
> +    error = NULL;
> +    connection = dbus_g_bus_get(DBUS_BUS_SESSION, &error);
> +    if (connection == NULL) {
> +        g_printerr("Failed to open connection to bus: %s\n",

see bellow

> +                   error->message);
> +        g_error_free(error);
> +        return;
> +    }
> +
> +    /* Create a proxy object */
> +
> +    proxy = dbus_g_proxy_new_for_name(connection,
> +                                      GS_SERVICE, GS_PATH, GS_INTERFACE);
> +
> +    /* Call method, wait for reply */
> +    error = NULL;
> +    if (!dbus_g_proxy_call
> +        (proxy, "AllowActivation", &error, G_TYPE_INVALID,
> +         G_TYPE_INVALID)) {
> +        /* Just do demonstrate remote exceptions versus regular GError */
> +        if (error->domain == DBUS_GERROR
> +            && error->code == DBUS_GERROR_REMOTE_EXCEPTION)
> +            g_printerr("Caught remote method exception %s: %s",

see bellow

> +                       dbus_g_error_get_name(error), error->message);
> +        else
> +            g_printerr("Error: %s\n", error->message);

see bellow


> +
> +        g_error_free(error);
> +    }
> +    else {
> +        g_print("Gnome screensaver enabled\n");

see bellow

> +    }
> +
> +    g_object_unref(proxy);
> +}
> +
> +
> +void gnome_screensaver_disable()
> +{
> +    DBusGConnection *connection;
> +    GError *error;
> +    DBusGProxy *proxy;
> +
> +    g_type_init();
> +
> +    error = NULL;
> +    connection = dbus_g_bus_get(DBUS_BUS_SESSION, &error);
> +    if (connection == NULL) {
> +        g_printerr("Failed to open connection to bus: %s\n",

see bellow

> +                   error->message);
> +        g_error_free(error);
> +        return;
> +    }
> +
> +    /* Create a proxy object */
> +
> +    proxy = dbus_g_proxy_new_for_name(connection,
> +                                      GS_SERVICE, GS_PATH, GS_INTERFACE);
> +
> +    /* Call method, wait for reply */
> +    error = NULL;
> +    if (!dbus_g_proxy_call
> +        (proxy, "InhibitActivation", &error, G_TYPE_STRING,
> +         "Playing a movie", G_TYPE_INVALID, G_TYPE_INVALID)) {
> +        /* Just do demonstrate remote exceptions versus regular GError */
> +        if (error->domain == DBUS_GERROR
> +            && error->code == DBUS_GERROR_REMOTE_EXCEPTION)
> +            g_printerr("Caught remote method exception %s: %s",

see bellow

> +                       dbus_g_error_get_name(error), error->message);
> +        else
> +            g_printerr("Error: %s\n", error->message);

see bellow

> +
> +        g_error_free(error);
> +    }
> +    else {
> +        g_print("Gnome screensaver disabled\n");

see bellow

or you hack your way around some kind of g_set_print_handler call
or you replace g_printerr/g_print ocurrences with our messaging
routines, this is a big patch stoper.

Best regards

	Reynaldo
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 189 bytes
Desc: Digital signature
URL: <http://lists.mplayerhq.hu/pipermail/mplayer-dev-eng/attachments/20060426/8a7ae55f/attachment.pgp>


More information about the MPlayer-dev-eng mailing list