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