[ 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:
@@ -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;
|
||||||
|
|
||||||
|
// MR: This needs a fix for lower gtk+ versions too. Might need to rethink logic (FIXME)
|
||||||
|
#if GTK_CHECK_VERSION(2,2,0)
|
||||||
|
if (!gtk_check_version(2,2,0))
|
||||||
|
{
|
||||||
|
wxWindow::Create( parent, id, pos, size, style, name );
|
||||||
|
|
||||||
|
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_colormap( colormap );
|
||||||
gtk_widget_push_visual( visual );
|
gtk_widget_push_visual( visual );
|
||||||
|
|
||||||
wxWindow::Create( parent, id, pos, size, style, name );
|
wxWindow::Create( parent, id, pos, size, style, name );
|
||||||
|
|
||||||
m_glWidget = m_wxwindow;
|
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 );
|
||||||
|
|
||||||
|
if (gtk_check_version(2,2,0) != NULL)
|
||||||
|
{
|
||||||
gtk_widget_pop_visual();
|
gtk_widget_pop_visual();
|
||||||
gtk_widget_pop_colormap();
|
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
|
||||||
|
@@ -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;
|
||||||
|
|
||||||
|
// MR: This needs a fix for lower gtk+ versions too. Might need to rethink logic (FIXME)
|
||||||
|
#if GTK_CHECK_VERSION(2,2,0)
|
||||||
|
if (!gtk_check_version(2,2,0))
|
||||||
|
{
|
||||||
|
wxWindow::Create( parent, id, pos, size, style, name );
|
||||||
|
|
||||||
|
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_colormap( colormap );
|
||||||
gtk_widget_push_visual( visual );
|
gtk_widget_push_visual( visual );
|
||||||
|
|
||||||
wxWindow::Create( parent, id, pos, size, style, name );
|
wxWindow::Create( parent, id, pos, size, style, name );
|
||||||
|
|
||||||
m_glWidget = m_wxwindow;
|
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 );
|
||||||
|
|
||||||
|
if (gtk_check_version(2,2,0) != NULL)
|
||||||
|
{
|
||||||
gtk_widget_pop_visual();
|
gtk_widget_pop_visual();
|
||||||
gtk_widget_pop_colormap();
|
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
|
||||||
|
Reference in New Issue
Block a user