|
|
@ -28,6 +28,102 @@ Date: 2023 Mar 04 |
|
|
|
|
|
|
|
""" |
|
|
|
|
|
|
|
import Xlib.display |
|
|
|
import Xlib.ext.randr |
|
|
|
import configparser |
|
|
|
from operator import itemgetter |
|
|
|
from util import edit_distance |
|
|
|
from util.egalax import get_egalax_drm_pure_name |
|
|
|
|
|
|
|
CONFIG_NAME = "conf/desktop.conf" |
|
|
|
|
|
|
|
|
|
|
|
def read_config(): |
|
|
|
"""Reads config file of desktop setup |
|
|
|
|
|
|
|
This function will reeds the config file of desktop. Config file contins |
|
|
|
a default monitor port name which will be the main Monitor display. |
|
|
|
|
|
|
|
NOTE: eGalax devide will be detected automatically from the /dev mountings. |
|
|
|
""" |
|
|
|
config = configparser.ConfigParser() |
|
|
|
read = config.read(CONFIG_NAME) |
|
|
|
if not read: |
|
|
|
raise FileNotFoundError("Desktop config file not found") |
|
|
|
return config |
|
|
|
|
|
|
|
|
|
|
|
def all_connected_monitor(): |
|
|
|
"""Generates all connected monitors |
|
|
|
|
|
|
|
as a tuple of (atom name: str, width, height) |
|
|
|
""" |
|
|
|
display = Xlib.display.Display() |
|
|
|
root = display.screen().root |
|
|
|
for m in root.xrandr_get_monitors().monitors: |
|
|
|
yield ( |
|
|
|
display.get_atom_name(m.name), |
|
|
|
m.width_in_pixels, |
|
|
|
m.height_in_pixels, |
|
|
|
) |
|
|
|
|
|
|
|
|
|
|
|
def get_edid_name(drm_name): |
|
|
|
"""Change eGalax DRM name to atom name""" |
|
|
|
return "#TODO" |
|
|
|
|
|
|
|
|
|
|
|
def prepare_monitors(config): |
|
|
|
"""Prepare monitor names |
|
|
|
|
|
|
|
|
|
|
|
Rules: |
|
|
|
- Use default monitor port as the main monitor if it is connected |
|
|
|
- If default monitor is not connected then use a monitor with |
|
|
|
minimum edit distance. |
|
|
|
|
|
|
|
- Use eGalax as touchpanel and if it's not connected return None. |
|
|
|
|
|
|
|
- other connected monitors will be returned as a list |
|
|
|
|
|
|
|
each monitor is returen as a |
|
|
|
|
|
|
|
Returns |
|
|
|
tuple: of |
|
|
|
- main monitor -> tuple | None if no monitor available other than |
|
|
|
touchpanel |
|
|
|
- touchpanel -> tuple | None if touchpanel did not exist |
|
|
|
- other -> list: this list may be empty if there is no other |
|
|
|
monitor connected |
|
|
|
""" |
|
|
|
main = config["DEFAULT"]["MainDisplay"] |
|
|
|
all_monitors = list(all_connected_monitor()) |
|
|
|
egalax_drm = get_egalax_drm_pure_name() |
|
|
|
egalax_name = get_edid_name(egalax_drm) |
|
|
|
egalax_monitor = None |
|
|
|
main_monitor = None |
|
|
|
for mon in all_monitors: |
|
|
|
if egalax_name == mon[0]: |
|
|
|
egalax_monitor = mon |
|
|
|
if main == mon[0]: |
|
|
|
main_monitor = mon |
|
|
|
if egalax_monitor: |
|
|
|
all_monitors.remove(egalax_monitor) |
|
|
|
if not main_monitor: |
|
|
|
try: |
|
|
|
min_monitor = min( |
|
|
|
all_monitors, |
|
|
|
key=lambda x: edit_distance(main, x, len(main), len(x)), |
|
|
|
) |
|
|
|
main_monitor = min_monitor |
|
|
|
except: |
|
|
|
main_monitor = None |
|
|
|
assert len(all_monitors) == 0 |
|
|
|
if main_monitor: |
|
|
|
all_monitors.remove(main_monitor) |
|
|
|
return main_monitor, egalax_monitor, all_monitors |
|
|
|
|
|
|
|
|
|
|
|
if __name__ == "__main__": |
|
|
|
pass |
|
|
|
conf = read_config() |
|
|
|
print(prepare_monitors(conf)) |
|
|
|