Skip to content

Commit

Permalink
Added input source control and an optional monitor parameter (#15)
Browse files Browse the repository at this point in the history
* Added input source control and an optional monitor parameter

* Implemented linux method for get capabilities

* Fixed black and pep8 errors

* Added unit testing and fixed a sphinx error

* Added unit testing for vcp capabilities parser

* Applied PR changes.
  • Loading branch information
RodinSevar committed Mar 14, 2021
1 parent 246ff31 commit 65256e8
Show file tree
Hide file tree
Showing 10 changed files with 585 additions and 18 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
docs/cli.txt
.vscode/
public/
*.orig

# Byte-compiled / optimized / DLL files
__pycache__/
Expand Down
8 changes: 8 additions & 0 deletions docs/changelog.rst
Original file line number Diff line number Diff line change
@@ -1,6 +1,14 @@
Change Log
##########

Unreleased
**********

Added
=====
- Added ``--monitor`` optional argument to select a specific monitor for the command
- Added ``--set-input-source`` and ``--get-input-source`` to change monitor input source

`2.3.0`_ 2020-10-07
*******************

Expand Down
1 change: 1 addition & 0 deletions monitorcontrol/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,4 +4,5 @@
get_monitors,
Monitor,
PowerMode,
InputSource,
)
106 changes: 89 additions & 17 deletions monitorcontrol/__main__.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
from . import get_monitors, PowerMode
from . import get_monitors, PowerMode, InputSource
from typing import List, Optional
import argparse
import logging
Expand Down Expand Up @@ -49,6 +49,29 @@ def get_parser() -> argparse.ArgumentParser:
group.add_argument(
"--version", action="store_true", help="Show the version and exit."
)
group.add_argument(
"--get-input-source",
action="store_true",
help="Get the input source of each monitor.",
)
group.add_argument(
"--set-input-source",
choices=[mode.name for mode in InputSource],
help="Set the input source of all monitors.",
)
group.add_argument(
"--get-monitors",
action="store_true",
help="Get the monitors.",
)
group = parser.add_argument_group("Optional monitor select")
group.add_argument(
"--monitor",
type=int,
default=None,
help="Select monitor for command. "
"Default: getters use monitor 1. Setters use all monitors.",
)
return parser


Expand Down Expand Up @@ -79,28 +102,77 @@ def main(argv: Optional[List[str]] = None):
root_logger.setLevel(logging_level)
root_logger.addHandler(handler)

monitor_index = 0
if args.monitor is not None:
monitor_index = args.monitor - 1

if args.version:
sys.stdout.write(version + "\n")
return
elif args.get_luminance:
for monitor in get_monitors():
with monitor:
luminance = monitor.get_luminance()
sys.stdout.write(str(luminance) + "\n")
return
monitor_obj = get_monitors()[monitor_index]
with monitor_obj:
luminance = monitor_obj.get_luminance()
sys.stdout.write(str(luminance) + "\n")
return
elif args.get_power_mode:
for monitor in get_monitors():
with monitor:
power = monitor.get_power_mode()
sys.stdout.write(str(power) + "\n")
return
monitor_obj = get_monitors()[monitor_index]
with monitor_obj:
power = monitor_obj.get_power_mode()
sys.stdout.write(str(power.name) + "\n")
return
elif args.set_luminance is not None:
for monitor in get_monitors():
with monitor:
monitor.set_luminance(args.set_luminance)
if args.monitor is None:
for monitor_obj in get_monitors():
with monitor_obj:
monitor_obj.set_luminance(args.set_luminance)
else:
monitor_obj = get_monitors()[monitor_index]
with monitor_obj:
monitor_obj.set_luminance(args.set_luminance)
return
elif args.set_power_mode is not None:
for monitor in get_monitors():
with monitor:
monitor.set_power_mode(args.set_power_mode)
if args.monitor is None:
for monitor_obj in get_monitors():
with monitor_obj:
monitor_obj.set_power_mode(args.set_power_mode)
else:
monitor_obj = get_monitors()[monitor_index]
with monitor_obj:
monitor_obj.set_power_mode(args.set_power_mode)
return
elif args.get_input_source:
monitor_obj = get_monitors()[monitor_index]
with monitor_obj:
input_source = monitor_obj.get_input_source()
sys.stdout.write(str(input_source) + "\n")
return
elif args.set_input_source is not None:
if args.monitor is None:
for monitor_obj in get_monitors():
with monitor_obj:
monitor_obj.set_input_source(args.set_input_source)
else:
monitor_obj = get_monitors()[monitor_index]
with monitor_obj:
monitor_obj.set_input_source(args.set_input_source)
return
elif args.get_monitors:
for monitor_index, monitor_obj in enumerate(get_monitors(), 0):
with monitor_obj:
monitors_dict = monitor_obj.get_vcp_capabilities()
current_input = monitor_obj.get_input_source()
model = monitors_dict["model"]
inputs = monitors_dict["inputs"]
sys.stdout.write(f"Monitor {monitor_index + 1}: {model}" + "\n")
sys.stdout.write("Available Inputs:\n")
for i in inputs:
sys.stdout.write(f"\t{i}")
if i == current_input:
sys.stdout.write("*\n")
else:
sys.stdout.write("\n")

return
else:
raise AssertionError("Internal error, please report this bug")

0 comments on commit 65256e8

Please sign in to comment.