Some changes for new Update/Refresh behaviour. This

commit actually doesn't change anything. I just cleared
some code and added the new interface. I want this to
be seperate from the commit (if any) that introduces the
new behaviour.


git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@13925 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Robert Roebling
2002-01-30 13:23:10 +00:00
parent 8c9892c2a8
commit beab25bde3
4 changed files with 272 additions and 284 deletions

View File

@@ -68,6 +68,7 @@ public:
virtual void Refresh( bool eraseBackground = TRUE, virtual void Refresh( bool eraseBackground = TRUE,
const wxRect *rect = (const wxRect *) NULL ); const wxRect *rect = (const wxRect *) NULL );
virtual void Update();
virtual void Clear(); virtual void Clear();
virtual bool SetBackgroundColour( const wxColour &colour ); virtual bool SetBackgroundColour( const wxColour &colour );
@@ -106,54 +107,60 @@ public:
virtual WXWidget GetHandle() const { return m_widget; } virtual WXWidget GetHandle() const { return m_widget; }
/* I don't want users to override what's done in idle so everything that // I don't want users to override what's done in idle so everything that
has to be done in idle time in order for wxGTK to work is done in // has to be done in idle time in order for wxGTK to work is done in
OnInternalIdle */ // OnInternalIdle
virtual void OnInternalIdle(); virtual void OnInternalIdle();
/* For compatibility across platforms (not in event table) */ // For compatibility across platforms (not in event table)
void OnIdle(wxIdleEvent& WXUNUSED(event)) {}; void OnIdle(wxIdleEvent& WXUNUSED(event)) {}
// wxGTK-specific: called recursively by Enable, // wxGTK-specific: called recursively by Enable,
// to give widgets an oppprtunity to correct their colours after they // to give widgets an oppprtunity to correct their colours after they
// have been changed by Enable // have been changed by Enable
virtual void OnParentEnable( bool WXUNUSED(enable) ) {}; virtual void OnParentEnable( bool WXUNUSED(enable) ) {}
/* used by all window classes in the widget creation process */ // Used by all window classes in the widget creation process.
bool PreCreation( wxWindowGTK *parent, const wxPoint &pos, const wxSize &size ); bool PreCreation( wxWindowGTK *parent, const wxPoint &pos, const wxSize &size );
void PostCreation(); void PostCreation();
/* internal addition of child windows. differs from class // Internal addition of child windows. differs from class
to class not by using virtual functions but by using // to class not by using virtual functions but by using
the m_insertCallback */ // the m_insertCallback.
void DoAddChild(wxWindowGTK *child); void DoAddChild(wxWindowGTK *child);
// This methods sends wxPaintEvents to the window. It reads the
// update region, breaks it up into rects and sends an event
// for each rect. It is also responsible for background erase
// events and NC paint events. It is called from "draw" and
// "expose" handlers as well as from ::Update()
void GtkSendPaintEvents();
/* the methods below are required because many native widgets // The methods below are required because many native widgets
are composed of several subwidgets and setting a style for // are composed of several subwidgets and setting a style for
the widget means setting it for all subwidgets as well. // the widget means setting it for all subwidgets as well.
also, it is nor clear, which native widget is the top // also, it is nor clear, which native widget is the top
widget where (most of) the input goes. even tooltips have // widget where (most of) the input goes. even tooltips have
to be applied to all subwidgets. */ // to be applied to all subwidgets.
virtual GtkWidget* GetConnectWidget(); virtual GtkWidget* GetConnectWidget();
virtual bool IsOwnGtkWindow( GdkWindow *window ); virtual bool IsOwnGtkWindow( GdkWindow *window );
void ConnectWidget( GtkWidget *widget ); void ConnectWidget( GtkWidget *widget );
/* creates a new widget style if none is there // Creates a new widget style if none is there
and sets m_widgetStyle to this value. */ // and sets m_widgetStyle to this value.
GtkStyle *GetWidgetStyle(); GtkStyle *GetWidgetStyle();
/* called by SetFont() and SetXXXColour etc */ // Called by SetFont() and SetXXXColour etc
void SetWidgetStyle(); void SetWidgetStyle();
/* overridden in many GTK widgets */ // Overridden in many GTK widgets who have to handle subwidgets
virtual void ApplyWidgetStyle(); virtual void ApplyWidgetStyle();
#if wxUSE_TOOLTIPS #if wxUSE_TOOLTIPS
virtual void ApplyToolTip( GtkTooltips *tips, const wxChar *tip ); virtual void ApplyToolTip( GtkTooltips *tips, const wxChar *tip );
#endif // wxUSE_TOOLTIPS #endif // wxUSE_TOOLTIPS
// called from GTK signales handlers. it indicates that // Called from GTK signales handlers. it indicates that
// the layouting functions have to be called later on // the layouting functions have to be called later on
// (i.e. in idle time, implemented in OnInternalIdle() ). // (i.e. in idle time, implemented in OnInternalIdle() ).
void GtkUpdateSize() { m_sizeSet = FALSE; } void GtkUpdateSize() { m_sizeSet = FALSE; }
@@ -198,13 +205,13 @@ public:
bool m_clipPaintRegion; // TRUE after ScrollWindow() bool m_clipPaintRegion; // TRUE after ScrollWindow()
bool m_queuedFullRedraw; // TRUE after DoMoveWindow bool m_queuedFullRedraw; // TRUE after DoMoveWindow
// these are true if the style were set before the widget was realized // These are true if the style were set before the widget was realized
// (typcally in the constructor) but the actual GTK style must not be set // (typcally in the constructor) but the actual GTK style must not be set
// before the widget has been "realized" // before the widget has been "realized"
bool m_delayedForegroundColour:1; bool m_delayedForegroundColour:1;
bool m_delayedBackgroundColour:1; bool m_delayedBackgroundColour:1;
// contains GTK's widgets internal information about non-default widget // Contains GTK's widgets internal information about non-default widget
// font and colours. we create one for each widget that gets any // font and colours. we create one for each widget that gets any
// non-default attribute set via SetFont() or SetForegroundColour() / // non-default attribute set via SetFont() or SetForegroundColour() /
// SetBackgroundColour(). // SetBackgroundColour().

View File

@@ -68,6 +68,7 @@ public:
virtual void Refresh( bool eraseBackground = TRUE, virtual void Refresh( bool eraseBackground = TRUE,
const wxRect *rect = (const wxRect *) NULL ); const wxRect *rect = (const wxRect *) NULL );
virtual void Update();
virtual void Clear(); virtual void Clear();
virtual bool SetBackgroundColour( const wxColour &colour ); virtual bool SetBackgroundColour( const wxColour &colour );
@@ -106,54 +107,60 @@ public:
virtual WXWidget GetHandle() const { return m_widget; } virtual WXWidget GetHandle() const { return m_widget; }
/* I don't want users to override what's done in idle so everything that // I don't want users to override what's done in idle so everything that
has to be done in idle time in order for wxGTK to work is done in // has to be done in idle time in order for wxGTK to work is done in
OnInternalIdle */ // OnInternalIdle
virtual void OnInternalIdle(); virtual void OnInternalIdle();
/* For compatibility across platforms (not in event table) */ // For compatibility across platforms (not in event table)
void OnIdle(wxIdleEvent& WXUNUSED(event)) {}; void OnIdle(wxIdleEvent& WXUNUSED(event)) {}
// wxGTK-specific: called recursively by Enable, // wxGTK-specific: called recursively by Enable,
// to give widgets an oppprtunity to correct their colours after they // to give widgets an oppprtunity to correct their colours after they
// have been changed by Enable // have been changed by Enable
virtual void OnParentEnable( bool WXUNUSED(enable) ) {}; virtual void OnParentEnable( bool WXUNUSED(enable) ) {}
/* used by all window classes in the widget creation process */ // Used by all window classes in the widget creation process.
bool PreCreation( wxWindowGTK *parent, const wxPoint &pos, const wxSize &size ); bool PreCreation( wxWindowGTK *parent, const wxPoint &pos, const wxSize &size );
void PostCreation(); void PostCreation();
/* internal addition of child windows. differs from class // Internal addition of child windows. differs from class
to class not by using virtual functions but by using // to class not by using virtual functions but by using
the m_insertCallback */ // the m_insertCallback.
void DoAddChild(wxWindowGTK *child); void DoAddChild(wxWindowGTK *child);
// This methods sends wxPaintEvents to the window. It reads the
// update region, breaks it up into rects and sends an event
// for each rect. It is also responsible for background erase
// events and NC paint events. It is called from "draw" and
// "expose" handlers as well as from ::Update()
void GtkSendPaintEvents();
/* the methods below are required because many native widgets // The methods below are required because many native widgets
are composed of several subwidgets and setting a style for // are composed of several subwidgets and setting a style for
the widget means setting it for all subwidgets as well. // the widget means setting it for all subwidgets as well.
also, it is nor clear, which native widget is the top // also, it is nor clear, which native widget is the top
widget where (most of) the input goes. even tooltips have // widget where (most of) the input goes. even tooltips have
to be applied to all subwidgets. */ // to be applied to all subwidgets.
virtual GtkWidget* GetConnectWidget(); virtual GtkWidget* GetConnectWidget();
virtual bool IsOwnGtkWindow( GdkWindow *window ); virtual bool IsOwnGtkWindow( GdkWindow *window );
void ConnectWidget( GtkWidget *widget ); void ConnectWidget( GtkWidget *widget );
/* creates a new widget style if none is there // Creates a new widget style if none is there
and sets m_widgetStyle to this value. */ // and sets m_widgetStyle to this value.
GtkStyle *GetWidgetStyle(); GtkStyle *GetWidgetStyle();
/* called by SetFont() and SetXXXColour etc */ // Called by SetFont() and SetXXXColour etc
void SetWidgetStyle(); void SetWidgetStyle();
/* overridden in many GTK widgets */ // Overridden in many GTK widgets who have to handle subwidgets
virtual void ApplyWidgetStyle(); virtual void ApplyWidgetStyle();
#if wxUSE_TOOLTIPS #if wxUSE_TOOLTIPS
virtual void ApplyToolTip( GtkTooltips *tips, const wxChar *tip ); virtual void ApplyToolTip( GtkTooltips *tips, const wxChar *tip );
#endif // wxUSE_TOOLTIPS #endif // wxUSE_TOOLTIPS
// called from GTK signales handlers. it indicates that // Called from GTK signales handlers. it indicates that
// the layouting functions have to be called later on // the layouting functions have to be called later on
// (i.e. in idle time, implemented in OnInternalIdle() ). // (i.e. in idle time, implemented in OnInternalIdle() ).
void GtkUpdateSize() { m_sizeSet = FALSE; } void GtkUpdateSize() { m_sizeSet = FALSE; }
@@ -198,13 +205,13 @@ public:
bool m_clipPaintRegion; // TRUE after ScrollWindow() bool m_clipPaintRegion; // TRUE after ScrollWindow()
bool m_queuedFullRedraw; // TRUE after DoMoveWindow bool m_queuedFullRedraw; // TRUE after DoMoveWindow
// these are true if the style were set before the widget was realized // These are true if the style were set before the widget was realized
// (typcally in the constructor) but the actual GTK style must not be set // (typcally in the constructor) but the actual GTK style must not be set
// before the widget has been "realized" // before the widget has been "realized"
bool m_delayedForegroundColour:1; bool m_delayedForegroundColour:1;
bool m_delayedBackgroundColour:1; bool m_delayedBackgroundColour:1;
// contains GTK's widgets internal information about non-default widget // Contains GTK's widgets internal information about non-default widget
// font and colours. we create one for each widget that gets any // font and colours. we create one for each widget that gets any
// non-default attribute set via SetFont() or SetForegroundColour() / // non-default attribute set via SetFont() or SetForegroundColour() /
// SetBackgroundColour(). // SetBackgroundColour().

View File

@@ -385,34 +385,34 @@ static void draw_frame( GtkWidget *widget, wxWindowGTK *win )
if (win->m_hasScrolling) if (win->m_hasScrolling)
{ {
GtkScrolledWindow *scroll_window = GTK_SCROLLED_WINDOW(widget); GtkScrolledWindow *scroll_window = GTK_SCROLLED_WINDOW(widget);
GtkRequisition vscroll_req; GtkRequisition vscroll_req;
vscroll_req.width = 2; vscroll_req.width = 2;
vscroll_req.height = 2; vscroll_req.height = 2;
(* GTK_WIDGET_CLASS( GTK_OBJECT_GET_CLASS(scroll_window->vscrollbar) )->size_request ) (* GTK_WIDGET_CLASS( GTK_OBJECT_GET_CLASS(scroll_window->vscrollbar) )->size_request )
(scroll_window->vscrollbar, &vscroll_req ); (scroll_window->vscrollbar, &vscroll_req );
GtkRequisition hscroll_req; GtkRequisition hscroll_req;
hscroll_req.width = 2; hscroll_req.width = 2;
hscroll_req.height = 2; hscroll_req.height = 2;
(* GTK_WIDGET_CLASS( GTK_OBJECT_GET_CLASS(scroll_window->hscrollbar) )->size_request ) (* GTK_WIDGET_CLASS( GTK_OBJECT_GET_CLASS(scroll_window->hscrollbar) )->size_request )
(scroll_window->hscrollbar, &hscroll_req ); (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) if (scroll_window->vscrollbar_visible)
{ {
dw += vscroll_req.width; dw += vscroll_req.width;
dw += scroll_class->scrollbar_spacing; dw += scroll_class->scrollbar_spacing;
} }
if (scroll_window->hscrollbar_visible) if (scroll_window->hscrollbar_visible)
{ {
dh += hscroll_req.height; dh += hscroll_req.height;
dh += scroll_class->scrollbar_spacing; dh += scroll_class->scrollbar_spacing;
} }
} }
int dx = 0; int dx = 0;
int dy = 0; int dy = 0;
@@ -800,49 +800,15 @@ 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
// current update region.
if (gdk_event->count == 0) if (gdk_event->count == 0)
{ win->GtkSendPaintEvents();
win->m_clipPaintRegion = TRUE;
wxWindowDC dc(win); // The following code will result in all window-less widgets
dc.SetClippingRegion(win->GetUpdateRegion()); // being redrawn if the wxWindows class is given a chance to
wxEraseEvent eevent( win->GetId(), &dc ); // paint *anything* because it will then be allowed to paint
eevent.SetEventObject( win ); // over the window-less widgets.
#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->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 */
GList *children = pizza->children; GList *children = pizza->children;
while (children) while (children)
{ {
@@ -870,11 +836,11 @@ static int gtk_window_expose_callback( GtkWidget *widget,
// "event" of m_wxwindow // "event" of m_wxwindow
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
/* GTK thinks it is clever and filters out a certain amount of "unneeded" // 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 // 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. // procedure in GtkWidget by giving our own handler for all system events.
There, we look for expose events ourselves whereas all other events are // There, we look for expose events ourselves whereas all other events are
handled normally. */ // handled normally.
gint gtk_window_event_event_callback( GtkWidget *widget, gint gtk_window_event_event_callback( GtkWidget *widget,
GdkEventExpose *event, GdkEventExpose *event,
@@ -893,8 +859,8 @@ gint gtk_window_event_event_callback( GtkWidget *widget,
// "draw" of m_wxwindow // "draw" of m_wxwindow
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
/* This callback is a complete replacement of the gtk_pizza_draw() function, // This callback is a complete replacement of the gtk_pizza_draw() function,
which disabled. */ // which disabled.
static void gtk_window_draw_callback( GtkWidget *widget, static void gtk_window_draw_callback( GtkWidget *widget,
GdkRectangle *rect, GdkRectangle *rect,
@@ -905,6 +871,8 @@ static void gtk_window_draw_callback( GtkWidget *widget,
if (g_isIdle) if (g_isIdle)
wxapp_install_idle_handler(); 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)) && if ((win->HasFlag(wxNO_FULL_REPAINT_ON_RESIZE)) &&
(win->GetChildren().GetCount() == 0)) (win->GetChildren().GetCount() == 0))
{ {
@@ -954,58 +922,22 @@ 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 );
win->m_clipPaintRegion = TRUE; // Actually send the various events based on the
// current update region.
wxWindowDC dc(win); win->GtkSendPaintEvents();
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;
// Redraw child widgets
GList *children = pizza->children; GList *children = pizza->children;
while (children) while (children)
{ {
GtkPizzaChild *child = (GtkPizzaChild*) children->data; GtkPizzaChild *child = (GtkPizzaChild*) children->data;
children = children->next; children = children->next;
GdkRectangle child_area; GdkRectangle child_area;
if (gtk_widget_intersect (child->widget, rect, &child_area)) if (gtk_widget_intersect (child->widget, rect, &child_area))
{ {
gtk_widget_draw (child->widget, &child_area /* (GdkRectangle*) NULL*/ ); gtk_widget_draw (child->widget, &child_area /* (GdkRectangle*) NULL*/ );
} }
} }
} }
@@ -2872,6 +2804,10 @@ void wxWindowGTK::DoSetSize( int x, int y, int width, int height, int sizeFlags
void wxWindowGTK::OnInternalIdle() void wxWindowGTK::OnInternalIdle()
{ {
// Update invalidated regions.
Update();
// Synthetize activate events.
if ( g_sendActivateEvent != -1 ) if ( g_sendActivateEvent != -1 )
{ {
bool activate = g_sendActivateEvent != 0; bool activate = g_sendActivateEvent != 0;
@@ -3494,6 +3430,57 @@ void wxWindowGTK::Refresh( bool eraseBackground, const wxRect *rect )
} }
} }
void wxWindowGTK::Update()
{
if (!m_updateRegion.IsEmpty())
{
printf( "never gets called\n" );
}
}
void wxWindowGTK::GtkSendPaintEvents()
{
m_clipPaintRegion = TRUE;
wxWindowDC dc( 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() void wxWindowGTK::Clear()
{ {
wxCHECK_RET( m_widget != NULL, wxT("invalid window") ); wxCHECK_RET( m_widget != NULL, wxT("invalid window") );

View File

@@ -385,34 +385,34 @@ static void draw_frame( GtkWidget *widget, wxWindowGTK *win )
if (win->m_hasScrolling) if (win->m_hasScrolling)
{ {
GtkScrolledWindow *scroll_window = GTK_SCROLLED_WINDOW(widget); GtkScrolledWindow *scroll_window = GTK_SCROLLED_WINDOW(widget);
GtkRequisition vscroll_req; GtkRequisition vscroll_req;
vscroll_req.width = 2; vscroll_req.width = 2;
vscroll_req.height = 2; vscroll_req.height = 2;
(* GTK_WIDGET_CLASS( GTK_OBJECT_GET_CLASS(scroll_window->vscrollbar) )->size_request ) (* GTK_WIDGET_CLASS( GTK_OBJECT_GET_CLASS(scroll_window->vscrollbar) )->size_request )
(scroll_window->vscrollbar, &vscroll_req ); (scroll_window->vscrollbar, &vscroll_req );
GtkRequisition hscroll_req; GtkRequisition hscroll_req;
hscroll_req.width = 2; hscroll_req.width = 2;
hscroll_req.height = 2; hscroll_req.height = 2;
(* GTK_WIDGET_CLASS( GTK_OBJECT_GET_CLASS(scroll_window->hscrollbar) )->size_request ) (* GTK_WIDGET_CLASS( GTK_OBJECT_GET_CLASS(scroll_window->hscrollbar) )->size_request )
(scroll_window->hscrollbar, &hscroll_req ); (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) if (scroll_window->vscrollbar_visible)
{ {
dw += vscroll_req.width; dw += vscroll_req.width;
dw += scroll_class->scrollbar_spacing; dw += scroll_class->scrollbar_spacing;
} }
if (scroll_window->hscrollbar_visible) if (scroll_window->hscrollbar_visible)
{ {
dh += hscroll_req.height; dh += hscroll_req.height;
dh += scroll_class->scrollbar_spacing; dh += scroll_class->scrollbar_spacing;
} }
} }
int dx = 0; int dx = 0;
int dy = 0; int dy = 0;
@@ -800,49 +800,15 @@ 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
// current update region.
if (gdk_event->count == 0) if (gdk_event->count == 0)
{ win->GtkSendPaintEvents();
win->m_clipPaintRegion = TRUE;
wxWindowDC dc(win); // The following code will result in all window-less widgets
dc.SetClippingRegion(win->GetUpdateRegion()); // being redrawn if the wxWindows class is given a chance to
wxEraseEvent eevent( win->GetId(), &dc ); // paint *anything* because it will then be allowed to paint
eevent.SetEventObject( win ); // over the window-less widgets.
#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->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 */
GList *children = pizza->children; GList *children = pizza->children;
while (children) while (children)
{ {
@@ -870,11 +836,11 @@ static int gtk_window_expose_callback( GtkWidget *widget,
// "event" of m_wxwindow // "event" of m_wxwindow
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
/* GTK thinks it is clever and filters out a certain amount of "unneeded" // 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 // 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. // procedure in GtkWidget by giving our own handler for all system events.
There, we look for expose events ourselves whereas all other events are // There, we look for expose events ourselves whereas all other events are
handled normally. */ // handled normally.
gint gtk_window_event_event_callback( GtkWidget *widget, gint gtk_window_event_event_callback( GtkWidget *widget,
GdkEventExpose *event, GdkEventExpose *event,
@@ -893,8 +859,8 @@ gint gtk_window_event_event_callback( GtkWidget *widget,
// "draw" of m_wxwindow // "draw" of m_wxwindow
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
/* This callback is a complete replacement of the gtk_pizza_draw() function, // This callback is a complete replacement of the gtk_pizza_draw() function,
which disabled. */ // which disabled.
static void gtk_window_draw_callback( GtkWidget *widget, static void gtk_window_draw_callback( GtkWidget *widget,
GdkRectangle *rect, GdkRectangle *rect,
@@ -905,6 +871,8 @@ static void gtk_window_draw_callback( GtkWidget *widget,
if (g_isIdle) if (g_isIdle)
wxapp_install_idle_handler(); 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)) && if ((win->HasFlag(wxNO_FULL_REPAINT_ON_RESIZE)) &&
(win->GetChildren().GetCount() == 0)) (win->GetChildren().GetCount() == 0))
{ {
@@ -954,58 +922,22 @@ 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 );
win->m_clipPaintRegion = TRUE; // Actually send the various events based on the
// current update region.
wxWindowDC dc(win); win->GtkSendPaintEvents();
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;
// Redraw child widgets
GList *children = pizza->children; GList *children = pizza->children;
while (children) while (children)
{ {
GtkPizzaChild *child = (GtkPizzaChild*) children->data; GtkPizzaChild *child = (GtkPizzaChild*) children->data;
children = children->next; children = children->next;
GdkRectangle child_area; GdkRectangle child_area;
if (gtk_widget_intersect (child->widget, rect, &child_area)) if (gtk_widget_intersect (child->widget, rect, &child_area))
{ {
gtk_widget_draw (child->widget, &child_area /* (GdkRectangle*) NULL*/ ); gtk_widget_draw (child->widget, &child_area /* (GdkRectangle*) NULL*/ );
} }
} }
} }
@@ -2872,6 +2804,10 @@ void wxWindowGTK::DoSetSize( int x, int y, int width, int height, int sizeFlags
void wxWindowGTK::OnInternalIdle() void wxWindowGTK::OnInternalIdle()
{ {
// Update invalidated regions.
Update();
// Synthetize activate events.
if ( g_sendActivateEvent != -1 ) if ( g_sendActivateEvent != -1 )
{ {
bool activate = g_sendActivateEvent != 0; bool activate = g_sendActivateEvent != 0;
@@ -3494,6 +3430,57 @@ void wxWindowGTK::Refresh( bool eraseBackground, const wxRect *rect )
} }
} }
void wxWindowGTK::Update()
{
if (!m_updateRegion.IsEmpty())
{
printf( "never gets called\n" );
}
}
void wxWindowGTK::GtkSendPaintEvents()
{
m_clipPaintRegion = TRUE;
wxWindowDC dc( 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() void wxWindowGTK::Clear()
{ {
wxCHECK_RET( m_widget != NULL, wxT("invalid window") ); wxCHECK_RET( m_widget != NULL, wxT("invalid window") );