include/vcl/salnativewidgets.hxx         |    5 +++--
 vcl/inc/opengl/x11/salvd.hxx             |    1 +
 vcl/inc/unx/gtk/gtkgdi.hxx               |    3 ++-
 vcl/inc/unx/salinst.h                    |    6 ++++++
 vcl/inc/unx/salvd.h                      |    7 +++----
 vcl/source/outdev/nativecontrols.cxx     |    4 ++++
 vcl/unx/generic/gdi/salvd.cxx            |   27 ++++++++++++++++-----------
 vcl/unx/gtk/app/gtkinst.cxx              |    6 +++++-
 vcl/unx/gtk/gdi/salnativewidgets-gtk.cxx |   11 ++++-------
 9 files changed, 44 insertions(+), 26 deletions(-)

New commits:
commit 9f46ac8a7e7b65156a138c3d3d1fc480de8533f3
Author: Jan Holesovsky <ke...@collabora.com>
Date:   Sat May 23 15:31:51 2015 +0200

    rendercontext: Initialize X11SalVirtualDevice with appropriate SalGraphics.
    
    Change-Id: I4230412ccc389b8ba6768229b569d7075e7ac466
    Reviewed-on: https://gerrit.libreoffice.org/15979
    Tested-by: Jenkins <c...@libreoffice.org>
    Reviewed-by: Adolfo Jayme Barrientos <fit...@ubuntu.com>

diff --git a/vcl/inc/opengl/x11/salvd.hxx b/vcl/inc/opengl/x11/salvd.hxx
index 2d60898..e4e6ecd 100644
--- a/vcl/inc/opengl/x11/salvd.hxx
+++ b/vcl/inc/opengl/x11/salvd.hxx
@@ -18,6 +18,7 @@
 
 class SalDisplay;
 class X11OpenGLSalGraphics;
+class X11SalGraphics;
 
 class X11OpenGLSalVirtualDevice : public SalVirtualDevice
 {
diff --git a/vcl/inc/unx/gtk/gtkgdi.hxx b/vcl/inc/unx/gtk/gtkgdi.hxx
index e0d0881..60b1513 100644
--- a/vcl/inc/unx/gtk/gtkgdi.hxx
+++ b/vcl/inc/unx/gtk/gtkgdi.hxx
@@ -26,12 +26,13 @@
 #include <gdk/gdkkeysyms.h>
 #include <postx.h>
 
+#include <unx/gtk/gtkframe.hxx>
+
 #if GTK_CHECK_VERSION(3,0,0)
 
 #include <headless/svpgdi.hxx>
 #include "textrender.hxx"
 
-class GtkSalFrame;
 class GtkSalGraphics : public SvpSalGraphics
 {
     GtkSalFrame *mpFrame;
diff --git a/vcl/inc/unx/salinst.h b/vcl/inc/unx/salinst.h
index b8feb71..381ddda 100644
--- a/vcl/inc/unx/salinst.h
+++ b/vcl/inc/unx/salinst.h
@@ -34,6 +34,8 @@ namespace com { namespace sun { namespace star { namespace 
datatransfer {
 } } } }
 
 class SalXLib;
+class X11SalGraphics;
+
 class VCLPLUG_GEN_PUBLIC X11SalInstance : public SalGenericInstance
 {
 private:
@@ -53,6 +55,10 @@ public:
     virtual SalObject*          CreateObject( SalFrame* pParent, 
SystemWindowData* pWindowData, bool bShow = true ) SAL_OVERRIDE;
     virtual void                DestroyObject( SalObject* pObject ) 
SAL_OVERRIDE;
 
+    /// Gtk vclplug needs to pass GtkSalGraphics to X11SalVirtualDevice, so 
create it, and pass as pNewGraphics.
+    virtual SalVirtualDevice* CreateX11VirtualDevice(SalGraphics* pGraphics, 
long &nDX, long &nDY,
+            sal_uInt16 nBitCount, const SystemGraphicsData* pData, 
X11SalGraphics* pNewGraphics);
+
     virtual SalVirtualDevice*   CreateVirtualDevice( SalGraphics* pGraphics,
                                                      long &nDX, long &nDY,
                                                      sal_uInt16 nBitCount, 
const SystemGraphicsData *pData = NULL ) SAL_OVERRIDE;
diff --git a/vcl/inc/unx/salvd.h b/vcl/inc/unx/salvd.h
index 4f98c0c..14ad97e 100644
--- a/vcl/inc/unx/salvd.h
+++ b/vcl/inc/unx/salvd.h
@@ -44,10 +44,9 @@ class X11SalVirtualDevice : public SalVirtualDevice
     bool        bExternPixmap_;
 
 public:
-    X11SalVirtualDevice( SalGraphics *pGraphics,
-                         long &nDX, long &nDY,
-                         sal_uInt16 nBitCount,
-                         const SystemGraphicsData *pData );
+    X11SalVirtualDevice(SalGraphics *pGraphics, long &nDX, long &nDY,
+            sal_uInt16 nBitCount, const SystemGraphicsData *pData, 
X11SalGraphics* pNewGraphics);
+
     virtual ~X11SalVirtualDevice();
 
     Display *GetXDisplay() const
diff --git a/vcl/unx/generic/gdi/salvd.cxx b/vcl/unx/generic/gdi/salvd.cxx
index f64612b..847ea9d 100644
--- a/vcl/unx/generic/gdi/salvd.cxx
+++ b/vcl/unx/generic/gdi/salvd.cxx
@@ -35,14 +35,20 @@
 #include <vcl/opengl/OpenGLHelper.hxx>
 #include <opengl/x11/salvd.hxx>
 
-SalVirtualDevice* X11SalInstance::CreateVirtualDevice( SalGraphics* pGraphics,
-                                                       long &nDX, long &nDY,
-                                                       sal_uInt16 nBitCount, 
const SystemGraphicsData *pData )
+SalVirtualDevice* X11SalInstance::CreateX11VirtualDevice(SalGraphics* 
pGraphics,
+        long &nDX, long &nDY, sal_uInt16 nBitCount, const SystemGraphicsData 
*pData,
+        X11SalGraphics* pNewGraphics)
 {
     if (OpenGLHelper::isVCLOpenGLEnabled())
         return new X11OpenGLSalVirtualDevice( pGraphics, nDX, nDY, nBitCount, 
pData );
     else
-        return new X11SalVirtualDevice( pGraphics, nDX, nDY, nBitCount, pData 
);
+        return new X11SalVirtualDevice(pGraphics, nDX, nDY, nBitCount, pData, 
pNewGraphics);
+}
+
+SalVirtualDevice* X11SalInstance::CreateVirtualDevice(SalGraphics* pGraphics,
+        long &nDX, long &nDY, sal_uInt16 nBitCount, const SystemGraphicsData 
*pData)
+{
+    return CreateX11VirtualDevice(pGraphics, nDX, nDY, nBitCount, pData, new 
X11SalGraphics());
 }
 
 void X11SalGraphics::Init( X11SalVirtualDevice *pDevice, SalColormap* 
pColormap,
@@ -81,12 +87,12 @@ void X11SalGraphics::Init( X11SalVirtualDevice *pDevice, 
SalColormap* pColormap,
     mxImpl->Init();
 }
 
-X11SalVirtualDevice::X11SalVirtualDevice( SalGraphics* pGraphics,
-                                          long &nDX, long &nDY,
-                                          sal_uInt16 nBitCount,
-                                          const SystemGraphicsData *pData ) :
-    m_nXScreen( 0 ),
-    bGraphics_( false )
+X11SalVirtualDevice::X11SalVirtualDevice(SalGraphics* pGraphics, long &nDX, 
long &nDY,
+                                         sal_uInt16 nBitCount, const 
SystemGraphicsData *pData,
+                                         X11SalGraphics* pNewGraphics) :
+    pGraphics_(pNewGraphics),
+    m_nXScreen(0),
+    bGraphics_(false)
 {
     SalColormap* pColormap = NULL;
     bool bDeleteColormap = false;
@@ -95,7 +101,6 @@ X11SalVirtualDevice::X11SalVirtualDevice( SalGraphics* 
pGraphics,
         nBitCount = pGraphics->GetBitCount();
 
     pDisplay_               = vcl_sal::getSalDisplay(GetGenericData());
-    pGraphics_              = new X11SalGraphics();
     nDepth_                 = nBitCount;
 
     if( pData && pData->hDrawable != None )
diff --git a/vcl/unx/gtk/app/gtkinst.cxx b/vcl/unx/gtk/app/gtkinst.cxx
index f9883c8..11a18e5 100644
--- a/vcl/unx/gtk/app/gtkinst.cxx
+++ b/vcl/unx/gtk/app/gtkinst.cxx
@@ -23,6 +23,7 @@
 #include <unx/gtk/gtkdata.hxx>
 #include <unx/gtk/gtkinst.hxx>
 #include <unx/salobj.h>
+#include <unx/gtk/gtkgdi.hxx>
 #include <unx/gtk/gtkframe.hxx>
 #include <unx/gtk/gtkobject.hxx>
 #include <unx/gtk/atkbridge.hxx>
@@ -320,7 +321,10 @@ SalVirtualDevice* GtkInstance::CreateVirtualDevice( 
SalGraphics *pG,
     pNew->SetSize( nDX, nDY );
     return pNew;
 #else
-    return X11SalInstance::CreateVirtualDevice( pG, nDX, nDY, nBitCount, pGd );
+    GtkSalGraphics *pGtkSalGraphics = dynamic_cast<GtkSalGraphics*>(pG);
+    assert(pGtkSalGraphics);
+    return CreateX11VirtualDevice(pG, nDX, nDY, nBitCount, pGd,
+            new GtkSalGraphics(pGtkSalGraphics->GetGtkFrame(), 
pGtkSalGraphics->GetGtkWidget()));
 #endif
 }
 
commit 42e15c0b0473699c6fda0cc9ee8ae755df7760f1
Author: Jan Holesovsky <ke...@collabora.com>
Date:   Sat May 23 21:37:25 2015 +0200

    rendercontext: Make the Gtk+ native widgets work with double-buffering.
    
    Change-Id: Ic7101ab7cbaa7fd5f6b073a73ef0c0088b1af4c6
    Reviewed-on: https://gerrit.libreoffice.org/15980
    Tested-by: Jenkins <c...@libreoffice.org>
    Reviewed-by: Adolfo Jayme Barrientos <fit...@ubuntu.com>

diff --git a/include/vcl/salnativewidgets.hxx b/include/vcl/salnativewidgets.hxx
index 6cab0ba..66bc744 100644
--- a/include/vcl/salnativewidgets.hxx
+++ b/include/vcl/salnativewidgets.hxx
@@ -246,11 +246,12 @@ enum class ControlState {
     HIDDEN       = 0x0010,
     DEFAULT      = 0x0020,
     SELECTED     = 0x0040,
-    CACHING_ALLOWED  = 0x8000,  // set when the control is completely visible 
(i.e. not clipped)
+    DOUBLEBUFFERING = 0x4000,  ///< Set when the control is painted using 
double-buffering via VirtualDevice.
+    CACHING_ALLOWED = 0x8000,  ///< Set when the control is completely visible 
(i.e. not clipped).
 };
 namespace o3tl
 {
-    template<> struct typed_flags<ControlState> : is_typed_flags<ControlState, 
0x8007f> {};
+    template<> struct typed_flags<ControlState> : is_typed_flags<ControlState, 
0xc007f> {};
 }
 
 /* ButtonValue:
diff --git a/vcl/source/outdev/nativecontrols.cxx 
b/vcl/source/outdev/nativecontrols.cxx
index e46df33..7011dfb 100644
--- a/vcl/source/outdev/nativecontrols.cxx
+++ b/vcl/source/outdev/nativecontrols.cxx
@@ -18,6 +18,7 @@
  */
 
 #include <vcl/outdev.hxx>
+#include <vcl/virdev.hxx>
 #include <vcl/window.hxx>
 
 #include <vcl/salnativewidgets.hxx>
@@ -300,6 +301,9 @@ bool OutputDevice::DrawNativeControl( ControlType nType,
     if (aTestRegion == vcl::Region(rControlRegion))
         nState |= ControlState::CACHING_ALLOWED;   // control is not clipped, 
caching allowed
 
+    if (dynamic_cast<VirtualDevice*>(this))
+        nState |= ControlState::DOUBLEBUFFERING;
+
     bool bRet = mpGraphics->DrawNativeControl(nType, nPart, screenRegion, 
nState, *aScreenCtrlValue, aCaption, this );
 
     return bRet;
diff --git a/vcl/unx/gtk/gdi/salnativewidgets-gtk.cxx 
b/vcl/unx/gtk/gdi/salnativewidgets-gtk.cxx
index b4f1ba0..6eb6043 100644
--- a/vcl/unx/gtk/gdi/salnativewidgets-gtk.cxx
+++ b/vcl/unx/gtk/gdi/salnativewidgets-gtk.cxx
@@ -860,12 +860,9 @@ bool GtkSalGraphics::hitTestNativeControl( ControlType     
   nType,
  *  aValue:          An optional value (tristate/numerical/string)
  *  rCaption:      A caption or title string (like button text etc)
  */
-bool GtkSalGraphics::drawNativeControl(    ControlType nType,
-                            ControlPart nPart,
-                            const Rectangle& rControlRegion,
-                            ControlState nState,
-                            const ImplControlValue& aValue,
-                            const OUString& rCaption )
+bool GtkSalGraphics::drawNativeControl(ControlType nType, ControlPart nPart,
+        const Rectangle& rControlRegion, ControlState nState,
+        const ImplControlValue& aValue, const OUString& rCaption)
 {
     // get a GC with current clipping region set
     GetFontGC();
@@ -891,7 +888,7 @@ bool GtkSalGraphics::drawNativeControl(    ControlType 
nType,
     std::unique_ptr<GdkX11Pixmap> xPixmap;
     std::unique_ptr<GdkX11Pixmap> xMask;
     Rectangle aPixmapRect;
-    if( ( bNeedPixmapPaint )
+    if ((bNeedPixmapPaint || (nState & ControlState::DOUBLEBUFFERING))
         && nType != CTRL_SCROLLBAR
         && nType != CTRL_SPINBOX
         && nType != CTRL_TAB_ITEM
_______________________________________________
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits

Reply via email to