def change_resolution(resolution): """Change display resolution. Takes a string for single monitors or a list of displays as returned by get_outputs(). """ if not resolution: logger.warning("No resolution provided") return if isinstance(resolution, str): logger.debug("Switching resolution to %s", resolution) if resolution not in get_resolutions(): logger.warning("Resolution %s doesn't exist.", resolution) else: logger.info("Changing resolution to %s", resolution) with subprocess.Popen( [LINUX_SYSTEM.get("xrandr"), "-s", resolution]) as xrandr: xrandr.communicate() else: for display in resolution: logger.debug("Switching to %s on %s", display.mode, display.name) if display.rotation is not None and display.rotation in ( "normal", "left", "right", "inverted", ): rotation = display.rotation else: rotation = "normal" logger.info("Switching resolution of %s to %s", display.name, display.mode) with subprocess.Popen([ LINUX_SYSTEM.get("xrandr"), "--output", display.name, "--mode", display.mode, "--pos", display.position, "--rotate", rotation, "--rate", display.rate, ]) as xrandr: xrandr.communicate()
def find_executable(exec_name): """Return the absolute path of an executable""" if not exec_name: return None cached = LINUX_SYSTEM.get(exec_name) if cached: return cached return shutil.which(exec_name)
def turn_off_except(display): """Use XrandR to turn off displays except the one referenced by `display`""" if not display: logger.error("No active display given, no turning off every display") return for output in get_outputs(): if output.name != display: logger.info("Turning off %s", output[0]) with subprocess.Popen( [LINUX_SYSTEM.get("xrandr"), "--output", output.name, "--off"]) as xrandr: xrandr.communicate()
def _get_vidmodes(): """Return video modes from XrandR""" logger.debug("Retrieving video modes from XrandR") return read_process_output([LINUX_SYSTEM.get("xrandr")]).split("\n")