Sophie

Sophie

distrib > Fedora > 13 > i386 > by-pkgid > cfd5a9dd583fb1ae0fd3ada5d6b760fc > files > 7

wallpapoz-0.5-2.fc13.src.rpm

--- wallpapoz-0.4.1-svn92_trunk/share/wallpapoz/lib/wallpapoz_system.py.kill_nox	2010-03-18 00:52:45.000000000 +0900
+++ wallpapoz-0.4.1-svn92_trunk/share/wallpapoz/lib/wallpapoz_system.py	2010-03-18 01:00:30.000000000 +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:
 
@@ -59,12 +61,46 @@
       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 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')
@@ -77,7 +113,7 @@
     if self.beryl:
       self.total_workspaces = self.row_workspaces * self.column_workspaces
     else:
-      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:
@@ -86,7 +122,7 @@
 
   ## class method to find if user use beryl in his system or not
   def check_beryl(self):
-    raw_geometry = os.popen('xprop -root _NET_DESKTOP_GEOMETRY').read()
+    raw_geometry = self.exec_cmd_under_X('xprop -root _NET_DESKTOP_GEOMETRY')
     # output of xprop -root _NET_DESKTOP_GEOMETRY is '_NET_DESKTOP_GEOMETRY(CARDINAL) = 1024, 768\n'
     # and we just need the '1024, 768' part
     raw_geometry = raw_geometry[34:raw_geometry.find('\n')]
@@ -117,7 +153,7 @@
   ## class method to know what workspace we are in now
   def current_desktop(self):
     if self.beryl:
-      raw_viewport = os.popen('xprop -root _NET_DESKTOP_VIEWPORT').read()
+      raw_viewport = self.exec_cmd_under_X('xprop -root _NET_DESKTOP_VIEWPORT')
       # output of xprop -root _NET_DESKTOP_VIEWPORT is '_NET_DESKTOP_VIEWPORT(CARDINAL) = 1024, 768\n'
       # and we just need the '1024, 768' part
       raw_viewport = raw_viewport[34:raw_viewport.find('\n')]
@@ -126,7 +162,7 @@
       y_pos = int(viewport[1]) / self.screen_height
       workspace = x_pos + self.column_workspaces * y_pos
     else:
-      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