summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--vcl/inc/unx/gtk/gtkframe.hxx1
-rw-r--r--vcl/unx/gtk/window/gtkframe.cxx20
-rw-r--r--vcl/unx/gtk3/gdi/gtk3salnativewidgets-gtk.cxx8
3 files changed, 22 insertions, 7 deletions
diff --git a/vcl/inc/unx/gtk/gtkframe.hxx b/vcl/inc/unx/gtk/gtkframe.hxx
index 50258e0b42ec..17d3e1209163 100644
--- a/vcl/inc/unx/gtk/gtkframe.hxx
+++ b/vcl/inc/unx/gtk/gtkframe.hxx
@@ -329,6 +329,7 @@ public:
// only for gtk3 ...
void pushIgnoreDamage();
void popIgnoreDamage();
+ bool isDuringRender();
void renderArea( cairo_t *cr, cairo_rectangle_t *src );
#endif
virtual ~GtkSalFrame();
diff --git a/vcl/unx/gtk/window/gtkframe.cxx b/vcl/unx/gtk/window/gtkframe.cxx
index 36be0b223c41..d45a8f65545a 100644
--- a/vcl/unx/gtk/window/gtkframe.cxx
+++ b/vcl/unx/gtk/window/gtkframe.cxx
@@ -2990,6 +2990,12 @@ void GtkSalFrame::popIgnoreDamage()
{
m_nDuringRender--;
}
+
+bool GtkSalFrame::isDuringRender()
+{
+ return m_nDuringRender;
+}
+
#endif
void GtkSalFrame::damaged (const basegfx::B2IBox& rDamageRect)
@@ -2997,27 +3003,29 @@ void GtkSalFrame::damaged (const basegfx::B2IBox& rDamageRect)
#if !GTK_CHECK_VERSION(3,0,0)
(void)rDamageRect;
#else
- if (m_nDuringRender)
+ if ( isDuringRender() )
return;
#if OSL_DEBUG_LEVEL > 1
long long area = rDamageRect.getWidth() * rDamageRect.getHeight();
if( area > 32 * 1024 )
- fprintf( stderr, "bitmap damaged %d %d (%dx%d) area %lld\n",
+ {
+ fprintf( stderr, "bitmap damaged %d %d (%dx%d) area %lld widget\n",
(int) rDamageRect.getMinX(),
(int) rDamageRect.getMinY(),
(int) rDamageRect.getWidth(),
(int) rDamageRect.getHeight(),
area );
+ }
#endif
/* FIXME: this is a dirty hack, to render buttons correctly, we
* should of course remove the -100 and + 200, but the whole area
* won't be rendered then.
*/
gtk_widget_queue_draw_area( m_pWindow,
- rDamageRect.getMinX() - 100,
- rDamageRect.getMinY() - 100,
- rDamageRect.getWidth() + 200,
- rDamageRect.getHeight() + 200 );
+ rDamageRect.getMinX() - 1,
+ rDamageRect.getMinY() - 1,
+ rDamageRect.getWidth() + 2,
+ rDamageRect.getHeight() + 2 );
#endif
}
diff --git a/vcl/unx/gtk3/gdi/gtk3salnativewidgets-gtk.cxx b/vcl/unx/gtk3/gdi/gtk3salnativewidgets-gtk.cxx
index 64dc0bce6c85..5e0972ff841b 100644
--- a/vcl/unx/gtk3/gdi/gtk3salnativewidgets-gtk.cxx
+++ b/vcl/unx/gtk3/gdi/gtk3salnativewidgets-gtk.cxx
@@ -979,7 +979,10 @@ void GtkSalGraphics::renderAreaToPix( cairo_t *cr,
src += nStride;
cairo_data += cairo_stride;
}
+ if ( !mpFrame->isDuringRender() )
+ gtk_widget_queue_draw_area( mpFrame->getWindow(), ax, ay, awidth, aheight );
}
+
sal_Bool GtkSalGraphics::getNativeControlRegion( ControlType nType, ControlPart nPart, const Rectangle& rControlRegion, ControlState,
const ImplControlValue&, const rtl::OUString&,
Rectangle &rNativeBoundingRegion, Rectangle &rNativeContentRegion )
@@ -1551,6 +1554,7 @@ void GtkSalGraphics::copyArea( long nDestX, long nDestY,
long nSrcWidth, long nSrcHeight,
sal_uInt16 nFlags )
{
+#ifndef DISABLE_CLEVER_COPYAREA
mpFrame->pushIgnoreDamage();
SvpSalGraphics::copyArea( nDestX, nDestY, nSrcX, nSrcY, nSrcWidth, nSrcHeight, nFlags );
mpFrame->popIgnoreDamage();
@@ -1595,10 +1599,12 @@ void GtkSalGraphics::copyArea( long nDestX, long nDestY,
// FIXME: this will queue (duplicate) gtk+ re-rendering for the exposed area, c'est la vie
gdk_window_move_region( gtk_widget_get_window( mpFrame->getWindow() ),
region, nDestX - nSrcX, nDestY - nSrcY );
-
print_update_area( gtk_widget_get_window( mpFrame->getWindow() ), "after copy area" );
cairo_region_destroy( clip_region );
cairo_region_destroy( region );
+#else
+ SvpSalGraphics::copyArea( nDestX, nDestY, nSrcX, nSrcY, nSrcWidth, nSrcHeight, nFlags );
+#endif
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */