X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/b5a49d4c5267d4eb933d45ec615ac2ed374750dc..3806393b34e39a4e18cff55dce55c26a103534c6:/src/gtk/window.cpp diff --git a/src/gtk/window.cpp b/src/gtk/window.cpp index 38b3a20847..d8285266ab 100644 --- a/src/gtk/window.cpp +++ b/src/gtk/window.cpp @@ -25,6 +25,7 @@ #include "wx/utils.h" #include "wx/dialog.h" #include "wx/msgdlg.h" +#include "wx/module.h" #if wxUSE_DRAG_AND_DROP #include "wx/dnd.h" @@ -39,7 +40,7 @@ #endif // wxUSE_CARET #if wxUSE_TEXTCTRL -#include "wx/textctrl.h" + #include "wx/textctrl.h" #endif #include "wx/menu.h" @@ -487,8 +488,8 @@ gint gtk_window_own_expose_callback( GtkWidget *widget, GdkEventExpose *gdk_even #ifdef __WXGTK20__ (* GTK_WIDGET_CLASS (pizza_parent_class)->expose_event) (widget, gdk_event); - -#endif + +#endif return TRUE; } @@ -829,12 +830,12 @@ static int gtk_window_expose_callback( GtkWidget *widget, // Actual redrawing takes place in idle time. win->Update(); - + #ifdef __WXGTK20__ (* GTK_WIDGET_CLASS (pizza_parent_class)->expose_event) (widget, gdk_event); - -#endif + +#endif return TRUE; } @@ -934,7 +935,7 @@ static void gtk_window_draw_callback( GtkWidget *widget, win->GetUpdateRegion().Union( rect->x, rect->y, rect->width, rect->height ); // Actual redrawing takes place in idle time. - + win->Update(); #ifndef __WXUNIVERSAL__ @@ -2351,6 +2352,9 @@ bool wxWindowGTK::Create( wxWindow *parent, } m_insertCallback = wxInsertChildInWindow; + + // always needed for background clearing + m_delayedBackgroundColour = TRUE; m_widget = gtk_scrolled_window_new( (GtkAdjustment *) NULL, (GtkAdjustment *) NULL ); GTK_WIDGET_UNSET_FLAGS( m_widget, GTK_CAN_FOCUS ); @@ -2366,7 +2370,7 @@ bool wxWindowGTK::Create( wxWindow *parent, m_vAdjust = gtk_range_get_adjustment( GTK_RANGE(scrolledWindow->vscrollbar) ); m_wxwindow = gtk_pizza_new(); - + #ifndef __WXUNIVERSAL__ GtkPizza *pizza = GTK_PIZZA(m_wxwindow); @@ -2547,7 +2551,7 @@ void wxWindowGTK::PostCreation() #ifndef __WXGTK20__ gtk_signal_connect( GTK_OBJECT(m_wxwindow), "draw", GTK_SIGNAL_FUNC(gtk_window_draw_callback), (gpointer)this ); - + if (HasFlag(wxNO_FULL_REPAINT_ON_RESIZE)) { gtk_signal_connect( GTK_OBJECT(m_wxwindow), "event", @@ -2773,7 +2777,7 @@ void wxWindowGTK::OnInternalIdle() { // Update invalidated regions. Update(); - + // Synthetize activate events. if ( g_sendActivateEvent != -1 ) { @@ -3387,18 +3391,23 @@ void wxWindowGTK::GtkSendPaintEvents() { wxWindowDC dc( (wxWindow*)this ); dc.SetClippingRegion( m_clearRegion ); - + wxEraseEvent erase_event( GetId(), &dc ); erase_event.SetEventObject( this ); - + if (!GetEventHandler()->ProcessEvent(erase_event)) { + if (!g_eraseGC) + { + g_eraseGC = gdk_gc_new( GTK_PIZZA(m_wxwindow)->bin_window ); + gdk_gc_set_fill( g_eraseGC, GDK_SOLID ); + } gdk_gc_set_foreground( g_eraseGC, m_backgroundColour.GetColor() ); - + wxRegionIterator upd( m_clearRegion ); while (upd) { - gdk_draw_rectangle( GTK_PIZZA(m_wxwindow)->bin_window, g_eraseGC, 0, + gdk_draw_rectangle( GTK_PIZZA(m_wxwindow)->bin_window, g_eraseGC, 1, upd.GetX(), upd.GetY(), upd.GetWidth(), upd.GetHeight() ); upd ++; } @@ -3421,9 +3430,9 @@ void wxWindowGTK::GtkSendPaintEvents() // The following code will result in all window-less widgets // being redrawn because the wxWindows class is allowed to // paint over the window-less widgets. - + GtkPizza *pizza = GTK_PIZZA(m_wxwindow); - + GList *children = pizza->children; while (children) { @@ -3435,12 +3444,12 @@ void wxWindowGTK::GtkSendPaintEvents() { // Get intersection of widget area and update region wxRegion region( m_updateRegion ); - + GdkEventExpose gdk_event; gdk_event.type = GDK_EXPOSE; gdk_event.window = pizza->bin_window; gdk_event.count = 0; - + wxRegionIterator upd( m_updateRegion ); while (upd) { @@ -3449,12 +3458,12 @@ void wxWindowGTK::GtkSendPaintEvents() rect.y = upd.GetY(); rect.width = upd.GetWidth(); rect.height = upd.GetHeight(); - + if (gtk_widget_intersect (child->widget, &rect, &gdk_event.area)) { gtk_widget_event (child->widget, (GdkEvent*) &gdk_event); } - + upd ++; } } @@ -3473,7 +3482,7 @@ void wxWindowGTK::Clear() if (m_wxwindow && m_wxwindow->window) { -// gdk_window_clear( m_wxwindow->window ); + gdk_window_clear( m_wxwindow->window ); } } @@ -3517,6 +3526,12 @@ bool wxWindowGTK::SetBackgroundColour( const wxColour &colour ) m_delayedBackgroundColour = TRUE; } + if (window) + { + // We need the pixel value e.g. for background clearing. + m_backgroundColour.CalcPixel( gdk_window_get_colormap( window ) ); + } + if ((m_wxwindow) && (m_wxwindow->window) && (m_backgroundColour != wxSystemSettings::GetColour(wxSYS_COLOUR_BTNFACE))) @@ -3524,7 +3539,6 @@ bool wxWindowGTK::SetBackgroundColour( const wxColour &colour ) /* wxMSW doesn't clear the window here. I don't do that either to provide compatibility. call Clear() to do the job. */ - m_backgroundColour.CalcPixel( gdk_window_get_colormap( window ) ); gdk_window_set_background( window, m_backgroundColour.GetColor() ); } @@ -4063,42 +4077,42 @@ void wxWindowGTK::ScrollWindow( int dx, int dy, const wxRect* WXUNUSED(rect) ) // No scrolling requested. if ((dx == 0) && (dy == 0)) return; - + #ifndef __WXGTK20__ if (!m_updateRegion.IsEmpty()) { m_updateRegion.Offset( dx, dy ); - + int cw = 0; int ch = 0; GetClientSize( &cw, &ch ); m_updateRegion.Intersect( 0, 0, cw, ch ); } - + if (!m_clearRegion.IsEmpty()) { m_clearRegion.Offset( dx, dy ); - + int cw = 0; int ch = 0; GetClientSize( &cw, &ch ); m_clearRegion.Intersect( 0, 0, cw, ch ); } - + m_clipPaintRegion = TRUE; - + gtk_pizza_scroll( GTK_PIZZA(m_wxwindow), -dx, -dy ); - + m_clipPaintRegion = FALSE; #else gdk_window_scroll( GTK_PIZZA(m_wxwindow)->bin_window, dx, dy ); - + GTK_PIZZA(m_wxwindow)->xoffset += dx; GTK_PIZZA(m_wxwindow)->yoffset += dy; - -#endif - + +#endif + } @@ -4161,14 +4175,15 @@ IMPLEMENT_DYNAMIC_CLASS(wxWinModule, wxModule) bool wxWinModule::OnInit() { - g_eraseGC = gdk_gc_new( GDK_ROOT_PARENT() ); - gdk_gc_set_fill( g_eraseGC, GDK_SOLID ); - + // g_eraseGC = gdk_gc_new( GDK_ROOT_PARENT() ); + // gdk_gc_set_fill( g_eraseGC, GDK_SOLID ); + return TRUE; } void wxWinModule::OnExit() { - gdk_gc_unref( g_eraseGC ); + if (g_eraseGC) + gdk_gc_unref( g_eraseGC ); }