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

Reply via email to