OVH Cloud OVH Cloud

Gtk + glarea probleme

1 réponse
Avatar
samuel.berthelot
Bonjour,
J'ai quelques soucis avec GTK 2.0 et le widget gtkglarea
Si j'utilise cet ensemble de liens et d'includes au moment de la
compilation:

-I/usr/include/ -I/usr/include/gtk-1.2 -I/usr/include/glib-1.2
-I/usr/lib/glib/include -I/usr/X11R6/include

-lX11 -lXi -lXmu -lglut -lGL -lGLU -lm -lgtk -lgdk -rdynamic -lgmodule
-lglib -ldl -lXi -lXext -lgtkgl

Alors je recois le message suivant:

gcc -Wall -ggdb -I/usr/include/ -I/usr/include/gtk-1.2
-I/usr/include/glib-1.2 -I/usr/lib/glib/include -I/usr/X11R6/include
-o exe parseur.o processor.o object3D.o main.o -L/usr/X11R6/lib
-lX11 -lXi -lXmu -lglut -lGL -lGLU -lm -lgtk -lgdk -rdynamic -lgmodule
-lglib -ldl -lXi -lXext -lgtkgl
main.o(.text+0x1a7): In function `main':
/home/sam/Developpement/C/Project/InitGTK/main.c:77: undefined
reference to `gtk_window_set_resizable'
collect2: ld returned 1 exit status
make: *** [exe] Error 1

gtk_window_set_resizable n'est pas reconnue ce qui n'a pas de sens vu
que les autres fonctions gtk que j'utilisent le sont...
Si je commente la ligne avec l'appel a cette fonction, alors mon
programme fonctionne et affiche le widget gtkglarea ainsi que les
autres widgets gtk.

Maintenant si j'utilise l'ensemble de liens et includes suivant au
moment de la compilation:

-I/usr/include/ -I/usr/include/gtk-1.2 -I/usr/include/glib-1.2
-I/usr/lib/glib/include -I/usr/X11R6/include -I/usr/include/gtk-2.0
-I/usr/lib/gtk-2.0/include -I/usr/include/atk-1.0
-I/usr/include/pango-1.0

-lX11 -lXi -lXmu -lglut -lGL -lGLU -lm -lgtk -lgdk -rdynamic -lgmodule
-lglib -ldl -lXi -lXext -lgtkgl -lgdk_pixbuf-2.0 -lm -lpangoxft-1.0
-lpangox-1.0 -lpango-1.0 -lgobject-2.0

Alors ca compile correctement. Par contre quand j'execute le programme
le message suivant apparait:

(process:4085): Gtk-WARNING **: Locale not supported by C library.
Using the fallback 'C' locale.
Segmentation fault

Apres avoir utilise le debugger je me suis rendu compte que l'erreur
de segmentation se produit a l'appel de :

glarea = create_glarea ();

et par la meme occasion se produira a tout appel de function reliee a
gtkglarea

Si je commente les 3 lignes de mon code qui se rapportent a gtkglarea,
voici ce qui se produit au moment de l' execution:

(process:4095): Gtk-WARNING **: Locale not supported by C library.
Using the fallback 'C' locale.

(exe:4095): Gtk-WARNING **: invalid cast from `(unknown)' to
`(unknown)'

(exe:4095): Gtk-CRITICAL **: file gtksignal.c: line 725
(gtk_signal_connect): assertion `GTK_IS_OBJECT (object)' failed.

(exe:4095): Gtk-WARNING **: invalid cast from `(unknown)' to
`(unknown)'

(exe:4095): Gtk-WARNING **: invalid cast from `(unknown)' to
`(unknown)'

(exe:4095): Gtk-CRITICAL **: file gtksignal.c: line 725
(gtk_signal_connect): assertion `GTK_IS_OBJECT (object)' failed.

(exe:4095): Gtk-WARNING **: invalid cast from `(unknown)' to
`(unknown)'

(exe:4095): Gtk-CRITICAL **: file gtksignal.c: line 725
(gtk_signal_connect): assertion `GTK_IS_OBJECT (object)' failed.

(exe:4095): Gtk-WARNING **: invalid cast from `(unknown)' to
`(unknown)'

(exe:4095): Gtk-WARNING **: invalid cast from `(unknown)' to
`(unknown)'

(exe:4095): Gtk-WARNING **: invalid cast from `(unknown)' to
`(unknown)'

Et la fenetre gtk de mon window apparait. Evidemment seul le bouton
apparait vu que j'ai retire tout appel a gtkglarea. En revanche le
bouton ne marche plus lorsque je clique dessus...

Bon j'espere que j'ai ete assez clair dans mes explications. Ce
probleme est plutot complique. Je pourrais m'en tenir au premier
groupe de libs et d'includes et ne pas utiliser
gtk_window_set_resizable mais j'ai remarque que d'autres fonctions
(que je n'utilise pas pour l'instant) posent le meme probleme...
Quelqu'un peut il m'aider ?

Merci d'avance.
Sam

Voici mon code au cas ou:


#include <GL/gl.h>
#include <GL/glu.h>
#include <gtk/gtk.h>
#include <gtkgl/gtkglarea.h>
#include "parseur.h"
#include "processor.h"

void display(void);
void draw_points(void);
void draw_wireframe(void);
void draw_polygons(void);
void setOrthoViewVol(void);
void setGluPerspViewVol(void);
void setFrustViewVol(void);

GtkWidget* create_glarea (void);
gint glarea_button_release (GtkWidget*, GdkEventButton*);
gint glarea_button_press (GtkWidget*, GdkEventButton*);
gint glarea_motion_notify (GtkWidget*, GdkEventMotion*);
gint glarea_draw (GtkWidget*, GdkEventExpose*);
gint glarea_reshape (GtkWidget*, GdkEventConfigure*);
gint glarea_init (GtkWidget*);
gint glarea_destroy (GtkWidget*);

int main(int argc, char *argv[])
{

GtkWidget* window;
GtkWidget* button_quit;
GtkWidget* box_main;
GtkWidget* glarea;

gtk_init (&argc, &argv);

/* Main widget container */

box_main = gtk_vbox_new (FALSE, 10);

/* GTK GL Area */

glarea = create_glarea ();

/* Quit button */

button_quit = gtk_button_new_with_label ("Quit");

gtk_signal_connect (GTK_OBJECT(button_quit), "clicked",
GTK_SIGNAL_FUNC(gtk_main_quit), NULL);

/* Main window */

window = gtk_window_new (GTK_WINDOW_TOPLEVEL);

gtk_window_set_title (GTK_WINDOW(window), "GtkGLArea Demo");

/* destroy this window when exiting from gtk_main() */

gtk_quit_add_destroy (1, GTK_OBJECT(window));

gtk_signal_connect (GTK_OBJECT(window), "delete_event",
GTK_SIGNAL_FUNC(gtk_main_quit), NULL);

gtk_signal_connect (GTK_OBJECT (window), "destroy",
GTK_SIGNAL_FUNC(gtk_main_quit), NULL);

gtk_container_set_border_width (GTK_CONTAINER(window), 10);

/* Pack everything into the main box, add the main box to */
/* the top-level window, and 'show' all of the widgets. */
/* The window is 'shown' last so that when the user sees */
/* it, it's contents are already there. Otherwise they */
/* might see each widget come up. */

gtk_box_pack_start (GTK_BOX(box_main), glarea, FALSE, TRUE, 0);
gtk_box_pack_start (GTK_BOX(box_main), button_quit, FALSE, TRUE, 0);
gtk_container_add (GTK_CONTAINER(window), box_main);

gtk_widget_show (glarea);
gtk_widget_show (button_quit);
gtk_widget_show (box_main);
gtk_widget_show (window);

gtk_main ();

return 1;
}

GtkWidget* create_glarea (void) {

GtkWidget* glarea;

int attrlist[] = {
GDK_GL_RGBA,
GDK_GL_DOUBLEBUFFER,
GDK_GL_DEPTH_SIZE, 1,
GDK_GL_NONE
};

if(gdk_gl_query() == FALSE) {
g_print("OpenGL not supported!\n");
return NULL;
}

if ((glarea = gtk_gl_area_new(attrlist)) == NULL) {
g_print("Error creating GtkGLArea!\n");
return NULL;
}

gtk_widget_set_events(GTK_WIDGET(glarea),
GDK_EXPOSURE_MASK|
GDK_BUTTON_PRESS_MASK|
GDK_BUTTON_RELEASE_MASK|
GDK_POINTER_MOTION_MASK|
GDK_POINTER_MOTION_HINT_MASK);


gtk_signal_connect (GTK_OBJECT(glarea), "motion_notify_event",
GTK_SIGNAL_FUNC(glarea_motion_notify), NULL);

gtk_signal_connect (GTK_OBJECT(glarea), "expose_event",
GTK_SIGNAL_FUNC(glarea_draw), NULL);

gtk_signal_connect (GTK_OBJECT(glarea), "configure_event",
GTK_SIGNAL_FUNC(glarea_reshape), NULL);

gtk_signal_connect (GTK_OBJECT(glarea), "realize",
GTK_SIGNAL_FUNC(glarea_init), NULL);

gtk_signal_connect (GTK_OBJECT(glarea), "destroy",
GTK_SIGNAL_FUNC (glarea_destroy), NULL);

gtk_widget_set_usize(GTK_WIDGET(glarea), 800, 600);
return (glarea);
}

gint glarea_motion_notify (GtkWidget* widget, GdkEventMotion* event)
{

return TRUE;
}

gint glarea_draw (GtkWidget* widget, GdkEventExpose* event)
{
if (event->count > 0)
{
return(TRUE);
}
g_print ("Expose Event\n");

if (gtk_gl_area_make_current(GTK_GL_AREA(widget)))
{
} return (TRUE);
}

gint glarea_reshape (GtkWidget* widget, GdkEventConfigure* event)
{

int w = widget->allocation.width;
int h = widget->allocation.height;

g_print ("Reshape Event\n");

if (gtk_gl_area_make_current (GTK_GL_AREA(widget)))
{
} return (TRUE);
}

gint glarea_init (GtkWidget* widget)
{
g_print ("Realize Event\n");

/* gtk_gl_area_make_current MUST be called before rendering */
/* into the GtkGLArea. */

if (gtk_gl_area_make_current (GTK_GL_AREA(widget)))
{
} return TRUE;
}

gint glarea_destroy (GtkWidget* widget)
{

g_print ("GTK GL Area Destroy Event\n");

/* Insert any required cleanup */
/* code here. */
return TRUE;
}

--
Pour contacter l'équipe de modération : moderateurs-fcolm@efrei.fr
ATTENTION: Postez DIRECTEMENT vos articles dans le groupe, PAS dans
la liste de distribution des modérateurs.

1 réponse

Avatar
Nicolas LAURENT
berthelot samuel wrote:
Bonjour,
J'ai quelques soucis avec GTK 2.0 et le widget gtkglarea
Si j'utilise cet ensemble de liens et d'includes au moment de la
compilation:

-I/usr/include/ -I/usr/include/gtk-1.2 -I/usr/include/glib-1.2
-I/usr/lib/glib/include -I/usr/X11R6/include

-lX11 -lXi -lXmu -lglut -lGL -lGLU -lm -lgtk -lgdk -rdynamic -lgmodule
-lglib -ldl -lXi -lXext -lgtkgl

Alors je recois le message suivant:

gcc -Wall -ggdb -I/usr/include/ -I/usr/include/gtk-1.2
-I/usr/include/glib-1.2 -I/usr/lib/glib/include -I/usr/X11R6/include
-o exe parseur.o processor.o object3D.o main.o -L/usr/X11R6/lib
-lX11 -lXi -lXmu -lglut -lGL -lGLU -lm -lgtk -lgdk -rdynamic -lgmodule
-lglib -ldl -lXi -lXext -lgtkgl
main.o(.text+0x1a7): In function `main':
/home/sam/Developpement/C/Project/InitGTK/main.c:77: undefined
reference to `gtk_window_set_resizable'
collect2: ld returned 1 exit status
make: *** [exe] Error 1





pour moi tu essaye d'utiliser l'API GTK-2.0 mais au moment de l'édition
de lien tu utilise la bibliothèque GTK-1.2... Enfin, c'est mon hypothèse!
En tout cas, le message du compilateur est clair :-)

--
Pour contacter l'équipe de modération :
ATTENTION: Postez DIRECTEMENT vos articles dans le groupe, PAS dans
la liste de distribution des modérateurs.