diff options
Diffstat (limited to 'modules/xf86misc.py')
-rwxr-xr-x | modules/xf86misc.py | 197 |
1 files changed, 197 insertions, 0 deletions
diff --git a/modules/xf86misc.py b/modules/xf86misc.py new file mode 100755 index 0000000..8b952d8 --- /dev/null +++ b/modules/xf86misc.py @@ -0,0 +1,197 @@ +#!/usr/bin/env python +########################################################################### +# xf86misc.py - # +# ------------------------------ # +# copyright : (C) 2004 by Simon Edwards # +# email : simon@simonzone.com # +# # +########################################################################### +# # +# This program is free software; you can redistribute it and/or modify # +# it under the terms of the GNU General Public License as published by # +# the Free Software Foundation; either version 2 of the License, or # +# (at your option) any later version. # +# # +########################################################################### +"""A simple interface for changing the current gamma setting under XFree86. +""" +import ixf86misc +import os, time + +class XF86Screen(object): + + RR_Rotate_0 = 1 + RR_Rotate_90 = 2 + RR_Rotate_180 = 4 + RR_Rotate_270 = 8 + RR_Reflect_X = 16 + RR_Reflect_Y = 32 + + def __init__(self,display,screenid): + self.screenid = screenid + self.display = display + self.ssinfo = None + self.starttime = time.time() + self.resettime = 0 + self.lastidle = 0 + + self.screenconfig = None + self._load() + + def _load(self): + # Check for the presence of the xrandr extension. + try: + (rc,x,y) = ixf86misc.XRRQueryExtension(self.display) + if rc==0: + return + except AttributeError, errmsg: + print "Trapped AttributeError:", errmsg, " - attempting to continue." + return + + self.screenconfig = ixf86misc.XRRGetScreenInfo(self.display, ixf86misc.RootWindow(self.display, self.screenid)) + if self.screenconfig is not None: + (self.currentsizeid,self.currentrotation) = ixf86misc.XRRConfigCurrentConfiguration(self.screenconfig) + self.availablerotations = ixf86misc.XRRRotations(self.display, self.screenid) + self.sizes = ixf86misc.XRRSizes(self.display, self.screenid) + self.currentrefreshrate = ixf86misc.XRRConfigCurrentRate(self.screenconfig) + + def resolutionSupportAvailable(self): + return self.screenconfig is not None + + def getScreenId(self): + return self.screenid + + def getGamma(self): + return ixf86misc.GetGamma(self.display,self.screenid) + + def setGamma(self,gammatuple): + ixf86misc.SetGamma(self.display,self.screenid,gammatuple[0],gammatuple[1],gammatuple[2]) + + def getRotation(self): + return self.currentrotation + + def getAvailableRotations(self): + return self.availablerotations + + def getSize(self): + return self.sizes[self.currentsizeid] + + def getSizeID(self): + return self.currentsizeid + + def getAvailableSizes(self): + return self.sizes[:] + + def getRefreshRate(self): + return self.currentrefreshrate + + def getAvailableRefreshRates(self,sizeid): + return ixf86misc.XRRRates(self.display,self.screenid,sizeid) + + def setScreenConfigAndRate(self, sizeid, rotation, refresh): + rc = ixf86misc.XRRSetScreenConfigAndRate(self.display, self.screenconfig, \ + ixf86misc.RootWindow(self.display, self.screenid), sizeid, rotation, refresh) + #ixf86misc.XRRConfigTimes(self.screenconfig) \ + + self._load() + return rc # FIXME handle failures due to the timestamp. + + def getDimensions(self): + return ixf86misc.DisplaySize(self.display,self.screenid) + + def getIdleSeconds(self): + data = self.__getScreenSaverInfo() + if data is None: + return 0 + + (state, kind, til_or_since, idle) = data + idletime = idle/1000.0 + + if (self.lastidle > idletime) or (self.resettime > idletime): # Something has moved in the meantime + self.starttime = 0 + self.resettime = 0 + else: + idletime = idletime - self.resettime + self.lastidle = idletime + return idletime + + def resetIdleSeconds(self): + self.resettime = time.time() - self.starttime + + # See man XScreenSaver(3) + def __getScreenSaverInfo(self): + if self.ssinfo is None: + if ixf86misc.XScreenSaverQueryExtension(self.display): + self.ssinfo = ixf86misc.XScreenSaverAllocInfo() + else: + return 0 # Error actually. + + return ixf86misc.XScreenSaverQueryInfo(self.display, + ixf86misc.RootWindow(self.display, self.screenid), self.ssinfo) + + +class XF86Server(object): + def __init__(self,displayname=None): + if displayname==None: + if 'DISPLAY' in os.environ: + displayname = os.environ['DISPLAY'] + else: + displayname = ":0.0" + self.displayname = displayname + self.display = ixf86misc.XOpenDisplay(displayname) + if self.display is None: + raise XF86Error, "Couldn't connect to X server." + + self._defaultscreen = ixf86misc.DefaultScreen(self.display) + + self.screens = [] + for i in range(ixf86misc.ScreenCount(self.display)): + self.screens.append(XF86Screen(self.display,i)) + + def getDefaultScreen(self): + return self.screens[self._defaultscreen] + + def getDisplay(self): + return self.display + + def getDisplayName(self): + return self.displayname + + def getScreens(self): + return self.screens[:] + + def resolutionSupportAvailable(self): + return self.screens[0].resolutionSupportAvailable() + +class XF86Error(Exception): + """Just an exception when some goes wrong with X.""" + +if __name__=='__main__': + xg = XF86Server() + xs = xg.getDefaultScreen() + print "Number of screens:",str(len(xg.screens)) + print "Idle seconds:",xs.getIdleSeconds() + print + print "Gamma:"+str(xs.getGamma()) + print + if xg.resolutionSupportAvailable(): + print "SizeID:"+str(xs.getSizeID()) + print "Size:"+str(xs.getSize()) + sizes = xs.getAvailableSizes() + print "Available Sizes:" + str(sizes) + print + print "Rotation:" + str(xs.getRotation()) + print "Available Rotations:" + str(xs.getAvailableRotations()) + print + print "Refresh rate:" + str(xs.getRefreshRate()) + print "Refresh rates for the current screen:"+str(xs.getAvailableRefreshRates(xs.getSizeID())) + + for i in range(len(sizes)): + print "All Refresh Rates:"+str(xs.getAvailableRefreshRates(i)) + xs.setScreenConfigAndRate(0,1,75) + print "SizeID:"+str(xs.getSizeID()) + print "Size:"+str(xs.getSize()) + sizes = xs.getAvailableSizes() + print "Available Sizes:" + str(sizes) + else: + print "(no resolution / randr support available)" |