New GTK 2.0 Update() code.
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@16491 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -95,6 +95,12 @@ void wxRegion::InitRect(wxCoord x, wxCoord y, wxCoord w, wxCoord h)
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
wxRegion::wxRegion( GdkRegion *region )
|
||||||
|
{
|
||||||
|
m_refData = new wxRegionRefData();
|
||||||
|
M_REGIONDATA->m_region = gdk_region_copy( region );
|
||||||
|
}
|
||||||
|
|
||||||
wxRegion::wxRegion( size_t n, const wxPoint *points, int fillStyle )
|
wxRegion::wxRegion( size_t n, const wxPoint *points, int fillStyle )
|
||||||
{
|
{
|
||||||
GdkPoint *gdkpoints = new GdkPoint[n];
|
GdkPoint *gdkpoints = new GdkPoint[n];
|
||||||
|
@@ -510,6 +510,22 @@ static int gtk_window_expose_callback( GtkWidget *widget,
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef __WXGTK20__
|
||||||
|
// This callback gets called in drawing-idle time under
|
||||||
|
// GTK 2.0, so we don't need to defer anything to idle
|
||||||
|
// time anymore.
|
||||||
|
|
||||||
|
win->GetUpdateRegion() = wxRegion( gdk_event->region );
|
||||||
|
|
||||||
|
win->GtkSendPaintEvents();
|
||||||
|
|
||||||
|
// Draw window less widgets
|
||||||
|
(* GTK_WIDGET_CLASS (pizza_parent_class)->expose_event) (widget, gdk_event);
|
||||||
|
#else
|
||||||
|
// This gets called immediately after an expose event
|
||||||
|
// under GTK 1.2 so we collect the calls and wait for
|
||||||
|
// the idle handler to pick things up.
|
||||||
|
|
||||||
win->GetUpdateRegion().Union( gdk_event->area.x,
|
win->GetUpdateRegion().Union( gdk_event->area.x,
|
||||||
gdk_event->area.y,
|
gdk_event->area.y,
|
||||||
gdk_event->area.width,
|
gdk_event->area.width,
|
||||||
@@ -521,13 +537,9 @@ static int gtk_window_expose_callback( GtkWidget *widget,
|
|||||||
|
|
||||||
// Actual redrawing takes place in idle time.
|
// Actual redrawing takes place in idle time.
|
||||||
// win->GtkUpdate();
|
// win->GtkUpdate();
|
||||||
|
|
||||||
#ifdef __WXGTK20__
|
|
||||||
|
|
||||||
(* GTK_WIDGET_CLASS (pizza_parent_class)->expose_event) (widget, gdk_event);
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -3142,8 +3154,8 @@ void wxWindowGTK::GetTextExtent( const wxString& string,
|
|||||||
|
|
||||||
if (string.IsEmpty())
|
if (string.IsEmpty())
|
||||||
{
|
{
|
||||||
if (x) (*y) = 0;
|
if (x) (*x) = 0;
|
||||||
if (x) (*y) = 0;
|
if (y) (*y) = 0;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
#ifdef __WXGTK20__
|
#ifdef __WXGTK20__
|
||||||
@@ -3154,8 +3166,8 @@ void wxWindowGTK::GetTextExtent( const wxString& string,
|
|||||||
|
|
||||||
if (!context)
|
if (!context)
|
||||||
{
|
{
|
||||||
if (x) (*y) = 0;
|
if (x) (*x) = 0;
|
||||||
if (x) (*y) = 0;
|
if (y) (*y) = 0;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -3171,8 +3183,8 @@ void wxWindowGTK::GetTextExtent( const wxString& string,
|
|||||||
PangoRectangle rect;
|
PangoRectangle rect;
|
||||||
pango_layout_line_get_extents(line, NULL, &rect);
|
pango_layout_line_get_extents(line, NULL, &rect);
|
||||||
|
|
||||||
if (x) (*x) = (wxCoord) rect.width;
|
if (x) (*x) = (wxCoord) (rect.width / PANGO_SCALE);
|
||||||
if (y) (*y) = (wxCoord) rect.height;
|
if (y) (*y) = (wxCoord) (rect.height / PANGO_SCALE);
|
||||||
if (descent)
|
if (descent)
|
||||||
{
|
{
|
||||||
// Do something about metrics here
|
// Do something about metrics here
|
||||||
@@ -3436,28 +3448,31 @@ void wxWindowGTK::GtkUpdate()
|
|||||||
#ifdef __WXGTK20__
|
#ifdef __WXGTK20__
|
||||||
if (m_wxwindow && GTK_PIZZA(m_wxwindow)->bin_window)
|
if (m_wxwindow && GTK_PIZZA(m_wxwindow)->bin_window)
|
||||||
gdk_window_process_updates( GTK_PIZZA(m_wxwindow)->bin_window, FALSE );
|
gdk_window_process_updates( GTK_PIZZA(m_wxwindow)->bin_window, FALSE );
|
||||||
#endif
|
#else
|
||||||
|
|
||||||
if (!m_updateRegion.IsEmpty())
|
if (!m_updateRegion.IsEmpty())
|
||||||
GtkSendPaintEvents();
|
GtkSendPaintEvents();
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void wxWindowGTK::GtkSendPaintEvents()
|
void wxWindowGTK::GtkSendPaintEvents()
|
||||||
{
|
{
|
||||||
if (!m_wxwindow)
|
if (!m_wxwindow)
|
||||||
{
|
{
|
||||||
|
#ifndef __WXGTK20__
|
||||||
m_clearRegion.Clear();
|
m_clearRegion.Clear();
|
||||||
|
#endif
|
||||||
m_updateRegion.Clear();
|
m_updateRegion.Clear();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// widget to draw on
|
|
||||||
GtkPizza *pizza = GTK_PIZZA (m_wxwindow);
|
|
||||||
|
|
||||||
// Clip to paint region in wxClientDC
|
// Clip to paint region in wxClientDC
|
||||||
m_clipPaintRegion = TRUE;
|
m_clipPaintRegion = TRUE;
|
||||||
|
|
||||||
#ifndef __WXGTK20__
|
#ifndef __WXGTK20__
|
||||||
|
// widget to draw on
|
||||||
|
GtkPizza *pizza = GTK_PIZZA (m_wxwindow);
|
||||||
|
|
||||||
|
// later for GTK 2.0, too.
|
||||||
if (GetThemeEnabled())
|
if (GetThemeEnabled())
|
||||||
{
|
{
|
||||||
// find ancestor from which to steal background
|
// find ancestor from which to steal background
|
||||||
@@ -3490,9 +3505,19 @@ void wxWindowGTK::GtkSendPaintEvents()
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
#endif
|
#endif
|
||||||
#ifdef __WXGTK20__
|
|
||||||
if (!m_clearRegion.IsEmpty()) // Always send an erase event under GTK 1.2
|
#ifdef __WXGTK20__
|
||||||
#endif
|
{
|
||||||
|
wxWindowDC dc( (wxWindow*)this );
|
||||||
|
dc.SetClippingRegion( m_updateRegion );
|
||||||
|
|
||||||
|
wxEraseEvent erase_event( GetId(), &dc );
|
||||||
|
erase_event.SetEventObject( this );
|
||||||
|
|
||||||
|
GetEventHandler()->ProcessEvent(erase_event);
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
// if (!m_clearRegion.IsEmpty()) // Always send an erase event under GTK 1.2
|
||||||
{
|
{
|
||||||
wxWindowDC dc( (wxWindow*)this );
|
wxWindowDC dc( (wxWindow*)this );
|
||||||
if (m_clearRegion.IsEmpty())
|
if (m_clearRegion.IsEmpty())
|
||||||
@@ -3505,7 +3530,6 @@ void wxWindowGTK::GtkSendPaintEvents()
|
|||||||
|
|
||||||
if (!GetEventHandler()->ProcessEvent(erase_event))
|
if (!GetEventHandler()->ProcessEvent(erase_event))
|
||||||
{
|
{
|
||||||
#ifndef __WXGTK20__
|
|
||||||
if (!g_eraseGC)
|
if (!g_eraseGC)
|
||||||
{
|
{
|
||||||
g_eraseGC = gdk_gc_new( pizza->bin_window );
|
g_eraseGC = gdk_gc_new( pizza->bin_window );
|
||||||
@@ -3520,10 +3544,10 @@ void wxWindowGTK::GtkSendPaintEvents()
|
|||||||
upd.GetX(), upd.GetY(), upd.GetWidth(), upd.GetHeight() );
|
upd.GetX(), upd.GetY(), upd.GetWidth(), upd.GetHeight() );
|
||||||
upd ++;
|
upd ++;
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
m_clearRegion.Clear();
|
m_clearRegion.Clear();
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
wxNcPaintEvent nc_paint_event( GetId() );
|
wxNcPaintEvent nc_paint_event( GetId() );
|
||||||
nc_paint_event.SetEventObject( this );
|
nc_paint_event.SetEventObject( this );
|
||||||
@@ -3586,6 +3610,7 @@ void wxWindowGTK::Clear()
|
|||||||
{
|
{
|
||||||
wxCHECK_RET( m_widget != NULL, wxT("invalid window") );
|
wxCHECK_RET( m_widget != NULL, wxT("invalid window") );
|
||||||
|
|
||||||
|
#ifndef __WXGTK20__
|
||||||
if (m_wxwindow && m_wxwindow->window)
|
if (m_wxwindow && m_wxwindow->window)
|
||||||
{
|
{
|
||||||
m_clearRegion.Clear();
|
m_clearRegion.Clear();
|
||||||
@@ -3595,6 +3620,7 @@ void wxWindowGTK::Clear()
|
|||||||
// Better do this in idle?
|
// Better do this in idle?
|
||||||
GtkUpdate();
|
GtkUpdate();
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
#if wxUSE_TOOLTIPS
|
#if wxUSE_TOOLTIPS
|
||||||
|
@@ -95,6 +95,12 @@ void wxRegion::InitRect(wxCoord x, wxCoord y, wxCoord w, wxCoord h)
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
wxRegion::wxRegion( GdkRegion *region )
|
||||||
|
{
|
||||||
|
m_refData = new wxRegionRefData();
|
||||||
|
M_REGIONDATA->m_region = gdk_region_copy( region );
|
||||||
|
}
|
||||||
|
|
||||||
wxRegion::wxRegion( size_t n, const wxPoint *points, int fillStyle )
|
wxRegion::wxRegion( size_t n, const wxPoint *points, int fillStyle )
|
||||||
{
|
{
|
||||||
GdkPoint *gdkpoints = new GdkPoint[n];
|
GdkPoint *gdkpoints = new GdkPoint[n];
|
||||||
|
@@ -510,6 +510,22 @@ static int gtk_window_expose_callback( GtkWidget *widget,
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef __WXGTK20__
|
||||||
|
// This callback gets called in drawing-idle time under
|
||||||
|
// GTK 2.0, so we don't need to defer anything to idle
|
||||||
|
// time anymore.
|
||||||
|
|
||||||
|
win->GetUpdateRegion() = wxRegion( gdk_event->region );
|
||||||
|
|
||||||
|
win->GtkSendPaintEvents();
|
||||||
|
|
||||||
|
// Draw window less widgets
|
||||||
|
(* GTK_WIDGET_CLASS (pizza_parent_class)->expose_event) (widget, gdk_event);
|
||||||
|
#else
|
||||||
|
// This gets called immediately after an expose event
|
||||||
|
// under GTK 1.2 so we collect the calls and wait for
|
||||||
|
// the idle handler to pick things up.
|
||||||
|
|
||||||
win->GetUpdateRegion().Union( gdk_event->area.x,
|
win->GetUpdateRegion().Union( gdk_event->area.x,
|
||||||
gdk_event->area.y,
|
gdk_event->area.y,
|
||||||
gdk_event->area.width,
|
gdk_event->area.width,
|
||||||
@@ -521,13 +537,9 @@ static int gtk_window_expose_callback( GtkWidget *widget,
|
|||||||
|
|
||||||
// Actual redrawing takes place in idle time.
|
// Actual redrawing takes place in idle time.
|
||||||
// win->GtkUpdate();
|
// win->GtkUpdate();
|
||||||
|
|
||||||
#ifdef __WXGTK20__
|
|
||||||
|
|
||||||
(* GTK_WIDGET_CLASS (pizza_parent_class)->expose_event) (widget, gdk_event);
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -3142,8 +3154,8 @@ void wxWindowGTK::GetTextExtent( const wxString& string,
|
|||||||
|
|
||||||
if (string.IsEmpty())
|
if (string.IsEmpty())
|
||||||
{
|
{
|
||||||
if (x) (*y) = 0;
|
if (x) (*x) = 0;
|
||||||
if (x) (*y) = 0;
|
if (y) (*y) = 0;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
#ifdef __WXGTK20__
|
#ifdef __WXGTK20__
|
||||||
@@ -3154,8 +3166,8 @@ void wxWindowGTK::GetTextExtent( const wxString& string,
|
|||||||
|
|
||||||
if (!context)
|
if (!context)
|
||||||
{
|
{
|
||||||
if (x) (*y) = 0;
|
if (x) (*x) = 0;
|
||||||
if (x) (*y) = 0;
|
if (y) (*y) = 0;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -3171,8 +3183,8 @@ void wxWindowGTK::GetTextExtent( const wxString& string,
|
|||||||
PangoRectangle rect;
|
PangoRectangle rect;
|
||||||
pango_layout_line_get_extents(line, NULL, &rect);
|
pango_layout_line_get_extents(line, NULL, &rect);
|
||||||
|
|
||||||
if (x) (*x) = (wxCoord) rect.width;
|
if (x) (*x) = (wxCoord) (rect.width / PANGO_SCALE);
|
||||||
if (y) (*y) = (wxCoord) rect.height;
|
if (y) (*y) = (wxCoord) (rect.height / PANGO_SCALE);
|
||||||
if (descent)
|
if (descent)
|
||||||
{
|
{
|
||||||
// Do something about metrics here
|
// Do something about metrics here
|
||||||
@@ -3436,28 +3448,31 @@ void wxWindowGTK::GtkUpdate()
|
|||||||
#ifdef __WXGTK20__
|
#ifdef __WXGTK20__
|
||||||
if (m_wxwindow && GTK_PIZZA(m_wxwindow)->bin_window)
|
if (m_wxwindow && GTK_PIZZA(m_wxwindow)->bin_window)
|
||||||
gdk_window_process_updates( GTK_PIZZA(m_wxwindow)->bin_window, FALSE );
|
gdk_window_process_updates( GTK_PIZZA(m_wxwindow)->bin_window, FALSE );
|
||||||
#endif
|
#else
|
||||||
|
|
||||||
if (!m_updateRegion.IsEmpty())
|
if (!m_updateRegion.IsEmpty())
|
||||||
GtkSendPaintEvents();
|
GtkSendPaintEvents();
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void wxWindowGTK::GtkSendPaintEvents()
|
void wxWindowGTK::GtkSendPaintEvents()
|
||||||
{
|
{
|
||||||
if (!m_wxwindow)
|
if (!m_wxwindow)
|
||||||
{
|
{
|
||||||
|
#ifndef __WXGTK20__
|
||||||
m_clearRegion.Clear();
|
m_clearRegion.Clear();
|
||||||
|
#endif
|
||||||
m_updateRegion.Clear();
|
m_updateRegion.Clear();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// widget to draw on
|
|
||||||
GtkPizza *pizza = GTK_PIZZA (m_wxwindow);
|
|
||||||
|
|
||||||
// Clip to paint region in wxClientDC
|
// Clip to paint region in wxClientDC
|
||||||
m_clipPaintRegion = TRUE;
|
m_clipPaintRegion = TRUE;
|
||||||
|
|
||||||
#ifndef __WXGTK20__
|
#ifndef __WXGTK20__
|
||||||
|
// widget to draw on
|
||||||
|
GtkPizza *pizza = GTK_PIZZA (m_wxwindow);
|
||||||
|
|
||||||
|
// later for GTK 2.0, too.
|
||||||
if (GetThemeEnabled())
|
if (GetThemeEnabled())
|
||||||
{
|
{
|
||||||
// find ancestor from which to steal background
|
// find ancestor from which to steal background
|
||||||
@@ -3490,9 +3505,19 @@ void wxWindowGTK::GtkSendPaintEvents()
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
#endif
|
#endif
|
||||||
#ifdef __WXGTK20__
|
|
||||||
if (!m_clearRegion.IsEmpty()) // Always send an erase event under GTK 1.2
|
#ifdef __WXGTK20__
|
||||||
#endif
|
{
|
||||||
|
wxWindowDC dc( (wxWindow*)this );
|
||||||
|
dc.SetClippingRegion( m_updateRegion );
|
||||||
|
|
||||||
|
wxEraseEvent erase_event( GetId(), &dc );
|
||||||
|
erase_event.SetEventObject( this );
|
||||||
|
|
||||||
|
GetEventHandler()->ProcessEvent(erase_event);
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
// if (!m_clearRegion.IsEmpty()) // Always send an erase event under GTK 1.2
|
||||||
{
|
{
|
||||||
wxWindowDC dc( (wxWindow*)this );
|
wxWindowDC dc( (wxWindow*)this );
|
||||||
if (m_clearRegion.IsEmpty())
|
if (m_clearRegion.IsEmpty())
|
||||||
@@ -3505,7 +3530,6 @@ void wxWindowGTK::GtkSendPaintEvents()
|
|||||||
|
|
||||||
if (!GetEventHandler()->ProcessEvent(erase_event))
|
if (!GetEventHandler()->ProcessEvent(erase_event))
|
||||||
{
|
{
|
||||||
#ifndef __WXGTK20__
|
|
||||||
if (!g_eraseGC)
|
if (!g_eraseGC)
|
||||||
{
|
{
|
||||||
g_eraseGC = gdk_gc_new( pizza->bin_window );
|
g_eraseGC = gdk_gc_new( pizza->bin_window );
|
||||||
@@ -3520,10 +3544,10 @@ void wxWindowGTK::GtkSendPaintEvents()
|
|||||||
upd.GetX(), upd.GetY(), upd.GetWidth(), upd.GetHeight() );
|
upd.GetX(), upd.GetY(), upd.GetWidth(), upd.GetHeight() );
|
||||||
upd ++;
|
upd ++;
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
m_clearRegion.Clear();
|
m_clearRegion.Clear();
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
wxNcPaintEvent nc_paint_event( GetId() );
|
wxNcPaintEvent nc_paint_event( GetId() );
|
||||||
nc_paint_event.SetEventObject( this );
|
nc_paint_event.SetEventObject( this );
|
||||||
@@ -3586,6 +3610,7 @@ void wxWindowGTK::Clear()
|
|||||||
{
|
{
|
||||||
wxCHECK_RET( m_widget != NULL, wxT("invalid window") );
|
wxCHECK_RET( m_widget != NULL, wxT("invalid window") );
|
||||||
|
|
||||||
|
#ifndef __WXGTK20__
|
||||||
if (m_wxwindow && m_wxwindow->window)
|
if (m_wxwindow && m_wxwindow->window)
|
||||||
{
|
{
|
||||||
m_clearRegion.Clear();
|
m_clearRegion.Clear();
|
||||||
@@ -3595,6 +3620,7 @@ void wxWindowGTK::Clear()
|
|||||||
// Better do this in idle?
|
// Better do this in idle?
|
||||||
GtkUpdate();
|
GtkUpdate();
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
#if wxUSE_TOOLTIPS
|
#if wxUSE_TOOLTIPS
|
||||||
|
Reference in New Issue
Block a user