/*============================================================ * Programme d'exemple demontrant l'utilisation de quelques * primitives et de quelques attributs de X11 *===========================================================*/ #include #include /*============================================================ * Variables globales utilisees par le programme *==========================================================*/ Display* ecran; Colormap tableCouleurs; Window fenetre; #define NB_COULEURS 8 enum INDEX_COULEURS { VERT, ORANGE_PALE, ROUGE, ORANGE_FONCE, GRIS, NOIR, BLANC, JAUNE }; const char* nomCouleurs[NB_COULEURS] = { "green", "orange1", "red", "orange3", "gray40", "black", "white", "yellow" }; XColor defCouleurs[NB_COULEURS]; GC contextesGraphiques[NB_COULEURS]; #define NB_FONTES 2 enum INDEX_FONTES { IBM, HELVETICA }; const char* nomFontes[NB_FONTES] = { /* "-ibm-*-medium-r-medium-*-20-140-100-100-c-90-iso8859-1",*/ /* "-*-Roman-Medium-R-*-*-*-280-100-100-*-*-ISO8859-1", */ "-*-Times-Medium-I-*-*-*-280-100-100-*-*-ISO8859-1", "-*-Helvetica-Medium-R-*-*-*-400-100-100-*-*-ISO8859-1" }; XFontStruct* defFontes[NB_FONTES]; /*---------------------------------------------------------------- * FONCTION : main * CLASSE : AUCUNE * DESCRIPTION: Point d'entree du programme * * ENTREES: argc : nombre d'arguments passes au programme * argv : chaines de caracteres contenant chacun * des arguments * SORTIES: AUCUNES * RETOUR: 0 si le programme s'est termine normalement, != 0 sinon *--------------------------------------------------------------*/ int main(int argc, char **argv) { char *display = NULL; int icol; XColor exact_def; int fenW, fenH, fenX, fenY; int fenBordure; unsigned long fenMasque; XSetWindowAttributes fenAttributs; unsigned long gcMasque; XGCValues gcAttributs; int ifnt; /* Etablir la connection avec le serveur X */ ecran = XOpenDisplay(display); if (! ecran ) { fprintf( stderr, "Ne peut etablir la connection au serveur X, verifier la variable DISPLAY\n" ); exit(-1); } /* Creer une table de couleurs privee pour l'application */ #define ALLOUE_TABLE 0 if( ALLOUE_TABLE ) { /* ALLOUER UNE NOUVELLE TABLE DE COULEUR SPECIFIQUE POUR L'APPLICATION */ tableCouleurs = XCreateColormap( ecran, DefaultRootWindow(ecran), DefaultVisual(ecran, DefaultScreen(ecran)), AllocNone ); } else { /* UTILISER LA TABLE DE COULEUR DE DEFAUT QUI A ETE ALLOUEE PAR LE SERVEUR */ tableCouleurs = DefaultColormap( ecran, DefaultScreen(ecran) ); } /* Allouer un certain nombre de couleurs dans la table */ for( icol = 0; icol < NB_COULEURS; ++icol ) { if( ! XAllocNamedColor( ecran, tableCouleurs, nomCouleurs[icol], &(defCouleurs[icol]), &exact_def ) ) { fprintf( stderr, "La couleur %s n'est pas defini sur le serveur\n", nomCouleurs[icol] ); exit(-1); } } /* Creer une fenetre principale pour l'application */ /* et centrer la fenetre dans l'ecran */ fenH = 480; fenW = 640; fenX = (DisplayWidth(ecran, DefaultScreen(ecran)) - fenW) >> 1; fenY = (DisplayHeight(ecran, DefaultScreen(ecran)) - fenH) >> 1; fenBordure = 2; fenMasque = CWBackPixel | CWBorderPixel | CWEventMask | CWColormap; fenAttributs.background_pixel = defCouleurs[GRIS].pixel; fenAttributs.border_pixel = defCouleurs[ROUGE].pixel; fenAttributs.event_mask = ExposureMask | KeyPressMask | ButtonPressMask; fenAttributs.colormap = tableCouleurs; fenetre = XCreateWindow(ecran, DefaultRootWindow(ecran), fenX, fenY, fenW, fenH, fenBordure, DefaultDepth(ecran, DefaultScreen(ecran)), InputOutput, DefaultVisual(ecran, DefaultScreen(ecran)), fenMasque, &fenAttributs); /* Creer une serie de contextes graphiques utilisant les couleurs */ gcMasque = GCLineWidth | GCBackground | GCForeground; gcAttributs.line_width = 3; gcAttributs.background = defCouleurs[GRIS].pixel; for( icol = 0; icol < NB_COULEURS; ++icol ) { gcAttributs.foreground = defCouleurs[icol].pixel; contextesGraphiques[icol] = XCreateGC (ecran, fenetre, gcMasque, &gcAttributs); } /* Charger des fontes pour tracer du texte */ for( ifnt = 0; ifnt < NB_FONTES; ++ifnt ) { if((defFontes[ifnt] = XLoadQueryFont( ecran, nomFontes[ifnt] )) == NULL ) { fprintf( stderr, "La fonte %s n'est pas definie sur le serveur\n", nomFontes[ifnt] ); exit(-1); } } /* Rendre la fenetre visible */ XMapWindow( ecran, fenetre ); /* Gerer les evenements */ for (;;) { XEvent evenement; XNextEvent(ecran, &evenement); switch (evenement.type) { case KeyPress: /* Fermer la fenetre si un bouton de souris */ case ButtonPress:/* ou une touche du clavier est presse */ XCloseDisplay ( ecran); exit(0); break; case Expose: /* si besoin de redessiner la fenetre */ { XTextItem texte1; XTextItem texte2; if ( evenement.xexpose.count != 0) break; XDrawLine( ecran, fenetre, contextesGraphiques[JAUNE], 0, 200, 200, 300 ); XDrawLine( ecran, fenetre, contextesGraphiques[VERT], 0, 0, 100, 100 ); texte1.chars = "Bonjour"; texte1.nchars = strlen(texte1.chars); texte1.delta = 0; texte1.font = defFontes[IBM]->fid; XDrawText( ecran, fenetre, contextesGraphiques[ROUGE], 250, 250, &texte1, 1 ); texte2.chars = "Le monde !"; texte2.nchars = strlen(texte2.chars); texte2.delta = 0; texte2.font = defFontes[HELVETICA]->fid; XDrawText( ecran, fenetre, contextesGraphiques[NOIR], 250, 400, &texte2, 1 ); } break; } } }