summaryrefslogtreecommitdiffstats
path: root/modules/xf86misc.py
diff options
context:
space:
mode:
Diffstat (limited to 'modules/xf86misc.py')
-rwxr-xr-xmodules/xf86misc.py197
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)"