[ 1222406 ] Fix for BadMatch X errors with wxGLCanvas under wxGTK - Nathan Cournia.

Modified to not break compilation pre-gtk2.2. Older gtk+ versions than 2.2 probably still need a workaround to
the original problem (the code is identical to them than before). Alas, I've never been able to reproduce the
problem. Testing appreciated.


git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@35047 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Mart Raudsepp
2005-08-01 15:36:18 +00:00
parent a85245b1c2
commit fee7a683ed
2 changed files with 74 additions and 16 deletions

View File

@@ -397,15 +397,41 @@ bool wxGLCanvas::Create( wxWindow *parent,
m_vi = vi; // save for later use m_vi = vi; // save for later use
wxCHECK_MSG( m_vi, FALSE, _T("required visual couldn't be found") ); wxCHECK_MSG( m_vi, FALSE, _T("required visual couldn't be found") );
GdkVisual *visual = gdkx_visual_get( vi->visualid ); GdkVisual *visual;
GdkColormap *colormap = gdk_colormap_new( visual, TRUE ); GdkColormap *colormap;
gtk_widget_push_colormap( colormap ); // MR: This needs a fix for lower gtk+ versions too. Might need to rethink logic (FIXME)
gtk_widget_push_visual( visual ); #if GTK_CHECK_VERSION(2,2,0)
if (!gtk_check_version(2,2,0))
{
wxWindow::Create( parent, id, pos, size, style, name );
wxWindow::Create( parent, id, pos, size, style, name ); m_glWidget = m_wxwindow;
m_glWidget = m_wxwindow; GdkScreen *screen = gtk_widget_get_screen( m_glWidget );
colormap = gdk_screen_get_default_colormap(screen);
visual = gdk_colormap_get_visual(colormap);
if (GDK_VISUAL_XVISUAL(visual)->visualid != vi->visualid)
{
visual = gdk_x11_screen_lookup_visual( screen, vi->visualid );
colormap = gdk_colormap_new(visual, FALSE);
}
gtk_widget_set_colormap( m_glWidget, colormap );
}
else
#endif
{
visual = gdkx_visual_get( vi->visualid );
colormap = gdk_colormap_new( visual, TRUE );
gtk_widget_push_colormap( colormap );
gtk_widget_push_visual( visual );
wxWindow::Create( parent, id, pos, size, style, name );
m_glWidget = m_wxwindow;
}
#ifdef __WXGTK20__ #ifdef __WXGTK20__
gtk_widget_set_double_buffered( m_glWidget, FALSE ); gtk_widget_set_double_buffered( m_glWidget, FALSE );
@@ -430,8 +456,11 @@ bool wxGLCanvas::Create( wxWindow *parent,
gtk_signal_connect( GTK_OBJECT(m_widget), "size_allocate", gtk_signal_connect( GTK_OBJECT(m_widget), "size_allocate",
GTK_SIGNAL_FUNC(gtk_glcanvas_size_callback), (gpointer)this ); GTK_SIGNAL_FUNC(gtk_glcanvas_size_callback), (gpointer)this );
gtk_widget_pop_visual(); if (gtk_check_version(2,2,0) != NULL)
gtk_widget_pop_colormap(); {
gtk_widget_pop_visual();
gtk_widget_pop_colormap();
}
// if our parent window is already visible, we had been realized before we // 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 // connected to the "realize" signal and hence our m_glContext hasn't been

View File

@@ -397,15 +397,41 @@ bool wxGLCanvas::Create( wxWindow *parent,
m_vi = vi; // save for later use m_vi = vi; // save for later use
wxCHECK_MSG( m_vi, FALSE, _T("required visual couldn't be found") ); wxCHECK_MSG( m_vi, FALSE, _T("required visual couldn't be found") );
GdkVisual *visual = gdkx_visual_get( vi->visualid ); GdkVisual *visual;
GdkColormap *colormap = gdk_colormap_new( visual, TRUE ); GdkColormap *colormap;
gtk_widget_push_colormap( colormap ); // MR: This needs a fix for lower gtk+ versions too. Might need to rethink logic (FIXME)
gtk_widget_push_visual( visual ); #if GTK_CHECK_VERSION(2,2,0)
if (!gtk_check_version(2,2,0))
{
wxWindow::Create( parent, id, pos, size, style, name );
wxWindow::Create( parent, id, pos, size, style, name ); m_glWidget = m_wxwindow;
m_glWidget = m_wxwindow; GdkScreen *screen = gtk_widget_get_screen( m_glWidget );
colormap = gdk_screen_get_default_colormap(screen);
visual = gdk_colormap_get_visual(colormap);
if (GDK_VISUAL_XVISUAL(visual)->visualid != vi->visualid)
{
visual = gdk_x11_screen_lookup_visual( screen, vi->visualid );
colormap = gdk_colormap_new(visual, FALSE);
}
gtk_widget_set_colormap( m_glWidget, colormap );
}
else
#endif
{
visual = gdkx_visual_get( vi->visualid );
colormap = gdk_colormap_new( visual, TRUE );
gtk_widget_push_colormap( colormap );
gtk_widget_push_visual( visual );
wxWindow::Create( parent, id, pos, size, style, name );
m_glWidget = m_wxwindow;
}
#ifdef __WXGTK20__ #ifdef __WXGTK20__
gtk_widget_set_double_buffered( m_glWidget, FALSE ); gtk_widget_set_double_buffered( m_glWidget, FALSE );
@@ -430,8 +456,11 @@ bool wxGLCanvas::Create( wxWindow *parent,
gtk_signal_connect( GTK_OBJECT(m_widget), "size_allocate", gtk_signal_connect( GTK_OBJECT(m_widget), "size_allocate",
GTK_SIGNAL_FUNC(gtk_glcanvas_size_callback), (gpointer)this ); GTK_SIGNAL_FUNC(gtk_glcanvas_size_callback), (gpointer)this );
gtk_widget_pop_visual(); if (gtk_check_version(2,2,0) != NULL)
gtk_widget_pop_colormap(); {
gtk_widget_pop_visual();
gtk_widget_pop_colormap();
}
// if our parent window is already visible, we had been realized before we // 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 // connected to the "realize" signal and hence our m_glContext hasn't been