| 
							- //
 - // "$Id: fullscreen.cxx 8033 2010-12-15 12:11:16Z AlbrechtS $"
 - //
 - // Fullscreen test program for the Fast Light Tool Kit (FLTK).
 - //
 - // This demo shows how to do many of the window manipulations that
 - // are popular on SGI programs, even though X does not really like
 - // them.  You can toggle the border on/off, change the visual to
 - // switch between single/double buffer, and make the window take
 - // over the screen.
 - //
 - // Normally the program makes a single window with a child GL window.
 - // This simulates a program where the 3D display is surrounded by
 - // control knobs.  Running the program with an argument will
 - // make it make a seperate GL window from the controls window.  This
 - // simulates a (older?) style program where the graphics display is
 - // a different window than the controls.
 - //
 - // This program reports how many times it redraws the window to
 - // stdout, so you can see how much time it is wasting.  It appears
 - // to be impossible to prevent X from sending redundant resize
 - // events, so there are extra redraws.  But the way I have the
 - // code arranged here seems to be keeping that to a minimu.
 - //
 - // Apparently unavoidable bugs:
 - //
 - // Turning the border on causes an unnecessary redraw.
 - //
 - // Turning off full screen when the border is on causes an unnecessary
 - // resize and redraw when the program turns the border on.
 - //
 - // If it is a seperate window, turning double buffering on and off
 - // will cause the window to raise, deiconize, and possibly move.  You
 - // can avoid this by making the Fl_Gl_Window a child of a normal
 - // window.
 - //
 - // Copyright 1998-2010 by Bill Spitzak and others.
 - //
 - // This library is free software; you can redistribute it and/or
 - // modify it under the terms of the GNU Library General Public
 - // License as published by the Free Software Foundation; either
 - // version 2 of the License, or (at your option) any later version.
 - //
 - // This library is distributed in the hope that it will be useful,
 - // but WITHOUT ANY WARRANTY; without even the implied warranty of
 - // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 - // Library General Public License for more details.
 - //
 - // You should have received a copy of the GNU Library General Public
 - // License along with this library; if not, write to the Free Software
 - // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
 - // USA.
 - //
 - // Please report all bugs and problems on the following page:
 - //
 - //     http://www.fltk.org/str.php
 - //
 - 
 - #include <config.h>
 - #include <FL/Fl.H>
 - #include <FL/Fl_Single_Window.H>
 - #include <FL/Fl_Hor_Slider.H>
 - #include <FL/Fl_Toggle_Light_Button.H>
 - #include <FL/math.h>
 - #include <stdio.h>
 - 
 - #if HAVE_GL
 - #include <FL/gl.h>
 - #include <FL/Fl_Gl_Window.H>
 - 
 - class shape_window : public Fl_Gl_Window {
 -   void draw();
 - public:
 -   int sides;
 -   shape_window(int x,int y,int w,int h,const char *l=0);
 - };
 - 
 - shape_window::shape_window(int x,int y,int w,int h,const char *l) :
 - Fl_Gl_Window(x,y,w,h,l) {
 -   sides = 3;
 - }
 - 
 - void shape_window::draw() {
 -   printf("drawing size %d %d\n",w(),h());
 -   if (!valid()) {
 -     valid(1);
 - //  printf("init\n");
 -     glLoadIdentity();
 -     glViewport(0,0,w(),h());
 -   }
 -   glClear(GL_COLOR_BUFFER_BIT);
 -   glColor3f(.5,.6,.7);
 -   glBegin(GL_POLYGON);
 -   for (int j = 0; j < sides; j ++) {
 -     double ang = j*2*M_PI/sides;
 -     glVertex3f(cos(ang),sin(ang),0);
 -   }
 -   glEnd();
 - }
 - 
 - #else
 - 
 - #include <FL/fl_draw.H>
 - 
 - class shape_window : public Fl_Window {
 -   void draw();
 - public:
 -   int sides;
 -   shape_window(int x,int y,int w,int h,const char *l=0);
 - };
 - 
 - shape_window::shape_window(int x,int y,int w,int h,const char *l) :
 - Fl_Window(x,y,w,h,l) {
 -   sides = 3;
 - }
 - 
 - void shape_window::draw() {
 -   fl_color(0);
 -   fl_rectf(0,0,w(),h());
 -   fl_font(0,20);
 -   fl_color(7);
 -   fl_draw("This requires GL",0,0,w(),h(),FL_ALIGN_CENTER);
 - }
 - 
 - #endif
 - 
 - void sides_cb(Fl_Widget *o, void *p) {
 -   shape_window *sw = (shape_window *)p;
 -   sw->sides = int(((Fl_Slider *)o)->value());
 -   sw->redraw();
 - }
 - 
 - #if HAVE_GL
 - void double_cb(Fl_Widget *o, void *p) {
 -   shape_window *sw = (shape_window *)p;
 -   int d = ((Fl_Button *)o)->value();
 -   sw->mode(d ? Fl_Mode(FL_DOUBLE|FL_RGB) : FL_RGB);
 - }
 - #else
 - void double_cb(Fl_Widget *, void *) {}
 - #endif
 - 
 - void border_cb(Fl_Widget *o, void *p) {
 -   Fl_Window *w = (Fl_Window *)p;
 -   int d = ((Fl_Button *)o)->value();
 -   w->border(d);
 - #if defined(WIN32) || defined(__APPLE__)
 -   int wx = w->x(), wy = w->y();
 -   w->hide(); w->show();
 -   w->position(wx, wy);
 - #endif
 - }
 - 
 - int px,py,pw,ph;
 - Fl_Button *border_button;
 - void fullscreen_cb(Fl_Widget *o, void *p) {
 -   Fl_Window *w = (Fl_Window *)p;
 -   int d = ((Fl_Button *)o)->value();
 -   if (d) {
 -     px = w->x();
 -     py = w->y();
 -     pw = w->w();
 -     ph = w->h();
 - #ifndef WIN32//necessary because fullscreen removes border
 - 	border_button->value(0);
 - 	border_button->do_callback();
 - #endif
 -     w->fullscreen();
 -   } else {
 -     w->fullscreen_off(px,py,pw,ph);
 -   }
 - }
 - 
 - #include <stdlib.h>
 - 
 - void exit_cb(Fl_Widget *, void *) {
 -   exit(0);
 - }
 - 
 - #define NUMB 5
 - 
 - int twowindow = 0;
 - int initfull = 0;
 - int arg(int, char **argv, int &i) {
 -   if (argv[i][1] == '2') {twowindow = 1; i++; return 1;}
 -   if (argv[i][1] == 'f') {initfull = 1; i++; return 1;}
 -   return 0;
 - }
 - 
 - int main(int argc, char **argv) {
 - 
 -   int i=0;
 -   if (Fl::args(argc,argv,i,arg) < argc)
 -     Fl::fatal("Options are:\n -2 = 2 windows\n -f = startup fullscreen\n%s",Fl::help);
 - 
 -   Fl_Single_Window window(300,300+30*NUMB); window.end();
 - 
 -   shape_window sw(10,10,window.w()-20,window.h()-30*NUMB-20);
 - #if HAVE_GL
 -   sw.mode(FL_RGB);
 - #endif
 - 
 -   Fl_Window *w;
 -   if (twowindow) {	// make it's own window
 -     sw.resizable(&sw);
 -     w = &sw;
 -     window.set_modal();	// makes controls stay on top when fullscreen pushed
 -     argc--;
 -     sw.show();
 -   } else {		// otherwise make a subwindow
 -     window.add(sw);
 -     window.resizable(&sw);
 -     w = &window;
 -   }
 - 
 -   window.begin();
 - 
 -   int y = window.h()-30*NUMB-5;
 -   Fl_Hor_Slider slider(50,y,window.w()-60,30,"Sides:");
 -   slider.align(FL_ALIGN_LEFT);
 -   slider.callback(sides_cb,&sw);
 -   slider.value(sw.sides);
 -   slider.step(1);
 -   slider.bounds(3,40);
 -   y+=30;
 - 
 -   Fl_Toggle_Light_Button b1(50,y,window.w()-60,30,"Double Buffered");
 -   b1.callback(double_cb,&sw);
 -   y+=30;
 - 
 -   Fl_Toggle_Light_Button b2(50,y,window.w()-60,30,"Border");
 -   b2.callback(border_cb,w);
 -   b2.set();
 -   border_button = &b2;
 -   y+=30;
 - 
 -   Fl_Toggle_Light_Button b3(50,y,window.w()-60,30,"FullScreen");
 -   b3.callback(fullscreen_cb,w);
 -   y+=30;
 - 
 -   Fl_Button eb(50,y,window.w()-60,30,"Exit");
 -   eb.callback(exit_cb);
 -   y+=30;
 - 
 -   if (initfull) {b3.set(); b3.do_callback();}
 - 
 -   window.end();
 -   window.show(argc,argv);
 - 
 -   return Fl::run();
 - }
 - 
 - //
 - // End of "$Id: fullscreen.cxx 8033 2010-12-15 12:11:16Z AlbrechtS $".
 - //
 
 
  |