[Libreoffice-commits] core.git: Branch 'libreoffice-4-0' - vcl/unx

Michael Meeks michael.meeks at suse.com
Tue Apr 30 03:50:34 PDT 2013


 vcl/unx/gtk/app/gtksys.cxx      |   12 ++++++++++++
 vcl/unx/gtk/window/gtkframe.cxx |   11 +++++++++++
 2 files changed, 23 insertions(+)

New commits:
commit ff3ce21011beda7c835db0979292d29dfa832d6b
Author: Michael Meeks <michael.meeks at suse.com>
Date:   Tue Apr 30 11:19:56 2013 +0100

    fdo#62815 - tolerate crazy / out-of-bound ScreenNumbers for FullScreen
    
    Thus making the gtk+ backend more similar to the generic backend
    in this regard; also be more strict about invalid monitors -> empty
    screens.
    
    Change-Id: Ia4f2e1205cb1d309fb1bb01f9631167339a3478e
    
    Signed-off-by: Petr Mladek <pmladek at suse.cz>

diff --git a/vcl/unx/gtk/app/gtksys.cxx b/vcl/unx/gtk/app/gtksys.cxx
index bc06b25..c822fd2 100644
--- a/vcl/unx/gtk/app/gtksys.cxx
+++ b/vcl/unx/gtk/app/gtksys.cxx
@@ -70,6 +70,13 @@ struct GdkRectangleEqual
 
 }
 
+/**
+ * GtkSalSystem::countScreenMonitors()
+ *
+ * This method builds the vector which allows us to map from VCL's
+ * idea of linear integer ScreenNumber to to gtk+'s rather more
+ * complicated screen + monitor concept.
+ */
 void
 GtkSalSystem::countScreenMonitors()
 {
@@ -134,6 +141,11 @@ GtkSalSystem::getScreenMonitorFromIdx (int nIdx, gint &nMonitor)
             break;
     }
     nMonitor = nIdx;
+
+    // handle invalid monitor indexes as non-existent screens
+    if (nMonitor < 0 || (pScreen && nMonitor >= gdk_screen_get_n_monitors (pScreen)))
+        pScreen = NULL;
+
     return pScreen;
 }
 
diff --git a/vcl/unx/gtk/window/gtkframe.cxx b/vcl/unx/gtk/window/gtkframe.cxx
index eb87e74..d783e95 100644
--- a/vcl/unx/gtk/window/gtkframe.cxx
+++ b/vcl/unx/gtk/window/gtkframe.cxx
@@ -2059,7 +2059,15 @@ void GtkSalFrame::SetScreen( unsigned int nNewScreen, int eType, Rectangle *pSiz
         return;
 
     gint nMonitor;
+    bool bSameMonitor = false;
     GdkScreen *pScreen = getDisplay()->getSystem()->getScreenMonitorFromIdx( nNewScreen, nMonitor );
+    if (!pScreen)
+    {
+        g_warning ("Attempt to move GtkSalFrame to invalid screen %d => "
+                   "fallback to current\n", nNewScreen);
+        pScreen = gtk_widget_get_screen( m_pWindow );
+        bSameMonitor = true;
+    }
 
     // Heavy lifting, need to move screen ...
     if( pScreen != gtk_widget_get_screen( m_pWindow ))
@@ -2067,6 +2075,9 @@ void GtkSalFrame::SetScreen( unsigned int nNewScreen, int eType, Rectangle *pSiz
 
     gint nOldMonitor = gdk_screen_get_monitor_at_window(
                             pScreen, widget_get_window( m_pWindow ) );
+    if (bSameMonitor)
+        nMonitor = nOldMonitor;
+
 #if OSL_DEBUG_LEVEL > 1
     if( nMonitor == nOldMonitor )
         g_warning( "An apparently pointless SetScreen - should we elide it ?" );


More information about the Libreoffice-commits mailing list