API de sistema gráfico elemental

Un programa mínimo con este sistema gráfico elemental, basado en X11, consiste en crear el cuerpo de las siguientes funciones:

#include "../Grafico.h"

void rePinta(){
agregar sentencias en este lugar}

void mousePress(int x, int y, int b){
agregar sentencias en este lugar}
void mouseRelease(int x, int y, int boton){agregar sentencias en este lugar}
void mouseMove(int x,int y){agregar sentencias en este lugar}
void mouseDrag(int x,int y, int b){
agregar sentencias en este lugar}

main(){
ventanaB(700,500); // abre una ventana y main queda bloqueada
//ventana(700,500); esta si no se quiere el bloqueo de main
}
Este programa mínimo asume que el archivo Grafico.h  se encuentra en el directorio padre.
 
a) En la función función main se debe llamar una sóla de las funciones siguientes:
ventana(int dx, int dy)
Esta función crea una ventana de ancho dx y alto dy, es una función no-bloqueante, es decir, se crea la ventana pero sigue la ejecución en la sentencia siguiente. Si la función main termina la ventana se cierra. Esta función se debe usar si se quiere tener una hebra de ejecución mientras la ventana está activa, esto es, combinar la programación orientada al evento con la procedural.
ventanaB(int, int)
Esta función crea una ventana de ancho dx y alto dy, es una función bloqueante, es decir, se crea la ventana pero no sigue la ejecución en la sentecia
siguiente. Es útil si sólo se va a crear un programa orientado al evento.

b) Las funciones:
void mousePress(int x, int y, int boton)
void mouseRelease(int x, int y, int boton)
void mouseMove(int x,int y)
void mouseDrag(int x,int y, int boton)
son llamadas cunado ocurren los eventos de mouse de oprimir un botón, mover el mouse y mover el mouse con un botón oprimido dentro de la ventana. Los argumentos x e y tienen las coordenadas del cursor al ocurrir el evento. El argumento boton indica qué botón del mouse produjo el evento con los valores 1,2 y 3. Se les debe incorporar las sentencias que manejen la situación para ele evento correspondiente.
Si no se incluyen sus declaraciones (aunque el cuerpo no haga nada), no se genera el programa ejecutable. Estas funciones no deben ser llamadas por otra función.


c) La función:
void rePinta()
es llamada cada vez que la ventana abierta por la función ventana() o ventanaB(), tienen un cambio: abrirse, cambiar de tamaño, cambiar de profundidad, etc. Si se desea llamar desde otra de las funciones del programa, se debe llamar indirectamente por medio la función update(). Sin se llama directamente, el programa puede fallar.

d) Los colores definidos son los siguientes:
#define negro		"#000000"
#define blanco "#ffffff"
#define rojo "#ff0000"
#define verde "#00ff00"
#define azul "#0000ff"
#define amarillo "#ffff00"
#define magenta "#ff00ff"
#define cyan "#00ffff"
#define nuevocolor "#905523"

Se pueden agregar más colores creando nuevos string estáticos o bién en forma dinámica.
e) Las siguientes funciones pueden ser llamadas desde el nuevo programa:
void ventana(int, int);
void ventanaB(int, int);
void setForegroundColor(const char *); // cambia el color del pincel
void setForegroundColorRGB(unsigned char R,unsigned char G,unsigned char B); // cambia el color del pincel
void setGrosorLinea(unsigned int); // cambia el grosor de la linea que se dibuja

int ancho(void); // devuelve el ancho de la ventana
int alto(void); // devuelve el alto de la ventana

f) Las siguientes funciones dibujan directamente en la ventana y aparecen de inmediato en ella.  No se recomienda su uso si se está usando      el doble bufer.
void fillArc(int x,int y,int dx,int dy,int angulo1,int angulo2); 
void drawArc(int x,int y,int dx,int dy,int angulo1,int angulo2);
void fillRect(int x, int y, int dx, int dy);
void drawRect(int, int, int, int);
void drawString(char *,int, int);
void drawLine(int, int, int, int);
void fillPolygon(Xpoint p[], int npoints); //p es una estructura de "npoints" pares: p[i].x y p[i].y
void drawPolyline(Xpoint p[], int npoints);
g) Las siguientes funciones dibujan en un bufer que es memoria distinta de la ventana, es decir, no aparecen de inmediato en ella.
    Luego de dibujar todas las figuras en el bufer, se puede llamar a la función buferDisplay(), que copia desde el bufer a la ventana.
void fillArcd(int x,int y,int dx,int dy,int angulo1,int angulo2);
void drawArcd(int x,int y,int dx,int dy,int angulo1,int angulo2);
void fillRectd(int x, int y, int dx, int dy);
void drawRectd(int, int, int, int);
void drawStringd(char *,int, int);
void drawLined(int, int, int, int);

void fillPolygond(Xpoint p, int npoints);
void drawPolylined(Xpoint p, int npoints);
h) La función:
void update(void);
es para llamar a la función buferDisplay() desde el programa creado.
i) la función:
void buferDisplay(void);
copia el contenido del bufer en el diplay de la ventana. Se debe llamar una vez al final de de las llamadas a las funciones de dibujo.
ii) la función:
void setCursor(unsigned int micursor);
cambia el cursor . Ver lista de cursores
Ejemplo: setCursor(XC_watch);

iii) la función:
void keyPress(unsigned int key);
entrega el código de la tecla oprimida cuando la ventana está activa. Para detalle de los códigos ver el archivo:
/usr/include/X11/keysymdef.h