> I desperately need access to some of fltk's native handles so that I may > fashion proper cooperation between fltk and various other libraries that I am > using. > > I am attempting to initialize the handles I need myself in the manner that is > described in the documentation here: > > http://www.fltk.org/doc-1.3/index.html > > ----------- Quote ---------- > > "Changing the Display, Screen, or X Visual > FLTK uses only a single display, screen, X visual, and X colormap. This > greatly simplifies its internal structure and makes it much smaller and > faster. You can change which it uses by setting global variables before the > first Fl_Window::show() is called. You may also want to call Fl::visual(), > which is a portable interface to get a full color and/or double buffered > visual." > > ----------------------------- > > In the constructor of my display window I attempt to initialize the display, > screen, visual and colormap. I normally do this before any windows are shown > and only once. However, the code below doesn't do this and only provides a > means to reproduce the following error which is causing much wailing and > gnashing of teeth: > > ----------- Error ---------- > > X Error of failed request: BadAtom (invalid Atom parameter) > Major opcode of failed request: 18 (X_ChangeProperty) > Atom id in failed request: 0x0 > Serial number of failed request: 21 > Current serial number in output stream: 32 > Press [Enter] to close the terminal ... > > ----------------------------- > > ----------- Code ---------- > > #include <fltk/run.h> > #include <fltk/GlWindow.h> > #include <iostream> > #include <string> > > #include <GL/glx.h> > #define XWindow ::Window > # include <fltk/x.h> > // > #define GLX_CONTEXT_MAJOR_VERSION_ARB 0x2091 > #define GLX_CONTEXT_MINOR_VERSION_ARB 0x2092 > typedef GLXContext (*glXCreateContextAttribsARBProc)(Display*, GLXFBConfig, > GLXContext, Bool, const int*); > > void Terminate(const std::string &message) > { > throw message; > }; > > struct OglDisplayWindow : public fltk::GlWindow > { > OglDisplayWindow( > int X, > int Y, > int W, > int H, > const char *L); > > virtual ~OglDisplayWindow(); > > virtual void draw(); > > virtual int handle(int); > > typedef GLXContext OGLCONTEXT; > private: > static Display *_disp_ptr; > static XVisualInfo *_vis_ptr; > static GLXFBConfig *_fbconfig_ptr; > static int _fbconfigID; > static int _screenID; > static Colormap _colorMap; > }; > > Display* OglDisplayWindow::_disp_ptr = 0; > XVisualInfo* OglDisplayWindow::_vis_ptr = 0; > GLXFBConfig* OglDisplayWindow::_fbconfig_ptr = 0; > int OglDisplayWindow::_fbconfigID = 0; > int OglDisplayWindow::_screenID = 0; > Colormap OglDisplayWindow::_colorMap = Colormap(); > > OglDisplayWindow::OglDisplayWindow( > int X, > int Y, > int W, > int H, > const char *L) : > fltk::GlWindow(X,Y,W,H,L) > { > struct Utility > { > static void InitOsNativeResources() > { > //Interacting with the X library > > ////////////////////////////////////////////////////////////////////////// > _disp_ptr = XOpenDisplay(0); > > if (!_disp_ptr) > { > Terminate("OglDisplayWindow::draw - Failed to > open X display.\n"); > }//end if > > _screenID = DefaultScreen(_disp_ptr); > > // Get a matching FB config > static int visual_attribs[] = { > GLX_X_RENDERABLE,True, > GLX_DRAWABLE_TYPE,GLX_WINDOW_BIT, > GLX_RENDER_TYPE,GLX_RGBA_BIT, > GLX_X_VISUAL_TYPE,GLX_TRUE_COLOR, > GLX_RED_SIZE,8, > GLX_GREEN_SIZE,8, > GLX_BLUE_SIZE,8, > GLX_ALPHA_SIZE,8, > GLX_DEPTH_SIZE,24, > GLX_STENCIL_SIZE,8, > GLX_DOUBLEBUFFER,True, > //GLX_SAMPLE_BUFFERS , 1, > //GLX_SAMPLES , 4, > None > }; > > //Getting matching framebuffer configs > int fbcount; > _fbconfig_ptr = glXChooseFBConfig( > _disp_ptr, > _screenID, > visual_attribs, > &fbcount); > > if (!_fbconfig_ptr) > { > Terminate("OglDisplayWindow::draw - Failed to > retrieve a framebuffer config.\n"); > }//end if > > //"Found matching FB configs > > // Pick the FB config/visual with the most samples > per pixel > > //Getting XVisualInfo > int best_fbc = -1; > int worst_fbc = -1; > int best_num_samp = -1; > int worst_num_samp = 999; > > int samp_buf; > int samples; > for (int i(0);i < fbcount;++i) > { > _vis_ptr = glXGetVisualFromFBConfig( > _disp_ptr, > _fbconfig_ptr[i]); > > if (_vis_ptr) > { > samp_buf = 0; > samples = 0; > glXGetFBConfigAttrib( > _disp_ptr, > _fbconfig_ptr[i], > GLX_SAMPLE_BUFFERS, > &samp_buf); > > glXGetFBConfigAttrib( > _disp_ptr, > _fbconfig_ptr[i], > GLX_SAMPLES, > &samples); > > if ((best_fbc < 0 || samp_buf) && > samples > best_num_samp) > { > best_fbc = i; > best_num_samp = samples; > }//end if > if (worst_fbc < 0 || !samp_buf || > samples < worst_num_samp) > { > worst_fbc = i; > worst_num_samp = samples; > }//end if > }//end if > > XFree(_vis_ptr); > }//end for > > //Use the best matching visual > _fbconfigID = best_fbc; > > _vis_ptr = glXGetVisualFromFBConfig( > _disp_ptr, > _fbconfig_ptr[_fbconfigID]); > > //Creating colormap > _colorMap = XCreateColormap( > _disp_ptr, > RootWindow(_disp_ptr,_vis_ptr->screen), > _vis_ptr->visual, > AllocNone); > > //Interacting with FLTK library > > ////////////////////////////////////////////////////////////////////////// > fltk::xdisplay = _disp_ptr; > fltk::xscreen = _screenID; > fltk::xvisual = _vis_ptr; > fltk::xcolormap = _colorMap; > > std::cout<<"Os handles initialized."<<std::endl; > }//end function > }; > > Utility::InitOsNativeResources(); > }//end function > > OglDisplayWindow::~OglDisplayWindow() > { > XFree(_fbconfig_ptr); //I am assuming fltk will free the other > resources after I pass them to the library...wrong? > }//end function > > void OglDisplayWindow::draw() > { > if (!this->valid()) > { > this->make_current(); > }//end if > }//end function > > int OglDisplayWindow::handle(int msg) > { > return fltk::GlWindow::handle(msg); > }//end function > > int main(void) > { > try > { > OglDisplayWindow displayWin( > 100, > 100, > 100, > 100, > "Debug Code"); > > displayWin.show(); > while (displayWin.visible()) > { > fltk::check(); > displayWin.flush(); > }//end while > } > catch (const std::string &message) > { > std::cerr << message << std::endl; > }//end try > }//end function
_______________________________________________ fltk mailing list [email protected] http://lists.easysw.com/mailman/listinfo/fltk

