# Annexe : Noyau - main.py

## Rôle et utilité

Le fichier `main.py` est situé à la racine du projet (`grimos_build/`). C'est le tout premier fichier exécuté par Python lorsque le système d'exploitation démarre (généralement appelé par le script `.xinitrc` de Linux via la commande `startx`). C'est l'étincelle qui allume le moteur de GrimOS.

## Implémentation technique

- Initialisation de Tkinter : C'est ici qu'est instancié l'objet `root = tk.Tk()`, qui est la fenêtre mère absolue de tout le système. Elle est configurée pour prendre tout l'écran (`-fullscreen`).
- Gestionnaire global de clic (`on_global_click`) : Ce script contient un "hack" essentiel. Il intercepte tous les clics gauches (`<ButtonPress-1>`) sur l'écran. Si l'utilisateur clique à l'intérieur d'une fausse fenêtre (`Window`), ce gestionnaire ordonne à la fenêtre de passer au premier plan (`w.lift()`), simulant le comportement d'un vrai bureau.
- Boucle Principale : L'exécution s'arrête sur `root.mainloop()`. C'est cette boucle infinie qui maintient l'ordinateur éveillé et gère l'affichage à 60 images par seconde.
- Redémarrage à chaud : Si la session est fermée avec une demande de redémarrage (flag `restart_requested`), le script utilise `os.execl` pour tuer le processus Python actuel et le relancer immédiatement à partir de zéro, permettant de recharger tous les fichiers du système sans redémarrer le serveur X11.

## Pistes de modification

- Gestion des écrans multiples : Actuellement, GrimOS est pensé pour un seul écran. Un développeur pourrait modifier `root.geometry()` ici pour étendre le `Canvas` sur plusieurs moniteurs.

## Code Source

    import sys
    import os
    import tkinter as tk

    # Add project root to path
    sys.path.append(os.path.dirname(os.path.abspath(__file__)))

    from core.config import load_settings
    from core.desktop import Desktop

    def main():
        settings = load_settings()

        root = tk.Tk()
        root.config(cursor="left_ptr")
        root.title("GrimOS")

        def on_global_click(event):
            try:
                if hasattr(event.widget, 'focus_target'):
                    event.widget.focus_target.focus_set()
                else:
                    event.widget.focus_set()
            except Exception:
                pass

            w = event.widget
            while hasattr(w, 'master') and w.master:
                if w.__class__.__name__ == 'Window':
                    w.lift()
                    break
                w = w.master

        root.bind_all("<ButtonPress-1>", on_global_click, add="+")

        if settings.get("fullscreen", False):
            w = root.winfo_screenwidth()
            h = root.winfo_screenheight()
            root.geometry(f"{w}x{h}+0+0")
            root.attributes('-fullscreen', True)
        else:
            res = settings.get("resolution", "1024x768")
            root.geometry(res)

        theme_name = settings.get("theme", "GrimOS")
        from core.theme import apply_theme
        apply_theme(root, theme_name)

        desktop = Desktop(root, settings)
        desktop.restart_requested = False

        root.mainloop()

        if getattr(desktop, "restart_requested", False):
            script = os.path.abspath(sys.argv[0])
            os.execl(sys.executable, sys.executable, script)

    if __name__ == "__main__":
        main()