From b033741431d6567700b3cdf8e631c8f45eedb877 Mon Sep 17 00:00:00 2001 From: Mario Steele Date: Mon, 2 Mar 2026 02:01:30 -0600 Subject: [PATCH] Created Tests to workout ProcessTree Test work to see what is needed to create ProcessTree, should work on *nix based systems, such as MacOS and Linux, since ps is available there. Need to work on windows with tasklist. --- tools/pt_testing.gd | 94 +++++++++++++++++++++++++++++++++++++++++ tools/pt_testing.gd.uid | 1 + 2 files changed, 95 insertions(+) create mode 100644 tools/pt_testing.gd create mode 100644 tools/pt_testing.gd.uid diff --git a/tools/pt_testing.gd b/tools/pt_testing.gd new file mode 100644 index 00000000..84afb85c --- /dev/null +++ b/tools/pt_testing.gd @@ -0,0 +1,94 @@ +@tool +extends EditorScript + +var finds: Array = [ + "kitty", + "/opt/zen-browser-bin/zen-bin", + "zen-bin", + "bin/dolphin", + "Discord", + "discord" +] + +class ProcessInfoTest: + extends RefCounted + var user: int + var pid: int + var ppid: int + var executable: String + + func _init(_user: String, _pid: String, _ppid: String, name: String) -> void: + user = _user.to_int() + pid = _pid.to_int() + ppid = _ppid.to_int() + executable = name + + func _to_string() -> String: + return "" % [pid, ppid, user, executable] + + func is_running() -> bool: + return OS.is_process_running(pid) + + func kill() -> Error: + return OS.kill(pid) + + func kill_parent() -> Error: + return OS.kill(ppid) + +class ProcessTreeTest: + extends RefCounted + var processes: Array[ProcessInfoTest] = [] + + func _init() -> void: + refresh() + + func refresh() -> void: + processes.clear() + var output := [] + OS.execute("/usr/bin/ps", ["-eo", "uid,pid,ppid,exe"], output) + var lines: PackedStringArray = output[0].split("\n") + for line in lines: + var parts = line.split(" ",false,4) + if parts[0] == "UID": + continue + if parts[3] == "-": + continue + var proc: ProcessInfoTest = ProcessInfoTest.new(parts[0],parts[1],parts[2],parts[3]) + processes.append(proc) + + func has_process_id(id: int) -> bool: + return processes.any(func(x: ProcessInfoTest): return x.pid == id) + + func has_process_name(name: String) -> bool: + return processes.any(func(x: ProcessInfoTest): return x.executable == name or name in x.executable) + + func get_process(id: int) -> ProcessInfoTest: + for proc: ProcessInfoTest in processes: + if proc.pid == id: + return proc + return null + + func get_process_by_name(name: String) -> ProcessInfoTest: + for proc: ProcessInfoTest in processes: + if proc.executable == name or name in proc.executable: + return proc + return null + + func get_all_processes_by_name(name: String) -> Array[ProcessInfoTest]: + var procs: Array[ProcessInfoTest] = [] + for proc: ProcessInfoTest in processes: + if proc.executable == name or name in proc.executable: + procs.append(proc) + return procs + +# Called when the script is executed (using File -> Run in Script Editor). +func _run() -> void: + var tree := ProcessTreeTest.new() + for name in finds: + var has_proc := tree.has_process_name(name) + var proc := tree.get_process_by_name(name) + var procs := tree.get_all_processes_by_name(name) + print("Has Process '%s': %s" % [name, has_proc]) + print("First Process '%s': %s" % [name, proc]) + print("Processes '%s': %s" % [name, procs]) + print("") diff --git a/tools/pt_testing.gd.uid b/tools/pt_testing.gd.uid new file mode 100644 index 00000000..623b9b7a --- /dev/null +++ b/tools/pt_testing.gd.uid @@ -0,0 +1 @@ +uid://b6xjdxwi4o27f