Index: src/Fl_Gl_Window.cxx
===================================================================
--- src/Fl_Gl_Window.cxx	(revision 4341)
+++ src/Fl_Gl_Window.cxx	(working copy)
@@ -137,27 +137,30 @@
     mode_ &= ~NON_LOCAL_CONTEXT;
     context_ = fl_create_gl_context(this, g);
     valid(0);
-
-//#ifdef __APPLE__
-//    GLint xywh[4];
-//
-//    if (parent() && parent()->window()) {
-//      xywh[0] = x();
-//      xywh[1] = parent()->window()->h() - y() - h();
-//    } else {
-//      xywh[0] = 0;
-//      xywh[1] = 0;
-//    }
-//
-//    xywh[2] = w();
-//    xywh[3] = h();
-//    aglSetInteger(context_, AGL_BUFFER_RECT, xywh);
-//    printf("make_current: xywh=[%d %d %d %d]\n", xywh[0], xywh[1], xywh[2], xywh[3]);
-//
-//    aglUpdateContext(context_);
-//#endif // __APPLE__
   }
   fl_set_gl_context(this, context_);
+
+#ifdef __APPLE__
+  // Set the buffer rectangle here, since in resize() we won't have the
+  // correct parent window size to work with...
+  GLint xywh[4];
+
+  if (window()) {
+    xywh[0] = x();
+    xywh[1] = window()->h() - y() - h();
+  } else {
+    xywh[0] = 0;
+    xywh[1] = 0;
+  }
+
+  xywh[2] = w();
+  xywh[3] = h();
+
+  aglEnable(context_, AGL_BUFFER_RECT);
+  aglSetInteger(context_, AGL_BUFFER_RECT, xywh);
+//  printf("make_current: xywh=[%d %d %d %d]\n", xywh[0], xywh[1], xywh[2], xywh[3]);
+#endif // __APPLE__
+
 #if defined(WIN32) && USE_COLORMAP
   if (fl_palette) {
     fl_GetDC(fl_xid(this));
@@ -358,49 +361,18 @@
 
 void Fl_Gl_Window::resize(int X,int Y,int W,int H) {
 //  printf("Fl_Gl_Window::resize(X=%d, Y=%d, W=%d, H=%d)\n", X, Y, W, H);
-  if (W != w() || H != h()) {
-    valid(0);
-#ifdef __APPLE_QD__
-    GLint xywh[4];
+//  printf("current: x()=%d, y()=%d, w()=%d, h()=%d\n", x(), y(), w(), h());
 
-    if (window()) {
-      // MRS: This isn't quite right, but the parent window won't have its W and H updated yet...
-      xywh[0] = x();
-      xywh[1] = window()->h() - y() - h();
-    } else {
-      xywh[0] = 0;
-      xywh[1] = 0;
-    }
+  if (W != w() || H != h()) valid(0);
 
-    xywh[2] = W;
-    xywh[3] = H;
-    aglSetInteger(context_, AGL_BUFFER_RECT, xywh);
-//    printf("resize: xywh=[%d %d %d %d]\n", xywh[0], xywh[1], xywh[2], xywh[3]);
-
-    aglUpdateContext(context_);
-#elif defined(__APPLE_QUARTZ__)
-    GLint xywh[4];
-
-    if (window()) {
-      // MRS: This isn't quite right, but the parent window won't have its W and H updated yet...
-      xywh[0] = x();
-      xywh[1] = window()->h() - y() - h();
-    } else {
-      xywh[0] = 0;
-      xywh[1] = 0;
-    }
-
-    xywh[2] = W;
-    xywh[3] = H;
-    aglSetInteger(context_, AGL_BUFFER_RECT, xywh);
-//    printf("resize: xywh=[%d %d %d %d]\n", xywh[0], xywh[1], xywh[2], xywh[3]);
-
-    aglUpdateContext(context_);
+#ifdef __APPLE__
+  if (X != x() || Y != y() || W != w() || H != h()) aglUpdateContext(context_);
 #elif !defined(WIN32)
-    if (!resizable() && overlay && overlay != this)
-      ((Fl_Gl_Window*)overlay)->resize(0,0,W,H);
-#endif
+  if ((W != w() || H != h()) && !resizable() && overlay && overlay != this) {
+    ((Fl_Gl_Window*)overlay)->resize(0,0,W,H);
   }
+#endif
+
   Fl_Window::resize(X,Y,W,H);
 }
 
Index: test/fractals.cxx
===================================================================
--- test/fractals.cxx	(revision 4341)
+++ test/fractals.cxx	(working copy)
@@ -612,25 +612,30 @@
 /************************ GLUT STUFF ***************************/
 /***************************************************************/
 
+int winwidth = 1;
+int winheight = 1;
+
 void reshape(int w, int h)
 {
   glViewport(0,0,w,h);
-  glMatrixMode(GL_PROJECTION);
-  glLoadIdentity();
-  gluPerspective(60.0, (GLdouble)w/h, 0.01, 100);
-  glPushMatrix();
-  glMatrixMode(GL_MODELVIEW);
-  glFlush();
+
+  winwidth  = w;
+  winheight = h;
 }
 
 void display(void)
-{ 
+{
+  time_t curtime;
+  char buf[255];
+  static time_t fpstime = 0;
+  static int fpscount = 0;
+  static int fps = 0;
+
   glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
 
   glMatrixMode(GL_PROJECTION);
-  glPopMatrix();
-  glPushMatrix();  /* clear of last viewing xform, leaving perspective */
-
+  glLoadIdentity();
+  gluPerspective(60.0, (GLdouble)winwidth/winheight, 0.01, 100);
   agvViewTransform();
 
   glMatrixMode(GL_MODELVIEW);
@@ -646,12 +651,31 @@
   if (DrawAxes)
     glCallList(AXES);
 
+  glMatrixMode(GL_PROJECTION);
+  glLoadIdentity();
+  gluOrtho2D(0.0, winwidth, 0.0, winheight);
+
+  sprintf(buf, "FPS=%d", fps);
+  glColor3f(1.0f, 1.0f, 1.0f);
+  gl_font(FL_HELVETICA, 12);
+  gl_draw(buf, 10, 10);
+
   //
   // Use glFinish() instead of glFlush() to avoid getting many frames
   // ahead of the display (problem with some Linux OpenGL implementations...)
   //
 
   glFinish();
+
+  // Update frames-per-second
+  fpscount ++;
+  curtime = time(NULL);
+  if ((curtime - fpstime) >= 2)
+  {
+    fps      = (fps + fpscount / (curtime - fpstime)) / 2;
+    fpstime  = curtime;
+    fpscount = 0;
+  }
 }
 
 void visible(int v)
