if (win->m_hasScrolling)
{
- GtkScrolledWindow *scroll_window = GTK_SCROLLED_WINDOW(widget);
+ GtkScrolledWindow *scroll_window = GTK_SCROLLED_WINDOW(widget);
- GtkRequisition vscroll_req;
- vscroll_req.width = 2;
- vscroll_req.height = 2;
- (* GTK_WIDGET_CLASS( GTK_OBJECT_GET_CLASS(scroll_window->vscrollbar) )->size_request )
- (scroll_window->vscrollbar, &vscroll_req );
+ GtkRequisition vscroll_req;
+ vscroll_req.width = 2;
+ vscroll_req.height = 2;
+ (* GTK_WIDGET_CLASS( GTK_OBJECT_GET_CLASS(scroll_window->vscrollbar) )->size_request )
+ (scroll_window->vscrollbar, &vscroll_req );
- GtkRequisition hscroll_req;
- hscroll_req.width = 2;
- hscroll_req.height = 2;
- (* GTK_WIDGET_CLASS( GTK_OBJECT_GET_CLASS(scroll_window->hscrollbar) )->size_request )
- (scroll_window->hscrollbar, &hscroll_req );
+ GtkRequisition hscroll_req;
+ hscroll_req.width = 2;
+ hscroll_req.height = 2;
+ (* GTK_WIDGET_CLASS( GTK_OBJECT_GET_CLASS(scroll_window->hscrollbar) )->size_request )
+ (scroll_window->hscrollbar, &hscroll_req );
- GtkScrolledWindowClass *scroll_class = GTK_SCROLLED_WINDOW_CLASS( GTK_OBJECT_GET_CLASS(widget) );
+ GtkScrolledWindowClass *scroll_class = GTK_SCROLLED_WINDOW_CLASS( GTK_OBJECT_GET_CLASS(widget) );
- if (scroll_window->vscrollbar_visible)
- {
- dw += vscroll_req.width;
- dw += scroll_class->scrollbar_spacing;
- }
+ if (scroll_window->vscrollbar_visible)
+ {
+ dw += vscroll_req.width;
+ dw += scroll_class->scrollbar_spacing;
+ }
- if (scroll_window->hscrollbar_visible)
- {
- dh += hscroll_req.height;
- dh += scroll_class->scrollbar_spacing;
- }
- }
+ if (scroll_window->hscrollbar_visible)
+ {
+ dh += hscroll_req.height;
+ dh += scroll_class->scrollbar_spacing;
+ }
+}
int dx = 0;
int dy = 0;
gdk_event->area.width,
gdk_event->area.height );
+ // Actually send the various events based on the
+ // current update region.
if (gdk_event->count == 0)
- {
- win->m_clipPaintRegion = TRUE;
-
- wxWindowDC dc(win);
- dc.SetClippingRegion(win->GetUpdateRegion());
- wxEraseEvent eevent( win->GetId(), &dc );
- eevent.SetEventObject( win );
-#if 1
- (void)win->GetEventHandler()->ProcessEvent(eevent);
-#else // 0
- if (!win->GetEventHandler()->ProcessEvent(eevent))
- {
- wxClientDC dc( win );
- dc.SetBrush( wxBrush( win->GetBackgroundColour(), wxSOLID ) );
- dc.SetPen( *wxTRANSPARENT_PEN );
-
- wxRegionIterator upd( win->GetUpdateRegion() );
- while (upd)
- {
- dc.DrawRectangle( upd.GetX(), upd.GetY(), upd.GetWidth(), upd.GetHeight() );
- upd ++;
- }
- }
-#endif // 1/0
-
- wxNcPaintEvent eventNc( win->GetId() );
- eventNc.SetEventObject( win );
- win->GetEventHandler()->ProcessEvent( eventNc );
-
- wxPaintEvent event( win->GetId() );
- event.SetEventObject( win );
- win->GetEventHandler()->ProcessEvent( event );
-
- win->GetUpdateRegion().Clear();
+ win->GtkSendPaintEvents();
- win->m_clipPaintRegion = FALSE;
- }
-
- /* 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.
GList *children = pizza->children;
while (children)
{
// "event" of m_wxwindow
//-----------------------------------------------------------------------------
-/* 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.
- There, we look for expose events ourselves whereas all other events are
- handled normally. */
+// 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.
+// There, we look for expose events ourselves whereas all other events are
+// handled normally.
gint gtk_window_event_event_callback( GtkWidget *widget,
GdkEventExpose *event,
// "draw" of m_wxwindow
//-----------------------------------------------------------------------------
-/* This callback is a complete replacement of the gtk_pizza_draw() function,
- which disabled. */
+// This callback is a complete replacement of the gtk_pizza_draw() function,
+// which disabled.
static void gtk_window_draw_callback( GtkWidget *widget,
GdkRectangle *rect,
if (g_isIdle)
wxapp_install_idle_handler();
+ // The wxNO_FULL_REPAINT_ON_RESIZE flag only works if
+ // there are no child windows.
if ((win->HasFlag(wxNO_FULL_REPAINT_ON_RESIZE)) &&
(win->GetChildren().GetCount() == 0))
{
win->GetUpdateRegion().Union( rect->x, rect->y, rect->width, rect->height );
- win->m_clipPaintRegion = TRUE;
-
- wxWindowDC dc(win);
- dc.SetClippingRegion(win->GetUpdateRegion());
- wxEraseEvent eevent( win->GetId(), &dc );
- eevent.SetEventObject( win );
-
-#if 1
- (void)win->GetEventHandler()->ProcessEvent(eevent);
-#else
- if (!win->GetEventHandler()->ProcessEvent(eevent))
- {
- if (!win->GetEventHandler()->ProcessEvent(eevent))
- {
- wxClientDC dc( win );
- dc.SetBrush( wxBrush( win->GetBackgroundColour(), wxSOLID ) );
- dc.SetPen( *wxTRANSPARENT_PEN );
-
- wxRegionIterator upd( win->GetUpdateRegion() );
- while (upd)
- {
- dc.DrawRectangle( upd.GetX(), upd.GetY(), upd.GetWidth(), upd.GetHeight() );
- upd ++;
- }
- }
- }
-#endif
-
- wxNcPaintEvent eventNc( win->GetId() );
- eventNc.SetEventObject( win );
- win->GetEventHandler()->ProcessEvent( eventNc );
-
- wxPaintEvent event( win->GetId() );
- event.SetEventObject( win );
- win->GetEventHandler()->ProcessEvent( event );
-
- win->GetUpdateRegion().Clear();
-
- win->m_clipPaintRegion = FALSE;
-
+ // Actually send the various events based on the
+ // current update region.
+ win->GtkSendPaintEvents();
+ // Redraw child widgets
GList *children = pizza->children;
while (children)
{
- GtkPizzaChild *child = (GtkPizzaChild*) children->data;
- children = children->next;
+ 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*/ );
- }
+ GdkRectangle child_area;
+ if (gtk_widget_intersect (child->widget, rect, &child_area))
+ {
+ gtk_widget_draw (child->widget, &child_area /* (GdkRectangle*) NULL*/ );
+ }
}
}
void wxWindowGTK::OnInternalIdle()
{
+ // Update invalidated regions.
+ Update();
+
+ // Synthetize activate events.
if ( g_sendActivateEvent != -1 )
{
bool activate = g_sendActivateEvent != 0;
{
if (m_wxwindow)
{
-
-/*
+#if 0
GtkPizza *pizza = GTK_PIZZA(m_wxwindow);
gboolean old_clear = pizza->clear_on_draw;
gtk_pizza_set_clear( pizza, FALSE );
gtk_widget_draw( m_wxwindow, (GdkRectangle*) NULL );
gtk_pizza_set_clear( pizza, old_clear );
-*/
+#endif
+
+#if 1
+ // Schedule for later Updating in ::Update() or ::OnInternalIdle().
+ m_updateRegion.Union( 0, 0, m_wxwindow->allocation.width, m_wxwindow->allocation.height );
+#else
GdkEventExpose gdk_event;
gdk_event.type = GDK_EXPOSE;
gdk_event.window = GTK_PIZZA(m_wxwindow)->bin_window;
gdk_event.area.width = m_wxwindow->allocation.width;
gdk_event.area.height = m_wxwindow->allocation.height;
gtk_window_expose_callback( m_wxwindow, &gdk_event, (wxWindow *)this );
+#endif
}
else
{
if (m_wxwindow)
{
-/*
+#if 0
GtkPizza *pizza = GTK_PIZZA(m_wxwindow);
gboolean old_clear = pizza->clear_on_draw;
gtk_pizza_set_clear( pizza, FALSE );
gtk_window_draw_callback( m_wxwindow, &gdk_rect, this );
gtk_pizza_set_clear( pizza, old_clear );
-*/
+#endif
+
+#if 1
+ // Schedule for later Updating in ::Update() or ::OnInternalIdle().
+ m_updateRegion.Union( rect->x, rect->y, rect->width, rect->height );
+#else
GdkEventExpose gdk_event;
gdk_event.type = GDK_EXPOSE;
gdk_event.window = GTK_PIZZA(m_wxwindow)->bin_window;
gdk_event.area.width = rect->width;
gdk_event.area.height = rect->height;
gtk_window_expose_callback( m_wxwindow, &gdk_event, (wxWindow *)this );
+#endif
}
else
{
}
}
+void wxWindowGTK::Update()
+{
+ if (!m_updateRegion.IsEmpty())
+ {
+ GtkSendPaintEvents();
+ }
+}
+
+void wxWindowGTK::GtkSendPaintEvents()
+{
+ m_clipPaintRegion = TRUE;
+
+ wxWindowDC dc( (wxWindow*)this );
+ dc.SetClippingRegion( m_updateRegion );
+ wxEraseEvent erase_event( GetId(), &dc );
+ erase_event.SetEventObject( this );
+
+#if 1
+ GetEventHandler()->ProcessEvent( erase_event );
+#else
+ if (!GetEventHandler()->ProcessEvent(erase_event))
+ {
+ if (!GetEventHandler()->ProcessEvent(erase_event))
+ {
+ wxClientDC dc( this );
+ dc.SetBrush( wxBrush( GetBackgroundColour(), wxSOLID ) );
+ dc.SetPen( *wxTRANSPARENT_PEN );
+
+ wxRegionIterator upd( m_updateRegion );
+ while (upd)
+ {
+ dc.DrawRectangle( upd.GetX(), upd.GetY(), upd.GetWidth(), upd.GetHeight() );
+ upd ++;
+ }
+ }
+ }
+#endif
+
+ wxNcPaintEvent nc_paint_event( GetId() );
+ nc_paint_event.SetEventObject( this );
+ GetEventHandler()->ProcessEvent( nc_paint_event );
+
+ wxPaintEvent paint_event( GetId() );
+ paint_event.SetEventObject( this );
+ GetEventHandler()->ProcessEvent( paint_event );
+
+ m_updateRegion.Clear();
+
+ m_clipPaintRegion = FALSE;
+}
+
void wxWindowGTK::Clear()
{
wxCHECK_RET( m_widget != NULL, wxT("invalid window") );
wxCHECK_RET( g_captureWindow, wxT("can't release mouse - not captured") );
+ g_captureWindow = (wxWindowGTK*) NULL;
+
GdkWindow *window = (GdkWindow*) NULL;
if (m_wxwindow)
window = GTK_PIZZA(m_wxwindow)->bin_window;
return;
gdk_pointer_ungrab ( (guint32)GDK_CURRENT_TIME );
- g_captureWindow = (wxWindowGTK*) NULL;
}
/* static */
wxCHECK_RET( m_wxwindow != NULL, wxT("window needs client area for scrolling") );
+ // No scrolling requested.
if ((dx == 0) && (dy == 0)) return;
+
+ 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 1
m_clipPaintRegion = TRUE;
+
gtk_pizza_scroll( GTK_PIZZA(m_wxwindow), -dx, -dy );
+
m_clipPaintRegion = FALSE;
-/*
+#else
+
if (m_children.GetCount() > 0)
{
gtk_pizza_scroll( GTK_PIZZA(m_wxwindow), -dx, -dy );
gdk_gc_unref( m_scrollGC );
}
-*/
+#endif
}
// Find the wxWindow at the current mouse position, also returning the mouse