ooo-build r12177 - in trunk: . patches/dev300 patches/src680
- From: thorstenb svn gnome org
- To: svn-commits-list gnome org
- Subject: ooo-build r12177 - in trunk: . patches/dev300 patches/src680
- Date: Tue, 15 Apr 2008 21:53:29 +0100 (BST)
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]