Loic wrote:
Might have to do with making sure you put win->begin();
and win->end() around your definition of the menubar,
so it's clear where it's getting parented.
There should be nothing special about the menu bar wrt to
keyboard event handling that I'm aware of.
FWIW, I added an Fl_Window and MenuBar to the example
I posted earlier, along with a handle() method that prints events
in the GL window subclass.
Seems to work normally for me; menubar and GL window appear within
the outer Fl_Window, and events are printed (eg. hitting right arrow)
and the menubar is shown.
#include <stdio.h>
#include <math.h>
#include <FL/Fl.h>
#include <FL/Fl_Window.h>
#include <FL/Fl_Menu_Bar.h>
#include <FL/Fl_Gl_Window.h>
#include <FL/gl.h>
//
// OpenGL spinning cube with checker texturemap -- erco/loic 03/17/09
//
#define WIN_W 400 // window width
#define WIN_H 400 // window height
#define TEX_W 64 // texturemap width
#define TEX_H 64 // texturemap height
#define FPS (1.0/24.0) // frames per second playback
//
// OpenGL class to show texturemapped cube
//
class MyGlWindow : public Fl_Gl_Window {
double spin;
GLuint TexID;
// TIMER CALLBACK
// Handles rotation the object
//
static void Timer_CB(void *userdata) {
MyGlWindow *mygl = (MyGlWindow*)userdata;
mygl->spin += 2.0; // spin
mygl->redraw();
Fl::repeat_timeout(FPS, Timer_CB, userdata);
}
public:
// CTOR
MyGlWindow(int x,int y,int w,int h,const char *l=0) : Fl_Gl_Window(x,y,w,h,l)
{
spin = 0.0;
Fl::add_timeout(FPS, Timer_CB, (void*)this); // 24fps timer
}
// PERSPECTIVE VIEW
// Same as gluPerspective()..
//
void Perspective(GLdouble fovy, GLdouble aspect, GLdouble zNear, GLdouble
zFar) {
GLdouble xmin, xmax, ymin, ymax;
ymax = zNear * tan(fovy * M_PI / 360.0);
ymin = -ymax;
xmin = ymin * aspect;
xmax = ymax * aspect;
glFrustum(xmin, xmax, ymin, ymax, zNear, zFar);
}
// RESHAPED VIEWPORT
// OpenGL stuff to do whenever window changes size
//
void ReshapeViewport() {
// Viewport
glViewport(0, 0, w(), h());
// Projection
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
GLfloat ratio = w() / h();
Perspective(30.0, 1.0*ratio, 1.0, 30.0);
glTranslatef(0.0, 0.0, -8.0);
// Model view
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
// OPENGL INITIALIZATION
// OpenGL stuff to do *only once* on startup.
//
void GlInit() {
// Make sure we only do this once
static int first_time = 1;
if ( first_time ) {
first_time = 0;
// Texture Map Init
GLubyte img[TEX_W][TEX_H][3]; // after glTexImage2D(), array
is no longer needed
glGenTextures(1, &TexID);
glBindTexture(GL_TEXTURE_2D, TexID);
for (int x=0; x<TEX_W; x++) {
for (int y=0; y<TEX_H; y++) {
GLubyte c = ((x&16)^(y&16)) ? 255 : 0;
// checkerboard
//GLubyte c = ((x&16)^(y&16)) ? ((x%16)<<4) : (((x%16)^15)<<4);
// basket weave
img[x][y][0] = c;
img[x][y][1] = c;
img[x][y][2] = c;
}
}
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, TEX_W, TEX_H, 0, GL_RGB,
GL_UNSIGNED_BYTE, &img[0][0][0]);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glEnable(GL_TEXTURE_2D);
// Misc OpenGL settings
glShadeModel(GL_FLAT);
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LEQUAL);
}
}
// FLTK DRAW
// Called by FLTK to draw the scene.
//
void draw() {
// Initialize/handle reshaped viewport
if ( !valid() ) {
valid(1);
GlInit();
ReshapeViewport();
}
// Clear
glClearColor(.5,.5,.5, 0.0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
// Setup model matrix
glLoadIdentity();
glRotatef(spin, 0.5, 1.0, 0.0); // show all sides of cube
// Draw cube with texture assigned to each face
glBegin(GL_QUADS);
// Front Face
glColor3f(1.0, 0.0, 0.0); // red
glTexCoord2f(0.0, 1.0); glVertex3f(-1.0, 1.0, 1.0); // Top
Left Of The Texture and Quad
glTexCoord2f(1.0, 1.0); glVertex3f( 1.0, 1.0, 1.0); // Top
Right Of The Texture and Quad
glTexCoord2f(1.0, 0.0); glVertex3f( 1.0, -1.0, 1.0); //
Bottom Right Of The Texture and Quad
glTexCoord2f(0.0, 0.0); glVertex3f(-1.0, -1.0, 1.0); //
Bottom Left Of The Texture and Quad
// Back Face
glColor3f(0.0, 1.0, 1.0); // cyn
glTexCoord2f(0.0, 1.0); glVertex3f( 1.0, 1.0, -1.0); // Top
Left Of The Texture and Quad
glTexCoord2f(1.0, 1.0); glVertex3f(-1.0, 1.0, -1.0); // Top
Right Of The Texture and Quad
glTexCoord2f(1.0, 0.0); glVertex3f(-1.0, -1.0, -1.0); //
Bottom Right Of The Texture and Quad
glTexCoord2f(0.0, 0.0); glVertex3f( 1.0, -1.0, -1.0); //
Bottom Left Of The Texture and Quad
// Top Face
glColor3f(0.0, 1.0, 0.0); // grn
glTexCoord2f(0.0, 1.0); glVertex3f(-1.0, 1.0, -1.0); // Top
Left Of The Texture and Quad
glTexCoord2f(1.0, 1.0); glVertex3f( 1.0, 1.0, -1.0); // Top
Right Of The Texture and Quad
glTexCoord2f(1.0, 0.0); glVertex3f( 1.0, 1.0, 1.0); //
Bottom Right Of The Texture and Quad
glTexCoord2f(0.0, 0.0); glVertex3f(-1.0, 1.0, 1.0); //
Bottom Left Of The Texture and Quad
// Bottom Face
glColor3f(1.0, 0.0, 1.0); // mag
glTexCoord2f(0.0, 1.0); glVertex3f( 1.0, -1.0, -1.0); // Top
Left Of The Texture and Quad
glTexCoord2f(1.0, 1.0); glVertex3f(-1.0, -1.0, -1.0); // Top
Right Of The Texture and Quad
glTexCoord2f(1.0, 0.0); glVertex3f(-1.0, -1.0, 1.0); //
Bottom Right Of The Texture and Quad
glTexCoord2f(0.0, 0.0); glVertex3f( 1.0, -1.0, 1.0); //
Bottom Left Of The Texture and Quad
// Right face
glColor3f(0.0, 0.0, 1.0); // blu
glTexCoord2f(0.0, 1.0); glVertex3f( 1.0, 1.0, 1.0); // Top
Left Of The Texture and Quad
glTexCoord2f(1.0, 1.0); glVertex3f( 1.0, 1.0, -1.0); // Top
Right Of The Texture and Quad
glTexCoord2f(1.0, 0.0); glVertex3f( 1.0, -1.0, -1.0); //
Bottom Right Of The Texture and Quad
glTexCoord2f(0.0, 0.0); glVertex3f( 1.0, -1.0, 1.0); //
Bottom Left Of The Texture and Quad
// Left Face
glColor3f(1.0, 1.0, 0.0); // yel
glTexCoord2f(0.0, 1.0); glVertex3f(-1.0, 1.0, -1.0); // Top
Left Of The Texture and Quad
glTexCoord2f(1.0, 1.0); glVertex3f(-1.0, 1.0, 1.0); // Top
Right Of The Texture and Quad
glTexCoord2f(1.0, 0.0); glVertex3f(-1.0, -1.0, 1.0); //
Bottom Right Of The Texture and Quad
glTexCoord2f(0.0, 0.0); glVertex3f(-1.0, -1.0, -1.0); //
Bottom Left Of The Texture and Quad
glEnd();
// DEBUG: CHECK FOR ERRORS
GLenum err = glGetError();
if ( err != GL_NO_ERROR ) {
fprintf(stderr, "GLGETERROR=%d\n", (int)err);
}
}
int handle(int e) {
printf("EVENT=%d\n",e);
return(Fl_Gl_Window::handle(e));
}
};
int main(int argc, char *argv[]) {
Fl_Window *win = new Fl_Window(WIN_W, WIN_H);
Fl_Menu_Bar *bar = new Fl_Menu_Bar(0,0,WIN_W,25);
bar->add("File/New");
bar->add("File/Save");
bar->add("File/Save As");
bar->add("File/Quit");
MyGlWindow* mygl = new MyGlWindow(35, 35, WIN_W-45, WIN_H-45, "Texture Test");
mygl->end();
win->end();
mygl->resizable(mygl);
mygl->show();
win->resizable(win);
win->show();
return(Fl::run());
}
_______________________________________________
fltk-opengl mailing list
[email protected]
http://lists.easysw.com/mailman/listinfo/fltk-opengl