[Libreoffice-commits] .: vcl/inc vcl/unx

Michael Meeks michael at kemper.freedesktop.org
Fri Jul 27 07:32:50 PDT 2012


 vcl/inc/unx/gtk/gtkframe.hxx                  |    1 +
 vcl/unx/gtk/window/gtkframe.cxx               |   20 ++++++++++++++------
 vcl/unx/gtk3/gdi/gtk3salnativewidgets-gtk.cxx |    8 +++++++-
 3 files changed, 22 insertions(+), 7 deletions(-)

New commits:
commit fae17f307efeebf535d5e389e2e829fbd9dace58
Author: Michael Meeks <michael.meeks at suse.com>
Date:   Fri Jul 27 15:27:46 2012 +0100

    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

diff --git a/vcl/inc/unx/gtk/gtkframe.hxx b/vcl/inc/unx/gtk/gtkframe.hxx
index 50258e0..17d3e12 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 36be0b2..d45a8f6 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 64dc0bc..5e0972f 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: */


More information about the Libreoffice-commits mailing list