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,34 +3414,49 @@ void wxWindowGTK::GtkSendPaintEvents()
m_clipPaintRegion = FALSE; m_clipPaintRegion = FALSE;
#ifndef __WXUNIVERSAL__
// 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); GtkPizza *pizza = GTK_PIZZA(m_wxwindow);
if (g_list_length(pizza->children) > 0)
GList *children = pizza->children;
while (children)
{ {
// The following code will result in all window-less widgets GtkPizzaChild *child = (GtkPizzaChild*) children->data;
// being redrawn because the wxWindows class is allowed to children = children->next;
// paint over the window-less widgets.
GList *children = pizza->children;
while (children)
{
GtkPizzaChild *child = (GtkPizzaChild*) children->data;
children = children->next;
if (GTK_WIDGET_NO_WINDOW (child->widget) && if (GTK_WIDGET_NO_WINDOW (child->widget) &&
GTK_WIDGET_DRAWABLE (child->widget)) GTK_WIDGET_DRAWABLE (child->widget))
{
// 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)
{ {
// Get intersection of widget area and update region GdkRectangle rect;
wxRegion region( m_updateRegion ); rect.x = upd.GetX();
region.Intersect( child->widget->allocation.x, rect.y = upd.GetY();
child->widget->allocation.y, rect.width = upd.GetWidth();
child->widget->allocation.width, rect.height = upd.GetHeight();
child->widget->allocation.height );
// Redraw the whole widget anyway if (gtk_widget_intersect (child->widget, &rect, &gdk_event.area))
if (!region.IsEmpty()) {
gtk_widget_draw( child->widget, NULL ); 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,34 +3414,49 @@ void wxWindowGTK::GtkSendPaintEvents()
m_clipPaintRegion = FALSE; m_clipPaintRegion = FALSE;
#ifndef __WXUNIVERSAL__
// 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); GtkPizza *pizza = GTK_PIZZA(m_wxwindow);
if (g_list_length(pizza->children) > 0)
GList *children = pizza->children;
while (children)
{ {
// The following code will result in all window-less widgets GtkPizzaChild *child = (GtkPizzaChild*) children->data;
// being redrawn because the wxWindows class is allowed to children = children->next;
// paint over the window-less widgets.
GList *children = pizza->children;
while (children)
{
GtkPizzaChild *child = (GtkPizzaChild*) children->data;
children = children->next;
if (GTK_WIDGET_NO_WINDOW (child->widget) && if (GTK_WIDGET_NO_WINDOW (child->widget) &&
GTK_WIDGET_DRAWABLE (child->widget)) GTK_WIDGET_DRAWABLE (child->widget))
{
// 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)
{ {
// Get intersection of widget area and update region GdkRectangle rect;
wxRegion region( m_updateRegion ); rect.x = upd.GetX();
region.Intersect( child->widget->allocation.x, rect.y = upd.GetY();
child->widget->allocation.y, rect.width = upd.GetWidth();
child->widget->allocation.width, rect.height = upd.GetHeight();
child->widget->allocation.height );
// Redraw the whole widget anyway if (gtk_widget_intersect (child->widget, &rect, &gdk_event.area))
if (!region.IsEmpty()) {
gtk_widget_draw( child->widget, NULL ); 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;