Blob Blame History Raw
--- wallpapoz-0.6.2/share/wallpapoz/lib/wallpapoz_system.py.kill_nox	2012-03-06 11:59:53.171834985 +0900
+++ wallpapoz-0.6.2/share/wallpapoz/lib/wallpapoz_system.py	2012-03-06 14:02:32.087891881 +0900
@@ -24,9 +24,11 @@
 ## wallpapoz_system.py -- finds current desktop and changes wallpaper
 # achieve goal by calling external program
 
+import subprocess
 import os
 import sys
 import string
+import signal
 
 class WallpapozSystem:
 
@@ -46,12 +48,48 @@
       print "daemon_wallpapoz: respawning daemon_wallpapoz."
       self.respawn_system()
 
+  def exec_cmd_under_X(self, cmd):
+    try:
+      p = subprocess.Popen(
+        cmd,
+        stdout = subprocess.PIPE,
+        stderr = subprocess.PIPE,
+        shell = True
+        )
+    except OSError:
+      print "daemon_wallpapoz: fork failed for %s, exiting." %cmd
+      sys.exit(1)
+
+    pstdout = p.stdout.read()
+    pstderr = p.stderr.read()
+    ret = p.wait()
+
+    kill_daemon = False
+
+    if (ret != 0) and (ret & 0xFF):
+        print "daemon_wallpapoz: %s returned status %i." %(cmd, ret)
+        print "daemon_wallpapoz: error message: %s" %pstderr
+        kill_daemon = True
+
+    if (cmd.find('xprop') >= 0) and (pstdout.find('no such atom') >= 0):
+        kill_daemon = True
+    if (cmd.find('xprop') >= 0) and (pstdout.find('not') >= 0):
+        kill_daemon = True
+
+    if kill_daemon:
+        ## No X resource available, kill daemon_wallpapoz
+        print "daemon_wallpapoz: X resource seems no longer available."
+        print "daemon_wallpapoz: killing daemon_wallpapoz."
+        sys.exit(1)
+
+    return pstdout
+
   def set_style(self, style):
     self.wallpaper_style = style
 
   ## class method to find monitor resolution
   def finding_screen_resolution(self):
-    raw_resolution = os.popen('xwininfo -root').read()
+    raw_resolution = self.exec_cmd_under_X('xwininfo -root')
     start_width = raw_resolution.find('Width')
     end_width = raw_resolution.find('\n',start_width)
     start_height = raw_resolution.find('Height')
@@ -61,9 +99,9 @@
 
   ## class method to find which desktop environment user uses
   def finding_desktop_environment(self):
-    raw_window_id = os.popen('xprop -root _NET_SUPPORTING_WM_CHECK').read()
+    raw_window_id = self.exec_cmd_under_X('xprop -root _NET_SUPPORTING_WM_CHECK')
     window_id = raw_window_id[46:raw_window_id.find("\n")]
-    raw_wm_name = os.popen('xprop -id ' + window_id + ' 8s _NET_WM_NAME').read()
+    raw_wm_name = self.exec_cmd_under_X('xprop -id ' + window_id + ' 8s _NET_WM_NAME')
     wm_name = raw_wm_name[29:raw_wm_name.rfind('"')]
     # default is Gnome3.
     self.window_manager = 'Gnome3'
@@ -80,7 +118,7 @@
 
   ## class method to find amount of workspaces in user desktop
   def finding_total_workspaces(self):
-    self.total_workspaces = int(os.popen("xprop -root _NET_NUMBER_OF_DESKTOPS").read()[36:38])
+    self.total_workspaces = int(self.exec_cmd_under_X("xprop -root _NET_NUMBER_OF_DESKTOPS")[36:38])
 
     # Save this total_workspaces value
     if not WallpapozSystem.static_finding_total_workspaces_called_p:
@@ -98,7 +136,7 @@
 
   ## class method to know what workspace we are in now
   def current_desktop(self):
-    raw_workspace = os.popen('xprop -root _NET_CURRENT_DESKTOP').read()
+    raw_workspace = self.exec_cmd_under_X('xprop -root _NET_CURRENT_DESKTOP')
     workspace = int(raw_workspace[33] + raw_workspace[34])
     return workspace