window manager start
This commit is contained in:
parent
68284127e3
commit
20678ed7f0
4 changed files with 125 additions and 64 deletions
|
|
@ -86,11 +86,11 @@ gui_api_table:
|
||||||
|
|
||||||
; --- Structure d'un OBJET (Bouton, etc) ---
|
; --- Structure d'un OBJET (Bouton, etc) ---
|
||||||
struc widget
|
struc widget
|
||||||
.header resw 1 ; HEADER
|
|
||||||
.state resb 1 ; État (0=libre, >0=utilisé)
|
.state resb 1 ; État (0=libre, >0=utilisé)
|
||||||
.type resb 1 ; Type (0=Button, 1=Slider...)
|
.type resb 1 ; Type (0=Button, 1=Slider...)
|
||||||
.oldstate resb 1 ; widget a-t-il été modifié ?
|
.oldstate resb 1 ; widget a-t-il été modifié ?
|
||||||
.user_id resb 1 ; ID unique utilisateur
|
.user_id resb 1 ; ID unique utilisateur
|
||||||
|
.win_id resb 1 ; ID de la fenêtre propriétaire
|
||||||
.x resw 1 ; Position Xevent_drag
|
.x resw 1 ; Position Xevent_drag
|
||||||
.y resw 1 ; Position Y
|
.y resw 1 ; Position Y
|
||||||
.w resw 1 ; Largeur
|
.w resw 1 ; Largeur
|
||||||
|
|
@ -254,9 +254,6 @@ gui_api_create:
|
||||||
mov cx, widget_size
|
mov cx, widget_size
|
||||||
div cx
|
div cx
|
||||||
|
|
||||||
mov bx, 0xDEAD
|
|
||||||
mov word [gs:si + widget.header], bx
|
|
||||||
|
|
||||||
mov bx, .type
|
mov bx, .type
|
||||||
mov byte [gs:si + widget.type], bl
|
mov byte [gs:si + widget.type], bl
|
||||||
mov bx, .x
|
mov bx, .x
|
||||||
|
|
|
||||||
|
|
@ -26,6 +26,9 @@ gui_process_all:
|
||||||
mov bl, [PTR_MOUSE + mouse.status]
|
mov bl, [PTR_MOUSE + mouse.status]
|
||||||
pop ds
|
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 si, 0 ; Pointeur début tableau
|
||||||
mov di, GUI_MAX_WIDGETS ; Compteur
|
mov di, GUI_MAX_WIDGETS ; Compteur
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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 <https://www.gnu.org/licenses/>.
|
|
||||||
;
|
|
||||||
; =============================================================================
|
|
||||||
|
|
||||||
%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
|
; Fonction : draw_window
|
||||||
; Description : Dessine une fenêtre style Mac System 1.0
|
; Description : Dessine une fenêtre style Mac System 1.0
|
||||||
121
src/gui/lib-wm.asm
Normal file
121
src/gui/lib-wm.asm
Normal file
|
|
@ -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 <https://www.gnu.org/licenses/>.
|
||||||
|
;
|
||||||
|
; =============================================================================
|
||||||
|
|
||||||
|
; =============================================================================
|
||||||
|
; 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
|
||||||
Loading…
Reference in a new issue