#!/usr/bin/python3

import sys
import subprocess

from pywayland.client.display import Display
from pywayland.protocol.idle_inhibit_unstable_v1.zwp_idle_inhibit_manager_v1 import ZwpIdleInhibitManagerV1
from pywayland.protocol.wayland.wl_compositor import WlCompositor
from pywayland.protocol.wayland.wl_registry import WlRegistryProxy

class WaylandRegistryUserData():
    def __init__(self):
        self.surface = None
        self.idle_inhibit_manager = None

def registry_handle_global(registry: WlRegistryProxy, id_: int, interface: str, version: int) -> None:
    registry_user_data: WaylandRegistryUserData = registry.user_data
    if interface == "wl_compositor":
        compositor = registry.bind(id_, WlCompositor, version)
        registry_user_data.surface = compositor.create_surface()
    elif interface == "zwp_idle_inhibit_manager_v1":
        registry_user_data.idle_inhibit_manager = registry.bind(id_, ZwpIdleInhibitManagerV1, version)

def main(process: list = []) -> None:
    registry_user_data = WaylandRegistryUserData()

    display = Display()
    display.connect()

    registry = display.get_registry()
    registry.user_data = registry_user_data
    registry.dispatcher["global"] = registry_handle_global

    def sync_commands() -> None:
        display.dispatch()
        display.roundtrip()
    
    sync_commands()

    if registry_user_data.surface is None or registry_user_data.idle_inhibit_manager is None:
        sync_commands()
        display.disconnect()
        raise RuntimeError("Could not get required protocols!")
    
    inhibitor = registry_user_data.idle_inhibit_manager.create_inhibitor(registry_user_data.surface)
    
    sync_commands()

    if process != []:
        subprocess.run(process)

    inhibitor.destroy()
    sync_commands()
    display.disconnect()

if __name__ == "__main__":
    main(process = sys.argv[1::])
