dotfiles/.local/bin/monitor7.py
2025-05-28 18:33:04 +02:00

98 lines
3.3 KiB
Python
Executable File

#!/usr/bin/env python3
import dbus
import dbus.mainloop.glib
import os
from gi.repository import GLib
# Define the paths to the PNG icons
ICON_PATHS = {
"nvidia": "/home/teraflops/Icons/nvidia-icon.svg",
"integrated": "/home/teraflops/Icons/amd.png",
}
# Function to interpret the numerical status into a clearer message
def interpret_gpu_status(status):
if status == 0:
return "nvidia"
elif status == 1:
return "integrated"
else:
return None # Ignore "switching mode" and other unknown statuses
# Function to send the signal using `os.system()`
def send_signal_to_waybar():
try:
print("Sending RTMIN+3 signal to Waybar using os.system") # Debug message
os.system("/usr/bin/pkill -RTMIN+3 waybar")
except Exception as e:
print(f"Error sending the signal with os.system: {e}")
# Function to write the icon path as a shell script in /tmp/gpu
def write_gpu_icon_script(status_message):
try:
icon_path = ICON_PATHS.get(status_message)
if icon_path:
print(f"Writing to /tmp/gpu: #!/bin/sh\necho \"{icon_path}\"") # Debug message
with open("/tmp/gpu.sh", "w") as file:
file.write(f"#!/bin/sh\necho \"{icon_path}\"\n")
# Make the script executable
os.chmod("/tmp/gpu.sh", 0o755)
print(f"GPU script saved in /tmp/gpu: #!/bin/sh\necho \"{icon_path}\"")
else:
print(f"No icon found for the status: {status_message}")
except Exception as e:
print(f"Error writing the script in /tmp/gpu: {e}")
# Callback for `NotifyGfxStatus`
def on_notify_gfx_status(status):
print(f"`on_notify_gfx_status` callback invoked with status: {status}") # Debug
status_message = interpret_gpu_status(status)
# If the status is not "nvidia" or "integrated", ignore it
if status_message:
print(f"GPU Status changed: {status_message}")
# Save the shell script with the icon path in /tmp/gpu
write_gpu_icon_script(status_message)
# Send the signal to Waybar using os.system
send_signal_to_waybar()
else:
print("Intermediate status detected, no action will be taken.")
# Callback for `NotifyGfx`
def on_notify_gfx(vendor):
print(f"`on_notify_gfx` callback invoked with vendor: {vendor}")
# Callback for `NotifyAction`
def on_notify_action(action):
print(f"`on_notify_action` callback invoked with action: {action}")
# Initialize the D-Bus loop
dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)
# Connect to the system bus and get the object
bus = dbus.SystemBus()
proxy = bus.get_object("org.supergfxctl.Daemon", "/org/supergfxctl/Gfx")
# Subscribe to the `NotifyGfxStatus`, `NotifyGfx`, and `NotifyAction` signals
bus.add_signal_receiver(on_notify_gfx_status,
dbus_interface="org.supergfxctl.Daemon",
signal_name="NotifyGfxStatus")
bus.add_signal_receiver(on_notify_gfx,
dbus_interface="org.supergfxctl.Daemon",
signal_name="NotifyGfx")
bus.add_signal_receiver(on_notify_action,
dbus_interface="org.supergfxctl.Daemon",
signal_name="NotifyAction")
print("Monitoring GPU signals...")
# Start the main loop
loop = GLib.MainLoop()
loop.run()