]> git.saurik.com Git - wxWidgets.git/blobdiff - src/gtk1/glcanvas.cpp
always use HWND first in WM_COMMAND handler to avoid mixing the controls with the...
[wxWidgets.git] / src / gtk1 / glcanvas.cpp
index 5cd38dcbbe496332e65366d6a08e7986ee1d4d1c..e46cac9e32957f5d9de8c5a77850958ab5bb2aa2 100644 (file)
@@ -237,9 +237,9 @@ gtk_glcanvas_size_callback( GtkWidget *WXUNUSED(widget), GtkAllocation* alloc, w
 // wxGlCanvas
 //---------------------------------------------------------------------------
 
 // wxGlCanvas
 //---------------------------------------------------------------------------
 
-IMPLEMENT_CLASS(wxGLCanvas, wxScrolledWindow)
+IMPLEMENT_CLASS(wxGLCanvas, wxWindow)
 
 
-BEGIN_EVENT_TABLE(wxGLCanvas, wxScrolledWindow)
+BEGIN_EVENT_TABLE(wxGLCanvas, wxWindow)
     EVT_SIZE(wxGLCanvas::OnSize)
 END_EVENT_TABLE()
 
     EVT_SIZE(wxGLCanvas::OnSize)
 END_EVENT_TABLE()
 
@@ -283,7 +283,6 @@ bool wxGLCanvas::Create( wxWindow *parent,
                          int *attribList, 
                         const wxPalette& palette)
 {
                          int *attribList, 
                         const wxPalette& palette)
 {
-    int data[512];
     m_sharedContext = (wxGLContext*)shared;  // const_cast
     m_sharedContextOf = (wxGLCanvas*)shared_context_of;  // const_cast
     m_glContext = (wxGLContext*) NULL;
     m_sharedContext = (wxGLContext*)shared;  // const_cast
     m_sharedContextOf = (wxGLCanvas*)shared_context_of;  // const_cast
     m_glContext = (wxGLContext*) NULL;
@@ -292,24 +291,85 @@ bool wxGLCanvas::Create( wxWindow *parent,
     m_noExpose = TRUE;
     m_nativeSizeEvent = TRUE;
     
     m_noExpose = TRUE;
     m_nativeSizeEvent = TRUE;
     
+    XVisualInfo *vi = NULL;
+    if (wxTheApp->m_glVisualInfo != NULL) {
+        vi = (XVisualInfo *) wxTheApp->m_glVisualInfo; 
+        m_canFreeVi = FALSE; // owned by wxTheApp - don't free upon destruction
+    } else {
+        vi = (XVisualInfo *) ChooseGLVisual(attribList);
+        m_canFreeVi = TRUE;
+    }
+    m_vi = vi;  // save for later use
+    
+    wxCHECK_MSG( m_vi, FALSE, "required visual couldn't be found" );
+
+    GdkVisual *visual = gdkx_visual_get( vi->visualid );
+    GdkColormap *colormap = gdk_colormap_new( gdkx_visual_get(vi->visualid), TRUE );
+    
+    gtk_widget_push_colormap( colormap );
+    gtk_widget_push_visual( visual );
+
+    wxWindow::Create( parent, id, pos, size, style, name );
+
+    m_glWidget = m_wxwindow;
+    
+    gtk_pizza_set_clear( GTK_PIZZA(m_wxwindow), FALSE );
+    
+    gtk_signal_connect( GTK_OBJECT(m_wxwindow), "realize",
+                            GTK_SIGNAL_FUNC(gtk_glwindow_realized_callback), (gpointer) this );
+
+    gtk_signal_connect( GTK_OBJECT(m_wxwindow), "map",
+                            GTK_SIGNAL_FUNC(gtk_glwindow_map_callback), (gpointer) this );
+
+    gtk_signal_connect( GTK_OBJECT(m_wxwindow), "expose_event",
+        GTK_SIGNAL_FUNC(gtk_glwindow_expose_callback), (gpointer)this );
+
+    gtk_signal_connect( GTK_OBJECT(m_wxwindow), "draw",
+        GTK_SIGNAL_FUNC(gtk_glwindow_draw_callback), (gpointer)this );
+       
+    gtk_signal_connect( GTK_OBJECT(m_widget), "size_allocate",
+        GTK_SIGNAL_FUNC(gtk_glcanvas_size_callback), (gpointer)this );
+
+    gtk_widget_pop_visual();
+    gtk_widget_pop_colormap();
+    
+    if (GTK_WIDGET_REALIZED(m_wxwindow))
+        gtk_glwindow_realized_callback( m_wxwindow, this );
+    
+    if (GTK_WIDGET_MAPPED(m_wxwindow))
+        gtk_glwindow_map_callback( m_wxwindow, this );
+    
+    return TRUE;
+}
+
+wxGLCanvas::~wxGLCanvas()
+{
+    XVisualInfo *vi = (XVisualInfo *) m_vi;
+    
+    if (vi && m_canFreeVi) XFree( vi );
+    if (m_glContext) delete m_glContext;
+}
+
+void* wxGLCanvas::ChooseGLVisual(int *attribList)
+{
+    int data[512];
     if (!attribList)
     {
         // default settings if attriblist = 0
         data[0] = GLX_RGBA;
         data[1] = GLX_DOUBLEBUFFER;
     if (!attribList)
     {
         // default settings if attriblist = 0
         data[0] = GLX_RGBA;
         data[1] = GLX_DOUBLEBUFFER;
-        data[2] = GLX_DOUBLEBUFFER;
-        data[3] = GLX_DEPTH_SIZE;   data[4] = 1;
-        data[5] = GLX_RED_SIZE;     data[6] = 1;
-        data[7] = GLX_GREEN_SIZE;   data[8] = 1;
-        data[9] = GLX_BLUE_SIZE;    data[10] = 1;
-        data[11] = GLX_ALPHA_SIZE;  data[12] = 0;
-        data[13] = None;
+        data[2] = GLX_DEPTH_SIZE;   data[3] = 1;
+        data[4] = GLX_RED_SIZE;     data[5] = 1;
+        data[6] = GLX_GREEN_SIZE;   data[7] = 1;
+        data[8] = GLX_BLUE_SIZE;    data[9] = 1;
+        data[10] = GLX_ALPHA_SIZE;  data[11] = 0;
+        data[12] = None;
 
        attribList = (int*) data;
     }
     else
     {
 
        attribList = (int*) data;
     }
     else
     {
-      int data[512], arg=0, p=0;
+      int arg=0, p=0;
        
       while( (attribList[arg]!=0) && (p<510) )
       {
        
       while( (attribList[arg]!=0) && (p<510) )
       {
@@ -356,51 +416,7 @@ bool wxGLCanvas::Create( wxWindow *parent,
     
     Display *dpy = GDK_DISPLAY();
     
     
     Display *dpy = GDK_DISPLAY();
     
-    XVisualInfo *vi = glXChooseVisual( dpy, DefaultScreen(dpy), attribList );
-    
-    m_vi = vi;  // safe for later use
-    
-    wxCHECK_MSG( m_vi, FALSE, "required visual couldn't be found" );
-
-    GdkVisual *visual = gdkx_visual_get( vi->visualid );
-    GdkColormap *colormap = gdk_colormap_new( gdkx_visual_get(vi->visualid), TRUE );
-    
-    gtk_widget_push_colormap( colormap );
-    gtk_widget_push_visual( visual );
-
-    wxScrolledWindow::Create( parent, id, pos, size, style, name );
-
-    m_glWidget = m_wxwindow;
-    
-    gtk_pizza_set_clear( GTK_PIZZA(m_wxwindow), FALSE );
-    
-    gtk_signal_connect( GTK_OBJECT(m_wxwindow), "realize",
-                            GTK_SIGNAL_FUNC(gtk_glwindow_realized_callback), (gpointer) this );
-
-    gtk_signal_connect( GTK_OBJECT(m_wxwindow), "map",
-                            GTK_SIGNAL_FUNC(gtk_glwindow_map_callback), (gpointer) this );
-
-    gtk_signal_connect( GTK_OBJECT(m_wxwindow), "expose_event",
-        GTK_SIGNAL_FUNC(gtk_glwindow_expose_callback), (gpointer)this );
-
-    gtk_signal_connect( GTK_OBJECT(m_wxwindow), "draw",
-        GTK_SIGNAL_FUNC(gtk_glwindow_draw_callback), (gpointer)this );
-       
-    gtk_signal_connect( GTK_OBJECT(m_widget), "size_allocate",
-        GTK_SIGNAL_FUNC(gtk_glcanvas_size_callback), (gpointer)this );
-
-    gtk_widget_pop_visual();
-    gtk_widget_pop_colormap();
-    
-    return TRUE;
-}
-
-wxGLCanvas::~wxGLCanvas()
-{
-    XVisualInfo *vi = (XVisualInfo *) m_vi;
-    
-    if (vi) XFree( vi );
-    if (m_glContext) delete m_glContext;
+    return glXChooseVisual( dpy, DefaultScreen(dpy), attribList );
 }
 
 void wxGLCanvas::SwapBuffers()
 }
 
 void wxGLCanvas::SwapBuffers()
@@ -410,19 +426,6 @@ void wxGLCanvas::SwapBuffers()
 
 void wxGLCanvas::OnSize(wxSizeEvent& WXUNUSED(event))
 {
 
 void wxGLCanvas::OnSize(wxSizeEvent& WXUNUSED(event))
 {
-    int width, height;
-    GetClientSize( &width, &height );
-    
-    if (m_glContext && GTK_WIDGET_REALIZED(m_glWidget) )
-    {
-        SetCurrent(); 
-       
-        glViewport(0, 0, (GLint)width, (GLint)height );
-        glMatrixMode(GL_PROJECTION);
-        glLoadIdentity();
-        glFrustum( -1.0, 1.0, -1.0, 1.0, 5.0, 15.0 );
-        glMatrixMode(GL_MODELVIEW);
-    }
 }
 
 void wxGLCanvas::SetCurrent()
 }
 
 void wxGLCanvas::SetCurrent()
@@ -450,6 +453,26 @@ void wxGLCanvas::OnInternalIdle()
     wxWindow::OnInternalIdle();
 }
 
     wxWindow::OnInternalIdle();
 }
 
+
+
+//---------------------------------------------------------------------------
+// wxGLApp
+//---------------------------------------------------------------------------
+
+IMPLEMENT_CLASS(wxGLApp, wxApp)
+        
+wxGLApp::~wxGLApp()
+{
+    if (m_glVisualInfo) XFree(m_glVisualInfo);
+}
+
+bool wxGLApp::InitGLVisual(int *attribList)
+{
+    if (m_glVisualInfo) XFree(m_glVisualInfo);
+    m_glVisualInfo = wxGLCanvas::ChooseGLVisual(attribList);
+    return (m_glVisualInfo != NULL);
+}
+
 #endif
     // wxUSE_GLCANVAS
 
 #endif
     // wxUSE_GLCANVAS