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:
@@ -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().
|
||||||
|
@@ -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().
|
||||||
|
@@ -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") );
|
||||||
|
@@ -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") );
|
||||||
|
Reference in New Issue
Block a user