More refreshes are deferred to idle time.

Corrected redraw areas of native widgets
    if underlying wxWindows have been exposed.


git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@14076 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Robert Roebling
2002-02-08 23:43:35 +00:00
parent bc850f29e6
commit 8f3e7ecc5d
2 changed files with 80 additions and 56 deletions

View File

@@ -800,10 +800,7 @@ static int gtk_window_expose_callback( GtkWidget *widget,
gdk_event->area.width, gdk_event->area.width,
gdk_event->area.height ); gdk_event->area.height );
// Actually send the various events based on the // Actual redrawing takes place in idle time.
// current update region.
if (gdk_event->count == 0)
win->GtkSendPaintEvents();
return TRUE; return TRUE;
} }
@@ -898,10 +895,9 @@ static void gtk_window_draw_callback( GtkWidget *widget,
win->GetUpdateRegion().Union( rect->x, rect->y, rect->width, rect->height ); win->GetUpdateRegion().Union( rect->x, rect->y, rect->width, rect->height );
// Actually send the various events based on the // Actual redrawing takes place in idle time.
// current update region.
win->GtkSendPaintEvents();
#ifndef __WXUNIVERSAL__
// Redraw child widgets // Redraw child widgets
GList *children = pizza->children; GList *children = pizza->children;
while (children) while (children)
@@ -915,6 +911,7 @@ static void gtk_window_draw_callback( GtkWidget *widget,
gtk_widget_draw (child->widget, &child_area /* (GdkRectangle*) NULL*/ ); gtk_widget_draw (child->widget, &child_area /* (GdkRectangle*) NULL*/ );
} }
} }
#endif
} }
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
@@ -3417,12 +3414,13 @@ void wxWindowGTK::GtkSendPaintEvents()
m_clipPaintRegion = FALSE; m_clipPaintRegion = FALSE;
GtkPizza *pizza = GTK_PIZZA(m_wxwindow); #ifndef __WXUNIVERSAL__
if (g_list_length(pizza->children) > 0)
{
// The following code will result in all window-less widgets // The following code will result in all window-less widgets
// being redrawn because the wxWindows class is allowed to // being redrawn because the wxWindows class is allowed to
// paint over the window-less widgets. // paint over the window-less widgets.
GtkPizza *pizza = GTK_PIZZA(m_wxwindow);
GList *children = pizza->children; GList *children = pizza->children;
while (children) while (children)
{ {
@@ -3434,17 +3432,31 @@ void wxWindowGTK::GtkSendPaintEvents()
{ {
// Get intersection of widget area and update region // Get intersection of widget area and update region
wxRegion region( m_updateRegion ); wxRegion region( m_updateRegion );
region.Intersect( child->widget->allocation.x,
child->widget->allocation.y,
child->widget->allocation.width,
child->widget->allocation.height );
// Redraw the whole widget anyway GdkEventExpose gdk_event;
if (!region.IsEmpty()) gdk_event.type = GDK_EXPOSE;
gtk_widget_draw( child->widget, NULL ); gdk_event.window = pizza->bin_window;
gdk_event.count = 0;
wxRegionIterator upd( m_updateRegion );
while (upd)
{
GdkRectangle rect;
rect.x = upd.GetX();
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 ++;
} }
} }
} }
#endif
m_updateRegion.Clear(); m_updateRegion.Clear();
} }
@@ -3583,7 +3595,7 @@ GtkStyle *wxWindowGTK::GetWidgetStyle()
void wxWindowGTK::SetWidgetStyle() void wxWindowGTK::SetWidgetStyle()
{ {
#if DISABLE_STYLE_IF_BROKEN_THEM #if DISABLE_STYLE_IF_BROKEN_THEME
if (m_widget->style->engine_data) if (m_widget->style->engine_data)
{ {
static bool s_warningPrinted = FALSE; static bool s_warningPrinted = FALSE;

View File

@@ -800,10 +800,7 @@ static int gtk_window_expose_callback( GtkWidget *widget,
gdk_event->area.width, gdk_event->area.width,
gdk_event->area.height ); gdk_event->area.height );
// Actually send the various events based on the // Actual redrawing takes place in idle time.
// current update region.
if (gdk_event->count == 0)
win->GtkSendPaintEvents();
return TRUE; return TRUE;
} }
@@ -898,10 +895,9 @@ static void gtk_window_draw_callback( GtkWidget *widget,
win->GetUpdateRegion().Union( rect->x, rect->y, rect->width, rect->height ); win->GetUpdateRegion().Union( rect->x, rect->y, rect->width, rect->height );
// Actually send the various events based on the // Actual redrawing takes place in idle time.
// current update region.
win->GtkSendPaintEvents();
#ifndef __WXUNIVERSAL__
// Redraw child widgets // Redraw child widgets
GList *children = pizza->children; GList *children = pizza->children;
while (children) while (children)
@@ -915,6 +911,7 @@ static void gtk_window_draw_callback( GtkWidget *widget,
gtk_widget_draw (child->widget, &child_area /* (GdkRectangle*) NULL*/ ); gtk_widget_draw (child->widget, &child_area /* (GdkRectangle*) NULL*/ );
} }
} }
#endif
} }
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
@@ -3417,12 +3414,13 @@ void wxWindowGTK::GtkSendPaintEvents()
m_clipPaintRegion = FALSE; m_clipPaintRegion = FALSE;
GtkPizza *pizza = GTK_PIZZA(m_wxwindow); #ifndef __WXUNIVERSAL__
if (g_list_length(pizza->children) > 0)
{
// The following code will result in all window-less widgets // The following code will result in all window-less widgets
// being redrawn because the wxWindows class is allowed to // being redrawn because the wxWindows class is allowed to
// paint over the window-less widgets. // paint over the window-less widgets.
GtkPizza *pizza = GTK_PIZZA(m_wxwindow);
GList *children = pizza->children; GList *children = pizza->children;
while (children) while (children)
{ {
@@ -3434,17 +3432,31 @@ void wxWindowGTK::GtkSendPaintEvents()
{ {
// Get intersection of widget area and update region // Get intersection of widget area and update region
wxRegion region( m_updateRegion ); wxRegion region( m_updateRegion );
region.Intersect( child->widget->allocation.x,
child->widget->allocation.y,
child->widget->allocation.width,
child->widget->allocation.height );
// Redraw the whole widget anyway GdkEventExpose gdk_event;
if (!region.IsEmpty()) gdk_event.type = GDK_EXPOSE;
gtk_widget_draw( child->widget, NULL ); gdk_event.window = pizza->bin_window;
gdk_event.count = 0;
wxRegionIterator upd( m_updateRegion );
while (upd)
{
GdkRectangle rect;
rect.x = upd.GetX();
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 ++;
} }
} }
} }
#endif
m_updateRegion.Clear(); m_updateRegion.Clear();
} }
@@ -3583,7 +3595,7 @@ GtkStyle *wxWindowGTK::GetWidgetStyle()
void wxWindowGTK::SetWidgetStyle() void wxWindowGTK::SetWidgetStyle()
{ {
#if DISABLE_STYLE_IF_BROKEN_THEM #if DISABLE_STYLE_IF_BROKEN_THEME
if (m_widget->style->engine_data) if (m_widget->style->engine_data)
{ {
static bool s_warningPrinted = FALSE; static bool s_warningPrinted = FALSE;