Hello,
I'm trying to integrate Agar widgets into Freeglut main loop.
I thought it should be possible to draw only Agar's widget, without
initialising its own render driver.
But if i try and skip the Agar's driver registration, i cannot use widgets.
So, when running my sample code, i got two windows, instead of Agar's
widget drawn in Freeglut window.
Below, you'll find my try.
I tried to make it as short as possible.
To compile:
gcc test_freeglut.c $(agar-config --cflags --libs) -Wall -lglut
Thank you for having a look.
/* based on hello.c
&& http://wiki.libagar.org/wiki/Custom_event_loop
*/
#include <GL/gl.h>
#include <GL/freeglut.h>
#include <agar/core.h>
#include <agar/gui.h>
#define ERROR(str) fprintf(stderr,"Error %s at %d\n",str,__LINE__);
int is_esc_pressed = 0;
int agar_init(AG_Window **win)
{
int is_error = 1;
if (AG_InitCore("agarhello", 0) < 0) {
ERROR("AG_InitCore"); goto err;
}
if (AG_InitGraphics("glx") < 0) { //ask glx instead
ERROR("AG_InitVideo"); goto err;
}
*win = AG_WindowNew(0);
AG_LabelNew(*win, 0, "Hello, world!");
AG_WindowShow(*win);
is_error = 0;
err:
return is_error;
}
void agar_eventloop()
{
AG_Driver *drv;
AG_Window *win;
AG_LockVFS(&agDrivers);
AGOBJECT_FOREACH_CHILD(drv, &agDrivers, ag_driver) {
if (!AGDRIVER_MULTIPLE(drv)) {
continue;
}
win = AGDRIVER_MW(drv)->win;
if (win->visible) {
AG_BeginRendering(drv);
AG_ObjectLock(win);
AG_WindowDraw(win);
AG_ObjectUnlock(win);
AG_EndRendering(drv);
}
}
AG_UnlockVFS(&agDrivers);
}
static void glut_timerCallback(int id_timer)
{
glutPostRedisplay();
glutTimerFunc(20, glut_timerCallback, id_timer);
}
void glut_display()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glutSwapBuffers ( );
}
void glut_keyboard ( unsigned char key, int x, int y )
{
switch ( key ) {
case 27: // escape
is_esc_pressed = 1;
break;
default:
printf("reçu appui sur : %c\n",key);
x=x;y=y;
break;
}
}
void glut_init ()
{
int argc=1; char *argv[]= {"init", 0 }; //nécessaire pour glutInit
glutInit (&argc, argv); // ( &argc, argv );
/* Initialize OpenGL context */
glClearColor (0.3f, 0.5f, 0.8f, 1.0f);
glEnable(GL_NORMALIZE);
glShadeModel (GL_SMOOTH);
glEnable (GL_DEPTH_TEST);
glutInitDisplayMode ( GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH );
glutInitWindowSize ( 500, 500 );
glutCreateWindow ( "OpenGL Framework" );
glutDisplayFunc ( glut_display );
glutKeyboardFunc ( glut_keyboard );
glutTimerFunc (20, glut_timerCallback, 1);
}
int main(int argc, char *argv[])
{
AG_Window *win = 0;
int is_error = agar_init (&win);
if (!is_error) {
glut_init();
while (!is_esc_pressed) {
glutMainLoopEvent();
agar_eventloop();
usleep(1);
}
}
return 0;
}
_______________________________________________
Agar mailing list
[email protected]
http://libagar.org/lists.html