From fae17f307efeebf535d5e389e2e829fbd9dace58 Mon Sep 17 00:00:00 2001 From: Michael Meeks Date: Fri, 27 Jul 2012 15:27:46 +0100 Subject: gtk3: ensure we re-render native commits If we blit pixels to the back-buffer, we need to remember to get them to gtk3 at idle. Change-Id: Ic37660e963fbbcdd132cfba0ce739174d64148d2 --- vcl/unx/gtk/window/gtkframe.cxx | 20 ++++++++++++++------ vcl/unx/gtk3/gdi/gtk3salnativewidgets-gtk.cxx | 8 +++++++- 2 files changed, 21 insertions(+), 7 deletions(-) (limited to 'vcl/unx') 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: */ -- cgit v1.2.3