1
0
Fork 0
mirror of https://github.com/kbumsik/VirtScreen.git synced 2025-03-09 15:40:18 +00:00

Beautified code, surpressed stdout

This commit is contained in:
Bumsik Kim 2018-04-26 14:45:10 -04:00
parent 9dae19dae4
commit 90078c71c2
No known key found for this signature in database
GPG key ID: E31041C8EC5B01C6

View file

@ -12,6 +12,10 @@ from netifaces import interfaces, ifaddresses, AF_INET
import subprocess
import atexit, signal
# Redirect stdout to /dev/null. Uncomment it while debugging.
import sys
sys.stdout = open(os.devnull, "a")
#-------------------------------------------------------------------------------
# file path definitions
#-------------------------------------------------------------------------------
@ -27,17 +31,6 @@ ICON_PATH = PROGRAM_PATH + "/icon/icon.png"
ICON_TABLET_OFF_PATH = PROGRAM_PATH + "/icon/icon_tablet_off.png"
ICON_TABLET_ON_PATH = PROGRAM_PATH + "/icon/icon_tablet_on.png"
#-------------------------------------------------------------------------------
# Display properties
#-------------------------------------------------------------------------------
class DisplayProperty:
def __init__(self):
self.name: str
self.width: int
self.height: int
self.x_offset: int
self.y_offset: int
#-------------------------------------------------------------------------------
# Subprocess wrapper
#-------------------------------------------------------------------------------
@ -57,11 +50,23 @@ class SubprocessWrapper:
def run(self, arg: str) -> str:
return subprocess.run(arg.split(), stdout=subprocess.PIPE).stdout.decode('utf-8')
#-------------------------------------------------------------------------------
# Display properties
#-------------------------------------------------------------------------------
class DisplayProperty:
def __init__(self):
self.name: str
self.width: int
self.height: int
self.x_offset: int
self.y_offset: int
#-------------------------------------------------------------------------------
# Screen adjustment class
#-------------------------------------------------------------------------------
class XRandR:
class XRandR(SubprocessWrapper):
def __init__(self):
super(XRandR, self).__init__()
self.mode_name: str
self.scrren_suffix = "_virt"
# Thoese will be created in set_virtual_screen()
@ -71,36 +76,25 @@ class XRandR:
self.primary = DisplayProperty()
self._update_primary_screen()
def _call(self, arg) -> None:
with open(os.devnull, "w") as nulldev:
subprocess.call(arg.split(), stdout=nulldev, stderr=nulldev)
def _check_call(self, arg) -> None:
with open(os.devnull, "w") as nulldev:
subprocess.check_call(arg.split(), stdout=nulldev, stderr=nulldev)
def _run(self, arg: str) -> str:
return subprocess.run(arg.split(), stdout=subprocess.PIPE).stdout.decode('utf-8')
def _add_screen_mode(self) -> None:
args_addmode = f"xrandr --addmode {self.virt.name} {self.mode_name}"
try:
self._check_call(args_addmode)
self.check_call(args_addmode)
except subprocess.CalledProcessError:
# When failed create mode and then add again
output = self._run(f"cvt {self.virt.width} {self.virt.height}")
output = self.run(f"cvt {self.virt.width} {self.virt.height}")
mode = re.search(r"^.*Modeline\s*\".*\"\s*(.*)$", output, re.M).group(1)
# Create new screen mode
self._check_call(f"xrandr --newmode {self.mode_name} {mode}")
self.check_call(f"xrandr --newmode {self.mode_name} {mode}")
# Add mode again
self._check_call(args_addmode)
self.check_call(args_addmode)
# After adding mode the program should delete the mode automatically on exit
atexit.register(self.delete_virtual_screen)
for sig in [signal.SIGTERM, signal.SIGHUP, signal.SIGQUIT]:
signal.signal(sig, self._signal_handler)
def _update_primary_screen(self) -> None:
output = self._run("xrandr")
output = self.run("xrandr")
match = re.search(r"^(\w*)\s+.*primary\s*(\d+)x(\d+)\+(\d+)\+(\d+).*$", output, re.M)
self.primary.name = match.group(1)
self.primary.width = int(match.group(2))
@ -109,7 +103,7 @@ class XRandR:
self.primary.y_offset = int(match.group(5))
def _update_virtual_screen(self) -> None:
output = self._run("xrandr")
output = self.run("xrandr")
match = re.search(r"^" + self.virt.name + r"\s+.*\s+(\d+)x(\d+)\+(\d+)\+(\d+).*$", output, re.M)
self.virt.width = int(match.group(1))
self.virt.height = int(match.group(2))
@ -137,9 +131,9 @@ class XRandR:
def create_virtual_screen(self) -> None:
self._add_screen_mode()
self._check_call(f"xrandr --output {self.virt.name} --mode {self.mode_name}")
self._check_call("sleep 5")
self._check_call(f"xrandr --output {self.virt.name} --auto")
self.check_call(f"xrandr --output {self.virt.name} --mode {self.mode_name}")
self.check_call("sleep 5")
self.check_call(f"xrandr --output {self.virt.name} --auto")
self._update_primary_screen()
self._update_virtual_screen()
@ -149,8 +143,8 @@ class XRandR:
self.mode_name
except AttributeError:
return
self._call(f"xrandr --output {self.virt.name} --off")
self._call(f"xrandr --delmode {self.virt.name} {self.mode_name}")
self.call(f"xrandr --output {self.virt.name} --off")
self.call(f"xrandr --delmode {self.virt.name} {self.mode_name}")
#-------------------------------------------------------------------------------
# Twisted class