X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/4230303c5415335c70caa0896163175d5e0e7da1..7cc52cd8ddf618163923e0171a87b7dff2c4c869:/src/gtk/glcanvas.cpp diff --git a/src/gtk/glcanvas.cpp b/src/gtk/glcanvas.cpp index 7cd95d0cab..1dce4e0df5 100644 --- a/src/gtk/glcanvas.cpp +++ b/src/gtk/glcanvas.cpp @@ -1,6 +1,6 @@ ///////////////////////////////////////////////////////////////////////////// // Name: gtk/glcanvas.cpp -// Purpose: wxGLCanvas, for using OpenGL/Mesa with wxWindows and GTK +// Purpose: wxGLCanvas, for using OpenGL/Mesa with wxWidgets and GTK // Author: Robert Roebling // Modified by: // Created: 17/08/98 @@ -157,11 +157,10 @@ wxPalette wxGLContext::CreateDefaultPalette() // "realize" from m_wxwindow //----------------------------------------------------------------------------- +extern "C" { static gint gtk_glwindow_realized_callback( GtkWidget * WXUNUSED(widget), wxGLCanvas *win ) { - // VZ: apparently in some cases we're called twice -- no idea why, - // but a check doesn't hurt if ( !win->m_glContext ) { wxGLContext *share = win->m_sharedContext; @@ -173,11 +172,13 @@ gtk_glwindow_realized_callback( GtkWidget * WXUNUSED(widget), wxGLCanvas *win ) return FALSE; } +} //----------------------------------------------------------------------------- // "map" from m_wxwindow //----------------------------------------------------------------------------- +extern "C" { static gint gtk_glwindow_map_callback( GtkWidget * WXUNUSED(widget), wxGLCanvas *win ) { @@ -193,11 +194,13 @@ gtk_glwindow_map_callback( GtkWidget * WXUNUSED(widget), wxGLCanvas *win ) return FALSE; } +} //----------------------------------------------------------------------------- // "expose_event" of m_wxwindow //----------------------------------------------------------------------------- +extern "C" { static void gtk_glwindow_expose_callback( GtkWidget *WXUNUSED(widget), GdkEventExpose *gdk_event, wxGLCanvas *win ) { @@ -211,12 +214,14 @@ gtk_glwindow_expose_callback( GtkWidget *WXUNUSED(widget), GdkEventExpose *gdk_e gdk_event->area.width, gdk_event->area.height ); } +} //----------------------------------------------------------------------------- // "draw" of m_wxwindow //----------------------------------------------------------------------------- #ifndef __WXGTK20__ +extern "C" { static void gtk_glwindow_draw_callback( GtkWidget *WXUNUSED(widget), GdkRectangle *rect, wxGLCanvas *win ) { @@ -228,12 +233,14 @@ gtk_glwindow_draw_callback( GtkWidget *WXUNUSED(widget), GdkRectangle *rect, wxG win->GetUpdateRegion().Union( rect->x, rect->y, rect->width, rect->height ); } +} #endif //----------------------------------------------------------------------------- // "size_allocate" of m_wxwindow //----------------------------------------------------------------------------- +extern "C" { static void gtk_glcanvas_size_callback( GtkWidget *WXUNUSED(widget), GtkAllocation* alloc, wxGLCanvas *win ) { @@ -247,6 +254,7 @@ gtk_glcanvas_size_callback( GtkWidget *WXUNUSED(widget), GtkAllocation* alloc, w event.SetEventObject( win ); win->GetEventHandler()->ProcessEvent( event ); } +} //--------------------------------------------------------------------------- // wxGlCanvas @@ -322,7 +330,7 @@ bool wxGLCanvas::Create( wxWindow *parent, wxCHECK_MSG( m_vi, FALSE, _T("required visual couldn't be found") ); GdkVisual *visual = gdkx_visual_get( vi->visualid ); - GdkColormap *colormap = gdk_colormap_new( gdkx_visual_get(vi->visualid), TRUE ); + GdkColormap *colormap = gdk_colormap_new( visual, TRUE ); gtk_widget_push_colormap( colormap ); gtk_widget_push_visual( visual ); @@ -357,6 +365,9 @@ bool wxGLCanvas::Create( wxWindow *parent, gtk_widget_pop_visual(); gtk_widget_pop_colormap(); + // if our parent window is already visible, we had been realized before we + // connected to the "realize" signal and hence our m_glContext hasn't been + // initialized yet and we have to do it now if (GTK_WIDGET_REALIZED(m_wxwindow)) gtk_glwindow_realized_callback( m_wxwindow, this );