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,
const wxRect *rect = (const wxRect *) NULL );
virtual void Update();
virtual void Clear();
virtual bool SetBackgroundColour( const wxColour &colour );
@@ -106,54 +107,60 @@ public:
virtual WXWidget GetHandle() const { return m_widget; }
/* 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
OnInternalIdle */
// 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
// OnInternalIdle
virtual void OnInternalIdle();
/* For compatibility across platforms (not in event table) */
void OnIdle(wxIdleEvent& WXUNUSED(event)) {};
// For compatibility across platforms (not in event table)
void OnIdle(wxIdleEvent& WXUNUSED(event)) {}
// wxGTK-specific: called recursively by Enable,
// to give widgets an oppprtunity to correct their colours after they
// 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 );
void PostCreation();
/* internal addition of child windows. differs from class
to class not by using virtual functions but by using
the m_insertCallback */
// Internal addition of child windows. differs from class
// to class not by using virtual functions but by using
// the m_insertCallback.
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
are composed of several subwidgets and setting a style for
the widget means setting it for all subwidgets as well.
also, it is nor clear, which native widget is the top
widget where (most of) the input goes. even tooltips have
to be applied to all subwidgets. */
// The methods below are required because many native widgets
// are composed of several subwidgets and setting a style for
// the widget means setting it for all subwidgets as well.
// also, it is nor clear, which native widget is the top
// widget where (most of) the input goes. even tooltips have
// to be applied to all subwidgets.
virtual GtkWidget* GetConnectWidget();
virtual bool IsOwnGtkWindow( GdkWindow *window );
void ConnectWidget( GtkWidget *widget );
/* creates a new widget style if none is there
and sets m_widgetStyle to this value. */
// Creates a new widget style if none is there
// and sets m_widgetStyle to this value.
GtkStyle *GetWidgetStyle();
/* called by SetFont() and SetXXXColour etc */
// Called by SetFont() and SetXXXColour etc
void SetWidgetStyle();
/* overridden in many GTK widgets */
// Overridden in many GTK widgets who have to handle subwidgets
virtual void ApplyWidgetStyle();
#if wxUSE_TOOLTIPS
virtual void ApplyToolTip( GtkTooltips *tips, const wxChar *tip );
#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
// (i.e. in idle time, implemented in OnInternalIdle() ).
void GtkUpdateSize() { m_sizeSet = FALSE; }
@@ -198,13 +205,13 @@ public:
bool m_clipPaintRegion; // TRUE after ScrollWindow()
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
// before the widget has been "realized"
bool m_delayedForegroundColour: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
// non-default attribute set via SetFont() or SetForegroundColour() /
// SetBackgroundColour().

View File

@@ -68,6 +68,7 @@ public:
virtual void Refresh( bool eraseBackground = TRUE,
const wxRect *rect = (const wxRect *) NULL );
virtual void Update();
virtual void Clear();
virtual bool SetBackgroundColour( const wxColour &colour );
@@ -106,54 +107,60 @@ public:
virtual WXWidget GetHandle() const { return m_widget; }
/* 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
OnInternalIdle */
// 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
// OnInternalIdle
virtual void OnInternalIdle();
/* For compatibility across platforms (not in event table) */
void OnIdle(wxIdleEvent& WXUNUSED(event)) {};
// For compatibility across platforms (not in event table)
void OnIdle(wxIdleEvent& WXUNUSED(event)) {}
// wxGTK-specific: called recursively by Enable,
// to give widgets an oppprtunity to correct their colours after they
// 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 );
void PostCreation();
/* internal addition of child windows. differs from class
to class not by using virtual functions but by using
the m_insertCallback */
// Internal addition of child windows. differs from class
// to class not by using virtual functions but by using
// the m_insertCallback.
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
are composed of several subwidgets and setting a style for
the widget means setting it for all subwidgets as well.
also, it is nor clear, which native widget is the top
widget where (most of) the input goes. even tooltips have
to be applied to all subwidgets. */
// The methods below are required because many native widgets
// are composed of several subwidgets and setting a style for
// the widget means setting it for all subwidgets as well.
// also, it is nor clear, which native widget is the top
// widget where (most of) the input goes. even tooltips have
// to be applied to all subwidgets.
virtual GtkWidget* GetConnectWidget();
virtual bool IsOwnGtkWindow( GdkWindow *window );
void ConnectWidget( GtkWidget *widget );
/* creates a new widget style if none is there
and sets m_widgetStyle to this value. */
// Creates a new widget style if none is there
// and sets m_widgetStyle to this value.
GtkStyle *GetWidgetStyle();
/* called by SetFont() and SetXXXColour etc */
// Called by SetFont() and SetXXXColour etc
void SetWidgetStyle();
/* overridden in many GTK widgets */
// Overridden in many GTK widgets who have to handle subwidgets
virtual void ApplyWidgetStyle();
#if wxUSE_TOOLTIPS
virtual void ApplyToolTip( GtkTooltips *tips, const wxChar *tip );
#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
// (i.e. in idle time, implemented in OnInternalIdle() ).
void GtkUpdateSize() { m_sizeSet = FALSE; }
@@ -198,13 +205,13 @@ public:
bool m_clipPaintRegion; // TRUE after ScrollWindow()
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
// before the widget has been "realized"
bool m_delayedForegroundColour: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
// non-default attribute set via SetFont() or SetForegroundColour() /
// SetBackgroundColour().

View File

@@ -385,34 +385,34 @@ static void draw_frame( GtkWidget *widget, wxWindowGTK *win )
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;
@@ -800,49 +800,15 @@ static int gtk_window_expose_callback( GtkWidget *widget,
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;
win->GtkSendPaintEvents();
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->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)
{
@@ -870,11 +836,11 @@ static int gtk_window_expose_callback( GtkWidget *widget,
// "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,
@@ -893,8 +859,8 @@ gint gtk_window_event_event_callback( GtkWidget *widget,
// "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,
@@ -905,6 +871,8 @@ static void gtk_window_draw_callback( GtkWidget *widget,
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))
{
@@ -954,58 +922,22 @@ static void gtk_window_draw_callback( GtkWidget *widget,
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*/ );
}
}
}
@@ -2872,6 +2804,10 @@ void wxWindowGTK::DoSetSize( int x, int y, int width, int height, int sizeFlags
void wxWindowGTK::OnInternalIdle()
{
// Update invalidated regions.
Update();
// Synthetize activate events.
if ( g_sendActivateEvent != -1 )
{
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()
{
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)
{
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;
@@ -800,49 +800,15 @@ static int gtk_window_expose_callback( GtkWidget *widget,
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;
win->GtkSendPaintEvents();
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->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)
{
@@ -870,11 +836,11 @@ static int gtk_window_expose_callback( GtkWidget *widget,
// "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,
@@ -893,8 +859,8 @@ gint gtk_window_event_event_callback( GtkWidget *widget,
// "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,
@@ -905,6 +871,8 @@ static void gtk_window_draw_callback( GtkWidget *widget,
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))
{
@@ -954,58 +922,22 @@ static void gtk_window_draw_callback( GtkWidget *widget,
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*/ );
}
}
}
@@ -2872,6 +2804,10 @@ void wxWindowGTK::DoSetSize( int x, int y, int width, int height, int sizeFlags
void wxWindowGTK::OnInternalIdle()
{
// Update invalidated regions.
Update();
// Synthetize activate events.
if ( g_sendActivateEvent != -1 )
{
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()
{
wxCHECK_RET( m_widget != NULL, wxT("invalid window") );