Small oops in redrawing code.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@6598 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Robert Roebling
2000-03-10 19:49:54 +00:00
parent 5adbbc2995
commit b420fb6a37
6 changed files with 336 additions and 176 deletions

View File

@@ -67,6 +67,7 @@ struct _GtkPizza
gboolean clear_on_draw;
gboolean use_filter;
gboolean external_expose;
};
struct _GtkPizzaClass
@@ -90,6 +91,9 @@ void gtk_pizza_set_clear (GtkPizza *pizza,
void gtk_pizza_set_filter (GtkPizza *pizza,
gboolean use);
void gtk_pizza_set_external (GtkPizza *pizza,
gboolean expose);
void gtk_pizza_scroll (GtkPizza *pizza,
gint dx,
gint dy);

View File

@@ -67,6 +67,7 @@ struct _GtkPizza
gboolean clear_on_draw;
gboolean use_filter;
gboolean external_expose;
};
struct _GtkPizzaClass
@@ -90,6 +91,9 @@ void gtk_pizza_set_clear (GtkPizza *pizza,
void gtk_pizza_set_filter (GtkPizza *pizza,
gboolean use);
void gtk_pizza_set_external (GtkPizza *pizza,
gboolean expose);
void gtk_pizza_scroll (GtkPizza *pizza,
gint dx,
gint dy);

View File

@@ -191,6 +191,7 @@ gtk_pizza_init (GtkPizza *pizza)
pizza->clear_on_draw = TRUE;
pizza->use_filter = TRUE;
pizza->external_expose = FALSE;
}
GtkWidget*
@@ -250,6 +251,16 @@ gtk_pizza_set_filter (GtkPizza *pizza,
pizza->use_filter = use;
}
void
gtk_pizza_set_external (GtkPizza *pizza,
gboolean expose)
{
g_return_if_fail (pizza != NULL);
g_return_if_fail (GTK_IS_PIZZA (pizza));
pizza->external_expose = expose;
}
void
gtk_pizza_put (GtkPizza *pizza,
GtkWidget *widget,
@@ -652,16 +663,77 @@ static void
gtk_pizza_draw (GtkWidget *widget,
GdkRectangle *area)
{
/* We handle all draws events in window.cpp now. */
GtkPizza *pizza;
GtkPizzaChild *child;
GdkRectangle child_area;
GList *children;
g_return_if_fail (widget != NULL);
g_return_if_fail (GTK_IS_PIZZA (widget));
pizza = GTK_PIZZA (widget);
/* Sometimes, We handle all expose events in window.cpp now. */
if (pizza->external_expose)
return;
children = pizza->children;
if ( !(GTK_WIDGET_APP_PAINTABLE (widget)) &&
(pizza->clear_on_draw))
{
gdk_window_clear_area( pizza->bin_window,
area->x, area->y, area->width, area->height);
}
while (children)
{
child = children->data;
children = children->next;
if (gtk_widget_intersect (child->widget, area, &child_area))
gtk_widget_draw (child->widget, &child_area);
}
}
static gint
gtk_pizza_expose (GtkWidget *widget,
GdkEventExpose *event)
{
/* We handle all expose events in window.cpp now. */
GtkPizza *pizza;
GtkPizzaChild *child;
GdkEventExpose child_event;
GList *children;
g_return_val_if_fail (widget != NULL, FALSE);
g_return_val_if_fail (GTK_IS_PIZZA (widget), FALSE);
g_return_val_if_fail (event != NULL, FALSE);
pizza = GTK_PIZZA (widget);
/* Sometimes, We handle all expose events in window.cpp now. */
if (pizza->external_expose)
return;
if (event->window != pizza->bin_window)
return FALSE;
children = pizza->children;
while (children)
{
child = children->data;
children = children->next;
child_event = *event;
if (GTK_WIDGET_NO_WINDOW (child->widget) &&
GTK_WIDGET_DRAWABLE (child->widget) &&
gtk_widget_intersect (child->widget, &event->area, &child_event.area))
{
gtk_widget_event (child->widget, (GdkEvent*) &child_event);
}
}
return TRUE;
}
static void

View File

@@ -620,9 +620,6 @@ static int gtk_window_expose_callback( GtkWidget *widget, GdkEventExpose *gdk_ev
if (g_isIdle)
wxapp_install_idle_handler();
if (win->m_queuedFullRedraw)
return TRUE;
/*
if (win->GetName() == wxT("htmlWindow"))
{
@@ -636,15 +633,16 @@ static int gtk_window_expose_callback( GtkWidget *widget, GdkEventExpose *gdk_ev
}
*/
if (!win->m_queuedFullRedraw)
{
win->GetUpdateRegion().Union( gdk_event->area.x,
gdk_event->area.y,
gdk_event->area.width,
gdk_event->area.height );
if (gdk_event->count > 0)
return TRUE;
if (gdk_event->count == 0)
{
wxEraseEvent eevent( win->GetId() );
eevent.SetEventObject( win );
win->GetEventHandler()->ProcessEvent(eevent);
@@ -654,6 +652,7 @@ static int gtk_window_expose_callback( GtkWidget *widget, GdkEventExpose *gdk_ev
win->GetEventHandler()->ProcessEvent( event );
win->GetUpdateRegion().Clear();
}
/* The following code will result in all window-less widgets
being redrawn if the wxWindows class is given a chance to
@@ -671,7 +670,8 @@ static int gtk_window_expose_callback( GtkWidget *widget, GdkEventExpose *gdk_ev
GdkEventExpose child_event = *gdk_event;
if (GTK_WIDGET_NO_WINDOW (child->widget) &&
GTK_WIDGET_DRAWABLE (child->widget))
GTK_WIDGET_DRAWABLE (child->widget) /* &&
gtk_widget_intersect (child->widget, &gdk_event->area, &child_event.area)*/ )
{
child_event.area.x = child->widget->allocation.x;
child_event.area.y = child->widget->allocation.y;
@@ -680,6 +680,7 @@ static int gtk_window_expose_callback( GtkWidget *widget, GdkEventExpose *gdk_ev
gtk_widget_event (child->widget, (GdkEvent*) &child_event);
}
}
}
return TRUE;
}
@@ -690,8 +691,9 @@ static int gtk_window_expose_callback( GtkWidget *widget, GdkEventExpose *gdk_ev
/* GTK thinks it is clever and filters out a certain amount of "unneeded"
expose events. We need them, of course, so we override the main event
procedure in GtkWidget by giving our own handler for all system events,
looking for the expose events and then we can always send them. */
procedure in GtkWidget by giving our own handler for all system events.
There, we look for expose events ourselves whereas all other events are
handled normally. */
gint gtk_window_event_event_callback( GtkWidget *widget, GdkEventExpose *event, wxWindow *win )
{
@@ -701,7 +703,6 @@ gint gtk_window_event_event_callback( GtkWidget *widget, GdkEventExpose *event,
return ret;
}
return FALSE;
}
@@ -719,18 +720,6 @@ static void gtk_window_draw_callback( GtkWidget *widget, GdkRectangle *rect, wxW
if (g_isIdle)
wxapp_install_idle_handler();
if (win->m_queuedFullRedraw)
return;
GtkPizza *pizza = GTK_PIZZA (widget);
if ( !(GTK_WIDGET_APP_PAINTABLE (widget)) &&
(pizza->clear_on_draw))
{
gdk_window_clear_area( pizza->bin_window,
rect->x, rect->y, rect->width, rect->height);
}
/*
if (win->GetName() == wxT("htmlWindow"))
{
@@ -744,8 +733,18 @@ static void gtk_window_draw_callback( GtkWidget *widget, GdkRectangle *rect, wxW
}
*/
win->GetUpdateRegion().Union( rect->x, rect->y,
rect->width, rect->height );
GtkPizza *pizza = GTK_PIZZA (widget);
if (!win->m_queuedFullRedraw)
{
if (!(GTK_WIDGET_APP_PAINTABLE (widget)) &&
(pizza->clear_on_draw))
{
gdk_window_clear_area( pizza->bin_window,
rect->x, rect->y, rect->width, rect->height);
}
win->GetUpdateRegion().Union( rect->x, rect->y, rect->width, rect->height );
win->m_clipPaintRegion = TRUE;
@@ -761,6 +760,7 @@ static void gtk_window_draw_callback( GtkWidget *widget, GdkRectangle *rect, wxW
win->m_clipPaintRegion = FALSE;
GList *children = pizza->children;
while (children)
{
@@ -774,6 +774,7 @@ static void gtk_window_draw_callback( GtkWidget *widget, GdkRectangle *rect, wxW
}
}
}
}
//-----------------------------------------------------------------------------
// "key_press_event" from any window
@@ -2291,6 +2292,9 @@ void wxWindow::PostCreation()
if (!m_noExpose)
{
/* these get reported to wxWindows -> wxPaintEvent */
gtk_pizza_set_external( GTK_PIZZA(m_wxwindow), TRUE );
gtk_signal_connect( GTK_OBJECT(m_wxwindow), "event",
GTK_SIGNAL_FUNC(gtk_window_event_event_callback), (gpointer)this );

View File

@@ -191,6 +191,7 @@ gtk_pizza_init (GtkPizza *pizza)
pizza->clear_on_draw = TRUE;
pizza->use_filter = TRUE;
pizza->external_expose = FALSE;
}
GtkWidget*
@@ -250,6 +251,16 @@ gtk_pizza_set_filter (GtkPizza *pizza,
pizza->use_filter = use;
}
void
gtk_pizza_set_external (GtkPizza *pizza,
gboolean expose)
{
g_return_if_fail (pizza != NULL);
g_return_if_fail (GTK_IS_PIZZA (pizza));
pizza->external_expose = expose;
}
void
gtk_pizza_put (GtkPizza *pizza,
GtkWidget *widget,
@@ -652,16 +663,77 @@ static void
gtk_pizza_draw (GtkWidget *widget,
GdkRectangle *area)
{
/* We handle all draws events in window.cpp now. */
GtkPizza *pizza;
GtkPizzaChild *child;
GdkRectangle child_area;
GList *children;
g_return_if_fail (widget != NULL);
g_return_if_fail (GTK_IS_PIZZA (widget));
pizza = GTK_PIZZA (widget);
/* Sometimes, We handle all expose events in window.cpp now. */
if (pizza->external_expose)
return;
children = pizza->children;
if ( !(GTK_WIDGET_APP_PAINTABLE (widget)) &&
(pizza->clear_on_draw))
{
gdk_window_clear_area( pizza->bin_window,
area->x, area->y, area->width, area->height);
}
while (children)
{
child = children->data;
children = children->next;
if (gtk_widget_intersect (child->widget, area, &child_area))
gtk_widget_draw (child->widget, &child_area);
}
}
static gint
gtk_pizza_expose (GtkWidget *widget,
GdkEventExpose *event)
{
/* We handle all expose events in window.cpp now. */
GtkPizza *pizza;
GtkPizzaChild *child;
GdkEventExpose child_event;
GList *children;
g_return_val_if_fail (widget != NULL, FALSE);
g_return_val_if_fail (GTK_IS_PIZZA (widget), FALSE);
g_return_val_if_fail (event != NULL, FALSE);
pizza = GTK_PIZZA (widget);
/* Sometimes, We handle all expose events in window.cpp now. */
if (pizza->external_expose)
return;
if (event->window != pizza->bin_window)
return FALSE;
children = pizza->children;
while (children)
{
child = children->data;
children = children->next;
child_event = *event;
if (GTK_WIDGET_NO_WINDOW (child->widget) &&
GTK_WIDGET_DRAWABLE (child->widget) &&
gtk_widget_intersect (child->widget, &event->area, &child_event.area))
{
gtk_widget_event (child->widget, (GdkEvent*) &child_event);
}
}
return TRUE;
}
static void

View File

@@ -620,9 +620,6 @@ static int gtk_window_expose_callback( GtkWidget *widget, GdkEventExpose *gdk_ev
if (g_isIdle)
wxapp_install_idle_handler();
if (win->m_queuedFullRedraw)
return TRUE;
/*
if (win->GetName() == wxT("htmlWindow"))
{
@@ -636,15 +633,16 @@ static int gtk_window_expose_callback( GtkWidget *widget, GdkEventExpose *gdk_ev
}
*/
if (!win->m_queuedFullRedraw)
{
win->GetUpdateRegion().Union( gdk_event->area.x,
gdk_event->area.y,
gdk_event->area.width,
gdk_event->area.height );
if (gdk_event->count > 0)
return TRUE;
if (gdk_event->count == 0)
{
wxEraseEvent eevent( win->GetId() );
eevent.SetEventObject( win );
win->GetEventHandler()->ProcessEvent(eevent);
@@ -654,6 +652,7 @@ static int gtk_window_expose_callback( GtkWidget *widget, GdkEventExpose *gdk_ev
win->GetEventHandler()->ProcessEvent( event );
win->GetUpdateRegion().Clear();
}
/* The following code will result in all window-less widgets
being redrawn if the wxWindows class is given a chance to
@@ -671,7 +670,8 @@ static int gtk_window_expose_callback( GtkWidget *widget, GdkEventExpose *gdk_ev
GdkEventExpose child_event = *gdk_event;
if (GTK_WIDGET_NO_WINDOW (child->widget) &&
GTK_WIDGET_DRAWABLE (child->widget))
GTK_WIDGET_DRAWABLE (child->widget) /* &&
gtk_widget_intersect (child->widget, &gdk_event->area, &child_event.area)*/ )
{
child_event.area.x = child->widget->allocation.x;
child_event.area.y = child->widget->allocation.y;
@@ -680,6 +680,7 @@ static int gtk_window_expose_callback( GtkWidget *widget, GdkEventExpose *gdk_ev
gtk_widget_event (child->widget, (GdkEvent*) &child_event);
}
}
}
return TRUE;
}
@@ -690,8 +691,9 @@ static int gtk_window_expose_callback( GtkWidget *widget, GdkEventExpose *gdk_ev
/* GTK thinks it is clever and filters out a certain amount of "unneeded"
expose events. We need them, of course, so we override the main event
procedure in GtkWidget by giving our own handler for all system events,
looking for the expose events and then we can always send them. */
procedure in GtkWidget by giving our own handler for all system events.
There, we look for expose events ourselves whereas all other events are
handled normally. */
gint gtk_window_event_event_callback( GtkWidget *widget, GdkEventExpose *event, wxWindow *win )
{
@@ -701,7 +703,6 @@ gint gtk_window_event_event_callback( GtkWidget *widget, GdkEventExpose *event,
return ret;
}
return FALSE;
}
@@ -719,18 +720,6 @@ static void gtk_window_draw_callback( GtkWidget *widget, GdkRectangle *rect, wxW
if (g_isIdle)
wxapp_install_idle_handler();
if (win->m_queuedFullRedraw)
return;
GtkPizza *pizza = GTK_PIZZA (widget);
if ( !(GTK_WIDGET_APP_PAINTABLE (widget)) &&
(pizza->clear_on_draw))
{
gdk_window_clear_area( pizza->bin_window,
rect->x, rect->y, rect->width, rect->height);
}
/*
if (win->GetName() == wxT("htmlWindow"))
{
@@ -744,8 +733,18 @@ static void gtk_window_draw_callback( GtkWidget *widget, GdkRectangle *rect, wxW
}
*/
win->GetUpdateRegion().Union( rect->x, rect->y,
rect->width, rect->height );
GtkPizza *pizza = GTK_PIZZA (widget);
if (!win->m_queuedFullRedraw)
{
if (!(GTK_WIDGET_APP_PAINTABLE (widget)) &&
(pizza->clear_on_draw))
{
gdk_window_clear_area( pizza->bin_window,
rect->x, rect->y, rect->width, rect->height);
}
win->GetUpdateRegion().Union( rect->x, rect->y, rect->width, rect->height );
win->m_clipPaintRegion = TRUE;
@@ -761,6 +760,7 @@ static void gtk_window_draw_callback( GtkWidget *widget, GdkRectangle *rect, wxW
win->m_clipPaintRegion = FALSE;
GList *children = pizza->children;
while (children)
{
@@ -774,6 +774,7 @@ static void gtk_window_draw_callback( GtkWidget *widget, GdkRectangle *rect, wxW
}
}
}
}
//-----------------------------------------------------------------------------
// "key_press_event" from any window
@@ -2291,6 +2292,9 @@ void wxWindow::PostCreation()
if (!m_noExpose)
{
/* these get reported to wxWindows -> wxPaintEvent */
gtk_pizza_set_external( GTK_PIZZA(m_wxwindow), TRUE );
gtk_signal_connect( GTK_OBJECT(m_wxwindow), "event",
GTK_SIGNAL_FUNC(gtk_window_event_event_callback), (gpointer)this );