[Glade-users] Trouble with drawing area



Hello,

I currently trying to put two drawing area on a main window of a project
genrated by Glade.

The first area works fine but when I program the second one, it shows
the same as the first one. The only call for the second drawing area is
a call to "trace" in a function located in callbacks.c

Here is the code of the main.c I used

#ifdef HAVE_CONFIG_H
#  include <config.h>
#endif

#include <gtk/gtk.h>
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include "interface.h"
#include "support.h"
#include "callbacks.h" 
#include <gdk/gdk.h>

/* variables globales du programme */
  int matrice[102][102][102];
  long int nbsweep = 10000;
  int nbflip = 10;
  int genre = 1;
  int tx = 20;
  int ty = 20;
  int tz = 20;
  int slide = 1;
  float temp = 50.0;
  float field =0.; 
  gboolean interrupt = FALSE;
  GtkWidget *window1;
  GtkWidget *area,*area2;
  GdkPixmap *pixmap = NULL;     /* offscreen drawable */
  GdkGC *gc = NULL;
  GdkColor blue;
  GdkColor red;
  GdkColor white;
  GdkColor grey;
  GdkColor black;

  void allocate_colors(GtkWidget *);
  void repaint(GtkWidget *);
  void repaint2(GtkWidget *);
  int  configure_event(GtkWidget *, GdkEventConfigure *);
  int  expose_event(GtkWidget *, GdkEventExpose *);
  gboolean on_graphs_expose_event      (GtkWidget       *widget,
                                        GdkEventExpose  *event,
                                        gpointer         user_data);

  gboolean on_graphs_configure_event   (GtkWidget       *widget,
                                        GdkEventConfigure *event,
                                        gpointer         user_data);
                                        
  void repaintclear(GtkWidget *area2);
  void trace(GtkWidget *area2, int i, int j);


int
main (int argc, char *argv[])
{
  GtkWidget *temper;
  GtkWidget *magnfield;
  GtkWidget *kind;
  GtkWidget *current;

#ifdef ENABLE_NLS
  bindtextdomain (PACKAGE, PACKAGE_LOCALE_DIR);
  textdomain (PACKAGE);
#endif 

  gtk_set_locale ();
  gtk_init (&argc, &argv);

  add_pixmap_directory (PACKAGE_DATA_DIR "/pixmaps");
  add_pixmap_directory (PACKAGE_SOURCE_DIR "/pixmaps");

  initmat();

  window1 = create_window1 ();

  gc=NULL;

  temper = lookup_widget (window1, "tempsc");
  magnfield = lookup_widget (window1, "hscale2");
  current = lookup_widget (window1, "spinbutton6");
  kind = lookup_widget (window1, "combo1");
  area = lookup_widget (window1, "drawingarea1");
  area2 = lookup_widget (window1, "graphs");

  gtk_signal_connect (GTK_OBJECT (GTK_RANGE(temper) -> adjustment),
"value_changed", GTK_SIGNAL_FUNC ( on_tempsc_value_changed), temper);
  gtk_signal_connect (GTK_OBJECT (GTK_RANGE(magnfield) -> adjustment),
"value_changed", GTK_SIGNAL_FUNC (on_hscale2_value_changed),magnfield);
  gtk_signal_connect (GTK_OBJECT (GTK_SPIN_BUTTON(current) ->
adjustment), "value_changed", GTK_SIGNAL_FUNC (
on_current_value_changed), current);
  gtk_signal_connect (GTK_OBJECT (GTK_COMBO(kind)-> entry),"activate",
GTK_SIGNAL_FUNC(on_combo_entry1_changed),NULL);

  gtk_signal_connect(GTK_OBJECT(area), "expose_event",(GtkSignalFunc)
expose_event, NULL);
  gtk_signal_connect(GTK_OBJECT(area), "configure_event",(GtkSignalFunc)
configure_event, NULL);
  gtk_signal_connect (GTK_OBJECT (area),"realize",GTK_SIGNAL_FUNC
(repaint),NULL);

  gtk_signal_connect(GTK_OBJECT(area2), "expose_event",(GtkSignalFunc)
on_graphs_expose_event, NULL);
  gtk_signal_connect(GTK_OBJECT(area2),
"configure_event",(GtkSignalFunc) on_graphs_configure_event, NULL);
  gtk_signal_connect (GTK_OBJECT (area2),"realize",GTK_SIGNAL_FUNC
(repaintclear),NULL);

  gtk_widget_show (window1);

  gtk_main ();
  return 0;
}


void init_colors(GtkWidget *area)
{
        GdkColormap *colormap;

        colormap = gtk_widget_get_colormap(area);
        if (!colormap)
                exit(1);

        blue.red   = 0;
        blue.green = 0;
        blue.blue  = 0xff * 0x100;
        gdk_colormap_alloc_color(colormap, &blue, FALSE, TRUE);

        red.red   = 0xff * 0x100;
        red.green = 0;
        red.blue  = 0;
        gdk_colormap_alloc_color(colormap, &red, FALSE, TRUE);

        white.red   = 0xff * 0x100;
        white.green = 0xff * 0x100;
        white.blue  = 0xff * 0x100;
        gdk_colormap_alloc_color(colormap, &white, FALSE, TRUE);

        grey.red   = 112 * 0x100;
        grey.green = 128 * 0x100;
        grey.blue  = 144 * 0x100;
        gdk_colormap_alloc_color(colormap, &grey, FALSE, TRUE);
        
        black.red   = 0;
        black.green = 0;
        black.blue  = 0;
        gdk_colormap_alloc_color(colormap, &white, FALSE, TRUE);
}


void repaint(GtkWidget *area)
{
        int i, j;
        GdkColor *color;

        for (i =1 ; i < tx+1; i++)
                for (j = 1; j < ty+1; j++) {
                        color = (matrice[i][j][slide] == 1) ? &red : &blue;
                        gdk_gc_set_foreground(gc, color);
                        gdk_draw_rectangle(pixmap, gc, TRUE,
                                           (i-1) * 400/tx, (j-1) * 400/ty , 400/tx ,400/ty 
);
                }

        gdk_draw_pixmap( area->window,
                         area->style->fg_gc[GTK_WIDGET_STATE(area)],
                         pixmap, 0, 0, 0, 0,
                         area->allocation.width, area->allocation.height );
}

void repaint2(GtkWidget *area)
{
        int i, j;
        GdkColor *color;

        for (j = 1; j < ty+1; j++)
                for (i =1 ; i < tx+1; i++)
                        {
                        color = (matrice[i][j][slide] == 1) ? &red : &blue;
                        gdk_gc_set_foreground(gc, color);
                        gdk_draw_rectangle(pixmap, gc, TRUE,
                                           (i-1) * 400/tx , (j-1) * 400/ty , 400/tx ,400/ty 
);
                                           
                        color = (matrice[i+1][j][slide] == 1) ? &red : &blue;
                        gdk_gc_set_foreground(gc, color);
                        gdk_draw_rectangle(pixmap, gc, TRUE,
                                           i * 400/tx , (j-.5) * 400/ty ,400/tx ,400/ty  );
                                           
                        color = &grey;
                        gdk_gc_set_foreground(gc, color);
                        gdk_draw_rectangle(pixmap, gc, TRUE,
                                           i*400/tx , 0 ,400/tx ,200/ty  );
                        
                           
                        ++i;
                        }

        gdk_draw_pixmap( area->window,
                         area->style->fg_gc[GTK_WIDGET_STATE(area)],
                         pixmap, 0, 0, 0, 0,
                         area->allocation.width, area->allocation.height );
}

int configure_event(GtkWidget *widget, GdkEventConfigure *event)
{
        if (!gc) {

                gc = gdk_gc_new(widget->window);

                init_colors(widget);
        }

        if (pixmap)
                gdk_pixmap_unref(pixmap);

        pixmap = gdk_pixmap_new( widget->window,
                                 widget->allocation.width,
                                 widget->allocation.height,
                                 -1 );
        gdk_draw_rectangle( pixmap,
                            widget->style->white_gc,
                            TRUE, 0, 0,
                            widget->allocation.width,
                            widget->allocation.height );
        repaint(widget);
        return FALSE;
}

int expose_event(GtkWidget *widget, GdkEventExpose *event)
{
        gdk_draw_pixmap( widget->window,
                         widget->style->fg_gc[GTK_WIDGET_STATE(widget)],
                         pixmap, 
                         event->area.x, event->area.y,
                         event->area.x, event->area.y,
                         event->area.width, event->area.height );
        return FALSE;
}

gboolean
on_graphs_expose_event                 (GtkWidget       *widget,
                                        GdkEventExpose  *event,
                                        gpointer         user_data)
{
        gdk_draw_pixmap( widget->window,
                         widget->style->fg_gc[GTK_WIDGET_STATE(widget)],
                         pixmap, 
                         event->area.x, event->area.y,
                         event->area.x, event->area.y,
                         event->area.width, event->area.height );
  return FALSE;
}


gboolean
on_graphs_configure_event              (GtkWidget       *widget,
                                        GdkEventConfigure *event,
                                        gpointer         user_data)
{
        if (!gc) {

                gc = gdk_gc_new(widget->window);

                init_colors(widget);
        }

        if (pixmap)
                gdk_pixmap_unref(pixmap);

        pixmap = gdk_pixmap_new( widget->window,
                                 widget->allocation.width,
                                 widget->allocation.height,
                                 -1 );
        gdk_draw_rectangle( pixmap,
                            widget->style->white_gc,
                            TRUE, 0, 0,
                            widget->allocation.width,
                            widget->allocation.height );
        repaintclear(widget); 
  return FALSE;
}

void repaintclear(GtkWidget *area2)
{
        GdkColor *color;

        color = &white;
        gdk_gc_set_foreground(gc, color);
        gdk_draw_rectangle(pixmap, gc, TRUE,0,0 , 400 ,400 );

        color = &black;
        gdk_gc_set_foreground(gc, color);
        gdk_draw_rectangle(pixmap, gc, TRUE,0,200 , 400 ,2 );
        
        color = &black;
        gdk_gc_set_foreground(gc, color);
        gdk_draw_rectangle(pixmap, gc, TRUE,0,0 ,2  ,400 );
        
        gdk_draw_pixmap( area2->window,
                         area2->style->fg_gc[GTK_WIDGET_STATE(area2)],
                         pixmap, 0, 0, 0, 0,
                         area2->allocation.width, area2->allocation.height );
}

void trace(GtkWidget *area2, int i, int j)
{
        GdkColor *color;

        color = &red;
        gdk_gc_set_foreground(gc, color);
        gdk_draw_rectangle(pixmap, gc, TRUE,
                                           i,j ,  1,1 );

        gdk_draw_pixmap( area2->window,
                         area2->style->fg_gc[GTK_WIDGET_STATE(area2)],
                         pixmap, 0, 0, 0, 0,
                         area2->allocation.width, area2->allocation.height );
}


Could someon tell me what's wrong ?

Thanks

Valery Avaux





[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]