--- 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