| 
					
				 | 
			
			
				@@ -6,7 +6,7 @@ https://cgit.freedesktop.org/xorg/app/xrandr/tree/xrandr.c 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 """ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import ctypes 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-import sys 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import ctypes.util 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 Time = ctypes.c_ulong 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 """ 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -113,8 +113,9 @@ class XRROutputInfo(ctypes.Structure): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 X11 = ctypes.cdll.LoadLibrary("libX11.so") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 Xrandr = ctypes.cdll.LoadLibrary("libXrandr.so") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-Xrandr.XRRGetScreenResourcesCurrent.restype = ctypes.POINTER( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    XRRScreenResources) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+Xrandr.XRRGetScreenResourcesCurrent.restype = \ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    ctypes.POINTER(XRRScreenResources) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+libc = ctypes.cdll.LoadLibrary(ctypes.util.find_library('c')) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 """ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 XRROutputInfo * 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 XRRGetOutputInfo (Display *dpy, XRRScreenResources *resources, RROutput output); 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -122,29 +123,47 @@ XRRGetOutputInfo (Display *dpy, XRRScreenResources *resources, RROutput output); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 Xrandr.XRRGetOutputInfo.restype = ctypes.POINTER(XRROutputInfo) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+class RandrOutputInfo: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    def __init__(self, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                 xdisplay, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                 screen_resrcs: ctypes.POINTER(XRRScreenResources), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                 output: RROutput): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        self._p = Xrandr.XRRGetOutputInfo(xdisplay, screen_resrcs, output) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    def __del__(self): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        libc.free(self._p) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    @property 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    def enabled(self): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        return self._p.contents.crtc != 0 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    @property 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    def connected(self): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        return self._p.contents.connection == RR_Connected 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    @property 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    def name(self): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        return self._p.contents.name.decode() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 def get_xrandr_output_infos(xdisplay): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     screen_resrcs = Xrandr.XRRGetScreenResourcesCurrent( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         xdisplay, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         X11.XDefaultRootWindow(xdisplay), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     ) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     assert isinstance(screen_resrcs.contents, XRRScreenResources) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    return [Xrandr.XRRGetOutputInfo(xdisplay, screen_resrcs, screen_resrcs.contents.outputs[o]) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    return [RandrOutputInfo(xdisplay, screen_resrcs, screen_resrcs.contents.outputs[o]) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             for o in range(screen_resrcs.contents.noutput)] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-def get_xrandr_output_enabled(output_info): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    return output_info.contents.crtc != 0 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 def process(connected, disabled, enabled): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     xdisplay = X11.XOpenDisplay(None) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     for output_info in get_xrandr_output_infos(xdisplay): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        if ((not connected or output_info.contents.connection == RR_Connected) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                and (not disabled or not get_xrandr_output_enabled(output_info)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                and (not enabled or get_xrandr_output_enabled(output_info))): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            output_name = output_info.contents.name \ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                .decode(sys.getfilesystemencoding()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            print(output_name) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if ((not connected or output_info.connected) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                and (not disabled or not output_info.enabled) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                and (not enabled or output_info.enabled)): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            print(output_info.name) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     X11.XCloseDisplay(xdisplay) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -182,4 +201,5 @@ def main(argv): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     return 0 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 if __name__ == "__main__": 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    import sys 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     sys.exit(main(sys.argv[1:])) 
			 |