/***************************************************************************** Gestionnaire de terminal Unix: screen.h (c) Pierre Adriaans 1994 ------------------------------------------------------------------------------ Include de screen.c Gestionnaire d'ecran pour terminaux en mode texte. - prevu pour travailler avec la librairie de gestion clavier Keyboard.c - travaille avec une emulation de memoire video. - implemente un multi-fenetrage LIFO - les fenetres peuvent etre ombrees. - les fonction ne controlent pas les coordonnees des fenetres. Gare au SIGSEGV !! - pour supprimer l'affichage d'ombrages sans modifier les appels a OpenWin, faites SetShading(0,0,NORMAL); - notion de fenetre active d'affichage et de saisie pour les fonctions Printf() et Gets() (dans leurs fichiers respectifs) - toute fonction d'interruption sur l'horloge est momentanement suspendue pendant les sections critiques d'affichage pour eviter les interferrences. - passer a l'inititalisation le #define correspondant au type de terminal, le gestionnaire s'adapte sans recompilation. *****************************************************************************/ #ifndef _SCREEN_H_ #define _SCREEN_H_ #include #include #include #include #include #include #include #include "ansi.h" /***************************************************************************** Definition de la resolution d'ecran *****************************************************************************/ #define NBRE_LIG 24 #define NBRE_COL 80 /***************************************************************************** Caracteristiques par defaut des ombrages de fenetre *****************************************************************************/ #define SHADE_HEIGHT 1 /* Nbre de colonnes a droites des fen */ #define SHADE_LENGTH 2 /* Nbre de lignes en dessous des fen */ #define SHADE_ATT PackAtt(NORMAL) /* Attribut */ #define UNSHADED 0 /* Pour des fenetres non ombrees */ #define SHADED 1 /* Pour des fenetres ombrees */ /***************************************************************************** Definition de l'emulation de memoire video *****************************************************************************/ struct VideoEle_s { char Code; char Attr; }; typedef struct VideoEle_s VideoEle_t; /***************************************************************************** Structures necessaires au multi-fenetrage LIFO *****************************************************************************/ /* Fenetres avec un cadre ou non */ #define UNFRAMED 0 #define SINGLE_FRAMED 1 #define DOUBLE_FRAMED 2 struct WinDesc_s { char Attr,CurrentAtt; int Lig,Col, Height,Length, ActLig,ActCol, ActHeight,ActLength, CursY,CursX, Shaded; VideoEle_t *Buffer; struct WinDesc_s *Prec; }; typedef struct WinDesc_s WinDesc_t; /***************************************************************************** Definitions relatives au type de terminal *****************************************************************************/ #define PC_SCREEN 0 /* #define a passer a l'initialisation */ #define VT_SCREEN 1 #define TEXT_SCREEN 2 /*---------------------------------------------------------------------------- Terminal Texte ----------------------------------------------------------------------------*/ /* Cadres simples */ #define TE_F_S_ULC '+' /* Coin superieur gauche */ #define TE_F_S_HO '-' /* Barre horizontale */ #define TE_F_S_URC '+' /* Coin superieur droit */ #define TE_F_S_VE '|' /* Barre verticale */ #define TE_F_S_LLC '+' /* Coin inferieur gauche */ #define TE_F_S_LRC '+' /* Coin inferieur droit */ /* Cadres doubles */ #define TE_F_D_ULC '+' /* Coin superieur gauche */ #define TE_F_D_HO '-' /* Barre horizontale */ #define TE_F_D_URC '+' /* Coin superieur droit */ #define TE_F_D_VE '|' /* Barre verticale */ #define TE_F_D_LLC '+' /* Coin inferieur gauche */ #define TE_F_D_LRC '+' /* Coin inferieur droit */ /* Jonctions de cadre: clockwise a partir de l'horizontale gauche. B = rien D = double S = simple */ #define TE_F_SSSS '+' /* | */ #define TE_F_SDSD '+' /* -+- */ #define TE_F_DSDS '+' /* | */ #define TE_F_DDDD '+' #define TE_F_BDDD '+' /* | */ #define TE_F_BSSS '+' /* |- */ #define TE_F_BSDS '+' /* | */ #define TE_F_BDSD '+' #define TE_F_SBSS '+' /* */ #define TE_F_DBDD '+' /* --- */ #define TE_F_DBDS '+' /* | */ #define TE_F_SBSD '+' #define TE_F_SSBS '+' /* | */ #define TE_F_DDBD '+' /* -| */ #define TE_F_DSBS '+' /* | */ #define TE_F_SDBD '+' #define TE_F_SSSB '+' /* | */ #define TE_F_DDDB '+' /* --- */ #define TE_F_DSDB '+' /* */ #define TE_F_SDSB '+' /* Autres caracteres */ #define TE_PLUS_MIN '?' /* Signe plus ou moins */ #define TE_DEGREE '?' /* Signe degre */ #define TE_MINUS_EQ '?' /* Signe inferieur ou egal */ #define TE_GREAT_EQ '?' /* Signe superieur ou egal */ #define TE_PI '?' /* Signe pi */ /*---------------------------------------------------------------------------- PC ----------------------------------------------------------------------------*/ /* Cadres simples */ #define PC_F_S_ULC 218 /* Coin superieur gauche */ #define PC_F_S_HO 196 /* Barre horizontale */ #define PC_F_S_URC 191 /* Coin superieur droit */ #define PC_F_S_VE 179 /* Barre verticale */ #define PC_F_S_LLC 192 /* Coin inferieur gauche */ #define PC_F_S_LRC 217 /* Coin inferieur droit */ /* Cadres doubles */ #define PC_F_D_ULC 201 /* Coin superieur gauche */ #define PC_F_D_HO 205 /* Barre horizontale */ #define PC_F_D_URC 187 /* Coin superieur droit */ #define PC_F_D_VE 186 /* Barre verticale */ #define PC_F_D_LLC 200 /* Coin inferieur gauche */ #define PC_F_D_LRC 188 /* Coin inferieur droit */ /* Jonctions de cadre: clockwise a partir de l'horizontale gauche. B = rien D = double S = simple */ #define PC_F_SSSS 197 #define PC_F_SDSD 215 #define PC_F_DSDS 216 #define PC_F_DDDD 206 #define PC_F_BSSS 195 #define PC_F_BDDD 204 #define PC_F_BSDS 198 #define PC_F_BDSD 199 #define PC_F_SBSS 194 #define PC_F_DBDD 203 #define PC_F_DBDS 209 #define PC_F_SBSD 210 #define PC_F_SSBS 180 #define PC_F_DDBD 185 #define PC_F_DSBS 181 #define PC_F_SDBD 182 #define PC_F_SSSB 193 #define PC_F_DDDB 202 #define PC_F_DSDB 207 #define PC_F_SDSB 208 /* Autres caracteres */ #define PC_DESKTOP 176 /* Centre du desktop */ #define PC_PLUS_MIN 241 /* Signe plus ou moins */ #define PC_DEGREE 248 /* Signe degre */ #define PC_MINUS_EQ 243 /* Signe inferieur ou egal */ #define PC_GREAT_EQ 242 /* Signe superieur ou egal */ #define PC_PI 227 /* Signe pi */ /*---------------------------------------------------------------------------- Terminal DEC ----------------------------------------------------------------------------*/ #define SWITCH_GRAPH printf("\033(0") /* Macros de passage de l'ecran en */ #define SWITCH_TEXT printf("\033(B") /* mode graphique / texte */ /* Tous les cadres sont simples sur terminaux DEC !! */ /* Cadres simples */ #define VT_F_S_ULC 'l' /* Coin superieur gauche */ #define VT_F_S_HO 'q' /* Barre horizontale */ #define VT_F_S_URC 'k' /* Coin superieur droit */ #define VT_F_S_VE 'x' /* Barre verticale */ #define VT_F_S_LLC 'm' /* Coin inferieur gauche */ #define VT_F_S_LRC 'j' /* Coin inferieur droit */ /* Cadres doubles */ #define VT_F_D_ULC 'l' /* Coin superieur gauche */ #define VT_F_D_HO 'q' /* Barre horizontale */ #define VT_F_D_URC 'k' /* Coin superieur droit */ #define VT_F_D_VE 'x' /* Barre verticale */ #define VT_F_D_LLC 'm' /* Coin inferieur gauche */ #define VT_F_D_LRC 'j' /* Coin inferieur droit */ /* Jonctions de cadre: clockwise a partir de l'horizontale gauche. B = rien D = double S = simple */ #define VT_F_SSSS 'n' /* | */ #define VT_F_SDSD 'n' /* -+- */ #define VT_F_DSDS 'n' /* | */ #define VT_F_DDDD 'n' #define VT_F_BDDD 't' /* | */ #define VT_F_BSSS 't' /* |- */ #define VT_F_BSDS 't' /* | */ #define VT_F_BDSD 't' #define VT_F_SBSS 'w' /* */ #define VT_F_DBDD 'w' /* --- */ #define VT_F_DBDS 'w' /* | */ #define VT_F_SBSD 'w' #define VT_F_SSBS 'u' /* | */ #define VT_F_DDBD 'u' /* -| */ #define VT_F_DSBS 'u' /* | */ #define VT_F_SDBD 'u' #define VT_F_SSSB 'v' /* | */ #define VT_F_DDDB 'v' /* --- */ #define VT_F_DSDB 'v' /* */ #define VT_F_SDSB 'v' /* Autres caracteres */ #define VT_DESKTOP 'a' /* Centre du desktop */ #define VT_PLUS_MIN 'g' /* Signe plus ou moins */ #define VT_DEGREE 'f' /* Signe degre */ #define VT_MINUS_EQ 'y' /* Signe inferieur ou egal */ #define VT_GREAT_EQ 'z' /* Signe superieur ou egal */ #define VT_PI '{' /* Signe pi */ /* Definition de la table de substitution */ #define NB_EXT_CHAR 38 struct VT_Table_s { unsigned char PC_Code; char VT_Code; }; typedef struct VT_Table_s VT_Table_t; /*---------------------------------------------------------------------------- Declaration en extern des caracteres contenant les codes etendus effectifs ----------------------------------------------------------------------------*/ #ifndef _SCREEN_SOURCE_CODE_ extern #endif char f_s_ulc_,f_s_ho_,f_s_urc_,f_s_ve_,f_s_llc_,f_s_lrc_, f_d_ulc_,f_d_ho_,f_d_urc_,f_d_ve_,f_d_llc_,f_d_lrc_, f_ssss_,f_sdsd_,f_dsds_,f_dddd_, f_bsss_,f_bddd_,f_bsds_,f_bdsd_, f_sbss_,f_dbdd_,f_dbds_,f_sbsd_, f_ssbs_,f_ddbd_,f_dsbs_,f_sdbd_, f_sssb_,f_dddb_,f_dsdb_,f_sdsb_, desktop_,plus_min_,degree_,minus_eq_,great_eq_,pi_; /*---------------------------------------------------------------------------- Defines d'acces aux variables contenant les caracteres etendus effectifs ----------------------------------------------------------------------------*/ #define F_S_ULC f_s_ulc_ /* Cadres simples */ #define F_S_HO f_s_ho_ #define F_S_URC f_s_urc_ #define F_S_VE f_s_ve_ #define F_S_LLC f_s_llc_ #define F_S_LRC f_s_lrc_ #define F_D_ULC f_d_ulc_ /* Cadres doubles */ #define F_D_HO f_d_ho_ #define F_D_URC f_d_urc_ #define F_D_VE f_d_ve_ #define F_D_LLC f_d_llc_ #define F_D_LRC f_d_lrc_ #define F_SSSS f_ssss_ /* Jonctions de cadres */ #define F_SDSD f_sdsd_ #define F_DSDS f_dsds_ #define F_DDDD f_dddd_ #define F_BSSS f_bsss_ #define F_BDDD f_bddd_ #define F_BSDS f_bsds_ #define F_BDSD f_bdsd_ #define F_SBSS f_sbss_ #define F_DBDD f_dbdd_ #define F_DBDS f_dbds_ #define F_SBSD f_sbsd_ #define F_SSBS f_ssbs_ #define F_DDBD f_ddbd_ #define F_DSBS f_dsbs_ #define F_SDBD f_sdbd_ #define F_SSSB f_sssb_ #define F_DDDB f_dddb_ #define F_DSDB f_dsdb_ #define F_SDSB f_sdsb_ #define C_DESKTOP desktop_ /* Autres caracteres */ #define C_PLUS_MIN plus_min_ #define C_DEGREE degree_ #define C_MINUS_EQ minus_eq_ #define C_GREAT_EQ great_eq_ #define C_PI pi_ /***************************************************************************** Macros de bloquage/debloquage du clavier pendant les sections critiques d'affichage. Succes non garanti ! *****************************************************************************/ #define LockKbd() (void)tcflow(0,TCIOFF) #define UnlockKbd() (void)tcflow(0,TCION) /***************************************************************************** Macro qui analyse si un caractere est affichable: - entre ' ' et 127: caracteres classiques - entre -127 et -1: caracteres etendus ce qui permet de ne pas afficher de caracteres de controles qui ne deplacent pas le curseur a l'ecran *****************************************************************************/ #define isdisplay(C) (((C >= ' ' && C < 127) || (C > -127 && C < 0)) ? 1 : 0) /***************************************************************************** Prototypes *****************************************************************************/ char PackAtt(char T,char B); void SetAtt(char Att); /***************************************************************************** Fonctions d'encapsulation: renvoient ou modifient les variables globales gerant la resolution, le curseur,... *****************************************************************************/ VT_Table_t *GetVT_TableAdress(void); void SetShading(int Length,int Height,char Attr); void GetShading(int *Length,int *Height,char *Attr); int GetScreenType(void); void GetScreenRes(int *NbLig,int *NbCol); void GetActiveWindow(int *Lig,int *Col,int *Height,int *Length); void SetActiveWindow(int Lig,int Col,int Height,int Length); void SetCurrentAtt(char NewAtt); char GetCurrentAtt(void); void GotoXY(int Lig,int Col); void SetXY(int Lig,int Col); void GetXY(int *Lig,int *Col); VideoEle_t *GetVideoMemoryAdress(void); WinDesc_t *GetActWinDesc(void); int GetNbreWin(void); /***************************************************************************** Fonction d'acces a l'ecran caractere par caractere a la base de la librairie. C'est cette fonction qui interprete les caracteres etendus suivant le type de terminal (Digital, texte ou PC). L'affichage est BUFFERISE (line buffered): les caracteres passes ne seront rellement affiches qu'a l'emission d'un '\n' ou a l'appel a fflush(stdout). Toutes les autres fonctions d'affichage de la librairie vident le buffer ecran en sortie, ce qui signifie un affichage immediat. Cette fonction deplace le curseur a l'ecran. *****************************************************************************/ void PutToScr(char c); /***************************************************************************** Fonctions d'acces a l'ecran ne modifiant ni la position du curseur ni l'attribut d'affichage courant. Toutes s'appuyent sur PutToScr. *****************************************************************************/ /*--------------------------------------------------------------------------*/ void ClrScr(void); /* Efface l'ecran */ /*--------------------------------------------------------------------------*/ void ClrZone(int Lig,int Col, /* Efface une zone d'ecran */ int Height,int Length, char Attr); /*--------------------------------------------------------------------------*/ int VidMemOffset(int Lig,int Col); /* Renvoie un offset dans la memoire video en fonction de 2 coord */ /*--------------------------------------------------------------------------*/ char GetChar(int Lig,int Col); /* Renvoie le caractere se trouvant a un endroit de l'ecran */ /*--------------------------------------------------------------------------*/ char GetAtt(int Lig,int Col); /* Renvoie l'attribut se trouvant a un endroit de l'ecran */ /*--------------------------------------------------------------------------*/ VideoEle_t GetVideoEle_s(int Lig, /* Renvoie le caractere et l'attr */ int Col); /* se trouvant a un endroit */ /* de l'ecran */ /*--------------------------------------------------------------------------*/ void PutChar(char Code,int Lig, /* Place un caractere a l'ecran */ int Col); /* sans changer l'attribut */ /*--------------------------------------------------------------------------*/ void PutAtt(char Attr,int Lig,int Col); /* Change l'attribut d'un caractere */ /*--------------------------------------------------------------------------*/ void WriteChar(char Code,char Attr, /* Affiche un caractere dans un */ int Lig,int Col); /* attribut */ /*--------------------------------------------------------------------------*/ void WriteString(char *Buffer, /* Affiche une chaine dans un */ char Attr,int Lig, /* attribut */ int Col); /*--------------------------------------------------------------------------*/ void PaintString(int Lig,int Col, /* Change l'attribut d'une chaine */ int Lg,char Attr); /* affichee */ /*--------------------------------------------------------------------------*/ void SetString(int Lig,int Col,int Lg, /* Remplace une chaine par un */ char Code); /* caractere sans changer l'att */ /*--------------------------------------------------------------------------*/ void PaintZone(int Lig,int Col, /* Change l'attribut d'une */ int Height,int Length, /* zone d'ecran */ char Attr); /*--------------------------------------------------------------------------*/ void SetZone(int Lig,int Col, /* Change les caracteres d'une zone */ int Height,int Length, /* d'ecran */ char Code); /*--------------------------------------------------------------------------*/ VideoEle_t *AllocateVideoBuffer( /* Reserve un buffer de sauvegarde */ int Height,int Length); /* d'une portion d'ecran */ /*--------------------------------------------------------------------------*/ void SaveZone(int Lig,int Col, /* Sauve une portion d'ecran */ int Height,int Length, VideoEle_t *Buf); /*--------------------------------------------------------------------------*/ void PutZone(int Lig,int Col, /* Restaure une portion d'ecran */ int Height,int Length, VideoEle_t *Buf); /*--------------------------------------------------------------------------*/ VideoEle_t *SaveScreen(void); /* Sauve un ecran entier */ /*--------------------------------------------------------------------------*/ void RestoreScreen( /* Restaure un ecran entier */ VideoEle_t *Buffer); /*--------------------------------------------------------------------------*/ void ScrollUpWin(int Lig,int Col, /* Scrolle une portion d'ecran vers */ int Height,int Length, /* le haut d'un nombre de lignes */ int NbreRows); /*--------------------------------------------------------------------------*/ void ScrollDownWin(int Lig,int Col, /* Scrolle une portion d'ecran vers */ int Height, /* le bas d'un nombre de lignes */ int Length, int NbreRows); /*--------------------------------------------------------------------------*/ /***************************************************************************** Gestion du multi-fenetrage LIFO *****************************************************************************/ /*--------------------------------------------------------------------------*/ void PaintWin(int Lig,int Col, /* Dessine une fenetre a l'ecran */ int Height,int Length, char Attr,int Frame, int Shaded); /*--------------------------------------------------------------------------*/ void PaintFrame(int Lig,int Col, /* Dessine un cadre a l'ecran */ int Height,int Length, char Attr,int Frame); /*--------------------------------------------------------------------------*/ int OpenWin(int Lig,int Col, /* Ouvre une fenetre en sauvant ce */ int Height,int Length, /* qu'elle recouvre */ char Attr,int Frame, int Shaded); /*--------------------------------------------------------------------------*/ void CloseWin(void); /* Referme la derniere fenetre ouverte */ /*--------------------------------------------------------------------------*/ /***************************************************************************** Divers *****************************************************************************/ /*--------------------------------------------------------------------------*/ void Window(int Lig,int Col, /* Regle la fenetre courante */ int Height,int Length); /* d'affichage en l'effacant dans */ /* l'attribut courant */ /*--------------------------------------------------------------------------*/ void DrawDesktop(char AttBar, /* Dessine le fond d'ecran */ char AttCenter); /* classique. Passer l'attribut du */ /* centre */ /*--------------------------------------------------------------------------*/ void ResetScreen(void); /* Reset de l'ecran. A utiliser */ /* avant le lancement de */ /* sous-commandes */ /*--------------------------------------------------------------------------*/ /***************************************************************************** Initialisation *****************************************************************************/ void InitScreen(int ScreenType); /* PC_SCREEN, VT_SCREEN ou TEXT_SCREEN */ void ExitScreen(void); #endif