/* Grafx2 - The Ultimate 256-color bitmap paint program
Copyright 2008 Peter Gordon
Copyright 2008 Yves Rizoud
Copyright 2008 Adrien Destugues
Copyright 1996-2001 Sunset Design (Guillaume Dorme & Karl Maritaud)
Grafx2 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; version 2
of the License.
Grafx2 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 Grafx2; if not, see or
write to the Free Software Foundation, Inc.,
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
//C
#include
#include
#include
//POSIX
#include
//SDL
#include
#include
#include
//#include
//mine
#include "SFont.h"
// Modificateurs pour Touche
#define MOD_SHIFT 0x1000
#define MOD_CTRL 0x2000
#define MOD_ALT 0x4000
#include "struct.h"
#include "clavier.h"
#include "const.h"
#include "io.h"
#include "hotkeys.h"
/*** Constants ***/
#define NB_MAX_TOUCHES 134
#define HAUTEUR_DEBUT_SETUP 7
#define HAUTEUR_FIN_SETUP 44
#define Header_size sizeof(struct Config_Header)
#define Chunk_size sizeof(struct Config_Chunk)
/* Colors */
#define COULEUR_SETUP 1
#define COULEUR_SELECT 8
/*** Global variables ***/
SFont_Font* MyFont;
SDL_Surface* Ecran;
bool Erreur[NB_MAX_TOUCHES];
uint8_t Choix_enreg;
uint16_t Decalage_curseur=0;
uint16_t Position_curseur=0;
byte * FichierConfig = NULL;
byte * ChunkData[CHUNK_MAX];
struct Config_Chunk Chunk[CHUNK_MAX];
uint8_t Fenetre_choix(int Largeur, int Hauteur, const char* Titre, const char* Choix, uint8_t Choix_debut,
uint8_t Couleur,uint8_t Couleur_choix);
/*** Fonctions de gestion des évènements SDL ***/
/* Attend qu'une touche soit pressée. Retourne le code touche. */
word Lire_Touche(void)
{
SDL_Event Event;
do{
SDL_WaitEvent(&Event);
if(Event.type==SDL_KEYDOWN)
{
word Touche = Conversion_Touche(Event.key.keysym);
if (Touche != 0)
return Touche;
}
}while(1);
}
/*** Drawing functions ***/
/* Draws a filled rectanble */
void Cadre(int x,int y,int w,int h,uint8_t color)
{
SDL_Rect rct;
rct.x=x;
rct.y=y;
rct.w=w;
rct.h=h;
SDL_FillRect(Ecran, &rct, color);
}
/* Draws the main screen and welcome message */
void Dessiner_ecran_principal()
{
Cadre(3,3,630,40,2);
SFont_Write(Ecran, MyFont, 8,6,"Setup program for Grafx2 (c) 1996-98 Sunset Design and 2008 PulkoMandy");
SFont_Write(Ecran, MyFont, 8,18,"Use Up/Down arrows & Page-Up/Page-Down to scroll, Enter to modify, Delete to remove a hot-key, and Escape to validate or cancel.");
SFont_Write(Ecran, MyFont, 8,30,"DO NOT USE Print-screen, Pause, and other special keys!");
// Cadre(3,46,630,400,COULEUR_SETUP);
SFont_Write(Ecran,MyFont,8,48,"Option");
SFont_Write(Ecran,MyFont,8*38,48,"Hot-Key");
SFont_Write(Ecran,MyFont,8*75,48,"Err");
SDL_UpdateRect(Ecran,0,0,640,480);
}
/* Displays informations about an option */
void Ecrire(uint8_t Ligne, uint16_t Num_option, uint8_t Couleur)
{
Cadre(3,Ligne*9,630,9,Couleur);
SFont_Write(Ecran,MyFont,8,Ligne*9,ConfigTouche[Num_option].Libelle);
SFont_Write(Ecran,MyFont,40*8,Ligne*9,Nom_touche(ConfigTouche[Num_option].Touche));
if(Erreur[Num_option])
SFont_Write(Ecran,MyFont,77*8,Ligne*9,"X");
Cadre(36*8,Ligne*9,1,9,255);
Cadre(74*8,Ligne*9,1,9,255);
SDL_UpdateRect(Ecran,3,Ligne*9,630,9);
}
/* Displays comment about an option */
void Ecrire_commentaire(uint16_t Num_option)
{
Cadre(8,50*9,630,18,0);
SFont_Write(Ecran,MyFont,8,50*9,ConfigTouche[Num_option].Explic1);
SFont_Write(Ecran,MyFont,8,51*9,ConfigTouche[Num_option].Explic2);
SDL_UpdateRect(Ecran,8,50*9,631,19);
}
/* Display the options list */
void Tout_ecrire()
{
uint8_t i = HAUTEUR_DEBUT_SETUP;
Cadre(3,46,630,400,COULEUR_SETUP);
while(i<=HAUTEUR_FIN_SETUP && i < NB_MAX_TOUCHES + HAUTEUR_DEBUT_SETUP)
{
Ecrire(i,Decalage_curseur+i-HAUTEUR_DEBUT_SETUP,
(i==HAUTEUR_DEBUT_SETUP+Position_curseur)?COULEUR_SELECT:COULEUR_SETUP);
i++;
}
Cadre(36*8,46,1,400,255);
Cadre(74*8,46,1,400,255);
SDL_UpdateRect(Ecran,0,0,640,480);
Ecrire_commentaire(Decalage_curseur+Position_curseur);
}
/*** Configuration handling functions ***/
/* Reads the config file */
/* returns an error message, or NULL if everything OK */
char * Interpretation_du_fichier_config()
{
FILE* Fichier;
long int Taille_fichier;
byte Numero_chunk;
word Taille_chunk;
byte * Ptr;
int i;
Fichier = fopen("gfx2.cfg","rb");
if (!Fichier)
{
return "gfx2.cfg is missing! Please run the\nmain program to generate it.";
}
fseek(Fichier,0,SEEK_END); // Positionnement à la fin
Taille_fichier = ftell(Fichier);
if (!Taille_fichier)
{
fclose(Fichier);
return "gfx2.cfg is empty. Please run the main\nprogram to generate it.";
}
FichierConfig = malloc(Taille_fichier);
if (!Fichier)
{
fclose(Fichier);
return "Out of memory when reading gfx2.cfg.";
}
fseek(Fichier,0,SEEK_SET); // Positionnement au début
if (! read_bytes(Fichier, FichierConfig, Taille_fichier))
{
fclose(Fichier);
return "Error while reading gfx2.cfg.";
}
fclose(Fichier);
// Initialisation des "index"
for (i=0; i= CHUNK_MAX)
return "File gfx2.cfg invalid.";
ChunkData[Numero_chunk] = Ptr;
Chunk[Numero_chunk].Taille = Taille_chunk;
// printf("%d %6X %d\n", Numero_chunk, Ptr - FichierConfig, Taille_chunk);
Ptr+=Taille_chunk;
}
// Si la config contenait des touches, on les initialise:
if (Chunk[CHUNK_TOUCHES].Taille)
{
unsigned int Indice_config;
Ptr = ChunkData[CHUNK_TOUCHES];
for (Indice_config=0; Indice_config 0)
{
if(Position_curseur <= HAUTEUR_FIN_SETUP - HAUTEUR_DEBUT_SETUP && Position_curseur > 0)
{
Ecrire(HAUTEUR_DEBUT_SETUP + (Position_curseur),Position_curseur + Decalage_curseur,
COULEUR_SETUP);
(Position_curseur) -- ;
Ecrire(HAUTEUR_DEBUT_SETUP + (Position_curseur),Position_curseur + Decalage_curseur,
COULEUR_SELECT);
}
else if(Decalage_curseur>0)
{
(Decalage_curseur) -- ;
Tout_ecrire();
}
Ecrire_commentaire(Position_curseur + Decalage_curseur);
}
}
/* Moves one line down */
void Scroll_bas()
{
if(Position_curseur + Decalage_curseur < (NB_MAX_TOUCHES-1))
{
if(Position_curseur < HAUTEUR_FIN_SETUP - HAUTEUR_DEBUT_SETUP)
{
Ecrire(HAUTEUR_DEBUT_SETUP + (Position_curseur) ,Position_curseur + Decalage_curseur,
COULEUR_SETUP);
(Position_curseur) ++ ;
Ecrire(HAUTEUR_DEBUT_SETUP + (Position_curseur) ,Position_curseur + Decalage_curseur,
COULEUR_SELECT);
}
else if(Decalage_curseur < (NB_MAX_TOUCHES-1))
{
(Decalage_curseur) ++ ;
Tout_ecrire();
}
Ecrire_commentaire(Position_curseur + Decalage_curseur );
}
}
/* Moves one screen up */
void Page_up()
{
if(Position_curseur+Decalage_curseur>0)
{
if(Position_curseur>0)
{
Ecrire(HAUTEUR_DEBUT_SETUP + (Position_curseur),Position_curseur + Decalage_curseur,
COULEUR_SETUP);
Position_curseur = 0 ;
Ecrire(HAUTEUR_DEBUT_SETUP + (Position_curseur),Position_curseur + Decalage_curseur,
COULEUR_SELECT);
}
else if(Decalage_curseur>0)
{
if(Decalage_curseur > HAUTEUR_FIN_SETUP-HAUTEUR_DEBUT_SETUP)
Decalage_curseur-=HAUTEUR_FIN_SETUP-HAUTEUR_DEBUT_SETUP;
else Decalage_curseur=0;
Tout_ecrire();
}
Ecrire_commentaire(Position_curseur+Decalage_curseur);
}
}
/* Moves one screen down */
void Page_down()
{
if(Position_curseur+Decalage_curseur<(NB_MAX_TOUCHES-1))
{
if(Position_curseurpixels))[(y*32+x)] != 255)
Masque_icone[(y*32+x)/8] |=0x80>>(x&7);
SDL_WM_SetIcon(Icone,Masque_icone);
}
}
SDL_EnableKeyRepeat(250, 32);
SDL_EnableUNICODE(SDL_ENABLE);
/* On initialise SFont */
MyFont = SFont_InitFont(IMG_Load("fonts/8pxfont.png"));
if(MyFont==NULL)
{
SDL_Quit();
exit(0);
}
Dessiner_ecran_principal();
if(!Initialiser_config())
{
Setup();
Enregistrer_config();
/* On fait un peu de nettoyage avant de s'en aller */
SFont_FreeFont(MyFont);
SDL_Quit();
exit(0);
}
else
{
SFont_FreeFont(MyFont);
SDL_Quit();
exit(1);
}
}
else
{
puts("Error: you mustn't run this setup program from a read-only drive!\n");
puts("The most probable cause of this error is that you are running this program");
puts("from a CD-Rom or a protected floppy disk.");
puts("You should try to copy all the files of Grafx2 on a hard drive or to");
puts("unprotect your floppy disk if you really want to run it from this outdated medium.");
exit(1);
}
return 0;
}