Acerca de GDK

¿Qué es GDK?

GDK básicamente es un envoltorio alrededor de funciones estándares de Xlib. Si tienes familiaridad con Xlib, te será fácil acostumbrarte a la mayoría de las funciones de GDK. Todas la funciones están escritas para proveer una manera de acceder a las funciones Xlib de una manera más fácil e intuitiva. Además, ya que GDK usa GLib (mirar abajo), será más portable y seguro de usar en múltiples plataformas.

¿Cómo utilizo la asignación de color

Una de las cosas agradables sobre GDK, es que está basada sobre Xlib; esto también es un problema, especialmente en el área de administración de color. Si quieres usar color en tu programa (dibujar un rectángulo o algo así), tu código debe lucir algo como esto:

{
  GdkColor *color;
  int width, height;
  GtkWidget *widget;
  GdkGC *gc;

  ...
  
  /* primero, crea un Contexto Gráfico para dibujar en él */
  gc = gdk_gc_new(widget->window);

  /* encontrar dimensiones apropiadas para el rectángulo */
  gdk_window_get_size(widget->window, &width, &height);

  /* el color que queremos utilizar */
  color = (GdkColor *)malloc(sizeof(GdkColor));
  
  /* rojo, verde, y azul son valores pasados, indicando la tripleta RGB
   * del color que queremos dibujar. Nota que los valores de los
   * componentes RGB dentro de GdkColor son tomados de 0 a 65536, no 0 a 255.
   */
  color->red = red * (65535/255);
  color->green = green * (65535/255);
  color->blue = blue * (65535/255);
  
  /* el valor de pixel indica el índice en el mapa de color del color.
   * simplemente es una combinación de los valores RGB que asignamos 
   * anteriormente
   */
  color->pixel = (gulong)(red*65536 + green*256 + blue);

  /* Sin embargo, el valor de pixel sólo es verdaderamente válido en
   * dispositivos de 24-bit (ColorVerdadero). Por lo tanto, esta llamada
   * es requerida para que GDK y X puedan darnos el color más cercano
   * disponible en el mapa de color
   */
  gdk_color_alloc(gtk_widget_get_colormap(widget), color);

  /* asignar la parte frontal a nuestro color */
  gdk_gc_set_foreground(gc, color);
  
  /* dibujar el rectángulo */
  gdk_draw_rectangle(widget->window, gc, 1, 0, 0, width, height);

  ...
}