Merge branch 'zdy'
This commit is contained in:
@@ -181,7 +181,7 @@ _accessibility_ns_map = {"st": "uri:deskat:state.at-spi.gnome.org"
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
def _create_atspi_node(node: Accessible) -> _Element:
|
def _create_atspi_node(node: Accessible, depth: int, flag: Optional[str] = None) -> _Element:
|
||||||
attribute_dict: Dict[str, Any] = {"name": node.name}
|
attribute_dict: Dict[str, Any] = {"name": node.name}
|
||||||
|
|
||||||
# States {{{ #
|
# States {{{ #
|
||||||
@@ -302,15 +302,58 @@ def _create_atspi_node(node: Accessible) -> _Element:
|
|||||||
)
|
)
|
||||||
if "text" in locals() and len(text) > 0:
|
if "text" in locals() and len(text) > 0:
|
||||||
xml_node.text = text
|
xml_node.text = text
|
||||||
|
|
||||||
# HACK: libreoffice has a problem -> billions of children for parent with RoleName "document spreadsheet"
|
# HACK: libreoffice has a problem -> billions of children for parent with RoleName "document spreadsheet"
|
||||||
if node.getRoleName() == "document spreadsheet":
|
#if node.getRoleName() == "document spreadsheet":
|
||||||
|
#return xml_node
|
||||||
|
# HYPERPARAMETER
|
||||||
|
if depth==50:
|
||||||
|
logger.warning("Max depth reached")
|
||||||
return xml_node
|
return xml_node
|
||||||
|
|
||||||
for ch in node:
|
# HACK: libreoffice has a problem -> billions of children for parent with RoleName "document spreadsheet"
|
||||||
xml_node.append(_create_atspi_node(ch))
|
if node.getRoleName() == "document spreadsheet":
|
||||||
return xml_node
|
flag = "calc"
|
||||||
|
|
||||||
|
if flag=="calc" and node_role_name=="table":
|
||||||
|
# Maximum column: 1024 if ver<=7.3 else 16384
|
||||||
|
# Maximum row: 104 8576
|
||||||
|
# Maximun sheet: 1 0000
|
||||||
|
|
||||||
|
version_str: str = subprocess.run("libreoffice --version", shell=True, text=True, stdout=subprocess.PIPE).stdout
|
||||||
|
version_str = version_str.split()[1]
|
||||||
|
version_tuple: Tuple[int] = tuple(map(int, version_str.split(".")))
|
||||||
|
MAXIMUN_COLUMN = 1024 if version_tuple<(7, 4) else 16384
|
||||||
|
MAX_ROW = 104_8576
|
||||||
|
|
||||||
|
index_base = 0
|
||||||
|
first_showing = False
|
||||||
|
column_base = None
|
||||||
|
for r in range(MAX_ROW):
|
||||||
|
#logger.warning(r)
|
||||||
|
for clm in range(column_base or 0, MAXIMUN_COLUMN):
|
||||||
|
child_node: Accessible = node[index_base+clm]
|
||||||
|
showing: bool = child_node.getState().contains(STATE_SHOWING)
|
||||||
|
if showing:
|
||||||
|
child_node: _Element = _create_atspi_node(child_node, depth+1, flag)
|
||||||
|
if not first_showing:
|
||||||
|
column_base = clm
|
||||||
|
first_showing = True
|
||||||
|
xml_node.append(child_node)
|
||||||
|
elif first_showing and column_base is not None or clm>=500:
|
||||||
|
break
|
||||||
|
if first_showing and clm==column_base or not first_showing and r>=500:
|
||||||
|
break
|
||||||
|
index_base += MAXIMUN_COLUMN
|
||||||
|
return xml_node
|
||||||
|
else:
|
||||||
|
for i, ch in enumerate(node):
|
||||||
|
# HYPERPARAMETER
|
||||||
|
if i>=1025:
|
||||||
|
logger.warning("Max width reached")
|
||||||
|
break
|
||||||
|
xml_node.append(_create_atspi_node(ch, depth+1, flag))
|
||||||
|
return xml_node
|
||||||
|
|
||||||
@app.route("/accessibility", methods=["GET"])
|
@app.route("/accessibility", methods=["GET"])
|
||||||
def get_accessibility_tree():
|
def get_accessibility_tree():
|
||||||
@@ -319,8 +362,9 @@ def get_accessibility_tree():
|
|||||||
# AT-SPI works for KDE as well
|
# AT-SPI works for KDE as well
|
||||||
if os_name == "Linux":
|
if os_name == "Linux":
|
||||||
desktop: Accessible = pyatspi.Registry.getDesktop(0)
|
desktop: Accessible = pyatspi.Registry.getDesktop(0)
|
||||||
desktop_xml: _Element = _create_atspi_node(desktop)
|
desktop_xml: _Element = _create_atspi_node(desktop, 0)
|
||||||
return jsonify({"AT": lxml.etree.tostring(desktop_xml, encoding="unicode")})
|
return jsonify({"AT": lxml.etree.tostring(desktop_xml, encoding="unicode")})
|
||||||
|
|
||||||
# TODO: Windows AT may be read through `pywinauto` module, however, two different backends `win32` and `uia` are supported and different results may be returned
|
# TODO: Windows AT may be read through `pywinauto` module, however, two different backends `win32` and `uia` are supported and different results may be returned
|
||||||
else:
|
else:
|
||||||
return "Currently not implemented for platform {:}.".format(platform.platform()), 500
|
return "Currently not implemented for platform {:}.".format(platform.platform()), 500
|
||||||
@@ -487,7 +531,7 @@ def get_directory_tree():
|
|||||||
def get_file():
|
def get_file():
|
||||||
# Retrieve filename from the POST request
|
# Retrieve filename from the POST request
|
||||||
if 'file_path' in request.form:
|
if 'file_path' in request.form:
|
||||||
file_path = os.path.expanduser(request.form['file_path'])
|
file_path = os.path.expandvars(os.path.expanduser(request.form['file_path']))
|
||||||
else:
|
else:
|
||||||
return jsonify({"error": "file_path is required"}), 400
|
return jsonify({"error": "file_path is required"}), 400
|
||||||
|
|
||||||
@@ -503,7 +547,7 @@ def get_file():
|
|||||||
def upload_file():
|
def upload_file():
|
||||||
# Retrieve filename from the POST request
|
# Retrieve filename from the POST request
|
||||||
if 'file_path' in request.form and 'file_data' in request.files:
|
if 'file_path' in request.form and 'file_data' in request.files:
|
||||||
file_path = os.path.expanduser(request.form['file_path'])
|
file_path = os.path.expandvars(os.path.expanduser(request.form['file_path']))
|
||||||
file = request.files["file_data"]
|
file = request.files["file_data"]
|
||||||
file.save(file_path)
|
file.save(file_path)
|
||||||
return "File Uploaded"
|
return "File Uploaded"
|
||||||
@@ -529,7 +573,7 @@ def change_wallpaper():
|
|||||||
if not path:
|
if not path:
|
||||||
return "Path not supplied!", 400
|
return "Path not supplied!", 400
|
||||||
|
|
||||||
path = Path(os.path.expanduser(path))
|
path = Path(os.path.expandvars(os.path.expanduser(path)))
|
||||||
|
|
||||||
if not path.exists():
|
if not path.exists():
|
||||||
return f"File not found: {path}", 404
|
return f"File not found: {path}", 404
|
||||||
@@ -560,10 +604,11 @@ def download_file():
|
|||||||
if not url or not path:
|
if not url or not path:
|
||||||
return "Path or URL not supplied!", 400
|
return "Path or URL not supplied!", 400
|
||||||
|
|
||||||
path = Path(os.path.expanduser(path))
|
path = Path(os.path.expandvars(os.path.expanduser(path)))
|
||||||
path.parent.mkdir(parents=True, exist_ok=True)
|
path.parent.mkdir(parents=True, exist_ok=True)
|
||||||
|
|
||||||
max_retries = 3
|
max_retries = 3
|
||||||
|
error: Optional[Exception] = None
|
||||||
for i in range(max_retries):
|
for i in range(max_retries):
|
||||||
try:
|
try:
|
||||||
response = requests.get(url, stream=True)
|
response = requests.get(url, stream=True)
|
||||||
@@ -576,9 +621,10 @@ def download_file():
|
|||||||
return "File downloaded successfully"
|
return "File downloaded successfully"
|
||||||
|
|
||||||
except requests.RequestException as e:
|
except requests.RequestException as e:
|
||||||
|
error = e
|
||||||
logger.error(f"Failed to download {url}. Retrying... ({max_retries - i - 1} attempts left)")
|
logger.error(f"Failed to download {url}. Retrying... ({max_retries - i - 1} attempts left)")
|
||||||
|
|
||||||
return f"Failed to download {url}. No retries left. Error: {e}", 500
|
return f"Failed to download {url}. No retries left. Error: {error}", 500
|
||||||
|
|
||||||
|
|
||||||
@app.route("/setup/open_file", methods=['POST'])
|
@app.route("/setup/open_file", methods=['POST'])
|
||||||
@@ -589,7 +635,7 @@ def open_file():
|
|||||||
if not path:
|
if not path:
|
||||||
return "Path not supplied!", 400
|
return "Path not supplied!", 400
|
||||||
|
|
||||||
path = Path(os.path.expanduser(path))
|
path = Path(os.path.expandvars(os.path.expanduser(path)))
|
||||||
|
|
||||||
if not path.exists():
|
if not path.exists():
|
||||||
return f"File not found: {path}", 404
|
return f"File not found: {path}", 404
|
||||||
|
|||||||
4
main.py
4
main.py
@@ -91,12 +91,12 @@ def human_agent():
|
|||||||
logger.info("The episode is done.")
|
logger.info("The episode is done.")
|
||||||
break
|
break
|
||||||
|
|
||||||
input("PAUSING")
|
#input("PAUSING")
|
||||||
|
|
||||||
result = env.evaluate()
|
result = env.evaluate()
|
||||||
logger.info("Result: %.2f", result)
|
logger.info("Result: %.2f", result)
|
||||||
|
|
||||||
input("PAUSING")
|
#input("PAUSING")
|
||||||
|
|
||||||
# env.close()
|
# env.close()
|
||||||
logger.info("Environment closed.")
|
logger.info("Environment closed.")
|
||||||
|
|||||||
Reference in New Issue
Block a user