From e8b04eb349f772582534d3e466983ada85f2460d Mon Sep 17 00:00:00 2001
From: Robert Roebling <robert@roebling.de>
Date: Sat, 2 Oct 1999 10:56:10 +0000
Subject: [PATCH]   Updated doc for wxFileExists()   Corrected redrawing and
 OpenGl canvas   Made new font code in utilsunix compile (Why does     Vadim
 never need any headers?)

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@3790 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
---
 docs/latex/wx/function.tex      |   3 +-
 src/gtk/window.cpp              |  24 ++++-
 src/gtk1/window.cpp             |  24 ++++-
 src/unix/utilsunx.cpp           |   3 +
 utils/glcanvas/gtk/glcanvas.cpp | 159 +++++---------------------------
 utils/glcanvas/gtk/glcanvas.h   |   3 -
 6 files changed, 71 insertions(+), 145 deletions(-)

diff --git a/docs/latex/wx/function.tex b/docs/latex/wx/function.tex
index c9b30b5a37..e260c3d765 100644
--- a/docs/latex/wx/function.tex
+++ b/docs/latex/wx/function.tex
@@ -31,7 +31,8 @@ slashes.
 
 \func{bool}{wxFileExists}{\param{const wxString\& }{filename}}
 
-Returns TRUE if the file exists.
+Returns TRUE if the file exists. It also returns TRUE if the file is
+a directory.
 
 \membersection{::wxFileNameFromPath}
 
diff --git a/src/gtk/window.cpp b/src/gtk/window.cpp
index 56c43282af..67fea2e151 100644
--- a/src/gtk/window.cpp
+++ b/src/gtk/window.cpp
@@ -2657,9 +2657,23 @@ void wxWindow::Refresh( bool eraseBackground, const wxRect *rect )
     if (!rect)
     {
         if (m_wxwindow)
-            gtk_widget_draw( m_wxwindow, (GdkRectangle*) NULL );
+	{
+	    /* call the callback directly for preventing GTK from
+	       clearing the bakground */
+	    int w = 0;
+	    int h = 0;
+	    GetClientSize( &w, &h );
+            GdkRectangle gdk_rect;
+            gdk_rect.x = 0;
+            gdk_rect.y = 0;
+            gdk_rect.width = w;
+            gdk_rect.height = h;
+            gtk_window_draw_callback( m_wxwindow, &gdk_rect, this );
+	}
         else
+	{
             gtk_widget_draw( m_widget, (GdkRectangle*) NULL );
+	}
     }
     else
     {
@@ -2670,9 +2684,15 @@ void wxWindow::Refresh( bool eraseBackground, const wxRect *rect )
         gdk_rect.height = rect->height;
 
         if (m_wxwindow)
-            gtk_widget_draw( m_wxwindow, &gdk_rect );
+	{
+	    /* call the callback directly for preventing GTK from
+	       clearing the bakground */
+            gtk_window_draw_callback( m_wxwindow, &gdk_rect, this );
+	}
         else
+	{
             gtk_widget_draw( m_widget, &gdk_rect );
+	}
     }
 }
 
diff --git a/src/gtk1/window.cpp b/src/gtk1/window.cpp
index 56c43282af..67fea2e151 100644
--- a/src/gtk1/window.cpp
+++ b/src/gtk1/window.cpp
@@ -2657,9 +2657,23 @@ void wxWindow::Refresh( bool eraseBackground, const wxRect *rect )
     if (!rect)
     {
         if (m_wxwindow)
-            gtk_widget_draw( m_wxwindow, (GdkRectangle*) NULL );
+	{
+	    /* call the callback directly for preventing GTK from
+	       clearing the bakground */
+	    int w = 0;
+	    int h = 0;
+	    GetClientSize( &w, &h );
+            GdkRectangle gdk_rect;
+            gdk_rect.x = 0;
+            gdk_rect.y = 0;
+            gdk_rect.width = w;
+            gdk_rect.height = h;
+            gtk_window_draw_callback( m_wxwindow, &gdk_rect, this );
+	}
         else
+	{
             gtk_widget_draw( m_widget, (GdkRectangle*) NULL );
+	}
     }
     else
     {
@@ -2670,9 +2684,15 @@ void wxWindow::Refresh( bool eraseBackground, const wxRect *rect )
         gdk_rect.height = rect->height;
 
         if (m_wxwindow)
-            gtk_widget_draw( m_wxwindow, &gdk_rect );
+	{
+	    /* call the callback directly for preventing GTK from
+	       clearing the bakground */
+            gtk_window_draw_callback( m_wxwindow, &gdk_rect, this );
+	}
         else
+	{
             gtk_widget_draw( m_widget, &gdk_rect );
+	}
     }
 }
 
diff --git a/src/unix/utilsunx.cpp b/src/unix/utilsunx.cpp
index 80c29861c7..1ecee5f029 100644
--- a/src/unix/utilsunx.cpp
+++ b/src/unix/utilsunx.cpp
@@ -586,6 +586,9 @@ void wxFatalError( const wxString &msg, const wxString &title )
         XFreeFont((Display *)wxGetDisplay(), font);
     }
 #elif defined(__WXGTK__)
+
+    #include "gdk/gdk.h"
+
     static inline wxNativeFont wxLoadFont(const wxString& fontSpec)
     {
         return gdk_font_load( wxConvCurrent->cWX2MB(fontSpec) );
diff --git a/utils/glcanvas/gtk/glcanvas.cpp b/utils/glcanvas/gtk/glcanvas.cpp
index fc5c324d52..6021bcec7d 100644
--- a/utils/glcanvas/gtk/glcanvas.cpp
+++ b/utils/glcanvas/gtk/glcanvas.cpp
@@ -128,52 +128,6 @@ wxPalette wxGLContext::CreateDefaultPalette()
     return wxNullPalette;
 }
 
-//-----------------------------------------------------------------------------
-// "expose_event" of m_glWidget
-//-----------------------------------------------------------------------------
-
-static void gtk_window_expose_callback( GtkWidget *WXUNUSED(widget), GdkEventExpose *gdk_event, wxWindow *win )
-{
-    if (!win->m_hasVMT) return;
-
-    win->GetUpdateRegion().Union( gdk_event->area.x,
-                               gdk_event->area.y,
-                               gdk_event->area.width,
-                               gdk_event->area.height );
-
-    if (gdk_event->count > 0) return;
-
-/*
-    printf( "OnExpose from " );
-    if (win->GetClassInfo() && win->GetClassInfo()->GetClassName())
-        printf( win->GetClassInfo()->GetClassName() );
-    printf( ".\n" );
-*/
-
-    wxPaintEvent event( win->GetId() );
-    event.SetEventObject( win );
-    win->GetEventHandler()->ProcessEvent( event );
-
-    win->GetUpdateRegion().Clear();
-}
-
-//-----------------------------------------------------------------------------
-// "draw" of m_glWidget
-//-----------------------------------------------------------------------------
-
-static void gtk_window_draw_callback( GtkWidget *WXUNUSED(widget), GdkRectangle *rect, wxWindow *win )
-{
-    if (!win->m_hasVMT) return;
-
-    win->GetUpdateRegion().Union( rect->x, rect->y, rect->width, rect->height );
-
-    wxPaintEvent event( win->GetId() );
-    event.SetEventObject( win );
-    win->GetEventHandler()->ProcessEvent( event );
-
-    win->GetUpdateRegion().Clear();
-}
-
 //---------------------------------------------------------------------------
 // wxGlCanvas
 //---------------------------------------------------------------------------
@@ -212,6 +166,16 @@ bool wxGLCanvas::Create( wxWindow *parent,
                          int *attribList, 
 			 const wxPalette& palette)
 {
+    m_needParent = TRUE;
+    m_acceptsFocus = TRUE;
+
+    if (!PreCreation( parent, pos, size ) ||
+        !CreateBase( parent, id, pos, size, style, wxDefaultValidator, name ))
+    {
+        wxFAIL_MSG( _T("wxGLCanvas creation failed") );
+	return FALSE;
+    }
+
     if (!attribList)
     {
         int data[] = { GLX_RGBA, 
@@ -251,6 +215,7 @@ bool wxGLCanvas::Create( wxWindow *parent,
       attribList = (int*) data;
     }
     
+    
     Display *dpy = GDK_DISPLAY();
     
     g_vi = glXChooseVisual( dpy, DefaultScreen(dpy), attribList );
@@ -262,45 +227,37 @@ bool wxGLCanvas::Create( wxWindow *parent,
     gtk_widget_push_visual( visual );
     
     m_glWidget = gtk_myfixed_new();
+    m_widget = m_glWidget;
     
     gtk_widget_pop_visual();
     gtk_widget_pop_colormap();
     
-    wxScrolledWindow::Create( parent, id, pos, size, style, name );
+    m_parent->DoAddChild( this );
   
-    GTK_WIDGET_UNSET_FLAGS( m_wxwindow, GTK_CAN_FOCUS );
-    GTK_WIDGET_SET_FLAGS( m_glWidget, GTK_CAN_FOCUS );
-    
-    gtk_myfixed_put( GTK_MYFIXED(m_wxwindow), m_glWidget, 0, 0, m_width, m_height );
-
-    gtk_signal_connect( GTK_OBJECT(m_glWidget), "expose_event",
-      GTK_SIGNAL_FUNC(gtk_window_expose_callback), (gpointer)this );
-
-    gtk_signal_connect( GTK_OBJECT(m_glWidget), "draw",
-      GTK_SIGNAL_FUNC(gtk_window_draw_callback), (gpointer)this );
-      
-    /* connect to key press and mouse handlers etc. */  
-    ConnectWidget( m_glWidget );
-    
-
     /* must be realized for OpenGl output */
     gtk_widget_realize( m_glWidget );
  
-    gtk_widget_show( m_glWidget );
-    
     m_glContext = new wxGLContext( TRUE, this, palette, shared );
     
     XFree( g_vi );
     g_vi = (XVisualInfo*) NULL;
 
-    gdk_window_set_back_pixmap( m_glWidget->window, None, 0 );
+//    gdk_window_set_back_pixmap( m_glWidget->window, None, 0 );
      
+    /* we pretend to have a m_wxwindow so that PostCreation hooks
+       up the events for expose and draw */
+    m_wxwindow = m_glWidget;
+    PostCreation();
+    
+    Show( TRUE );
+    
     return TRUE;
 }
 
 wxGLCanvas::~wxGLCanvas()
 {
     if (m_glContext) delete m_glContext;
+    m_wxwindow = (GtkWidget*) NULL;
 }
 
 void wxGLCanvas::SwapBuffers()
@@ -335,78 +292,6 @@ void wxGLCanvas::SetColour( const char *colour )
     if (m_glContext) m_glContext->SetColour( colour );
 }
 
-void wxGLCanvas::DoSetSize( int x, int y, int width, int height, int sizeFlags )
-{
-    if (m_resizing) return; // I don't like recursions
-    m_resizing = TRUE;
-
-    if (m_parent->m_wxwindow == NULL) // i.e. wxNotebook
-    {
-        // don't set the size for children of wxNotebook, just take the values.
-        m_x = x;
-        m_y = y;
-        m_width = width;
-        m_height = height;
-    }
-    else
-    {
-        int old_width = m_width;
-        int old_height = m_height;
-
-        if ((sizeFlags & wxSIZE_ALLOW_MINUS_ONE) == 0)
-        {
-            if (x != -1) m_x = x;
-            if (y != -1) m_y = y;
-            if (width != -1) m_width = width;
-            if (height != -1) m_height = height;
-        }
-        else
-        {
-            m_x = x;
-            m_y = y;
-            m_width = width;
-            m_height = height;
-        }
-
-        if ((sizeFlags & wxSIZE_AUTO_WIDTH) == wxSIZE_AUTO_WIDTH)
-        {
-             if (width == -1) m_width = 80;
-        }
-
-        if ((sizeFlags & wxSIZE_AUTO_HEIGHT) == wxSIZE_AUTO_HEIGHT)
-        {
-             if (height == -1) m_height = 26;
-        }
-
-        if ((m_minWidth != -1) && (m_width < m_minWidth)) m_width = m_minWidth;
-        if ((m_minHeight != -1) && (m_height < m_minHeight)) m_height = m_minHeight;
-        if ((m_maxWidth != -1) && (m_width > m_maxWidth)) m_width = m_maxWidth;
-        if ((m_maxHeight != -1) && (m_height > m_maxHeight)) m_height = m_maxHeight;
-
-        gtk_myfixed_set_size( GTK_MYFIXED(m_parent->m_wxwindow), 
-	                      m_widget, 
-			      m_x, 
-			      m_y,
-			      m_width,
-			      m_height );
-
-        gtk_myfixed_set_size( GTK_MYFIXED(m_wxwindow), 
-	                      m_glWidget,
-			      m_x, 
-			      m_y,
-			      m_width,
-			      m_height );
-    }
-
-    m_sizeSet = TRUE;
-
-    wxSizeEvent event( wxSize(m_width,m_height), GetId() );
-    event.SetEventObject( this );
-    GetEventHandler()->ProcessEvent( event );
-
-    m_resizing = FALSE;
-}
-
 GtkWidget *wxGLCanvas::GetConnectWidget()
 {
     return m_glWidget;
diff --git a/utils/glcanvas/gtk/glcanvas.h b/utils/glcanvas/gtk/glcanvas.h
index 837d92f3c5..985fb626b6 100644
--- a/utils/glcanvas/gtk/glcanvas.h
+++ b/utils/glcanvas/gtk/glcanvas.h
@@ -131,9 +131,6 @@ class wxGLCanvas: public wxScrolledWindow
 
  // implementation
   
-    virtual void DoSetSize( int x, int y, int width, int height,
-      int sizeFlags = wxSIZE_AUTO );
-    
     virtual GtkWidget *GetConnectWidget();
     bool IsOwnGtkWindow( GdkWindow *window );
   
-- 
2.50.0

