--- xine-ui-0.99.6.orig/src/xitk/common.h
+++ xine-ui-0.99.6/src/xitk/common.h
@@ -331,6 +331,5 @@ typedef struct {
   int                       use_root_window;
 
   int                       ssaver_enabled;
-  int                       ssaver_timeout;
 
   int                       skip_by_chapter;
--- xine-ui-0.99.6.orig/src/xitk/main.c
+++ xine-ui-0.99.6/src/xitk/main.c
@@ -1383,6 +1383,8 @@ int main(int argc, char *argv[]) {
   if (sigprocmask (SIG_BLOCK,  &vo_mask, NULL))
     fprintf (stderr, "sigprocmask() failed.\n");
 
+  signal(SIGCHLD, SIG_IGN);
+
   gGui = (gGui_t *) calloc(1, sizeof(gGui_t));
   
   gGui->stream                 = NULL;
--- xine-ui-0.99.6.orig/src/xitk/panel.c
+++ xine-ui-0.99.6/src/xitk/panel.c
@@ -356,7 +356,6 @@ void panel_update_runtime_display(void)
  * Update slider thread.
  */
 static void *slider_loop(void *dummy) {
-  int screensaver_timer = 0;
   int status, speed;
   int pos, secs;
   int i = 0;
@@ -441,20 +440,7 @@ static void *slider_loop(void *dummy) {
 	else
 	  video_window_set_mrl((char *)gGui->mmk.mrl);
 	
-	if(!xitk_is_window_iconified(gGui->video_display, gGui->video_window)) {
-	  
-	  if(gGui->ssaver_timeout) {
-	    
-	    if(!(i % 2))
-	      screensaver_timer++;
-	    
-	    if(screensaver_timer >= gGui->ssaver_timeout) {
-	      screensaver_timer = 0;
-	      video_window_reset_ssaver();
-	      
-	    }
-	  }  
-	}
+       video_window_suspend_ssaver(!xitk_is_window_iconified(gGui->video_display, gGui->video_window));
 
 	if(gGui->logo_mode == 0) {
 	  
@@ -494,6 +480,8 @@ static void *slider_loop(void *dummy) {
 	    stream_infos_update_infos();
 
 	}
+      } else {
+       video_window_suspend_ssaver(0);
       }
     }
     
--- xine-ui-0.99.6.orig/src/xitk/videowin.c
+++ xine-ui-0.99.6/src/xitk/videowin.c
@@ -1087,6 +1087,9 @@ static void video_window_adapt_size (voi
 
   /* The old window should be destroyed now */
   if(old_video_window != None) {
+    /* Screensaver control is tied to our window id */
+    video_window_suspend_ssaver(0);
+
     XDestroyWindow(gGui->video_display, old_video_window);
      
     if(gGui->cursor_grabbed)
@@ -2261,69 +2264,34 @@ static void video_window_handle_event (X
 
 }
 
-void video_window_reset_ssaver(void) {
+void video_window_suspend_ssaver(int do_suspend) {
+  static int was_suspended;
 
-  if(gGui->ssaver_enabled && (xitk_get_last_keypressed_time() >= (long int) gGui->ssaver_timeout)) {
+  do_suspend = do_suspend && gGui->ssaver_enabled;
 
-#ifdef HAVE_XTESTEXTENSION
-    if(gVw.have_xtest == True) {
-      
-      gVw.fake_key_cur++;
-      
-      if(gVw.fake_key_cur >= 2)
-	gVw.fake_key_cur = 0;
-
-      XLockDisplay(gGui->video_display);
-      XTestFakeKeyEvent(gGui->video_display, gVw.fake_keys[gVw.fake_key_cur], True, CurrentTime);
-      XTestFakeKeyEvent(gGui->video_display, gVw.fake_keys[gVw.fake_key_cur], False, CurrentTime);
-      XSync(gGui->video_display, False);
-      XUnlockDisplay(gGui->video_display);
+  if(was_suspended != do_suspend) {
+    if(fork() == 0) {
+      char window_id[30];
+      char *args[] = { "xdg-screensaver", NULL, window_id, NULL };
+      int fd;
+
+      for(fd = 3; fd < 256; fd++)
+	close(fd);
+
+      args[1] = do_suspend ? "suspend" : "resume";
+      sprintf(window_id, "%lu", (unsigned long)gGui->video_window);
+      execvp(args[0], args);
+      _exit(0);
     }
-    else 
-#endif
-    {
-      /* Reset the gnome screensaver. Look up the command in PATH only once to save time, */
-      /* assuming its location and permission will not change during run time of xine-ui. */
-      {
-	static char *const gssaver_args[] = { "gnome-screensaver-command", "--poke", NULL };
-	static char *gssaver_path   = NULL;
-
-	if(!gssaver_path) {
-	  char *path = getenv("PATH");
-
-	  if(!path)
-	    path = "/usr/local/bin:/usr/bin";
-	  do {
-	    char *p, *pbuf;
-	    int   plen;
-
-	    for(p = path; *path && *path != ':'; path++)
-	      ;
-	    if(p == path)
-	      plen = 1, p = ".";
-	    else
-	      plen = path - p;
-	    asprintf(&pbuf, "%.*s/%s", plen, p, gssaver_args[0]);
-	    if ( access(pbuf, X_OK) ) {
-	      free(pbuf);
-	      gssaver_path = "";
-	    } else
-	      gssaver_path = pbuf;
-	  } while(!gssaver_path[0] && *path++);
-	}
-	if(gssaver_path[0] && (fork() == 0)) {
-	  execv(gssaver_path, gssaver_args);
-	  exit(0);
-	}
-      }
 
-      XLockDisplay(gGui->video_display);
-      XResetScreenSaver(gGui->video_display);
-      XUnlockDisplay(gGui->video_display);
-    }
+    was_suspended = do_suspend;
   }
 }
 
+void video_window_reset_ssaver(void) {
+  video_window_suspend_ssaver(1);
+}
+
 void video_window_get_frame_size(int *w, int *h) {
   if(w)
     *w = gVw.frame_width;
--- xine-ui-0.99.6.orig/src/xitk/videowin.h
+++ xine-ui-0.99.6/src/xitk/videowin.h
@@ -81,6 +81,7 @@ void video_window_get_mag (float *xmag,
 void video_window_update_logo(void);
 void video_window_change_skins(int);
 
+void video_window_suspend_ssaver(int do_suspend);
 void video_window_reset_ssaver(void);
 
 void video_window_get_frame_size(int *w, int *h);
--- xine-ui-0.99.6.orig/src/xitk/event.c
+++ xine-ui-0.99.6/src/xitk/event.c
@@ -135,9 +135,6 @@ static void skip_by_chapter_cb(void *dat
   gGui->skip_by_chapter = cfg->num_value;
   panel_update_nextprev_tips();
 }
-static void ssaver_timeout_cb(void *data, xine_cfg_entry_t *cfg) {
-  gGui->ssaver_timeout = cfg->num_value;
-}
 
 static void visual_anim_cb(void *data, xine_cfg_entry_t *cfg) {
   
@@ -1614,14 +1611,6 @@ void gui_init (int nfiles, char *filenam
 					 snapshot_loc_cb,
 					 CONFIG_NO_DATA);
   
-  gGui->ssaver_timeout =
-    xine_config_register_num (__xineui_global_xine_instance, "gui.screensaver_timeout", 10,
-			      _("Screensaver reset interval (s)"),
-			      _("Time, in seconds, between two faked events to keep a screensaver quiet, 0 to disable."),
-			      CONFIG_LEVEL_ADV,
-			      ssaver_timeout_cb,
-			      CONFIG_NO_DATA);
-  
   gGui->skip_by_chapter = 
     xine_config_register_bool (__xineui_global_xine_instance, "gui.skip_by_chapter", 1,
 			       _("Chapter hopping"),