gboolean clear_on_draw;
gboolean use_filter;
+ gboolean external_expose;
};
struct _GtkPizzaClass
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);
gboolean clear_on_draw;
gboolean use_filter;
+ gboolean external_expose;
};
struct _GtkPizzaClass
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);
pizza->clear_on_draw = TRUE;
pizza->use_filter = TRUE;
+ pizza->external_expose = FALSE;
}
GtkWidget*
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,
gtk_pizza_draw (GtkWidget *widget,
GdkRectangle *area)
{
- /* We handle all draws events in window.cpp now. */
- return;
+ 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. */
- return FALSE;
+ 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
if (g_isIdle)
wxapp_install_idle_handler();
- if (win->m_queuedFullRedraw)
- return TRUE;
-
/*
if (win->GetName() == wxT("htmlWindow"))
{
}
*/
- win->GetUpdateRegion().Union( gdk_event->area.x,
- gdk_event->area.y,
- gdk_event->area.width,
- gdk_event->area.height );
-
+ if (!win->m_queuedFullRedraw)
+ {
- if (gdk_event->count > 0)
- return TRUE;
+ win->GetUpdateRegion().Union( gdk_event->area.x,
+ gdk_event->area.y,
+ gdk_event->area.width,
+ gdk_event->area.height );
- wxEraseEvent eevent( win->GetId() );
- eevent.SetEventObject( win );
- win->GetEventHandler()->ProcessEvent(eevent);
+ if (gdk_event->count == 0)
+ {
+ wxEraseEvent eevent( win->GetId() );
+ eevent.SetEventObject( win );
+ win->GetEventHandler()->ProcessEvent(eevent);
- wxPaintEvent event( win->GetId() );
- event.SetEventObject( win );
- win->GetEventHandler()->ProcessEvent( event );
+ wxPaintEvent event( win->GetId() );
+ event.SetEventObject( win );
+ win->GetEventHandler()->ProcessEvent( event );
- win->GetUpdateRegion().Clear();
+ win->GetUpdateRegion().Clear();
+ }
- /* The following code will result in all window-less widgets
- being redrawn if the wxWindows class is given a chance to
- paint *anything* because it will then be allowed to paint
- over the window-less widgets */
+ /* The following code will result in all window-less widgets
+ being redrawn if the wxWindows class is given a chance to
+ paint *anything* because it will then be allowed to paint
+ over the window-less widgets */
- GtkPizza *pizza = GTK_PIZZA (widget);
+ GtkPizza *pizza = GTK_PIZZA (widget);
- GList *children = pizza->children;
- while (children)
- {
- GtkPizzaChild *child = (GtkPizzaChild*) children->data;
- children = children->next;
+ GList *children = pizza->children;
+ while (children)
+ {
+ GtkPizzaChild *child = (GtkPizzaChild*) children->data;
+ children = children->next;
- GdkEventExpose child_event = *gdk_event;
+ GdkEventExpose child_event = *gdk_event;
- if (GTK_WIDGET_NO_WINDOW (child->widget) &&
- GTK_WIDGET_DRAWABLE (child->widget))
- {
- child_event.area.x = child->widget->allocation.x;
- child_event.area.y = child->widget->allocation.y;
- child_event.area.width = child->widget->allocation.width;
- child_event.area.height = child->widget->allocation.height;
- gtk_widget_event (child->widget, (GdkEvent*) &child_event);
+ if (GTK_WIDGET_NO_WINDOW (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;
+ child_event.area.width = child->widget->allocation.width;
+ child_event.area.height = child->widget->allocation.height;
+ gtk_widget_event (child->widget, (GdkEvent*) &child_event);
+ }
}
}
/* 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 )
{
return ret;
}
-
return FALSE;
}
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"))
{
}
*/
- 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;
+ win->m_clipPaintRegion = TRUE;
- wxEraseEvent eevent( win->GetId() );
- eevent.SetEventObject( win );
- win->GetEventHandler()->ProcessEvent(eevent);
+ wxEraseEvent eevent( win->GetId() );
+ eevent.SetEventObject( win );
+ win->GetEventHandler()->ProcessEvent(eevent);
- wxPaintEvent event( win->GetId() );
- event.SetEventObject( win );
- win->GetEventHandler()->ProcessEvent( event );
+ wxPaintEvent event( win->GetId() );
+ event.SetEventObject( win );
+ win->GetEventHandler()->ProcessEvent( event );
- win->GetUpdateRegion().Clear();
+ win->GetUpdateRegion().Clear();
- win->m_clipPaintRegion = FALSE;
+ win->m_clipPaintRegion = FALSE;
- GList *children = pizza->children;
- while (children)
- {
- GtkPizzaChild *child = (GtkPizzaChild*) children->data;
- children = children->next;
-
- GdkRectangle child_area;
- if (gtk_widget_intersect (child->widget, rect, &child_area))
+
+ GList *children = pizza->children;
+ while (children)
{
- gtk_widget_draw (child->widget, &child_area /* (GdkRectangle*) NULL*/ );
+ GtkPizzaChild *child = (GtkPizzaChild*) children->data;
+ children = children->next;
+
+ GdkRectangle child_area;
+ if (gtk_widget_intersect (child->widget, rect, &child_area))
+ {
+ gtk_widget_draw (child->widget, &child_area /* (GdkRectangle*) NULL*/ );
+ }
}
}
}
if ((colormap = gtk_widget_get_colormap (widget)) !=
gtk_widget_get_default_colormap ())
{
- attrmask |= GDK_IC_PREEDIT_COLORMAP;
- attr->preedit_colormap = colormap;
+ attrmask |= GDK_IC_PREEDIT_COLORMAP;
+ attr->preedit_colormap = colormap;
}
attrmask |= GDK_IC_PREEDIT_FOREGROUND;
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 );
m_updateRegion.Clear();
m_updateRegion.Union( 0,0,m_width,m_height );
gtk_widget_draw( m_wxwindow, (GdkRectangle*) NULL );
-
+
GdkEventMask mask = gdk_window_get_events( GTK_PIZZA(m_wxwindow)->bin_window );
mask = (GdkEventMask)(mask | GDK_EXPOSURE_MASK);
gdk_window_set_events( GTK_PIZZA(m_wxwindow)->bin_window, mask );
pizza->clear_on_draw = TRUE;
pizza->use_filter = TRUE;
+ pizza->external_expose = FALSE;
}
GtkWidget*
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,
gtk_pizza_draw (GtkWidget *widget,
GdkRectangle *area)
{
- /* We handle all draws events in window.cpp now. */
- return;
+ 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. */
- return FALSE;
+ 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
if (g_isIdle)
wxapp_install_idle_handler();
- if (win->m_queuedFullRedraw)
- return TRUE;
-
/*
if (win->GetName() == wxT("htmlWindow"))
{
}
*/
- win->GetUpdateRegion().Union( gdk_event->area.x,
- gdk_event->area.y,
- gdk_event->area.width,
- gdk_event->area.height );
-
+ if (!win->m_queuedFullRedraw)
+ {
- if (gdk_event->count > 0)
- return TRUE;
+ win->GetUpdateRegion().Union( gdk_event->area.x,
+ gdk_event->area.y,
+ gdk_event->area.width,
+ gdk_event->area.height );
- wxEraseEvent eevent( win->GetId() );
- eevent.SetEventObject( win );
- win->GetEventHandler()->ProcessEvent(eevent);
+ if (gdk_event->count == 0)
+ {
+ wxEraseEvent eevent( win->GetId() );
+ eevent.SetEventObject( win );
+ win->GetEventHandler()->ProcessEvent(eevent);
- wxPaintEvent event( win->GetId() );
- event.SetEventObject( win );
- win->GetEventHandler()->ProcessEvent( event );
+ wxPaintEvent event( win->GetId() );
+ event.SetEventObject( win );
+ win->GetEventHandler()->ProcessEvent( event );
- win->GetUpdateRegion().Clear();
+ win->GetUpdateRegion().Clear();
+ }
- /* The following code will result in all window-less widgets
- being redrawn if the wxWindows class is given a chance to
- paint *anything* because it will then be allowed to paint
- over the window-less widgets */
+ /* The following code will result in all window-less widgets
+ being redrawn if the wxWindows class is given a chance to
+ paint *anything* because it will then be allowed to paint
+ over the window-less widgets */
- GtkPizza *pizza = GTK_PIZZA (widget);
+ GtkPizza *pizza = GTK_PIZZA (widget);
- GList *children = pizza->children;
- while (children)
- {
- GtkPizzaChild *child = (GtkPizzaChild*) children->data;
- children = children->next;
+ GList *children = pizza->children;
+ while (children)
+ {
+ GtkPizzaChild *child = (GtkPizzaChild*) children->data;
+ children = children->next;
- GdkEventExpose child_event = *gdk_event;
+ GdkEventExpose child_event = *gdk_event;
- if (GTK_WIDGET_NO_WINDOW (child->widget) &&
- GTK_WIDGET_DRAWABLE (child->widget))
- {
- child_event.area.x = child->widget->allocation.x;
- child_event.area.y = child->widget->allocation.y;
- child_event.area.width = child->widget->allocation.width;
- child_event.area.height = child->widget->allocation.height;
- gtk_widget_event (child->widget, (GdkEvent*) &child_event);
+ if (GTK_WIDGET_NO_WINDOW (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;
+ child_event.area.width = child->widget->allocation.width;
+ child_event.area.height = child->widget->allocation.height;
+ gtk_widget_event (child->widget, (GdkEvent*) &child_event);
+ }
}
}
/* 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 )
{
return ret;
}
-
return FALSE;
}
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"))
{
}
*/
- 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;
+ win->m_clipPaintRegion = TRUE;
- wxEraseEvent eevent( win->GetId() );
- eevent.SetEventObject( win );
- win->GetEventHandler()->ProcessEvent(eevent);
+ wxEraseEvent eevent( win->GetId() );
+ eevent.SetEventObject( win );
+ win->GetEventHandler()->ProcessEvent(eevent);
- wxPaintEvent event( win->GetId() );
- event.SetEventObject( win );
- win->GetEventHandler()->ProcessEvent( event );
+ wxPaintEvent event( win->GetId() );
+ event.SetEventObject( win );
+ win->GetEventHandler()->ProcessEvent( event );
- win->GetUpdateRegion().Clear();
+ win->GetUpdateRegion().Clear();
- win->m_clipPaintRegion = FALSE;
+ win->m_clipPaintRegion = FALSE;
- GList *children = pizza->children;
- while (children)
- {
- GtkPizzaChild *child = (GtkPizzaChild*) children->data;
- children = children->next;
-
- GdkRectangle child_area;
- if (gtk_widget_intersect (child->widget, rect, &child_area))
+
+ GList *children = pizza->children;
+ while (children)
{
- gtk_widget_draw (child->widget, &child_area /* (GdkRectangle*) NULL*/ );
+ GtkPizzaChild *child = (GtkPizzaChild*) children->data;
+ children = children->next;
+
+ GdkRectangle child_area;
+ if (gtk_widget_intersect (child->widget, rect, &child_area))
+ {
+ gtk_widget_draw (child->widget, &child_area /* (GdkRectangle*) NULL*/ );
+ }
}
}
}
if ((colormap = gtk_widget_get_colormap (widget)) !=
gtk_widget_get_default_colormap ())
{
- attrmask |= GDK_IC_PREEDIT_COLORMAP;
- attr->preedit_colormap = colormap;
+ attrmask |= GDK_IC_PREEDIT_COLORMAP;
+ attr->preedit_colormap = colormap;
}
attrmask |= GDK_IC_PREEDIT_FOREGROUND;
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 );
m_updateRegion.Clear();
m_updateRegion.Union( 0,0,m_width,m_height );
gtk_widget_draw( m_wxwindow, (GdkRectangle*) NULL );
-
+
GdkEventMask mask = gdk_window_get_events( GTK_PIZZA(m_wxwindow)->bin_window );
mask = (GdkEventMask)(mask | GDK_EXPOSURE_MASK);
gdk_window_set_events( GTK_PIZZA(m_wxwindow)->bin_window, mask );