diff --git a/src/gui/lib-api.asm b/src/gui/lib-api.asm
index d173e67..d57742f 100644
--- a/src/gui/lib-api.asm
+++ b/src/gui/lib-api.asm
@@ -86,11 +86,11 @@ gui_api_table:
; --- Structure d'un OBJET (Bouton, etc) ---
struc widget
- .header resw 1 ; HEADER
.state resb 1 ; État (0=libre, >0=utilisé)
.type resb 1 ; Type (0=Button, 1=Slider...)
.oldstate resb 1 ; widget a-t-il été modifié ?
.user_id resb 1 ; ID unique utilisateur
+ .win_id resb 1 ; ID de la fenêtre propriétaire
.x resw 1 ; Position Xevent_drag
.y resw 1 ; Position Y
.w resw 1 ; Largeur
@@ -254,9 +254,6 @@ gui_api_create:
mov cx, widget_size
div cx
- mov bx, 0xDEAD
- mov word [gs:si + widget.header], bx
-
mov bx, .type
mov byte [gs:si + widget.type], bl
mov bx, .x
diff --git a/src/gui/lib-logic.asm b/src/gui/lib-logic.asm
index 3fab1b0..433f797 100644
--- a/src/gui/lib-logic.asm
+++ b/src/gui/lib-logic.asm
@@ -26,6 +26,9 @@ gui_process_all:
mov bl, [PTR_MOUSE + mouse.status]
pop ds
+ ; Récupérer l'ID de la fenêtre active
+ mov dl, [wm_active_window_id]
+
mov si, 0 ; Pointeur début tableau
mov di, GUI_MAX_WIDGETS ; Compteur
diff --git a/src/gui/window.asm b/src/gui/lib-wm-draw.asm
similarity index 78%
rename from src/gui/window.asm
rename to src/gui/lib-wm-draw.asm
index da6d9bd..5d22443 100644
--- a/src/gui/window.asm
+++ b/src/gui/lib-wm-draw.asm
@@ -1,63 +1,3 @@
-; =============================================================================
-; Project : Custom BIOS / ROM
-; File : gui/window.asm
-; Author : frater
-;
-; License : GNU General Public License v3.0 or later (GPL-3.0+)
-;
-; This program is free software: you can redistribute it and/or modify
-; it under the terms of the GNU General Public License as published by
-; the Free Software Foundation, either version 3 of the License, or
-; (at your option) any later version.
-;
-; This program is distributed in the hope that it will be useful,
-; but WITHOUT ANY WARRANTY; without even the implied warranty of
-; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-; GNU General Public License for more details.
-;
-; You should have received a copy of the GNU General Public License
-; along with this program. If not, see .
-;
-; =============================================================================
-
-%macro GUI 1-*
- ; %1 est l'index de la fonction
- ; On itère sur les arguments suivants en sens inverse (Convention C)
-
- %rep %0 - 1 ; Répéter pour (Nombre d'args - 1)
- %rotate -1 ; Prend le dernier argument
- push %1 ; L'empile
- %endrep
-
- %rotate -1 ; On revient au premier argument (l'index de fonction)
- call word [cs:graph_driver + ((%1)*2)]
-
- ; Nettoyage de la pile (Convention CDECL: l'appelant nettoie)
- ; Chaque argument = 2 octets (1 word).
- add sp, (%0 - 1) * 2
-%endmacro
-
-; ------------------------------------------------------------
-; TABLE DE SAUT (VECTEURS API)
-; Cette table doit être située au début du driver pour être
-; accessible par la GUI à des offsets fixes.
-; ------------------------------------------------------------
-%define WINDOW 0
-
-; ------------------------------------------------------------
-; COMMENTAIRE SUR LA MÉTHODE D'APPEL
-;
-; GFX FUNCTION, Arg1, Arg2, Arg3
-;
-; GFX GFX_PUTPIXEL, 320, 100, 1
-;
-; Si vous changez le code du driver, tant que la table au début
-; ne change pas d'ordre, la GUI n'a pas besoin d'être recompilée.
-; ------------------------------------------------------------
-
-gui_driver:
- dw draw_window
-
; =============================================================================
; Fonction : draw_window
; Description : Dessine une fenêtre style Mac System 1.0
diff --git a/src/gui/lib-wm.asm b/src/gui/lib-wm.asm
new file mode 100644
index 0000000..b5ad4ee
--- /dev/null
+++ b/src/gui/lib-wm.asm
@@ -0,0 +1,121 @@
+; =============================================================================
+; Project : Custom BIOS / ROM
+; File : gui/window.asm
+; Author : frater
+;
+; License : GNU General Public License v3.0 or later (GPL-3.0+)
+;
+; This program is free software: you can redistribute it and/or modify
+; it under the terms of the GNU General Public License as published by
+; the Free Software Foundation, either version 3 of the License, or
+; (at your option) any later version.
+;
+; This program is distributed in the hope that it will be useful,
+; but WITHOUT ANY WARRANTY; without even the implied warranty of
+; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+; GNU General Public License for more details.
+;
+; You should have received a copy of the GNU General Public License
+; along with this program. If not, see .
+;
+; =============================================================================
+
+; =============================================================================
+; Project : Custom BIOS / ROM
+; File : gui/window-manager.asm
+; Description : Gestionnaire de fenêtres (Window Manager)
+; =============================================================================
+
+%define MAX_WINDOWS 8
+
+; --- États d'une fenêtre ---
+%define WIN_STATE_FREE 0 ; Slot libre en mémoire
+%define WIN_STATE_INACTIVE 1 ; Affichée en arrière-plan
+%define WIN_STATE_ACTIVE 2 ; Au premier plan (focus)
+%define WIN_STATE_HIDDEN 3 ; Invisible
+
+struc window
+ .state resb 1 ; État de la fenêtre
+ .id resb 1 ; Identifiant unique
+ .x resw 1
+ .y resw 1
+ .w resw 1
+ .h resw 1
+ .title_ofs resw 1 ; Pointeur texte du titre
+ .title_seg resw 1
+ .process_cb resw 1 ; NOUVEAU : Offset du callback (processus de la fenêtre)
+ .process_seg resw 1 ; Segment du callback
+endstruc
+
+%define window_size 16
+
+; Variables globales du WM (à placer dans le segment BDA_CUSTOM ou SEG_GUI)
+wm_active_window_id db 0 ; ID de la fenêtre actuellement active
+
+; -----------------------------------------------------------------------------
+; wm_process_all
+; Remplace la boucle principale. Gère les processus de fenêtre puis la GUI.
+; -----------------------------------------------------------------------------
+wm_process_all:
+ pusha
+ push ds
+ push gs
+
+ mov ax, SEG_GUI
+ mov gs, ax
+
+ ; 1. Gérer les processus des fenêtres
+ mov si, 0 ; On suppose que le pool window commence à l'offset 0 d'une zone dédiée
+ mov cx, MAX_WINDOWS
+
+ .loop_windows:
+ cmp byte [gs:si + window.state], WIN_STATE_FREE
+ je .next_window
+
+ ; VÉRIFICATION : Est-ce que la fenêtre est ACTIVE ?
+ ; Selon votre règle : on n'appelle pas le processus si elle n'est pas active.
+ cmp byte [gs:si + window.state], WIN_STATE_ACTIVE
+ jne .next_window
+
+ ; La fenêtre est active, a-t-elle un processus (callback) défini ?
+ cmp word [gs:si + window.process_cb], 0
+ je .next_window
+
+ ; Exécution du processus spécifique à la fenêtre active
+ pusha
+ ; Appel inter-segment (Far Call) ou intra-segment (Near Call) selon l'architecture
+ ; Ici on simule un near call si tout est dans CS
+ call word [gs:si + window.process_cb]
+ popa
+
+ .next_window:
+ add si, window_size
+ loop .loop_windows
+
+ ; 2. Appeler le moteur d'événements des widgets (lib-logic)
+ call gui_process_all
+
+ pop gs
+ pop ds
+ popa
+ ret
+
+; -----------------------------------------------------------------------------
+; wm_set_active
+; Change la fenêtre active (Focus)
+; In: AL = window_id
+; -----------------------------------------------------------------------------
+wm_set_active:
+ push gs
+ push bx
+
+ ; Sauvegarder le nouvel ID actif
+ mov [wm_active_window_id], al
+
+ ; Note : Ici vous pourriez rajouter une boucle pour passer toutes les
+ ; autres fenêtres en WIN_STATE_INACTIVE et redessiner le tout pour
+ ; mettre la fenêtre active au premier plan (Z-Order).
+
+ pop bx
+ pop gs
+ ret
\ No newline at end of file