ooo-build r12177 - in trunk: . patches/dev300 patches/src680



Author: thorstenb
Date: Tue Apr 15 21:53:28 2008
New Revision: 12177
URL: http://svn.gnome.org/viewvc/ooo-build?rev=12177&view=rev

Log:
	* patches/dev300/apply: renamed vcl-xinerama-64bit-fix.diff to
	vcl-dynamic-screens-fix.diff 

	* patches/src680/apply: renamed vcl-xinerama-64bit-fix.diff to
	vcl-dynamic-screens-fix.diff 

	* patches/src680/vcl-dynamic-screens-fix.diff: split the
	ambivalent use of GetXineramaScreens() and getDataForScreen() at
	SalDisplay into several methods, adapted all call sites and
	changed the implementation that queries screen dimensions to
	actually look things up dynamically



Added:
   trunk/patches/src680/vcl-dynamic-screens-fix.diff
Modified:
   trunk/ChangeLog
   trunk/patches/dev300/apply
   trunk/patches/src680/apply

Modified: trunk/patches/dev300/apply
==============================================================================
--- trunk/patches/dev300/apply	(original)
+++ trunk/patches/dev300/apply	Tue Apr 15 21:53:28 2008
@@ -1064,6 +1064,8 @@
 # enable vcl to load bitmaps when height it negative
 vcl-bitmap2-negative-height.diff
 
+# fixes dynamic screen config bugs (xinerama & multiscreen)
+vcl-dynamic-screens-fix.diff, n#359955, rodo+thorsten
 
 [ SystemBits ]
 # use getopt() and readdir_r() from system glibc
@@ -2092,6 +2094,3 @@
 # build our stuff
 # FIXME: should be in the respective patches
 buildfix-no-UPD-in-library-names.diff, jholesov
-
-[ Fixes ]
-vcl-xinerama-64bit-fix.diff, rodo

Modified: trunk/patches/src680/apply
==============================================================================
--- trunk/patches/src680/apply	(original)
+++ trunk/patches/src680/apply	Tue Apr 15 21:53:28 2008
@@ -1172,6 +1172,8 @@
 # enable vcl to load bitmaps when height it negative
 vcl-bitmap2-negative-height.diff
 
+# fixes dynamic screen config bugs (xinerama & multiscreen)
+vcl-dynamic-screens-fix.diff, n#359955, rodo+thorsten
 
 [ SystemBits ]
 # use getopt() and readdir_r() from system glibc
@@ -2263,6 +2265,3 @@
 libwpg-testing.diff
 libwps-testing.diff
 writerperfect-testing.diff
-
-[ Fixes ]
-vcl-xinerama-64bit-fix.diff, rodo

Added: trunk/patches/src680/vcl-dynamic-screens-fix.diff
==============================================================================
--- (empty file)
+++ trunk/patches/src680/vcl-dynamic-screens-fix.diff	Tue Apr 15 21:53:28 2008
@@ -0,0 +1,370 @@
+--- vcl/unx/gtk/window/gtkframe.cxx	23 Jan 2008 17:17:10 -0000	1.72.8.2
++++ vcl/unx/gtk/window/gtkframe.cxx	15 Apr 2008 20:07:09 -0000
+@@ -1180,7 +1180,7 @@ void GtkSalFrame::Center()
+             GdkModifierType aMask;
+             gdk_display_get_pointer( getGdkDisplay(), &pScreen, &x, &y, &aMask );
+ 
+-            const std::vector< Rectangle >& rScreens = GetX11SalData()->GetDisplay()->GetXineramaScreens();
++            const std::vector< Rectangle >& rScreens = GetX11SalData()->GetDisplay()->GetXineramaScreenRects();
+             for( unsigned int i = 0; i < rScreens.size(); i++ )
+                 if( rScreens[i].IsInside( Point( x, y ) ) )
+                 {
+@@ -1649,7 +1649,7 @@ void GtkSalFrame::ShowFullScreen( BOOL b
+     {
+         GtkSalDisplay* pDisp = getDisplay();
+         // xinerama ?
+-        if( pDisp->IsXinerama() && pDisp->GetXineramaScreens().size() > 1 )
++        if( pDisp->IsXinerama() && pDisp->GetXineramaScreenCount() > 1 )
+         {
+             if( bFullScreen )
+             {
+@@ -1663,10 +1663,10 @@ void GtkSalFrame::ShowFullScreen( BOOL b
+                 m_nStyle |= SAL_FRAME_STYLE_PARTIAL_FULLSCREEN;
+                 createNewWindow( None, false, m_nScreen );
+                 Rectangle aNewPosSize;
+-                if( nScreen < 0 || nScreen >= static_cast<int>(pDisp->GetXineramaScreens().size()) )
++                if( nScreen < 0 || nScreen >= static_cast<int>(pDisp->GetXineramaScreenCount()) )
+                     aNewPosSize = Rectangle( Point( 0, 0 ), pDisp->GetScreenSize(m_nScreen) );
+                 else
+-                    aNewPosSize = pDisp->GetXineramaScreens()[ nScreen ];
++                    aNewPosSize = pDisp->GetXineramaScreenRects()[ nScreen ];
+                 gtk_window_resize( m_pWindow,
+                                    maGeometry.nWidth = aNewPosSize.GetWidth(),
+                                    maGeometry.nHeight = aNewPosSize.GetHeight() );
+--- vcl/unx/inc/saldisp.hxx	26 Feb 2008 18:14:50 -0000	1.42.112.2
++++ vcl/unx/inc/saldisp.hxx	15 Apr 2008 20:07:17 -0000
+@@ -477,6 +479,7 @@ public:
+     void			Remove( XEvent   *pEvent );
+ 
+     virtual void          initScreen( int nScreen ) const;
++    Size                  getScreenSize( int nScreen ) const;
+     const ScreenData&     getDataForScreen( int nScreen ) const
+     {
+         if( nScreen < 0 || nScreen >= static_cast<int>(m_aScreens.size()) )
+@@ -526,12 +529,13 @@ public:
+     ::vcl_sal::WMAdaptor* getWMAdaptor() const { return m_pWMAdaptor; }
+     DtIntegrator* getDtIntegrator() const { return m_pDtIntegrator; }
+     bool			IsXinerama() const { return m_bXinerama; }
+-    const std::vector< Rectangle >& GetXineramaScreens() const { return m_aXineramaScreens; }
++    const std::vector< Rectangle >& GetXineramaScreenRects();
+     XLIB_Window     GetRootWindow( int nScreen ) const
+     { return getDataForScreen( nScreen ).m_aRoot; }
+     const std::vector< ScreenData >& GetScreenData()
+     { return m_aScreens; }
+     int GetScreenCount() const { return static_cast<int>(m_aScreens.size()); }
++    std::size_t GetXineramaScreenCount() const { return m_aXineramaScreens.size(); }
+ 
+     const std::list< SalFrame* >& getFrames() const
+     { return m_aFrames; }
+--- vcl/unx/source/app/saldisp.cxx	23 Jan 2008 17:18:18 -0000	1.91.146.2
++++ vcl/unx/source/app/saldisp.cxx	15 Apr 2008 20:07:25 -0000
+@@ -70,7 +70,7 @@
+ 
+ #ifdef USE_XINERAMA
+ #ifdef USE_XINERAMA_XORG
+-#if defined(X86) || defined(MACOSX)
++#if defined(X86) || defined(X86_64) || defined(MACOSX)
+ #include <X11/extensions/Xinerama.h>
+ #endif
+ #elif defined USE_XINERAMA_XSUN
+@@ -847,6 +853,26 @@ void SalDisplay::initScreen( int nScreen
+ }
+ 
+ // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
++
++Size SalDisplay::getScreenSize( int nScreen ) const
++{
++    if( nScreen < 0 || nScreen >= static_cast<int>(m_aScreens.size()) )
++        return Size();
++    if( ! m_aScreens[nScreen].m_bInit )
++        initScreen( nScreen );
++    else
++    {
++        // update screen size everytime, xrandr etc. change this
++        // without notice
++        Screen* pScreen = ScreenOfDisplay( pDisp_, nScreen );
++        const_cast<Size&>(m_aScreens[nScreen].m_aSize) = Size( WidthOfScreen( pScreen ), 
++                                                               HeightOfScreen( pScreen ) );
++    }
++
++    return m_aScreens[nScreen].m_aSize;
++}
++
++// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+ void SalDisplay::Init()
+ {
+     for( size_t i = 0; i < POINTER_COUNT; i++ )
+@@ -2640,9 +2695,9 @@ void SalDisplay::GetScreenFontResolution
+         return;
+ 
+     int   nThreshold;
+-    if (m_aScreens[m_nDefaultScreen].m_aSize.Height() <= 600)
++    if (GetScreenSize(m_nDefaultScreen).Height() <= 600)
+         nThreshold =  96;
+-    else if (m_aScreens[m_nDefaultScreen].m_aSize.Height() <= 768)
++    else if (GetScreenSize(m_nDefaultScreen).Height() <= 768)
+         nThreshold = 108;
+     else
+         nThreshold = 120;
+@@ -2657,6 +2712,96 @@ void SalDisplay::GetScreenFontResolution
+     rDPIX = rDPIY;
+ }
+ 
++const std::vector< Rectangle >& SalDisplay::GetXineramaScreenRects()
++{ 
++    OSL_ASSERT(m_bXinerama);
++
++    /* update screen rects from xinerama - should, for whatever
++       reason, xinerama been disabled by now, just fill in empty
++       rects, calling code is not prepared to handle IsXinerama() ==
++       true & this here giving empty vector
++    */
++
++    // clear rects
++    std::fill(m_aXineramaScreens.begin(),
++              m_aXineramaScreens.end(),
++              Rectangle());
++
++#ifdef USE_XINERAMA
++#if defined(USE_XINERAMA_XSUN)
++    if( XineramaGetState( pDisp_, m_nDefaultScreen ) )
++    {
++        int nFramebuffers = 1;
++        XRectangle pFramebuffers[MAXFRAMEBUFFERS];
++        unsigned char hints[MAXFRAMEBUFFERS];
++        int result = XineramaGetInfo( pDisp_,
++                                      m_nDefaultScreen,
++                                      pFramebuffers,
++                                      hints,
++                                      &nFramebuffers );
++
++        // limit to existing number of screens
++        nFramebuffers = std::min(int(m_aXineramaScreens).size(),nFramebuffers);
++        if( result > 0 )
++        {
++            for( int i = 0; i < nFramebuffers; i++ )
++                m_aXineramaScreens[i] = Rectangle( Point( pFramebuffers[i].x,
++                                                   pFramebuffers[i].y ),
++                                            Size( pFramebuffers[i].width,
++                                                  pFramebuffers[i].height ) );
++        }
++    }
++#elif defined(USE_XINERAMA_XORG)
++#if defined(X86) || defined(X86_64) || defined(MACOSX)
++    if( XineramaIsActive( pDisp_ ) )
++    {
++        int nFramebuffers = 1;
++        XineramaScreenInfo* pScreens = XineramaQueryScreens( pDisp_, &nFramebuffers );
++        if( pScreens )
++        {
++            if( nFramebuffers > 1 )
++            {
++                // limit to existing number of screens
++                nFramebuffers = std::min(int(m_aXineramaScreens.size()),nFramebuffers);
++
++                for( int i = 0, j = 0; i < nFramebuffers; i++ )
++                {
++                    // see if any frame buffers are at the same coordinates
++                    // this can happen with weird configuration e.g. on
++                    // XFree86 and Clone displays
++                    bool bDuplicate = false;
++                    for( int n = 0; n < i; n++ )
++                    {
++                        if( m_aXineramaScreens[n].Left() == pScreens[i].x_org &&
++                            m_aXineramaScreens[n].Top() == pScreens[i].y_org )
++                        {
++                            bDuplicate = true;
++                            if( m_aXineramaScreens[n].GetWidth() < pScreens[i].width ||
++                                m_aXineramaScreens[n].GetHeight() < pScreens[i].height )
++                            {
++                                m_aXineramaScreens[n].SetSize( Size( pScreens[i].width,
++                                                                     pScreens[i].height ) );
++                            }
++                            break;
++                        }
++                    }
++                    if( ! bDuplicate )
++                        m_aXineramaScreens[j++] = Rectangle( Point( pScreens[i].x_org,
++                                                                    pScreens[i].y_org ),
++                                                             Size( pScreens[i].width,
++                                                                   pScreens[i].height ) );
++                }
++            }
++            XFree( pScreens );
++        }
++    }
++#endif
++#endif
++#endif // USE_XINERAMA
++
++    return m_aXineramaScreens; 
++}
++
+ void SalDisplay::InitXinerama()
+ {
+     if( m_aScreens.size() > 1 )
+@@ -2688,7 +2833,7 @@ void SalDisplay::InitXinerama()
+         }
+     }
+ #elif defined(USE_XINERAMA_XORG)
+-#if defined( X86 ) || defined( MACOSX )
++#if defined(X86) || defined(X86_64) || defined(MACOSX)
+ if( XineramaIsActive( pDisp_ ) )
+ {
+     int nFramebuffers = 1;
+--- vcl/unx/source/app/salsys.cxx	27 Jun 2007 20:47:35 -0000	1.18
++++ vcl/unx/source/app/salsys.cxx	15 Apr 2008 20:07:26 -0000
+@@ -66,7 +66,7 @@ X11SalSystem::~X11SalSystem()
+ unsigned int X11SalSystem::GetDisplayScreenCount()
+ {
+     SalDisplay* pSalDisp = GetX11SalData()->GetDisplay();
+-    return pSalDisp->IsXinerama() ? pSalDisp->GetXineramaScreens().size() : pSalDisp->GetScreenCount();
++    return pSalDisp->IsXinerama() ? pSalDisp->GetXineramaScreenCount() : pSalDisp->GetScreenCount();
+ }
+ 
+ bool X11SalSystem::IsMultiDisplay()
+@@ -88,14 +88,13 @@ Rectangle X11SalSystem::GetDisplayScreen
+     SalDisplay* pSalDisp = GetX11SalData()->GetDisplay();
+     if( pSalDisp->IsXinerama() )
+     {
+-        const std::vector< Rectangle >& rScreens = pSalDisp->GetXineramaScreens();
++        const std::vector< Rectangle >& rScreens = pSalDisp->GetXineramaScreenRects();
+         if( nScreen < rScreens.size() )
+             aRet = rScreens[nScreen];
+     }
+     else
+     {
+-        const SalDisplay::ScreenData& rScreen = pSalDisp->getDataForScreen( nScreen );
+-        aRet = Rectangle( Point( 0, 0 ), rScreen.m_aSize );
++        aRet = Rectangle( Point( 0, 0 ), pSalDisp->GetScreenSize(nScreen) );
+     }
+     
+     return aRet;
+@@ -113,8 +112,7 @@ rtl::OUString X11SalSystem::GetScreenNam
+     SalDisplay* pSalDisp = GetX11SalData()->GetDisplay();
+     if( pSalDisp->IsXinerama() )
+     {
+-        const std::vector< Rectangle >& rScreens = pSalDisp->GetXineramaScreens();
+-        if( nScreen >= rScreens.size() )
++        if( nScreen >= pSalDisp->GetXineramaScreenCount() )
+             nScreen = 0;
+         rtl::OUStringBuffer aBuf( 256 );
+         aBuf.append( rtl::OStringToOUString( rtl::OString( DisplayString( pSalDisp->GetDisplay() ) ), osl_getThreadTextEncoding() ) );
+--- vcl/unx/source/app/wmadaptor.cxx	23 Jan 2008 17:18:32 -0000	1.67.112.1
++++ vcl/unx/source/app/wmadaptor.cxx	15 Apr 2008 20:07:31 -0000
+@@ -1580,7 +1580,7 @@ void WMAdaptor::maximizeFrame( X11SalFra
+         if( m_pSalDisplay->IsXinerama() )
+         {
+             Point aMed( aTL.X() + rGeom.nWidth/2, aTL.Y() + rGeom.nHeight/2 );
+-            const std::vector< Rectangle >& rScreens = m_pSalDisplay->GetXineramaScreens();
++            const std::vector< Rectangle >& rScreens = m_pSalDisplay->GetXineramaScreenRects();
+             for( unsigned int i = 0; i < rScreens.size(); i++ )
+                 if( rScreens[i].IsInside( aMed ) )
+                 {
+@@ -2202,7 +2202,7 @@ void NetWMAdaptor::showFullScreen( X11Sa
+                 m_pSalDisplay->GetRootWindow( pFrame->GetScreenNumber() ),
+                 &aRoot, &aChild,
+                 &root_x, &root_y, &lx, &ly, &mask );
+-                const std::vector< Rectangle >& rScreens = m_pSalDisplay->GetXineramaScreens();
++                const std::vector< Rectangle >& rScreens = m_pSalDisplay->GetXineramaScreenRects();
+                 Point aMousePoint( root_x, root_y );
+                 for( unsigned int i = 0; i < rScreens.size(); i++ )
+                 {
+--- vcl/unx/source/gdi/salgdi3.cxx	31 Jan 2008 10:06:27 -0000	1.149.8.2
++++ vcl/unx/source/gdi/salgdi3.cxx	15 Apr 2008 20:07:40 -0000
+@@ -905,7 +905,7 @@ bool X11SalGraphics::DrawServerAAForcedS
+         // clip with screen
+         int nScreenX = m_pFrame->maGeometry.nX+aXRect.x;
+         int nScreenY = m_pFrame->maGeometry.nY+aXRect.y;
+-        const Size& rScreenSize = GetDisplay()->getDataForScreen( m_nScreen ).m_aSize;
++        const Size& rScreenSize = GetDisplay()->GetScreenSize( m_nScreen );
+         int nScreenW = rScreenSize.Width();
+         int nScreenH = rScreenSize.Height();
+         if( nScreenX < 0 )
+@@ -941,7 +941,7 @@ bool X11SalGraphics::DrawServerAAForcedS
+             // geometry changed in the meantime; lets get the current geometry
+             // and clip against the current window size as well as the screen
+             // with the current frame position
+-            const Size& rScreenSize = GetDisplay()->getDataForScreen(m_nScreen).m_aSize;
++            const Size& rScreenSize = GetDisplay()->GetScreenSize(m_nScreen);
+             int nScreenW = rScreenSize.Width();
+             int nScreenH = rScreenSize.Height();
+             XLIB_Window aRoot = None;
+--- vcl/unx/source/window/salframe.cxx	25 Jan 2008 16:37:31 -0000	1.219.110.3
++++ vcl/unx/source/window/salframe.cxx	15 Apr 2008 20:07:50 -0000
+@@ -370,7 +370,7 @@ void X11SalFrame::Init( ULONG nSalFrameS
+     {
+         if( ! bUseGeometry )
+         {
+-            Size aScreenSize( GetDisplay()->getDataForScreen( m_nScreen ).m_aSize );
++            Size aScreenSize( GetDisplay()->GetScreenSize( m_nScreen ) );
+             w = aScreenSize.Width();
+             h = aScreenSize.Height();
+             if( nSalFrameStyle & SAL_FRAME_STYLE_SIZEABLE &&
+@@ -439,7 +439,7 @@ void X11SalFrame::Init( ULONG nSalFrameS
+                                    GetDisplay()->GetRootWindow( m_nScreen ),
+                                    &aRoot, &aChild,
+                                    &root_x, &root_y, &lx, &ly, &mask );
+-                    const std::vector< Rectangle >& rScreens = GetDisplay()->GetXineramaScreens();
++                    const std::vector< Rectangle >& rScreens = GetDisplay()->GetXineramaScreenRects();
+                     for( unsigned int i = 0; i < rScreens.size(); i++ )
+                         if( rScreens[i].IsInside( Point( root_x, root_y ) ) )
+                         {
+@@ -1443,7 +1443,7 @@ void X11SalFrame::Center( )
+ 	int				nRealScreenWidth, nRealScreenHeight;
+ 	int				nScreenX = 0, nScreenY = 0;
+ 
+-    const Size& aScreenSize = GetDisplay()->getDataForScreen( m_nScreen ).m_aSize;
++    const Size& aScreenSize = GetDisplay()->GetScreenSize( m_nScreen );
+     nScreenWidth		= aScreenSize.Width();
+     nScreenHeight		= aScreenSize.Height();
+     nRealScreenWidth	= nScreenWidth;
+@@ -1469,7 +1469,7 @@ void X11SalFrame::Center( )
+                            &root_x, &root_y,
+                            &x, &y,
+                            &mask );
+-        const std::vector< Rectangle >& rScreens = GetDisplay()->GetXineramaScreens();
++        const std::vector< Rectangle >& rScreens = GetDisplay()->GetXineramaScreenRects();
+         for( unsigned int i = 0; i < rScreens.size(); i++ )
+             if( rScreens[i].IsInside( Point( root_x, root_y ) ) )
+             {
+@@ -1689,7 +1689,7 @@ void X11SalFrame::SetWindowState( const 
+                 bDoAdjust = true;
+             }
+             
+-            const Size& aScreenSize = pDisplay_->getDataForScreen( m_nScreen ).m_aSize;
++            const Size& aScreenSize = pDisplay_->GetScreenSize( m_nScreen );
+             const WMAdaptor *pWM = GetDisplay()->getWMAdaptor();
+             
+             if( bDoAdjust && aPosSize.GetWidth() <= aScreenSize.Width()
+@@ -1883,7 +1883,7 @@ void X11SalFrame::GetPosSize( Rectangle 
+ {
+ 	if( maGeometry.nWidth < 1 || maGeometry.nHeight < 1 )
+ 	{
+-        const Size& aScreenSize = pDisplay_->getDataForScreen( m_nScreen ).m_aSize;
++        const Size& aScreenSize = pDisplay_->GetScreenSize( m_nScreen );
+ 		long w = aScreenSize.Width()  - maGeometry.nLeftDecoration - maGeometry.nRightDecoration;
+ 		long h = aScreenSize.Height() - maGeometry.nTopDecoration - maGeometry.nBottomDecoration;
+ 
+@@ -2090,7 +2090,7 @@ void X11SalFrame::Restore()
+ 
+ void X11SalFrame::ShowFullScreen( BOOL bFullScreen, sal_Int32 nScreen )
+ {
+-    if( GetDisplay()->IsXinerama() && GetDisplay()->GetXineramaScreens().size() > 1 )
++    if( GetDisplay()->IsXinerama() && GetDisplay()->GetXineramaScreenCount() > 1 )
+     {
+         if( mbFullScreen == (bool)bFullScreen )
+             return;
+@@ -2099,10 +2099,10 @@ void X11SalFrame::ShowFullScreen( BOOL b
+             maRestorePosSize = Rectangle( Point( maGeometry.nX, maGeometry.nY ),
+                                           Size( maGeometry.nWidth, maGeometry.nHeight ) );
+             Rectangle aRect;
+-            if( nScreen < 0 || nScreen >= static_cast<int>(GetDisplay()->GetXineramaScreens().size()) )
++            if( nScreen < 0 || nScreen >= static_cast<int>(GetDisplay()->GetXineramaScreenCount()) )
+                 aRect = Rectangle( Point(0,0), GetDisplay()->GetScreenSize( m_nScreen ) );
+             else
+-                aRect = GetDisplay()->GetXineramaScreens()[nScreen];
++                aRect = GetDisplay()->GetXineramaScreenRects()[nScreen];
+             nStyle_ |= SAL_FRAME_STYLE_PARTIAL_FULLSCREEN;
+             bool bVisible = bMapped_;
+             if( bVisible )



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]