diff -cprB parole/src/common/parole-screensaver.c parole-screensaver/src/common/parole-screensaver.c *** parole/src/common/parole-screensaver.c 2012-12-17 17:03:09.511606602 -0500 --- parole-screensaver/src/common/parole-screensaver.c 2012-12-17 17:06:28.324592459 -0500 *************** *** 37,47 **** #define PAROLE_SCREEN_SAVER_GET_PRIVATE(o) \ (G_TYPE_INSTANCE_GET_PRIVATE ((o), PAROLE_TYPE_SCREENSAVER, ParoleScreenSaverPrivate)) - struct ParoleScreenSaverPrivate - { - gulong reset_id; - }; - G_DEFINE_TYPE (ParoleScreenSaver, parole_screen_saver, G_TYPE_OBJECT) --- 37,42 ---- *************** parole_screen_saver_finalize (GObject *o *** 51,58 **** ParoleScreenSaver *saver; saver = PAROLE_SCREEN_SAVER (object); ! ! parole_screen_saver_uninhibit (saver); G_OBJECT_CLASS (parole_screen_saver_parent_class)->finalize (object); } --- 46,54 ---- ParoleScreenSaver *saver; saver = PAROLE_SCREEN_SAVER (object); ! ! //uninhibit here is no longer needed because the screensaver disabling method automatically re-enables when the window is closed. ! G_OBJECT_CLASS (parole_screen_saver_parent_class)->finalize (object); } *************** parole_screen_saver_class_init (ParoleSc *** 64,85 **** object_class->finalize = parole_screen_saver_finalize; - g_type_class_add_private (klass, sizeof (ParoleScreenSaverPrivate)); } static void parole_screen_saver_init (ParoleScreenSaver *saver) { ! saver->priv = PAROLE_SCREEN_SAVER_GET_PRIVATE (saver); ! ! saver->priv->reset_id = 0; ! } ! ! static gboolean ! parole_screen_saver_reset_timeout (gpointer data) ! { ! XResetScreenSaver (GDK_DISPLAY ()); ! return TRUE; } ParoleScreenSaver * --- 60,71 ---- object_class->finalize = parole_screen_saver_finalize; } static void parole_screen_saver_init (ParoleScreenSaver *saver) { ! return; } ParoleScreenSaver * *************** parole_screen_saver_new (void) *** 90,113 **** return saver; } ! void parole_screen_saver_inhibit (ParoleScreenSaver *saver) { g_return_if_fail (PAROLE_IS_SCREENSAVER (saver)); ! parole_screen_saver_uninhibit (saver); ! saver->priv->reset_id = g_timeout_add_seconds (RESET_SCREENSAVER_TIMEOUT, ! (GSourceFunc) parole_screen_saver_reset_timeout, ! NULL); } ! void parole_screen_saver_uninhibit (ParoleScreenSaver *saver) { g_return_if_fail (PAROLE_IS_SCREENSAVER (saver)); ! ! if ( saver->priv->reset_id != 0 ) ! { ! g_source_remove (saver->priv->reset_id); ! saver->priv->reset_id = 0; ! } } --- 76,99 ---- return saver; } ! void parole_screen_saver_inhibit (ParoleScreenSaver *saver, GtkWindow *window) { g_return_if_fail (PAROLE_IS_SCREENSAVER (saver)); ! char *buf = malloc(sizeof(char) * (26 + 12)); /* 26 because that's the length of the string, and I doubt window ids go above 12 chars. ! anyone know better than me on this? */ ! sprintf(buf, "xdg-screensaver suspend %d", GDK_WINDOW_XID(GDK_WINDOW(GTK_WIDGET(window)->window))); ! system(buf); ! free(buf); } ! void parole_screen_saver_uninhibit (ParoleScreenSaver *saver, GtkWindow *window) { g_return_if_fail (PAROLE_IS_SCREENSAVER (saver)); ! char *buf = malloc(sizeof(char) * (25 + 12)); /* 25 because that's the length of the string, and I doubt window ids go above 12 chars ! anyone know better than me on this? */ ! sprintf(buf, "xdg-screensaver resume %d", GDK_WINDOW_XID(GDK_WINDOW(GTK_WIDGET(window)->window))); ! system(buf); ! free(buf); } diff -cprB parole/src/common/parole-screensaver.h parole-screensaver/src/common/parole-screensaver.h *** parole/src/common/parole-screensaver.h 2012-12-17 17:03:09.511606602 -0500 --- parole-screensaver/src/common/parole-screensaver.h 2012-12-17 17:06:28.324592459 -0500 *************** *** 22,40 **** #define __PAROLE_SCREEN_SAVER_H #include ! G_BEGIN_DECLS #define PAROLE_TYPE_SCREENSAVER (parole_screen_saver_get_type () ) #define PAROLE_SCREEN_SAVER(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), PAROLE_TYPE_SCREENSAVER, ParoleScreenSaver)) #define PAROLE_IS_SCREENSAVER(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), PAROLE_TYPE_SCREENSAVER)) - typedef struct ParoleScreenSaverPrivate ParoleScreenSaverPrivate; - typedef struct { GObject parent; - ParoleScreenSaverPrivate *priv; } ParoleScreenSaver; --- 22,37 ---- #define __PAROLE_SCREEN_SAVER_H #include ! #include /* needed to get the window, needed for xdg-screensaver suspend */ G_BEGIN_DECLS #define PAROLE_TYPE_SCREENSAVER (parole_screen_saver_get_type () ) #define PAROLE_SCREEN_SAVER(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), PAROLE_TYPE_SCREENSAVER, ParoleScreenSaver)) #define PAROLE_IS_SCREENSAVER(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), PAROLE_TYPE_SCREENSAVER)) typedef struct { GObject parent; } ParoleScreenSaver; *************** typedef struct *** 47,55 **** GType parole_screen_saver_get_type (void) G_GNUC_CONST; ParoleScreenSaver *parole_screen_saver_new (void); ! void parole_screen_saver_inhibit (ParoleScreenSaver *saver); ! void parole_screen_saver_uninhibit (ParoleScreenSaver *saver); G_END_DECLS --- 44,52 ---- GType parole_screen_saver_get_type (void) G_GNUC_CONST; ParoleScreenSaver *parole_screen_saver_new (void); ! void parole_screen_saver_inhibit (ParoleScreenSaver *saver, GtkWindow *window); ! void parole_screen_saver_uninhibit (ParoleScreenSaver *saver, GtkWindow *window); G_END_DECLS diff -cprB parole/src/parole-player.c parole-screensaver/src/parole-player.c *** parole/src/parole-player.c 2012-12-17 17:03:09.523606656 -0500 --- parole-screensaver/src/parole-player.c 2012-12-17 17:08:12.345108271 -0500 *************** parole_player_reset_saver_changed (Parol *** 1489,1495 **** NULL); if ( !reset_saver ) ! parole_screen_saver_uninhibit (player->priv->screen_saver); else if ( player->priv->state == PAROLE_STATE_PLAYING ) { gboolean has_video; --- 1489,1495 ---- NULL); if ( !reset_saver ) ! parole_screen_saver_uninhibit (player->priv->screen_saver, GTK_WINDOW (player->priv->window)); else if ( player->priv->state == PAROLE_STATE_PLAYING ) { gboolean has_video; *************** parole_player_reset_saver_changed (Parol *** 1500,1510 **** if ( has_video ) { ! parole_screen_saver_inhibit (player->priv->screen_saver); } } else ! parole_screen_saver_uninhibit (player->priv->screen_saver); } static void --- 1500,1510 ---- if ( has_video ) { ! parole_screen_saver_inhibit (player->priv->screen_saver, GTK_WINDOW (player->priv->window)); } } else ! parole_screen_saver_uninhibit (player->priv->screen_saver, GTK_WINDOW (player->priv->window)); } static void *************** static void *** 1646,1652 **** parole_player_error_cb (ParoleGst *gst, const gchar *error, ParolePlayer *player) { parole_dialog_error (GTK_WINDOW (player->priv->window), _("GStreamer backend error"), error); ! parole_screen_saver_uninhibit (player->priv->screen_saver); parole_player_stopped (player); } --- 1646,1652 ---- parole_player_error_cb (ParoleGst *gst, const gchar *error, ParolePlayer *player) { parole_dialog_error (GTK_WINDOW (player->priv->window), _("GStreamer backend error"), error); ! parole_screen_saver_uninhibit (player->priv->screen_saver, GTK_WINDOW (player->priv->window)); parole_player_stopped (player); }