I am new to FLTK. I want to put several OpenGL windows in an Fl_Tile. I started with Erco's cheat at
http://seriss.com/people/erco/fltk/#GL4PortResizable which worked OK. However, I want the FL_DOWN_BOX borders to be visible between the tiles. So I enclosed each Fl_Gl_Window in a larger Fl_Window and put these in the Fl_Tile. My layout for testing is like this: +----------+----------+ | gltileb | +----------+----------+ | +------+ | +------+ | | |\ /| | |\ /| | | | \ / | | | \ / | | | | \/ | | | \/ | | | | /\ | | | /\ | | | | / \ | | | / \ | | | |/ \| | |/ \| | | +------+ | +------+ | +----------+----------+ | +------+ | +------+ | | |\ /| | |\ /| | | | \ / | | | \ / | | | | \/ | | | \/ | | | | /\ | | | /\ | | | | / \ | | | / \ | | | |/ \| | |/ \| | | +------+ | +------+ | +----------+----------+ I was hoping for Four Xs in four squares, each with a colored border inside a tile. The X and squares are drawn by GL with colored borders drawn by FLTK, surrounded by regular FL_DOWN_FRAMEs. The problem is that only the left two of the four GL windows get drawn. This is with fltk1.3.0 tested under linux and Windows. What am I doing wrong? I am not really clear on how/when/if my FLGL::draw() gets called in this hierarchy. Robert Strickland Here is my test code: /** Test by Robert Strickland to tile four OpenGL windows. Based on Erco's cheat: http://seriss.com/people/erco/fltk/#GL4PortResizable but without the code to do the proportional resizing */ #include <FL/Fl.H> #include <FL/Fl_Double_Window.H> #include <FL/Fl_Tile.H> #include <FL/Fl_Gl_Window.H> #include <FL/gl.h> /** A Fl_Gl_Window that draws an X in a box */ class FLGL : public Fl_Gl_Window { public: FLGL(int x, int y, int w, int h, const char* l=0) : Fl_Gl_Window(x, y, w, h, l) { end(); } protected: void draw() { if ( !valid() ) { // First time? init viewport, etc. valid(1); glLoadIdentity(); glViewport(0, 0, w(), h()); glOrtho(-w(), w(), -h(), h(), -1, 1); } // Clear screen glClear(GL_COLOR_BUFFER_BIT); // Draw white 'X' glColor3f(1.0, 1.0, 1.0); glBegin(GL_LINES); glVertex2f(w(), h()); glVertex2f(-w(), -h()); glVertex2f(w(), -h()); glVertex2f(-w(), h()); glEnd(); // Draw yellow border last, around the outer edge glColor3f(1.0, 1.0, 0.0); glBegin(GL_LINE_LOOP); glVertex2f(-w()+1, -h()); glVertex2f(w(), -h()); glVertex2f(w(), h()-1); glVertex2f(-w()+1, h()-1); glEnd(); } }; /** A container for a FLGL window that leaves room for a border */ class Viewport : public Fl_Window { protected: FLGL *gl; public: Viewport(int x, int y, int w, int h, const char* l=0) : Fl_Window(x, y, w, h, l) { box(FL_DOWN_FRAME); gl = new FLGL( x+10, x+10, w-20, w-20 ); // wide border for testing resizable(gl); end(); } }; /** A 2x2 tile of OpenGL windows in Viewport containers with borders */ class Layout:public Fl_Tile { private: Viewport *view[4]; public: Layout(int x, int y, int w, int h) : Fl_Tile(x, y, w, h) { box(FL_DOWN_BOX); color(FL_RED); // (shouldn't be seen) // Create the 4 Viewports int k = 0; for (int j = 0; j < 2; j++) { for (int i = 0; i < 2; i++) { view[k] = new Viewport(i*200, j*200, 200, 200); view[k]->box(FL_DOWN_BOX); view[k]->color(9+k); view[k]->align(FL_ALIGN_CLIP); k++; } } end(); } }; int main() { Fl_Double_Window *win = new Fl_Double_Window(400, 400, "gltileb"); Layout *layout = new Layout(0, 0, win->w(), win->h()); win->resizable(layout); win->end(); win->show(); return(Fl::run()); } // End of test code _______________________________________________ fltk-opengl mailing list fltk-opengl@easysw.com http://lists.easysw.com/mailman/listinfo/fltk-opengl