aa version of the canvas problem



Hi,

the followin code does not work. In theory, you should be able to create
a new window with menu "Fichier/Nouveau" and then each mouse click in
the window should display a ellipse item. This works well with non aa
canvas, but not with aa. new items show only when, for example, I resize
the window, or I if i hide then show it. See following code. 

Oh, there is a also a bug in test-gnome with aa canvas version. Move the 
green text and you'll see by yourself.

Best regards,

	Bertrand.

/* 
   gcc -o LFM9 `gnome-config --cflags gnomeui` \
   LFM9.c `gnome-config --libs gnomeui`
*/
/******************************************************************************/


/* inclure le header principal de Gnome                                       */
/* il se chargera d'inclure toutes les headers                                */
/* necessaires a la compilation utilisant les                                  */
/* librairies Gnome                                                           */
#include <gnome.h>


static void quit_cb (GtkWidget *widget, void *data);
static void new_child_cb (GtkWidget *widget, gpointer data);
static GtkWidget *create_canvas ();

/******************************************************************************/
/* Definition des menus                                                       */
/******************************************************************************/

/* sous menu du menu "Fichier" declare ci dessous.                            */
/* On ne decare qu'un element, indique par la chaine "Sortir". Il est dessine */
/* avec l'icone de menu standard de Gnome pour les menus de srtie             */
/* Lorsque l'utilisateur le selectionne, il appelle le callback "quit_cb"     */
static GnomeUIInfo file_menu [] = {
  GNOMEUIINFO_ITEM_STOCK ("Nouveau", NULL, new_child_cb, GNOME_STOCK_MENU_NEW),
  GNOMEUIINFO_ITEM_STOCK ("Sortir", NULL, quit_cb, GNOME_STOCK_MENU_EXIT),
  GNOMEUIINFO_END
};

/* Un menu vide, pour ajouter la liste des fenetres enfants mdi               */
GnomeUIInfo void_menu[] = {
  { GNOME_APP_UI_ENDOFINFO }
};

/* Definition de la barre de menu principale                                  */
static GnomeUIInfo main_menu [] = {
  GNOMEUIINFO_SUBTREE ("Fichier", &file_menu),
  GNOMEUIINFO_SUBTREE ("Fenetres", &void_menu),
  GNOMEUIINFO_END
};
/******************************************************************************/

static GnomeMDI *mdi;


/* callback appele quand toutes les fenetres sont fermees */
static void
quit_cb (GtkWidget *widget, void *data)
{
  gtk_main_quit ();
}


/* Creer un objet graphique. Ici il s'agit d'un bouton contenant un simple    */
/* texte. Cela pourrait etre n'importe quel descendant du type "widget".      */
static GtkWidget *
create_main_widget(GnomeApp *application)
{
  
  
}

/* creer la barre de menu principale. En fait c'est un simple appel de        */
/* fonction. Tout se fait dans la declaration des elements de menu au debut   */
/* de ce fichier                                                              */
static void 
create_toplevel_menu()
{
  gnome_mdi_set_menubar_template(mdi, main_menu);
  
}


static GtkWidget *
create_view (GnomeMDIChild *child, gpointer data) {
  GtkWidget *canvas;
  
  /* creer un nouveau canvas */
  canvas = create_canvas();
  gtk_widget_show (canvas);

  return GTK_WIDGET(canvas);

}

static void 
new_child_cb (GtkWidget *widget, gpointer data) {
	static gint num_fenetre = 1;
	gchar name[32];
	GnomeMDIGenericChild *child;


	sprintf(name, "Child %d", num_fenetre);
	
	if((child = gnome_mdi_generic_child_new(name)) != NULL) {
	  gnome_mdi_generic_child_set_view_creator(child, create_view, NULL);

	  gtk_object_set_user_data(GTK_OBJECT(child), GINT_TO_POINTER(num_fenetre));

	  /* ajouter l'enfant  */
	  gnome_mdi_add_child(mdi, GNOME_MDI_CHILD(child));
		
	  /* cette routine enregistre une vue de l'enfant */
	  gnome_mdi_add_view(mdi, GNOME_MDI_CHILD(child));

		num_fenetre++;
	}
}



static gboolean
canvas_clicked_cb (GtkWidget *widget,
		   GdkEventButton *event,
		   gpointer user_data)
{  
  GnomeCanvas *canvas = GNOME_CANVAS (widget);

  GnomeCanvasGroup *root_group;
  GnomeCanvasItem *ellipse;
  gdouble x,y;
  
  /* determiner le groupe de plus haut niveau
     du canvas */
  root_group = gnome_canvas_root (canvas);

  /* les coordonnes du pointeur donnees dans la 
     structure event sont indiquees relativement
     au coin en haut a gauche de la fenetre dans
     lequel l'evennement est survenu. 
     Il faut les convertir en coordonnees relatives
     au canvas.
  */
  gnome_canvas_window_to_world (canvas, event->x, event->y, &x, &y);
  
  
  /* ajouter une ellipse au cannevas */
  ellipse = gnome_canvas_item_new 
    (root_group, 
     gnome_canvas_ellipse_get_type(),
     "x1", x,
     "x2", x + 100 * (double)rand()/RAND_MAX,
     "y1", y,
     "y2", y + 100 * (double)rand()/RAND_MAX,
     "outline_color", "black",
     "fill_color", NULL,
     "width_units", 2.0,
     NULL);
}

static GtkWidget *
create_canvas ()
{
  GtkWidget *canvas;
  

  /* creer le canvas en lui meme */
  gtk_widget_push_visual (gdk_rgb_get_visual ());
  gtk_widget_push_colormap (gdk_rgb_get_cmap ());
	
  canvas = gnome_canvas_new_aa ();
  /* fixer la taille d'affichage du  canvas */
  gtk_widget_set_usize (canvas, 400, 300);
  /* recuperer le groupe de plus haut niveau */

  gtk_signal_connect (GTK_OBJECT (canvas), "button-press-event", 
		      (GtkSignalFunc) canvas_clicked_cb, NULL);
  return canvas;

}

int
main(int argc, char *argv[])
{
 GtkWidget *main_widget;
  
  gnome_init ("Bonjour", "1.0", argc, argv);
  
  
  mdi = GNOME_MDI(gnome_mdi_new("", "Troisieme programme d'exemple"));
  
  /* creer la barre de menu des fenetres principales */
  /* cette routine ne cree que les elements de menu  */
  /* communs a toutes les fenetres principales.      */
  create_toplevel_menu (mdi);
  
  /* preciser dans quel menu sera inseree la liste   */
  /* des fenetres enfants mdi                        */
  gnome_mdi_set_child_list_path(mdi, "Fenetres/");
  
  gtk_signal_connect (GTK_OBJECT (mdi), "destroy", 
   		      GTK_SIGNAL_FUNC (quit_cb),  
  		      NULL); 
  
  
  gnome_mdi_open_toplevel (mdi);
  gtk_main ();
  
  return 0;
}





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