# 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

```python
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()
```
