Spaces:
Runtime error
Runtime error
# Xlib.ext.dpms -- X Display Power Management Signaling | |
# | |
# Copyright (C) 2020 Thiago Kenji Okada <thiagokokada@gmail.com> | |
# | |
# This library is free software; you can redistribute it and/or | |
# modify it under the terms of the GNU Lesser General Public License | |
# as published by the Free Software Foundation; either version 2.1 | |
# of the License, or (at your option) any later version. | |
# | |
# This library is distributed in the hope that it will be useful, | |
# but WITHOUT ANY WARRANTY; without even the implied warranty of | |
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. | |
# See the GNU Lesser General Public License for more details. | |
# | |
# You should have received a copy of the GNU Lesser General Public | |
# License along with this library; if not, write to the | |
# Free Software Foundation, Inc., | |
# 59 Temple Place, | |
# Suite 330, | |
# Boston, MA 02111-1307 USA | |
''' | |
This extension provides X Protocol control over the VESA Display | |
Power Management Signaling (DPMS) characteristics of video boards | |
under control of the X Window System. | |
Documentation: https://www.x.org/releases/X11R7.7/doc/xextproto/dpms.html | |
''' | |
from Xlib.protocol import rq | |
extname = 'DPMS' | |
# DPMS Extension Power Levels | |
# 0 DPMSModeOn In use | |
# 1 DPMSModeStandby Blanked, low power | |
# 2 DPMSModeSuspend Blanked, lower power | |
# 3 DPMSModeOff Shut off, awaiting activity | |
DPMSModeOn = 0 | |
DPMSModeStandby = 1 | |
DPMSModeSuspend = 2 | |
DPMSModeOff = 3 | |
DPMSPowerLevel = ( | |
DPMSModeOn, | |
DPMSModeStandby, | |
DPMSModeSuspend, | |
DPMSModeOff, | |
) | |
class DPMSGetVersion(rq.ReplyRequest): | |
_request = rq.Struct( | |
rq.Card8('opcode'), | |
rq.Opcode(0), | |
rq.RequestLength(), | |
rq.Card16('major_version'), | |
rq.Card16('minor_version'), | |
) | |
_reply = rq.Struct( | |
rq.ReplyCode(), | |
rq.Pad(1), | |
rq.Card16('sequence_number'), | |
rq.ReplyLength(), | |
rq.Card16('major_version'), | |
rq.Card16('minor_version'), | |
rq.Pad(20), | |
) | |
def get_version(self): | |
return DPMSGetVersion(display=self.display, | |
opcode=self.display.get_extension_major(extname), | |
major_version=1, | |
minor_version=1) | |
class DPMSCapable(rq.ReplyRequest): | |
_request = rq.Struct( | |
rq.Card8('opcode'), | |
rq.Opcode(1), | |
rq.RequestLength(), | |
) | |
_reply = rq.Struct( | |
rq.ReplyCode(), | |
rq.Pad(1), | |
rq.Card16('sequence_number'), | |
rq.ReplyLength(), | |
rq.Bool('capable'), | |
rq.Pad(23), | |
) | |
def capable(self): | |
return DPMSCapable(display=self.display, | |
opcode=self.display.get_extension_major(extname), | |
major_version=1, | |
minor_version=1) | |
class DPMSGetTimeouts(rq.ReplyRequest): | |
_request = rq.Struct( | |
rq.Card8('opcode'), | |
rq.Opcode(2), | |
rq.RequestLength(), | |
) | |
_reply = rq.Struct( | |
rq.ReplyCode(), | |
rq.Pad(1), | |
rq.Card16('sequence_number'), | |
rq.ReplyLength(), | |
rq.Card16('standby_timeout'), | |
rq.Card16('suspend_timeout'), | |
rq.Card16('off_timeout'), | |
rq.Pad(18), | |
) | |
def get_timeouts(self): | |
return DPMSGetTimeouts(display=self.display, | |
opcode=self.display.get_extension_major(extname), | |
major_version=1, | |
minor_version=1) | |
class DPMSSetTimeouts(rq.Request): | |
_request = rq.Struct( | |
rq.Card8('opcode'), | |
rq.Opcode(3), | |
rq.RequestLength(), | |
rq.Card16('standby_timeout'), | |
rq.Card16('suspend_timeout'), | |
rq.Card16('off_timeout'), | |
rq.Pad(2) | |
) | |
def set_timeouts(self, standby_timeout, suspend_timeout, off_timeout): | |
return DPMSSetTimeouts(display=self.display, | |
opcode=self.display.get_extension_major(extname), | |
major_version=1, | |
minor_version=1, | |
standby_timeout=standby_timeout, | |
suspend_timeout=suspend_timeout, | |
off_timeout=off_timeout) | |
class DPMSEnable(rq.Request): | |
_request = rq.Struct( | |
rq.Card8('opcode'), | |
rq.Opcode(4), | |
rq.RequestLength(), | |
) | |
def enable(self): | |
return DPMSEnable(display=self.display, | |
opcode=self.display.get_extension_major(extname), | |
major_version=1, | |
minor_version=1) | |
class DPMSDisable(rq.Request): | |
_request = rq.Struct( | |
rq.Card8('opcode'), | |
rq.Opcode(5), | |
rq.RequestLength(), | |
) | |
def disable(self): | |
return DPMSDisable(display=self.display, | |
opcode=self.display.get_extension_major(extname), | |
major_version=1, | |
minor_version=1) | |
class DPMSForceLevel(rq.Request): | |
_request = rq.Struct( | |
rq.Card8('opcode'), | |
rq.Opcode(6), | |
rq.RequestLength(), | |
rq.Resource('power_level', DPMSPowerLevel), | |
) | |
def force_level(self, power_level): | |
return DPMSForceLevel(display=self.display, | |
opcode=self.display.get_extension_major(extname), | |
major_version=1, | |
minor_version=1, | |
power_level=power_level) | |
class DPMSInfo(rq.ReplyRequest): | |
_request = rq.Struct( | |
rq.Card8('opcode'), | |
rq.Opcode(7), | |
rq.RequestLength(), | |
) | |
_reply = rq.Struct( | |
rq.ReplyCode(), | |
rq.Pad(1), | |
rq.Card16('sequence_number'), | |
rq.ReplyLength(), | |
rq.Card16('power_level'), | |
rq.Bool('state'), | |
rq.Pad(21), | |
) | |
def info(self): | |
return DPMSInfo(display=self.display, | |
opcode=self.display.get_extension_major(extname), | |
major_version=1, | |
minor_version=1) | |
def init(disp, _info): | |
disp.extension_add_method('display', 'dpms_get_version', get_version) | |
disp.extension_add_method('display', 'dpms_capable', capable) | |
disp.extension_add_method('display', 'dpms_get_timeouts', get_timeouts) | |
disp.extension_add_method('display', 'dpms_set_timeouts', set_timeouts) | |
disp.extension_add_method('display', 'dpms_enable', enable) | |
disp.extension_add_method('display', 'dpms_disable', disable) | |
disp.extension_add_method('display', 'dpms_force_level', force_level) | |
disp.extension_add_method('display', 'dpms_info', info) | |