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