// gcc -o configNotify configNotify.c gl.o -L/usr/X11/lib -lforms -lGLU -lGL -lm -lX11 -I/usr/X11/include/

#include <stdlib.h>

#include <GL/gl.h>
#include <GL/glx.h>

#include "forms.h"

#define TRUE 1
#define FALSE 0

typedef struct {
	FL_FORM *worldView;
	void *vdata;
	char *cdata;
	long  ldata;
	FL_OBJECT *worldViewCanvas;
} FD_worldView;

FD_worldView *create_form_worldView(void)
{
  FL_OBJECT *obj;
  FD_worldView *fdui = (FD_worldView *) fl_calloc(1, sizeof(*fdui));

  fdui->worldView = fl_bgn_form(FL_NO_BOX, 640, 480);
  obj = fl_add_box(FL_UP_BOX,0,0,640,480,"");
  fdui->worldViewCanvas = obj = fl_add_glcanvas(FL_NORMAL_CANVAS,0,0,640,480,"");
  fl_end_form();

  fdui->worldView->fdui = fdui;

  return fdui;
}

int
worldView_expose_handler(FL_OBJECT *obj, Window win, int w, int h,
			 XEvent *xev, void *data)
{
  printf("Expose: Window w=%d h=%d; Object w=%d h=%d\n", w, h, obj->w, obj->h);

  return TRUE;
}

int
worldView_configure_notify_handler(FL_OBJECT *obj, Window win, int w, int h,
				   XEvent *xev, void *data)
{
  printf("Configure notify: Window w=%d h=%d; Object w=%d h=%d\n",
	 w, h, obj->w, obj->h);

  return TRUE;
}

int
raw_callback(FL_FORM *form, void *event)
{
  Window win;
  int x, y, w, h;

  if (((XEvent *)event)->type == ConfigureNotify) {
    win = FL_ObjWin(((FD_worldView *)form->fdui)->worldViewCanvas);
    fl_get_wingeometry(win, &x, &y, &w, &h);
    printf("Raw event ConfigureNotify: Window w=%d h=%d; Object w=%d h=%d\n",
	   w, h, ((FD_worldView *)form->fdui)->worldViewCanvas->w,
	   ((FD_worldView *)form->fdui)->worldViewCanvas->h);
  }
  return FALSE;
}

int
main(int argc, char *argv[])
{
  FL_OBJECT *obj;
  FD_worldView *form;
  const int attributeList[] = { GLX_RGBA, GLX_DOUBLEBUFFER,
				GLX_DEPTH_SIZE, 16,None };

  fl_initialize(&argc, argv, 0, 0, 0);

  fl_set_glcanvas_defaults(attributeList);

  form = create_form_worldView();

  obj = form->worldViewCanvas;
  fl_add_canvas_handler(obj, Expose, &worldView_expose_handler, 0);
  fl_add_canvas_handler(obj, ConfigureNotify,
			&worldView_configure_notify_handler, 0);

  fl_register_raw_callback(form->worldView, FL_ALL_EVENT, &raw_callback);

  fl_show_form(form->worldView, FL_PLACE_POSITION, FL_FULLBORDER, "worldView");

  fl_do_forms();

  return 0;
}

