aa version of the canvas problem
- From: Bertrand Guiheneuf <Bertrand Guiheneuf inria fr>
- To: gnome-list gnome org
- Subject: aa version of the canvas problem
- Date: Wed, 02 Jun 1999 00:19:56 +0200
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]