rpms/openoffice.org/devel openoffice.org-3.3.0.ooo111770.vcl.defaultmonitor.patch, NONE, 1.1 openoffice.org.spec, 1.2244, 1.2245

Caolan McNamara caolanm at fedoraproject.org
Tue Jun 15 19:11:15 UTC 2010


Author: caolanm

Update of /cvs/pkgs/rpms/openoffice.org/devel
In directory cvs01.phx2.fedoraproject.org:/tmp/cvs-serv2429

Modified Files:
	openoffice.org.spec 
Added Files:
	openoffice.org-3.3.0.ooo111770.vcl.defaultmonitor.patch 
Log Message:
ensure presentation-screen preview defaults to displaying on gdk_screen_get_primary_monitor

openoffice.org-3.3.0.ooo111770.vcl.defaultmonitor.patch:
 gtk/app/gtkdata.cxx         |   33 ++++++++++++++++++-
 inc/plugins/gtk/gtkdata.hxx |    2 +
 inc/saldisp.hxx             |    3 +
 source/app/saldisp.cxx      |   73 ++++++++++++++++++++++++--------------------
 source/app/salsys.cxx       |    2 -
 5 files changed, 77 insertions(+), 36 deletions(-)

--- NEW FILE openoffice.org-3.3.0.ooo111770.vcl.defaultmonitor.patch ---
diff -ru vcl.orig/unx/gtk/app/gtkdata.cxx vcl/unx/gtk/app/gtkdata.cxx
--- vcl.orig/unx/gtk/app/gtkdata.cxx	2010-06-14 19:51:39.500810695 +0100
+++ vcl/unx/gtk/app/gtkdata.cxx	2010-06-15 10:07:16.669799057 +0100
@@ -220,12 +220,12 @@
             {
                 gint nMonitors = gdk_screen_get_n_monitors(pScreen);
                 m_aXineramaScreens = std::vector<Rectangle>();
+                m_aXineramaScreenIndexMap = std::vector<int>(nMonitors);
                 for (gint i = 0; i < nMonitors; ++i)
                 {
                     GdkRectangle dest;
                     gdk_screen_get_monitor_geometry(pScreen, i, &dest);
-                    m_aXineramaScreens.push_back( Rectangle( Point(dest.x,
-                                                                   dest.y ), Size( dest.width, dest.height ) ) );
+                    addXineramaScreenUnique( i, dest.x, dest.y, dest.width, dest.height );
                 }
                 m_bXinerama = m_aXineramaScreens.size() > 1;
                 if( ! m_aFrames.empty() )
@@ -239,6 +239,35 @@
     }
 }
 
+extern "C"
+{
+    typedef gint(* screen_get_primary_monitor)(GdkScreen *screen);
+}
+
+int GtkSalDisplay::GetDefaultMonitorNumber() const
+{
+	fprintf(stderr, "GtkSalDisplay::GetDefaultMonitorNumber\n");
+
+    GdkScreen* pScreen = gdk_display_get_screen( m_pGdkDisplay, m_nDefaultScreen );
+#if GTK_CHECK_VERSION(2,20,0)
+    return m_aXineramaScreenIndexMap[gdk_screen_get_primary_monitor(pScreen)];
+#else
+    static screen_get_primary_monitor sym_gdk_screen_get_primary_monitor =
+        (screen_get_primary_monitor)osl_getAsciiFunctionSymbol( GetSalData()->m_pPlugin, "gdk_screen_get_primary_monitor" );
+    if (sym_gdk_screen_get_primary_monitor)
+        return sym_gdk_screen_get_primary_monitor( pScreen );
+    //gdk_screen_get_primary_monitor unavailable, take the first laptop monitor as the default
+    gint nMonitors = gdk_screen_get_n_monitors(pScreen);
+    for (gint i = 0; i < nMonitors; ++i)
+    {
+        fprintf(stderr, "name is %s\n", gdk_screen_get_monitor_plug_name(pScreen, i));
+        if (g_ascii_strncasecmp (gdk_screen_get_monitor_plug_name(pScreen, i), "LVDS", 4) == 0)
+            return m_aXineramaScreenIndexMap[i];
+    }
+    return 0;
+#endif
+}
+
 void GtkSalDisplay::initScreen( int nScreen ) const
 {
     if( nScreen < 0 || nScreen >= static_cast<int>(m_aScreens.size()) )
diff -ru vcl.orig/unx/inc/plugins/gtk/gtkdata.hxx vcl/unx/inc/plugins/gtk/gtkdata.hxx
--- vcl.orig/unx/inc/plugins/gtk/gtkdata.hxx	2010-06-14 19:51:39.547798667 +0100
+++ vcl/unx/inc/plugins/gtk/gtkdata.hxx	2010-06-14 20:33:22.407799098 +0100
@@ -76,6 +76,8 @@
     virtual long Dispatch( XEvent *pEvent );
     virtual void initScreen( int nScreen ) const;
 
+    virtual int GetDefaultMonitorNumber() const;
+
     static GdkFilterReturn filterGdkEvent( GdkXEvent* sys_event,
                                            GdkEvent* event,
                                            gpointer data );
diff -ru vcl.orig/unx/inc/saldisp.hxx vcl/unx/inc/saldisp.hxx
--- vcl.orig/unx/inc/saldisp.hxx	2010-06-14 19:51:39.548798785 +0100
+++ vcl/unx/inc/saldisp.hxx	2010-06-15 10:06:53.031798755 +0100
@@ -392,6 +392,7 @@
 
     bool			m_bXinerama;
     std::vector< Rectangle > m_aXineramaScreens;
+    std::vector< int > m_aXineramaScreenIndexMap;
     std::list<SalFrame*> m_aFrames;
     std::list<SalObject*> m_aSalObjects;
     
@@ -407,6 +408,7 @@
     int             processRandREvent( XEvent* );
 
     void			doDestruct();
+    void            addXineramaScreenUnique( int i, long i_nX, long i_nY, long i_nWidth, long i_nHeight );
 public:
 	static	SalDisplay	   *GetSalDisplay( Display* display );
 	static	BOOL			BestVisual( Display     *pDisp,
@@ -476,6 +478,7 @@
 	XLIB_Window		GetDrawable( int nScreen ) const { return getDataForScreen( nScreen ).m_aRefWindow; }
 	Display		   *GetDisplay() const { return pDisp_; }
 	int				GetDefaultScreenNumber() const { return m_nDefaultScreen; }
+	virtual int		GetDefaultMonitorNumber() const;
     const Size&     GetScreenSize( int nScreen ) const { return getDataForScreen( nScreen ).m_aSize; }
 	srv_vendor_t	GetServerVendor() const { return meServerVendor; }
 	void			SetServerVendor() { meServerVendor = sal_GetServerVendor(pDisp_); }
diff -ru vcl.orig/unx/source/app/saldisp.cxx vcl/unx/source/app/saldisp.cxx
--- vcl.orig/unx/source/app/saldisp.cxx	2010-06-14 19:51:39.516798973 +0100
+++ vcl/unx/source/app/saldisp.cxx	2010-06-15 10:12:39.627798619 +0100
@@ -65,9 +65,7 @@
 
 #ifdef USE_XINERAMA
 #ifdef USE_XINERAMA_XORG
-#if defined(X86) || defined(X86_64)
 #include <X11/extensions/Xinerama.h>
-#endif
 #elif defined USE_XINERAMA_XSUN
 #if defined(SOLARIS) && defined(INTEL) // missing extension header in standard installation
 #define MAXFRAMEBUFFERS       16
@@ -2600,6 +2598,30 @@
              sal::static_int_cast< unsigned int >(GetVisual(m_nDefaultScreen).GetVisualId()) );
 }
 
+void SalDisplay::addXineramaScreenUnique( int i, long i_nX, long i_nY, long i_nWidth, long i_nHeight )
+{
+    // see if any frame buffers are at the same coordinates
+    // this can happen with weird configuration e.g. on
+    // XFree86 and Clone displays
+    const size_t nScreens = m_aXineramaScreens.size();
+    for( size_t n = 0; n < nScreens; n++ )
+    {
+        if( m_aXineramaScreens[n].Left() == i_nX &&
+            m_aXineramaScreens[n].Top() == i_nY )
+        {
+            if( m_aXineramaScreens[n].GetWidth() < i_nWidth ||
+                m_aXineramaScreens[n].GetHeight() < i_nHeight )
+            {
+                m_aXineramaScreens[n].SetSize( Size( i_nWidth, i_nHeight ) );
+                m_aXineramaScreenIndexMap[i] = n;
+            }
+            return;
+        }
+    }
+    m_aXineramaScreenIndexMap[i] = m_aXineramaScreens.size();
+    m_aXineramaScreens.push_back( Rectangle( Point( i_nX, i_nY ), Size( i_nWidth, i_nHeight ) ) );
+}
+
 void SalDisplay::InitXinerama()
 {
     if( m_aScreens.size() > 1 )
@@ -2622,16 +2644,16 @@
         if( result > 0 && nFramebuffers > 1 )
         {
             m_bXinerama = true;
-            m_aXineramaScreens = std::vector<Rectangle>( nFramebuffers );
+            m_aXineramaScreens = std::vector<Rectangle>();
+            m_aXineramaScreenIndexMap = std::vector<int>(nFramebuffers);
             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 ) );
+                addXineramaScreenUnique( i, pFramebuffers[i].x,
+                                         pFramebuffers[i].y,
+                                         pFramebuffers[i].width,
+                                         pFramebuffers[i].height );
         }
     }
 #elif defined(USE_XINERAMA_XORG)
-#if defined( X86 ) || defined( X86_64 )
 if( XineramaIsActive( pDisp_ ) )
 {
     int nFramebuffers = 1;
@@ -2641,32 +2663,13 @@
         if( nFramebuffers > 1 )
         {
             m_aXineramaScreens = std::vector<Rectangle>();
+            m_aXineramaScreenIndexMap = std::vector<int>(nFramebuffers);
             for( int i = 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.push_back( Rectangle( Point( pScreens[i].x_org,
-                                                                    pScreens[i].y_org ),
-                                                             Size( pScreens[i].width,
-                                                                   pScreens[i].height ) ) );
+                addXineramaScreenUnique( i, pScreens[i].x_org,
+                                         pScreens[i].y_org,
+                                         pScreens[i].width,
+                                         pScreens[i].height );
             }
             m_bXinerama = m_aXineramaScreens.size() > 1;
         }
@@ -2674,7 +2677,6 @@
     }
 }
 #endif
-#endif
 #if OSL_DEBUG_LEVEL > 1
     if( m_bXinerama )
     {
@@ -2685,6 +2687,11 @@
 #endif // USE_XINERAMA
 }
 
+int SalDisplay::GetDefaultMonitorNumber() const
+{
+    return 0;
+}
+
 void SalDisplay::registerFrame( SalFrame* pFrame )
 {
     m_aFrames.push_front( pFrame );
diff -ru vcl.orig/unx/source/app/salsys.cxx vcl/unx/source/app/salsys.cxx
--- vcl.orig/unx/source/app/salsys.cxx	2010-06-14 19:51:39.515799413 +0100
+++ vcl/unx/source/app/salsys.cxx	2010-06-14 20:28:14.281799292 +0100
@@ -74,7 +74,7 @@
 unsigned int X11SalSystem::GetDefaultDisplayNumber()
 {
     SalDisplay* pSalDisp = GetX11SalData()->GetDisplay();
-    return pSalDisp->GetDefaultScreenNumber();
+    return  pSalDisp->IsXinerama() ? pSalDisp->GetDefaultMonitorNumber() : pSalDisp->GetDefaultScreenNumber();
 }
 
 Rectangle X11SalSystem::GetDisplayScreenPosSizePixel( unsigned int nScreen )


Index: openoffice.org.spec
===================================================================
RCS file: /cvs/pkgs/rpms/openoffice.org/devel/openoffice.org.spec,v
retrieving revision 1.2244
retrieving revision 1.2245
diff -u -p -r1.2244 -r1.2245
--- openoffice.org.spec	15 Jun 2010 19:04:58 -0000	1.2244
+++ openoffice.org.spec	15 Jun 2010 19:11:15 -0000	1.2245
@@ -151,6 +151,7 @@ Patch80: openoffice.org-3.3.0.ooo112247.
 Patch81: openoffice.org-3.3.0.ooo112363.accessibility.badindex.patch
 Patch82: openoffice.org-3.3.0.ooo112384.sw.export.doc.styledoesntexist.patch
 Patch83: workspace.gtkfpicker9.patch
+Patch84: openoffice.org-3.3.0.ooo111770.vcl.defaultmonitor.patch
 
 %{!?python_sitearch: %global python_sitearch %(%{__python} -c "from distutils.sysconfig import get_python_lib; print(get_python_lib(1))")}
 %define instdir %{_libdir}
@@ -1715,6 +1716,7 @@ cp -p %{SOURCE5} external/unowinreg/unow
 %patch81 -p0 -b .ooo112363.accessibility.badindex.patch
 %patch82 -p0 -b .ooo112384.sw.export.doc.styledoesntexist.patch
 %patch83 -p0 -b .workspace.gtkfpicker9.patch
+%patch84 -p0 -b .ooo111770.vcl.defaultmonitor.patch
 
 %build
 echo build start time is `date`, diskspace: `df -h . | tail -n 1`
@@ -4208,6 +4210,8 @@ fi
 %changelog
 * Tue Jun 15 2010 Caolán McNamara <caolanm at redhat.com> - 1:3.2.1-19.14
 - run smoketest in check
+- ensure presentation-screen preview defaults to displaying on 
+  gdk_screen_get_primary_monitor
 
 * Mon Jun 14 2010 Caolán McNamara <caolanm at redhat.com> - 1:3.2.1-19.13
 - Resolves: rhbz#601890/ooo#112384 avoid crash on export to .doc



More information about the scm-commits mailing list