//C #include //POSIX #include //SDL #include #include #include //mine #include "SFont.h" #include "scancodes.h" /*** Constants ***/ #define NB_MAX_OPTIONS 134 #define HAUTEUR_DEBUT_SETUP 7 #define HAUTEUR_FIN_SETUP 44 /* Colors */ #define COULEUR_SETUP 1 #define COULEUR_SELECT 8 /*** Types definitions and structs ***/ typedef struct{ uint16_t Numero; uint16_t Touche; uint16_t Touche2; char Libelle[36]; char Explic1[77]; char Explic2[77]; bool Erreur; bool Suppr; } Options; typedef struct{ char Signature[3]; uint8_t Version1; uint8_t Version2; uint8_t Beta1; uint8_t Beta2; } Type_header; #define Header_size 7 typedef struct{ uint8_t Numero; uint16_t Taille; } Type_chunk; #define Chunk_size 3 /*** Global variables ***/ SFont_Font* MyFont; SDL_Surface* Ecran; int Numero_definition_option; Options Config[NB_MAX_OPTIONS]; bool Choix_enreg; uint16_t NB_OPTIONS; /*** Fonctions de gestion des évènements SDL ***/ /* Attend qu'une touche soit pressée. Retourne le keysym. */ SDL_keysym Lire_Touche(void) { SDL_Event Event; do{ SDL_WaitEvent(&Event); if(Event.type==SDL_KEYDOWN) break; }while(1); return Event.key.keysym; } /* Writes human-readable key name to buffer Temp. Temp must be at least 35 bytes long ! */ void Nom_touche(uint16_t Touche,char* Temp) { char Temp2[28]; uint8_t Num_table =1; Temp[0] = Temp2[0] = 0; if((Touche & 0x0100) > 0) { strcat(Temp," + "); Num_table = 2; } if((Touche & 0x0200) > 0) { strcat(Temp," + "); Num_table = 3; } if((Touche & 0x0400) > 0) { strcat(Temp," + "); Num_table = 4; } switch(Num_table) { case 1: strcpy(Temp2,Table_Normal[Touche & 0xFF]); printf("k: %x\n",Touche & 0xFF); if (strcmp(Temp2,"???") == 0) strcpy(Temp,"********** Invalid key! **********"); else if (Temp2[0]==0) Temp[0]=0; else { strcat(Temp,"<"); strcat(Temp,Temp2); strcat(Temp,">"); } break; case 2: strcpy(Temp2,Table_Shift[Touche & 0xFF]); break; } } /*** 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) { char NomTouche[35]; puts(Config[Num_option].Libelle); SFont_Write(Ecran,MyFont,8,Ligne*9,Config[Num_option].Libelle); Nom_touche(Config[Num_option].Touche,NomTouche); SFont_Write(Ecran,MyFont,40*8,Ligne*9,NomTouche); if(Config[Num_option].Erreur) SFont_Write(Ecran,MyFont,77*8,Ligne*9,"X"); else Cadre(77*8,Ligne*9,8,8,Couleur); } /* Displays comment about an option */ void Ecrire_commentaire(uint16_t Num_option) { SFont_Write(Ecran,MyFont,8,50*9,Config[Num_option].Explic1); SFont_Write(Ecran,MyFont,8,51*9,Config[Num_option].Explic2); } /* Display the options list */ void Tout_ecrire(uint16_t Decalage_curseur,uint16_t Position_curseur) { uint8_t i = HAUTEUR_DEBUT_SETUP; Cadre(3,(HAUTEUR_DEBUT_SETUP+Position_curseur - 1)*9,630,8,COULEUR_SELECT); while(i<=HAUTEUR_FIN_SETUP && i <= NB_OPTIONS + HAUTEUR_DEBUT_SETUP) { Ecrire(i,Decalage_curseur+i-HAUTEUR_DEBUT_SETUP,COULEUR_SETUP); i++; } Cadre(36*8,46,1,400,255); Cadre(78*8,46,1,400,255); Ecrire_commentaire(Decalage_curseur+Position_curseur-1); SDL_UpdateRect(Ecran,0,0,640,480); } /*** Configuration handling functions ***/ /* Defines an option */ void Definir_option(uint16_t Numero, char* Libelle, char* Explic1, char* Explic2, bool Deletable, uint16_t Default_key) { Config[Numero_definition_option].Numero = Numero; Config[Numero_definition_option].Touche = Default_key; Config[Numero_definition_option].Touche2 = 0xFF; strncpy(Config[Numero_definition_option].Libelle,Libelle,36); strncpy(Config[Numero_definition_option].Explic1,Explic1,77); strncpy(Config[Numero_definition_option].Explic2,Explic2,77); Config[Numero_definition_option].Erreur = false; Config[Numero_definition_option].Suppr = Deletable; Numero_definition_option ++ ; } /* Initialize configuration */ bool Initialiser_config() { bool Erreur = false; FILE* Fichier_INI; Numero_definition_option = 0; Definir_option(0,"Scroll up", "Scrolls the picture up, both in magnify and normal mode.", "This hotkey cannot be removed.", false, 0x48); // HAUT Definir_option(1,"Scroll down", "Scrolls the picture down, both in magnify and normal mode.", "This hotkey cannot be removed.", false, 0x50); // BAS Definir_option(2,"Scroll left", "Scrolls the picture to the left, both in magnify and normal mode.", "This hotkey cannot be removed.", false, 0x4B); // GAUCHE Definir_option(3,"Scroll right", "Scrolls the picture to the right, both in magnify and normal mode.", "This hotkey cannot be removed.", false, 0x4D); // DROITE NB_OPTIONS = Numero_definition_option - 1; } uint8_t Fenetre_choix(uint8_t Largeur, uint8_t Hauteur, char* Titre, char* Choix, uint8_t Choix_debut, uint8_t Couleur,uint8_t Couleur_choix) { puts("FENETRE CHOIX UNIMPLEMENTED !!!"); return 0; } /* Checks if some key is used twice */ void Test_duplic() { uint16_t i,j; bool Pas_encore_erreur; for(i=0;i