]> git.saurik.com Git - wxWidgets.git/blobdiff - src/gtk/window.cpp
Oh well, I'll just stuff in the rest of the Unicode changes I have made
[wxWidgets.git] / src / gtk / window.cpp
index 6a50e9e1fe31722d6de068f594e8619e15017261..7f2fa89f26ee38e6c66b4701c640af466d85d977 100644 (file)
 
 */
 
-//-------------------------------------------------------------------------
-// conditional compilation
-//-------------------------------------------------------------------------
-
-#if (GTK_MINOR_VERSION == 1)
-#if (GTK_MICRO_VERSION >= 5)
-#define NEW_GTK_SCROLL_CODE
-#endif
-#endif
-
 //-----------------------------------------------------------------------------
-// (debug)
+// data
 //-----------------------------------------------------------------------------
 
-#ifdef __WXDEBUG__
+extern wxList     wxPendingDelete;
+extern bool       g_blockEventsOnDrag;
+extern bool       g_blockEventsOnScroll;
+static bool       g_capturing = FALSE;
+static wxWindow  *g_focusWindow = (wxWindow*) NULL;
 
-static gint gtk_debug_focus_in_callback( GtkWidget *WXUNUSED(widget),
-                                         GdkEvent *WXUNUSED(event),
-                                         const char *name )
-{
-    printf( "FOCUS NOW AT: " );
-    printf( name );
-    printf( "\n" );
+/* hack: we need something to pass to gtk_menu_popup, so we store the time of
+   the last click here */
+static guint32 gs_timeLastClick = 0;
 
-    return FALSE;
-}
+#if (GTK_MINOR_VERSION > 0)
+
+//-----------------------------------------------------------------------------
+// local code (see below)
+//-----------------------------------------------------------------------------
 
-void debug_focus_in( GtkWidget* widget, const char* name, const char *window )
+static void draw_frame( GtkWidget *widget, wxWindow *win )
 {
-    return;
+    if (!win->HasVMT()) return;
 
-    wxString tmp = name;
-    tmp += " FROM ";
-    tmp += window;
+    int dw = 0;
+    int dh = 0;
+    
+    if (win->m_hasScrolling)
+    {
+        GtkScrolledWindow *scroll_window = GTK_SCROLLED_WINDOW(widget);
+        GtkScrolledWindowClass *scroll_class = GTK_SCROLLED_WINDOW_CLASS( GTK_OBJECT(widget)->klass );
 
-    char *s = new char[tmp.Length()+1];
+/*
+            GtkWidget *hscrollbar = scroll_window->hscrollbar;
+            GtkWidget *vscrollbar = scroll_window->vscrollbar;
+           
+           we use this instead:  range.slider_width = 11 + 2*2pts edge 
+*/
 
-    strcpy( s, WXSTRINGCAST tmp );
+        if (scroll_window->vscrollbar_visible)
+        {
+            dw += 15;   /* dw += vscrollbar->allocation.width; */
+            dw += scroll_class->scrollbar_spacing;
+        }
 
-    gtk_signal_connect( GTK_OBJECT(widget), "focus_in_event",
-      GTK_SIGNAL_FUNC(gtk_debug_focus_in_callback), (gpointer)s );
+        if (scroll_window->hscrollbar_visible)
+        {
+            dh += 15;   /* dh += hscrollbar->allocation.height; */
+            dw += scroll_class->scrollbar_spacing;
+        }
+    }
+    
+    int dx = 0;
+    int dy = 0;
+    if (GTK_WIDGET_NO_WINDOW (widget))
+    {
+        dx += widget->allocation.x;
+        dy += widget->allocation.y;
+    }
+    
+    if (win->m_windowStyle & wxRAISED_BORDER)
+    {
+        gtk_draw_shadow( widget->style, 
+                         widget->window,
+                        GTK_STATE_NORMAL,
+                        GTK_SHADOW_OUT,
+                        dx, dy,
+                        win->m_width-dw, win->m_height-dh );
+       return;
+    } 
+    
+    if (win->m_windowStyle & wxSUNKEN_BORDER)
+    {
+        gtk_draw_shadow( widget->style, 
+                         widget->window,
+                        GTK_STATE_NORMAL,
+                        GTK_SHADOW_IN,
+                        dx, dy, 
+                        win->m_width-dw, win->m_height-dh );
+       return;
+    }
 }
 
-#endif
+//-----------------------------------------------------------------------------
+// "expose_event" of m_widget
+//-----------------------------------------------------------------------------
+
+static void gtk_window_own_expose_callback( GtkWidget *widget, GdkEventExpose *gdk_event, wxWindow *win )
+{
+    if (gdk_event->count > 0) return;
+    draw_frame( widget, win );
+}
 
 //-----------------------------------------------------------------------------
-// data
+// "draw" of m_wxwindow
 //-----------------------------------------------------------------------------
 
-extern wxList     wxPendingDelete;
-extern bool       g_blockEventsOnDrag;
-extern bool       g_blockEventsOnScroll;
-static bool       g_capturing = FALSE;
-static wxWindow  *g_focusWindow = (wxWindow*) NULL;
+static void gtk_window_own_draw_callback( GtkWidget *widget, GdkRectangle *WXUNUSED(rect), wxWindow *win )
+{
+    draw_frame( widget, win );
+}
 
-// hack: we need something to pass to gtk_menu_popup, so we store the time of
-// the last click here
-static guint32 gs_timeLastClick = 0;
+#endif
 
 //-----------------------------------------------------------------------------
-// "expose_event" (of m_wxwindow, not of m_widget)
+// "expose_event" of m_wxwindow
 //-----------------------------------------------------------------------------
 
 static void gtk_window_expose_callback( GtkWidget *WXUNUSED(widget), GdkEventExpose *gdk_event, wxWindow *win )
@@ -210,7 +255,7 @@ static void gtk_window_expose_callback( GtkWidget *WXUNUSED(widget), GdkEventExp
 }
 
 //-----------------------------------------------------------------------------
-// "draw" (of m_wxwindow, not of m_widget)
+// "draw" of m_wxwindow
 //-----------------------------------------------------------------------------
 
 static void gtk_window_draw_callback( GtkWidget *WXUNUSED(widget), GdkRectangle *rect, wxWindow *win )
@@ -399,9 +444,10 @@ static gint gtk_window_key_press_callback( GtkWidget *widget, GdkEventKey *gdk_e
     if (ret)
     {
         gtk_signal_emit_stop_by_name( GTK_OBJECT(widget), "key_press_event" );
+       return TRUE;
     }
 
-    return ret;
+    return FALSE;
 }
 
 //-----------------------------------------------------------------------------
@@ -511,14 +557,13 @@ static gint gtk_window_key_release_callback( GtkWidget *widget, GdkEventKey *gdk
     event.m_y = 0;
     event.SetEventObject( win );
 
-    bool ret = win->GetEventHandler()->ProcessEvent( event );
-
-    if (ret)
+    if (win->GetEventHandler()->ProcessEvent( event ))
     {
         gtk_signal_emit_stop_by_name( GTK_OBJECT(widget), "key_release_event" );
+       return TRUE;
     }
 
-    return ret;
+    return FALSE;
 }
 
 //-----------------------------------------------------------------------------
@@ -527,11 +572,12 @@ static gint gtk_window_key_release_callback( GtkWidget *widget, GdkEventKey *gdk
 
 static gint gtk_window_button_press_callback( GtkWidget *widget, GdkEventButton *gdk_event, wxWindow *win )
 {
-    if (!win->IsOwnGtkWindow( gdk_event->window )) return TRUE;
-
+    if (!win->HasVMT()) return FALSE;
     if (g_blockEventsOnDrag) return TRUE;
     if (g_blockEventsOnScroll) return TRUE;
 
+    if (!win->IsOwnGtkWindow( gdk_event->window )) return FALSE;
+
     if (win->m_wxwindow)
     {
         if (GTK_WIDGET_CAN_FOCUS(win->m_wxwindow) && !GTK_WIDGET_HAS_FOCUS (win->m_wxwindow) )
@@ -548,8 +594,6 @@ static gint gtk_window_button_press_callback( GtkWidget *widget, GdkEventButton
         }
     }
 
-    if (!win->HasVMT()) return TRUE;
-
 /*
     printf( "OnButtonPress from " );
     if (win->GetClassInfo() && win->GetClassInfo()->GetClassName())
@@ -653,18 +697,17 @@ static gint gtk_window_button_press_callback( GtkWidget *widget, GdkEventButton
         }
     }
 
-    wxPoint pt(win->GetClientAreaOrigin());
-    event.m_x -= pt.x;
-    event.m_y -= pt.y;
-
     event.SetEventObject( win );
 
     gs_timeLastClick = gdk_event->time;
 
     if (win->GetEventHandler()->ProcessEvent( event ))
+    {
         gtk_signal_emit_stop_by_name( GTK_OBJECT(widget), "button_press_event" );
+       return TRUE;
+    }
 
-    return TRUE;
+    return FALSE;
 }
 
 //-----------------------------------------------------------------------------
@@ -673,12 +716,11 @@ static gint gtk_window_button_press_callback( GtkWidget *widget, GdkEventButton
 
 static gint gtk_window_button_release_callback( GtkWidget *widget, GdkEventButton *gdk_event, wxWindow *win )
 {
-    if (!win->IsOwnGtkWindow( gdk_event->window )) return TRUE;
-
-    if (g_blockEventsOnDrag) return TRUE;
-    if (g_blockEventsOnScroll) return TRUE;
+    if (!win->HasVMT()) return FALSE;
+    if (g_blockEventsOnDrag) return FALSE;
+    if (g_blockEventsOnScroll) return FALSE;
 
-    if (!win->HasVMT()) return TRUE;
+    if (!win->IsOwnGtkWindow( gdk_event->window )) return FALSE;
 
 /*
     printf( "OnButtonRelease from " );
@@ -761,16 +803,15 @@ static gint gtk_window_button_release_callback( GtkWidget *widget, GdkEventButto
         }
     }
 
-    wxPoint pt(win->GetClientAreaOrigin());
-    event.m_x -= pt.x;
-    event.m_y -= pt.y;
-
     event.SetEventObject( win );
 
     if (win->GetEventHandler()->ProcessEvent( event ))
+    {
         gtk_signal_emit_stop_by_name( GTK_OBJECT(widget), "button_release_event" );
+       return TRUE;
+    }
 
-    return TRUE;
+    return FALSE;
 }
 
 //-----------------------------------------------------------------------------
@@ -779,6 +820,12 @@ static gint gtk_window_button_release_callback( GtkWidget *widget, GdkEventButto
 
 static gint gtk_window_motion_notify_callback( GtkWidget *widget, GdkEventMotion *gdk_event, wxWindow *win )
 {
+    if (!win->HasVMT()) return FALSE;
+    if (g_blockEventsOnDrag) return FALSE;
+    if (g_blockEventsOnScroll) return FALSE;
+
+    if (!win->IsOwnGtkWindow( gdk_event->window )) return FALSE;
+
     if (gdk_event->is_hint)
     {
        int x = 0;
@@ -790,13 +837,6 @@ static gint gtk_window_motion_notify_callback( GtkWidget *widget, GdkEventMotion
        gdk_event->state = state;
     }
 
-    if (!win->IsOwnGtkWindow( gdk_event->window )) return TRUE;
-
-    if (g_blockEventsOnDrag) return TRUE;
-    if (g_blockEventsOnScroll) return TRUE;
-
-    if (!win->HasVMT()) return TRUE;
-
 /*
     printf( "OnMotion from " );
     if (win->GetClassInfo() && win->GetClassInfo()->GetClassName())
@@ -870,16 +910,15 @@ static gint gtk_window_motion_notify_callback( GtkWidget *widget, GdkEventMotion
         }
     }
 
-    wxPoint pt(win->GetClientAreaOrigin());
-    event.m_x -= pt.x;
-    event.m_y -= pt.y;
-
     event.SetEventObject( win );
 
     if (win->GetEventHandler()->ProcessEvent( event ))
+    {
         gtk_signal_emit_stop_by_name( GTK_OBJECT(widget), "motion_notify_event" );
+       return TRUE;
+    }
 
-    return TRUE;
+    return FALSE;
 }
 
 //-----------------------------------------------------------------------------
@@ -888,7 +927,8 @@ static gint gtk_window_motion_notify_callback( GtkWidget *widget, GdkEventMotion
 
 static gint gtk_window_focus_in_callback( GtkWidget *widget, GdkEvent *WXUNUSED(event), wxWindow *win )
 {
-    if (g_blockEventsOnDrag) return TRUE;
+    if (!win->HasVMT()) return FALSE;
+    if (g_blockEventsOnDrag) return FALSE;
 
     g_focusWindow = win;
 
@@ -906,7 +946,6 @@ static gint gtk_window_focus_in_callback( GtkWidget *widget, GdkEvent *WXUNUSED(
         }
     }
 
-    if (!win->HasVMT()) return TRUE;
 
 /*
     printf( "OnSetFocus from " );
@@ -921,9 +960,12 @@ static gint gtk_window_focus_in_callback( GtkWidget *widget, GdkEvent *WXUNUSED(
     event.SetEventObject( win );
 
     if (win->GetEventHandler()->ProcessEvent( event ))
+    {
         gtk_signal_emit_stop_by_name( GTK_OBJECT(widget), "focus_in_event" );
-
-    return TRUE;
+        return TRUE;
+    }
+    
+    return FALSE;
 }
 
 //-----------------------------------------------------------------------------
@@ -932,15 +974,15 @@ static gint gtk_window_focus_in_callback( GtkWidget *widget, GdkEvent *WXUNUSED(
 
 static gint gtk_window_focus_out_callback( GtkWidget *widget, GdkEvent *WXUNUSED(event), wxWindow *win )
 {
-    if (g_blockEventsOnDrag) return TRUE;
+    if (!win->HasVMT()) return FALSE;
+    if (g_blockEventsOnDrag) return FALSE;
+    
     if (win->m_wxwindow)
     {
       if (GTK_WIDGET_CAN_FOCUS(win->m_wxwindow))
           GTK_WIDGET_UNSET_FLAGS (win->m_wxwindow, GTK_HAS_FOCUS);
     }
 
-    if (!win->HasVMT()) return TRUE;
-
 /*
     printf( "OnKillFocus from " );
     if (win->GetClassInfo() && win->GetClassInfo()->GetClassName())
@@ -952,9 +994,12 @@ static gint gtk_window_focus_out_callback( GtkWidget *widget, GdkEvent *WXUNUSED
     event.SetEventObject( win );
 
     if (win->GetEventHandler()->ProcessEvent( event ))
+    {
         gtk_signal_emit_stop_by_name( GTK_OBJECT(widget), "focus_out_event" );
-
-    return TRUE;
+        return TRUE;
+    }
+    
+    return FALSE;
 }
 
 //-----------------------------------------------------------------------------
@@ -963,15 +1008,14 @@ static gint gtk_window_focus_out_callback( GtkWidget *widget, GdkEvent *WXUNUSED
 
 static gint gtk_window_enter_callback( GtkWidget *widget, GdkEventCrossing *gdk_event, wxWindow *win )
 {
-    if (g_blockEventsOnDrag) return TRUE;
+    if (!win->HasVMT()) return FALSE;
+    if (g_blockEventsOnDrag) return FALSE;
+    
+    if (widget->window != gdk_event->window) return FALSE;
 
     if ((widget->window) && (win->m_cursor))
         gdk_window_set_cursor( widget->window, win->m_cursor->GetCursor() );
 
-    if (widget->window != gdk_event->window) return TRUE;
-
-    if (!win->HasVMT()) return TRUE;
-
 /*
     printf( "OnEnter from " );
     if (win->GetClassInfo() && win->GetClassInfo()->GetClassName())
@@ -999,14 +1043,13 @@ static gint gtk_window_enter_callback( GtkWidget *widget, GdkEventCrossing *gdk_
     event.m_x = (long)x;
     event.m_y = (long)y;
 
-    wxPoint pt(win->GetClientAreaOrigin());
-    event.m_x -= pt.x;
-    event.m_y -= pt.y;
-
     if (win->GetEventHandler()->ProcessEvent( event ))
+    {
        gtk_signal_emit_stop_by_name( GTK_OBJECT(widget), "enter_notify_event" );
-
-    return TRUE;
+       return TRUE;
+    }
+    
+    return FALSE;
 }
 
 //-----------------------------------------------------------------------------
@@ -1015,15 +1058,14 @@ static gint gtk_window_enter_callback( GtkWidget *widget, GdkEventCrossing *gdk_
 
 static gint gtk_window_leave_callback( GtkWidget *widget, GdkEventCrossing *gdk_event, wxWindow *win )
 {
-    if (g_blockEventsOnDrag) return TRUE;
+    if (!win->HasVMT()) return FALSE;
+    if (g_blockEventsOnDrag) return FALSE;
 
+    if (widget->window != gdk_event->window) return FALSE;
+    
     if ((widget->window) && (win->m_cursor))
         gdk_window_set_cursor( widget->window, wxSTANDARD_CURSOR->GetCursor() );
 
-    if (widget->window != gdk_event->window) return TRUE;
-
-    if (!win->HasVMT()) return TRUE;
-
 /*
     printf( "OnLeave from " );
     if (win->GetClassInfo() && win->GetClassInfo()->GetClassName())
@@ -1051,14 +1093,13 @@ static gint gtk_window_leave_callback( GtkWidget *widget, GdkEventCrossing *gdk_
     event.m_x = (long)x;
     event.m_y = (long)y;
 
-    wxPoint pt(win->GetClientAreaOrigin());
-    event.m_x -= pt.x;
-    event.m_y -= pt.y;
-
     if (win->GetEventHandler()->ProcessEvent( event ))
+    {
         gtk_signal_emit_stop_by_name( GTK_OBJECT(widget), "leave_notify_event" );
-
-    return TRUE;
+        return TRUE;
+    }
+    
+    return FALSE;
 }
 
 //-----------------------------------------------------------------------------
@@ -1275,11 +1316,6 @@ static void wxInsertChildInWindow( wxWindow* parent, wxWindow* child )
                           child->m_width,
                           child->m_height );
 
-    if (wxIS_KIND_OF(parent,wxFrame))
-    {
-        parent->m_sizeSet = FALSE;
-    }
-
     if (parent->m_windowStyle & wxTAB_TRAVERSAL)
     {
         /* we now allow a window to get the focus as long as it
@@ -1405,17 +1441,8 @@ bool wxWindow::Create( wxWindow *parent, wxWindowID id,
     m_widget = gtk_scrolled_window_new( (GtkAdjustment *) NULL, (GtkAdjustment *) NULL );
     GTK_WIDGET_UNSET_FLAGS( m_widget, GTK_CAN_FOCUS );
 
-#ifdef __WXDEBUG__
-    debug_focus_in( m_widget, "wxWindow::m_widget", name );
-#endif
-
     GtkScrolledWindow *s_window = GTK_SCROLLED_WINDOW(m_widget);
 
-#ifdef __WXDEBUG__
-    debug_focus_in( s_window->hscrollbar, "wxWindow::hsrcollbar", name );
-    debug_focus_in( s_window->vscrollbar, "wxWindow::vsrcollbar", name );
-#endif
-
     GtkScrolledWindowClass *scroll_class = GTK_SCROLLED_WINDOW_CLASS( GTK_OBJECT(m_widget)->klass );
     scroll_class->scrollbar_spacing = 0;
 
@@ -1429,21 +1456,25 @@ bool wxWindow::Create( wxWindow *parent, wxWindowID id,
 
     m_wxwindow = gtk_myfixed_new();
 
-#ifdef __WXDEBUG__
-    debug_focus_in( m_wxwindow, "wxWindow::m_wxwindow", name );
-#endif
+    gtk_container_add( GTK_CONTAINER(m_widget), m_wxwindow );
+    
+#if (GTK_MINOR_VERSION > 0)
+    GtkMyFixed *myfixed = GTK_MYFIXED(m_wxwindow);
 
-#ifdef NEW_GTK_SCROLL_CODE
-    gtk_scrolled_window_add_with_viewport( GTK_SCROLLED_WINDOW(m_widget), m_wxwindow );
-    GtkViewport *viewport = GTK_VIEWPORT(s_window->child);
+    if (m_windowStyle & wxRAISED_BORDER)
+    {
+        gtk_myfixed_set_shadow_type( myfixed, GTK_SHADOW_OUT );
+    }
+    else if (m_windowStyle & wxSUNKEN_BORDER)
+    {
+        gtk_myfixed_set_shadow_type( myfixed, GTK_SHADOW_IN );
+    }
+    else
+    {
+        gtk_myfixed_set_shadow_type( myfixed, GTK_SHADOW_NONE );
+    }
 #else
-    gtk_container_add( GTK_CONTAINER(m_widget), m_wxwindow );
     GtkViewport *viewport = GTK_VIEWPORT(s_window->viewport);
-#endif
-
-#ifdef __WXDEBUG__
-    debug_focus_in( GTK_WIDGET(viewport), "wxWindow::viewport", name );
-#endif
 
     if (m_windowStyle & wxRAISED_BORDER)
     {
@@ -1457,6 +1488,7 @@ bool wxWindow::Create( wxWindow *parent, wxWindowID id,
     {
         gtk_viewport_set_shadow_type( viewport, GTK_SHADOW_NONE );
     }
+#endif
 
     if (m_windowStyle & wxTAB_TRAVERSAL)
     {
@@ -1471,9 +1503,11 @@ bool wxWindow::Create( wxWindow *parent, wxWindowID id,
         m_acceptsFocus = TRUE;
     }
 
+#if (GTK_MINOR_VERSION == 0)
     // shut the viewport up
     gtk_viewport_set_hadjustment( viewport, (GtkAdjustment*) gtk_adjustment_new( 0.0, 0.0, 0.0, 0.0, 0.0, 0.0) );
     gtk_viewport_set_vadjustment( viewport, (GtkAdjustment*) gtk_adjustment_new( 0.0, 0.0, 0.0, 0.0, 0.0, 0.0) );
+#endif
 
     // I _really_ don't want scrollbars in the beginning
     m_vAdjust->lower = 0.0;
@@ -1507,7 +1541,7 @@ bool wxWindow::Create( wxWindow *parent, wxWindowID id,
     gtk_signal_connect( GTK_OBJECT(s_window->hscrollbar), "button_release_event",
           (GtkSignalFunc)gtk_scrollbar_button_release_callback, (gpointer) this );
 
-    // these handers het notified when screen updates are required either when
+    // these handlers get notified when screen updates are required either when
     // scrolling or when the window size (and therefore scrollbar configuration)
     // has changed
 
@@ -1697,11 +1731,21 @@ void wxWindow::PostCreation()
     
     if (m_wxwindow)
     {
+        /* these get reported to wxWindows -> wxPaintEvent */
         gtk_signal_connect( GTK_OBJECT(m_wxwindow), "expose_event",
           GTK_SIGNAL_FUNC(gtk_window_expose_callback), (gpointer)this );
 
         gtk_signal_connect( GTK_OBJECT(m_wxwindow), "draw",
           GTK_SIGNAL_FUNC(gtk_window_draw_callback), (gpointer)this );
+         
+#if (GTK_MINOR_VERSION > 0)
+       /* these are called when the "sunken" or "raised" borders are drawn */
+        gtk_signal_connect( GTK_OBJECT(m_widget), "expose_event",
+          GTK_SIGNAL_FUNC(gtk_window_own_expose_callback), (gpointer)this );
+
+        gtk_signal_connect( GTK_OBJECT(m_widget), "draw",
+          GTK_SIGNAL_FUNC(gtk_window_own_draw_callback), (gpointer)this );
+#endif
     }
 
     ConnectWidget( GetConnectWidget() );
@@ -1793,21 +1837,6 @@ void wxWindow::PrepareDC( wxDC &WXUNUSED(dc) )
     // are we to set fonts here ?
 }
 
-wxPoint wxWindow::GetClientAreaOrigin() const
-{
-    return wxPoint(0,0);
-}
-
-void wxWindow::AdjustForParentClientOrigin( int& x, int& y, int sizeFlags )
-{
-    if (((sizeFlags & wxSIZE_NO_ADJUSTMENTS) == 0) && GetParent())
-    {
-        wxPoint pt(GetParent()->GetClientAreaOrigin());
-        x += pt.x;
-        y += pt.y;
-    }
-}
-
 void wxWindow::DoSetSize( int x, int y, int width, int height, int sizeFlags )
 {
     wxASSERT_MSG( (m_widget != NULL), "invalid window" );
@@ -1864,15 +1893,13 @@ void wxWindow::DoSetSize( int x, int y, int width, int height, int sizeFlags )
            /* the default button has a border around it */
            int border = 5;
        
-            wxPoint pt( m_parent->GetClientAreaOrigin() );
-            gtk_myfixed_move( GTK_MYFIXED(m_parent->m_wxwindow), m_widget, m_x+pt.x-border, m_y+pt.y-border );
+            gtk_myfixed_move( GTK_MYFIXED(m_parent->m_wxwindow), m_widget, m_x-border, m_y-border );
 
             gtk_widget_set_usize( m_widget, m_width+2*border, m_height+2*border );
        }
        else
        {
-            wxPoint pt( m_parent->GetClientAreaOrigin() );
-            gtk_myfixed_move( GTK_MYFIXED(m_parent->m_wxwindow), m_widget, m_x+pt.x, m_y+pt.y );
+            gtk_myfixed_move( GTK_MYFIXED(m_parent->m_wxwindow), m_widget, m_x, m_y );
 
             if ((old_width != m_width) || (old_height != m_height))
               gtk_widget_set_usize( m_widget, m_width, m_height );
@@ -1930,38 +1957,39 @@ void wxWindow::DoSetClientSize( int width, int height )
             GtkScrolledWindow *scroll_window = GTK_SCROLLED_WINDOW(m_widget);
             GtkScrolledWindowClass *scroll_class = GTK_SCROLLED_WINDOW_CLASS( GTK_OBJECT(m_widget)->klass );
 
-#ifdef NEW_GTK_SCROLL_CODE
-            GtkWidget *viewport = scroll_window->child;
-#else
+#if (GTK_MINOR_VERSION == 0)
             GtkWidget *viewport = scroll_window->viewport;
-#endif
-
             GtkStyleClass *viewport_class = viewport->style->klass;
 
-            GtkWidget *hscrollbar = scroll_window->hscrollbar;
-            GtkWidget *vscrollbar = scroll_window->vscrollbar;
-
             if ((m_windowStyle & wxRAISED_BORDER) ||
                 (m_windowStyle & wxSUNKEN_BORDER))
             {
                 dw += 2 * viewport_class->xthickness;
                 dh += 2 * viewport_class->ythickness;
             }
+#endif
+
+/*
+            GtkWidget *hscrollbar = scroll_window->hscrollbar;
+            GtkWidget *vscrollbar = scroll_window->vscrollbar;
+           
+           we use this instead:  range.slider_width = 11 + 2*2pts edge 
+*/
 
             if (scroll_window->vscrollbar_visible)
             {
-                dw += vscrollbar->allocation.width;
+                dw += 15;   /* dw += vscrollbar->allocation.width; */
                 dw += scroll_class->scrollbar_spacing;
             }
 
             if (scroll_window->hscrollbar_visible)
             {
-                dh += hscrollbar->allocation.height;
+                dh += 15;   /* dh += hscrollbar->allocation.height; */
                 dw += scroll_class->scrollbar_spacing;
             }
        }
 
-      SetSize( width+dw, height+dh );
+       SetSize( width+dw, height+dh );
     }
 }
 
@@ -1995,12 +2023,8 @@ void wxWindow::GetClientSize( int *width, int *height ) const
             GtkScrolledWindow *scroll_window = GTK_SCROLLED_WINDOW(m_widget);
             GtkScrolledWindowClass *scroll_class = GTK_SCROLLED_WINDOW_CLASS( GTK_OBJECT(m_widget)->klass );
 
-#ifdef NEW_GTK_SCROLL_CODE
-            GtkWidget *viewport = scroll_window->child;
-#else
+#if (GTK_MINOR_VERSION == 0)
             GtkWidget *viewport = scroll_window->viewport;
-#endif
-
             GtkStyleClass *viewport_class = viewport->style->klass;
 
             if ((m_windowStyle & wxRAISED_BORDER) ||
@@ -2009,18 +2033,23 @@ void wxWindow::GetClientSize( int *width, int *height ) const
                 dw += 2 * viewport_class->xthickness;
                 dh += 2 * viewport_class->ythickness;
             }
+#endif
+/*
+            GtkWidget *hscrollbar = scroll_window->hscrollbar;
+            GtkWidget *vscrollbar = scroll_window->vscrollbar;
+           
+           we use this instead:  range.slider_width = 11 + 2*2pts edge 
+*/
 
             if (scroll_window->vscrollbar_visible)
             {
-//              dw += vscrollbar->allocation.width;
-                dw += 15;                               // range.slider_width = 11 + 2*2pts edge
+                dw += 15;   /* dw += vscrollbar->allocation.width; */
                 dw += scroll_class->scrollbar_spacing;
             }
 
             if (scroll_window->hscrollbar_visible)
             {
-//              dh += hscrollbar->allocation.height;
-                dh += 15;
+                dh += 15;   /* dh += hscrollbar->allocation.height; */
                 dh += scroll_class->scrollbar_spacing;
             }
         }
@@ -2061,10 +2090,6 @@ void wxWindow::ClientToScreen( int *x, int *y )
         }
     }
 
-    wxPoint pt(GetClientAreaOrigin());
-    org_x += pt.x;
-    org_y += pt.y;
-
     if (x) *x += org_x;
     if (y) *y += org_y;
 }
@@ -2092,10 +2117,6 @@ void wxWindow::ScreenToClient( int *x, int *y )
         }
     }
 
-    wxPoint pt(GetClientAreaOrigin());
-    org_x -= pt.x;
-    org_y -= pt.y;
-
     if (x) *x -= org_x;
     if (y) *y -= org_y;
 }
@@ -3112,6 +3133,14 @@ void wxWindow::ScrollWindow( int dx, int dy, const wxRect* WXUNUSED(rect) )
 
     wxCHECK_RET( m_wxwindow != NULL, "window needs client area for scrolling" );
 
+    wxNode *node = m_children.First();
+    while (node)
+    {
+        wxWindow *child = (wxWindow*) node->Data();
+       child->Move( child->m_x + dx, child->m_y + dy );
+       node = node->Next();
+    }
+
     int cw = 0;
     int ch = 0;
     GetClientSize( &cw, &ch );