+bool wxWindowGTK::Reparent( wxWindowBase *newParentBase )
+{
+ wxCHECK_MSG( (m_widget != NULL), FALSE, wxT("invalid window") );
+
+ wxWindowGTK *oldParent = m_parent,
+ *newParent = (wxWindowGTK *)newParentBase;
+
+ wxASSERT( GTK_IS_WIDGET(m_widget) );
+
+ if ( !wxWindowBase::Reparent(newParent) )
+ return FALSE;
+
+ wxASSERT( GTK_IS_WIDGET(m_widget) );
+
+ /* prevent GTK from deleting the widget arbitrarily */
+ gtk_widget_ref( m_widget );
+
+ if (oldParent)
+ {
+ gtk_container_remove( GTK_CONTAINER(m_widget->parent), m_widget );
+ }
+
+ wxASSERT( GTK_IS_WIDGET(m_widget) );
+
+ if (newParent)
+ {
+ /* insert GTK representation */
+ (*(newParent->m_insertCallback))(newParent, this);
+ }
+
+ /* reverse: prevent GTK from deleting the widget arbitrarily */
+ gtk_widget_unref( m_widget );
+
+ return TRUE;
+}
+
+void wxWindowGTK::DoAddChild(wxWindowGTK *child)
+{
+ wxASSERT_MSG( (m_widget != NULL), wxT("invalid window") );
+
+ wxASSERT_MSG( (child != NULL), wxT("invalid child window") );
+
+ wxASSERT_MSG( (m_insertCallback != NULL), wxT("invalid child insertion function") );
+
+ /* add to list */
+ AddChild( child );
+
+ /* insert GTK representation */
+ (*m_insertCallback)(this, child);
+}
+
+void wxWindowGTK::Raise()
+{
+ wxCHECK_RET( (m_widget != NULL), wxT("invalid window") );
+
+ if (!m_widget->window) return;
+
+ gdk_window_raise( m_widget->window );
+}
+
+void wxWindowGTK::Lower()
+{
+ wxCHECK_RET( (m_widget != NULL), wxT("invalid window") );
+
+ if (!m_widget->window) return;
+
+ gdk_window_lower( m_widget->window );
+}
+
+bool wxWindowGTK::SetCursor( const wxCursor &cursor )
+{
+ wxCHECK_MSG( (m_widget != NULL), FALSE, wxT("invalid window") );
+
+ if (cursor == m_cursor)
+ return FALSE;
+
+ if (g_isIdle)
+ wxapp_install_idle_handler();
+
+ if (cursor == wxNullCursor)
+ return wxWindowBase::SetCursor( *wxSTANDARD_CURSOR );
+ else
+ return wxWindowBase::SetCursor( cursor );
+}
+
+void wxWindowGTK::WarpPointer( int x, int y )
+{
+ wxCHECK_RET( (m_widget != NULL), wxT("invalid window") );
+
+ // We provide this function ourselves as it is
+ // missing in GDK (top of this file).
+
+ GdkWindow *window = (GdkWindow*) NULL;
+ if (m_wxwindow)
+ window = GTK_PIZZA(m_wxwindow)->bin_window;
+ else
+ window = GetConnectWidget()->window;
+
+ if (window)
+ gdk_window_warp_pointer( window, x, y );
+}
+
+
+void wxWindowGTK::Refresh( bool eraseBackground, const wxRect *rect )
+{
+ if (!m_widget) return;
+ if (!m_widget->window) return;
+
+#ifndef __WXGTK20__
+ if (g_isIdle)
+ wxapp_install_idle_handler();
+
+ wxRect myRect(0,0,0,0);
+ if (m_wxwindow && rect)
+ {
+ myRect.SetSize(wxSize( m_wxwindow->allocation.width,
+ m_wxwindow->allocation.height));
+ myRect.Intersect(*rect);
+ if (!myRect.width || !myRect.height)
+ // nothing to do, rectangle is empty
+ return;
+ rect = &myRect;
+ }
+
+ if (eraseBackground && m_wxwindow && m_wxwindow->window)
+ {
+ if (rect)
+ {
+ // Schedule for later Updating in ::Update() or ::OnInternalIdle().
+ m_clearRegion.Union( rect->x, rect->y, rect->width, rect->height );
+ }
+ else
+ {
+ // Schedule for later Updating in ::Update() or ::OnInternalIdle().
+ m_clearRegion.Clear();
+ m_clearRegion.Union( 0, 0, m_wxwindow->allocation.width, m_wxwindow->allocation.height );
+ }
+ }
+
+ if (rect)
+ {
+ if (m_wxwindow)
+ {
+ // Schedule for later Updating in ::Update() or ::OnInternalIdle().
+ m_updateRegion.Union( rect->x, rect->y, rect->width, rect->height );
+ }
+ else
+ {
+ GdkRectangle gdk_rect;
+ gdk_rect.x = rect->x;
+ gdk_rect.y = rect->y;
+ gdk_rect.width = rect->width;
+ gdk_rect.height = rect->height;
+ gtk_widget_draw( m_widget, &gdk_rect );
+ }
+ }
+ else