Focus correct sddm-greeter window ID if we have more than one #4

Merged
hygienic-books merged 1 commits from bugfix/3-delay-sddm-check-til-xauth into master 2022-03-08 01:21:22 +00:00
3 changed files with 76 additions and 39 deletions

48
main.py
View File

@ -6,12 +6,14 @@ import sys
import time import time
import cec import cec
import logging import logging
import inflect
from rich import traceback from rich import traceback
from rich.console import Console from rich.console import Console
from rich.logging import RichHandler from rich.logging import RichHandler
from inotify_simple import INotify, flags from inotify_simple import INotify, flags
traceback.install() traceback.install()
console = Console() console = Console()
p = inflect.engine()
FORMAT = "%(message)s" FORMAT = "%(message)s"
@ -71,15 +73,26 @@ def x_focus_window(window_id: str) -> bool:
def sddm_greeter_window_ids() -> list: def sddm_greeter_window_ids() -> list:
log.debug(f"Checking if an 'sddm-greeter' window exists ...") sddm_check_attempt = 1
sddm_check_attempts_max = 2
sddm_check_sleep = 2
while sddm_check_attempt <= sddm_check_attempts_max:
log.debug(f"Checking if 'sddm-greeter' window exists "
f"({sddm_check_attempt} of {sddm_check_attempts_max}) ...")
try: try:
dm_windows = subprocess.run( dm_windows = subprocess.run(
["xdotool", "search", "--onlyvisible", "--classname", "sddm-greeter"], ["xdotool", "search", "--onlyvisible", "--classname", "sddm-greeter"],
check=True, check=True,
stdout=subprocess.PIPE, capture_output=True,
encoding="utf-8") encoding="utf-8")
return dm_windows.stdout.splitlines() return dm_windows.stdout.splitlines()
except subprocess.CalledProcessError as xdotool_error: except subprocess.CalledProcessError as xdotool_error:
if sddm_check_attempt < sddm_check_attempts_max:
log.debug(f"No 'sddm-greeter' window, checking again in "
f"""{sddm_check_sleep} {p.plural("second", sddm_check_sleep)} ...""")
sddm_check_attempt += 1
time.sleep(sddm_check_sleep)
else:
log.debug(f"No 'sddm-greeter' window exists, doing nothing") log.debug(f"No 'sddm-greeter' window exists, doing nothing")
log.debug(xdotool_error) log.debug(xdotool_error)
return [] return []
@ -90,12 +103,19 @@ def sddm_change_focus_if_two_windows() -> bool:
if not dm_windows: if not dm_windows:
return False return False
else: else:
log.debug(f"Checking if 'sddm-greeter' window has focus ...") sddm_focus_attempt = 1
sddm_focus_attempt_max = 2
sddm_focus_sleep = 2
sddm_window_count_attempt = 1
sddm_window_count_attempt_max = 2
while sddm_focus_attempt <= sddm_focus_attempt_max:
log.debug(f"Checking if 'sddm-greeter' window has focus "
f"({sddm_focus_attempt} of {sddm_focus_attempt_max}) ...")
try: try:
x_window_focus = subprocess.run( x_window_focus = subprocess.run(
["xdotool", "getwindowfocus"], ["xdotool", "getwindowfocus"],
check=True, check=True,
stdout=subprocess.PIPE, capture_output=True,
encoding="utf-8") encoding="utf-8")
x_window_id_has_focus = x_window_focus.stdout.splitlines()[0] x_window_id_has_focus = x_window_focus.stdout.splitlines()[0]
if x_window_id_has_focus in dm_windows: if x_window_id_has_focus in dm_windows:
@ -107,12 +127,24 @@ def sddm_change_focus_if_two_windows() -> bool:
f"focus ({x_window_id_has_focus})") f"focus ({x_window_id_has_focus})")
dm_windows.remove(x_window_id_has_focus) dm_windows.remove(x_window_id_has_focus)
x_focus_window(dm_windows[0]) x_focus_window(dm_windows[0])
return True
else: else:
log.warning(f"Number of 'sddm-greeter' windows ({len(dm_windows)}) is unexpected, not doing " log.warning(f"Number of 'sddm-greeter' windows ({len(dm_windows)}) unexpected, "
f"anything") f"not doing anything")
return False
else: else:
log.debug(f"No other 'sddm-greeter' windows exist, checking again ...")
sddm_window_count_attempt += 1
if sddm_window_count_attempt == sddm_window_count_attempt_max:
log.debug(f"No other 'sddm-greeter' windows exist, no need to focus anything") log.debug(f"No other 'sddm-greeter' windows exist, no need to focus anything")
return False
except subprocess.CalledProcessError as xdotool_error: except subprocess.CalledProcessError as xdotool_error:
if sddm_focus_attempt < sddm_focus_attempt_max:
log.debug(f"Unable to get ID of focused window, checking again in "
f"""{sddm_focus_sleep} {p.plural("second", sddm_focus_sleep)} ...""")
sddm_focus_attempt += 1
time.sleep(sddm_focus_sleep)
else:
log.warning(f"Unable to get ID of focused window") log.warning(f"Unable to get ID of focused window")
log.warning(xdotool_error) log.warning(xdotool_error)
return False return False
@ -166,6 +198,7 @@ def signal_handler(rx_signal: int, frame) -> None:
def set_xauth_env(file_abs_path: str) -> None: def set_xauth_env(file_abs_path: str) -> None:
os.environ["XAUTHORITY"] = file_abs_path os.environ["XAUTHORITY"] = file_abs_path
log.debug(f"""Env variable 'XAUTHORITY' set to '{os.environ["XAUTHORITY"]}'""") log.debug(f"""Env variable 'XAUTHORITY' set to '{os.environ["XAUTHORITY"]}'""")
sddm_change_focus_if_two_windows()
signal.signal(signal.SIGINT, signal_handler) signal.signal(signal.SIGINT, signal_handler)
@ -190,9 +223,9 @@ xdo_map = {
} }
set_xauth_env(xauth_abs_path)
os.environ["DISPLAY"] = ":0" os.environ["DISPLAY"] = ":0"
log.debug(f"""Env variable 'DISPLAY' set to '{os.environ["DISPLAY"]}'""") log.debug(f"""Env variable 'DISPLAY' set to '{os.environ["DISPLAY"]}'""")
set_xauth_env(xauth_abs_path)
log.debug(f"Activating event handlers ...") log.debug(f"Activating event handlers ...")
@ -200,7 +233,6 @@ cec.add_callback(keypress_handler, cec.EVENT_KEYPRESS)
cec.add_callback(log_handler, cec.EVENT_LOG) cec.add_callback(log_handler, cec.EVENT_LOG)
log.debug(f"Event handlers active") log.debug(f"Event handlers active")
log.info(f"Open for business on adapter '{use_adapter}'!") log.info(f"Open for business on adapter '{use_adapter}'!")
sddm_change_focus_if_two_windows()
while True: while True:

View File

@ -1,3 +1,4 @@
cec cec
inotify_simple inotify_simple
rich rich
inflect

View File

@ -10,6 +10,10 @@ colorama==0.4.4
# via rich # via rich
commonmark==0.9.1 commonmark==0.9.1
# via rich # via rich
inflect==5.4.0
# via -r requirements.in
inotify-simple==1.3.5
# via -r requirements.in
pygments==2.11.2 pygments==2.11.2
# via rich # via rich
rich==11.2.0 rich==11.2.0