diff options
author | Michael Meeks <michael.meeks@suse.com> | 2013-04-30 11:19:56 +0100 |
---|---|---|
committer | Michael Meeks <michael.meeks@suse.com> | 2013-04-30 11:22:05 +0100 |
commit | c53f1d1fa8714c330528c9b872b06f3271216f83 (patch) | |
tree | d478bb57880dd073f3d5be4b568a8c0c5e8c8691 /vcl/unx | |
parent | 341ff124eca09ba3a2c8daad56134c2b65f2aca1 (diff) |
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
Diffstat (limited to 'vcl/unx')
-rw-r--r-- | vcl/unx/gtk/app/gtksys.cxx | 12 | ||||
-rw-r--r-- | vcl/unx/gtk/window/gtksalframe.cxx | 11 |
2 files changed, 23 insertions, 0 deletions
diff --git a/vcl/unx/gtk/app/gtksys.cxx b/vcl/unx/gtk/app/gtksys.cxx index e389eb4ae0a4..1d2d7313b564 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/gtksalframe.cxx b/vcl/unx/gtk/window/gtksalframe.cxx index 8f5af1f8714e..041a8a060bac 100644 --- a/vcl/unx/gtk/window/gtksalframe.cxx +++ b/vcl/unx/gtk/window/gtksalframe.cxx @@ -2038,7 +2038,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 )) @@ -2046,6 +2054,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 ?" ); |