summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Meeks <michael.meeks@suse.com>2013-07-18 14:55:12 +0100
committerMichael Meeks <michael.meeks@suse.com>2013-07-18 14:55:12 +0100
commitee4569efa8322497112e8e951a67b9adca4ac55e (patch)
tree8c92c052d20d07e09938a8a62181695ebb9bb99a
parent8ac71b29eeca8b025d7548e1cee519277af7b90f (diff)
fdo#67045 - fix several nasty screen selection issues with presenter console.
Also add the ability to select the external screen (whatever it is) to the configuration dialog. Change-Id: Id2d157eafff0031d7ae9fa2140d7022ae4a0cc6b
-rw-r--r--officecfg/registry/schema/org/openoffice/Office/Impress.xcs5
-rw-r--r--sd/source/ui/dlg/present.cxx63
-rw-r--r--sd/source/ui/inc/present.hxx4
-rw-r--r--sd/source/ui/slideshow/slideshow.cxx28
-rw-r--r--sdext/source/presenter/PresenterScreen.cxx13
5 files changed, 70 insertions, 43 deletions
diff --git a/officecfg/registry/schema/org/openoffice/Office/Impress.xcs b/officecfg/registry/schema/org/openoffice/Office/Impress.xcs
index 81618068467d..410a86995ece 100644
--- a/officecfg/registry/schema/org/openoffice/Office/Impress.xcs
+++ b/officecfg/registry/schema/org/openoffice/Office/Impress.xcs
@@ -504,7 +504,10 @@
<!-- OldLocation: -->
<!-- UIHints: slide show settings display listbox -->
<info>
- <desc>Number of the display used for full screen slide show mode.</desc>
+ <desc>Offset number of the display used for full screen slide show mode;
+ -1 means all screens,
+ 0 means default external screen,
+ N>0 means real-screen number + 1.</desc>
<label>Display for full screen slide show mode</label>
</info>
<value>0</value>
diff --git a/sd/source/ui/dlg/present.cxx b/sd/source/ui/dlg/present.cxx
index fa638597fb18..6aec2896a4e8 100644
--- a/sd/source/ui/dlg/present.cxx
+++ b/sd/source/ui/dlg/present.cxx
@@ -149,6 +149,26 @@ SdStartPresentationDlg::SdStartPresentationDlg( Window* pWindow,
ChangePauseHdl( NULL );
}
+String SdStartPresentationDlg::GetDisplayName( sal_Int32 nDisplay, bool bExternal )
+{
+ String aName( bExternal ? msExternalMonitor->GetText() :
+ msMonitor->GetText() );
+ const String aNumber( OUString::number( nDisplay ) );
+ aName.SearchAndReplace( String("%1"), aNumber );
+ return aName;
+}
+
+/// Store display index together with name in user data
+sal_Int32 SdStartPresentationDlg::InsertDisplayEntry(const rtl::OUString &aName,
+ sal_Int32 nDisplay)
+{
+ maLBMonitor->InsertEntry( aName );
+ const sal_uInt32 nEntryIndex = maLBMonitor->GetEntryCount() - 1;
+ maLBMonitor->SetEntryData( nEntryIndex, (void*)(sal_IntPtr)nDisplay );
+
+ return nEntryIndex;
+}
+
void SdStartPresentationDlg::InitMonitorSettings()
{
try
@@ -172,36 +192,39 @@ void SdStartPresentationDlg::InitMonitorSettings()
sal_Int32 nDefaultExternalIndex (-1);
const sal_Int32 nDefaultSelectedDisplay (
( ( const SfxInt32Item& ) rOutAttrs.Get( ATTR_PRESENT_DISPLAY ) ).GetValue());
- const String sPlaceHolder( "%1" );
+
+ // Un-conditionally add a version for '0' the default external display
+ sal_Int32 nInsertedEntry;
+
+ // FIXME: string-freeze this should really be 'External (display %)'
+ String aName = GetDisplayName( nExternalIndex + 1, true);
+ nInsertedEntry = InsertDisplayEntry( aName, 0 );
+ if( nDefaultSelectedDisplay == 0)
+ nSelectedIndex = nInsertedEntry;
+
+ // The user data contains the real setting
for( sal_Int32 nDisplay = 0; nDisplay < mnMonitors; nDisplay++ )
{
- String aName( nDisplay == nExternalIndex ?
- msExternalMonitor->GetText() :
- msMonitor->GetText() );
- const String aNumber( OUString::number( nDisplay + 1 ) );
- aName.SearchAndReplace( sPlaceHolder, aNumber );
- maLBMonitor->InsertEntry( aName );
-
- // Store display index together with name.
- const sal_uInt32 nEntryIndex (maLBMonitor->GetEntryCount()-1);
- maLBMonitor->SetEntryData(nEntryIndex, (void*)(sal_IntPtr)nDisplay);
+ bool bIsExternal = nDisplay == nExternalIndex;
+ // FIXME: string-freeze, use true to denote external for now
+ bIsExternal = false;
+ aName = GetDisplayName( nDisplay + 1, bIsExternal );
+ nInsertedEntry = InsertDisplayEntry( aName, nDisplay + 1 );
// Remember the index of the default selection.
- if (nDefaultSelectedDisplay == nDisplay)
- nSelectedIndex = nEntryIndex;
+ if( nDisplay + 1 == nDefaultSelectedDisplay )
+ nSelectedIndex = nInsertedEntry;
// Remember index of the default display.
- if (nDisplay == nExternalIndex)
- nDefaultExternalIndex = nEntryIndex;
+ if( nDisplay == nExternalIndex )
+ nDefaultExternalIndex = nInsertedEntry;
}
if( bUnifiedDisplay )
{
- maLBMonitor->InsertEntry( msAllMonitors->GetText() );
- const sal_uInt32 nEntryIndex (maLBMonitor->GetEntryCount()-1);
- maLBMonitor->SetEntryData(nEntryIndex, (void*)-1);
- if (nDefaultSelectedDisplay == -1)
- nSelectedIndex = nEntryIndex;
+ nInsertedEntry = InsertDisplayEntry( msAllMonitors->GetText(), -1 );
+ if( nDefaultSelectedDisplay == -1 )
+ nSelectedIndex = nInsertedEntry;
}
if (nSelectedIndex < 0)
diff --git a/sd/source/ui/inc/present.hxx b/sd/source/ui/inc/present.hxx
index 393e03a4759f..ef27bfbe5da3 100644
--- a/sd/source/ui/inc/present.hxx
+++ b/sd/source/ui/inc/present.hxx
@@ -74,7 +74,9 @@ private:
DECL_LINK( ChangePauseHdl, void * );
void InitMonitorSettings();
-
+ sal_Int32 InsertDisplayEntry(const rtl::OUString &aName,
+ sal_Int32 nDisplay);
+ String GetDisplayName( sal_Int32 nDisplay, bool bExternal );
public:
SdStartPresentationDlg( Window* pWindow,
const SfxItemSet& rInAttrs,
diff --git a/sd/source/ui/slideshow/slideshow.cxx b/sd/source/ui/slideshow/slideshow.cxx
index 0fa31942940d..a34e66008c49 100644
--- a/sd/source/ui/slideshow/slideshow.cxx
+++ b/sd/source/ui/slideshow/slideshow.cxx
@@ -550,14 +550,6 @@ void SAL_CALL SlideShow::setPropertyValue( const OUString& aPropertyName, const
sal_Int32 nDisplay = 0;
if( aValue >>= nDisplay )
{
- // Convert value to true display id.
- if (nDisplay == 0)
- nDisplay = Application::GetDisplayExternalScreen();
- else if (nDisplay < 0)
- nDisplay = -1;
- else
- --nDisplay;
-
bIllegalArgument = false;
SdOptions* pOptions = SD_MOD()->GetSdOptions(DOCUMENT_TYPE_IMPRESS);
@@ -642,14 +634,7 @@ Any SAL_CALL SlideShow::getPropertyValue( const OUString& PropertyName ) throw(U
case ATTR_PRESENT_DISPLAY:
{
SdOptions* pOptions = SD_MOD()->GetSdOptions(DOCUMENT_TYPE_IMPRESS);
- const sal_Int32 nDisplay (pOptions->GetDisplay());
- // Convert true display id to the previously used schema.
- if (nDisplay == (sal_Int32)Application::GetDisplayExternalScreen())
- return Any(sal_Int32(0));
- else if (nDisplay < 0)
- return Any(sal_Int32(-1));
- else
- return Any(nDisplay+1);
+ return Any(pOptions->GetDisplay());
}
default:
@@ -1288,8 +1273,8 @@ void SlideShow::StartFullscreenPresentation( )
// ---------------------------------------------------------
+/// convert configuration setting display concept to real screens
sal_Int32 SlideShow::GetDisplay()
-
{
sal_Int32 nDisplay = 0;
@@ -1297,6 +1282,15 @@ sal_Int32 SlideShow::GetDisplay()
if( pOptions )
nDisplay = pOptions->GetDisplay();
+ if( nDisplay < 0 )
+ nDisplay = -1;
+ else if( nDisplay == 0)
+ nDisplay = (sal_Int32)Application::GetDisplayExternalScreen();
+ else
+ nDisplay--;
+
+ SAL_INFO("sd", "Presenting on real screen " << nDisplay);
+
return nDisplay;
}
diff --git a/sdext/source/presenter/PresenterScreen.cxx b/sdext/source/presenter/PresenterScreen.cxx
index 2f1aeaa22778..05caa7e80f1c 100644
--- a/sdext/source/presenter/PresenterScreen.cxx
+++ b/sdext/source/presenter/PresenterScreen.cxx
@@ -448,9 +448,10 @@ void PresenterScreen::SwitchMonitors()
}
}
-// FIXME: really VCL should hold the current 'external' and 'built-in'
-// display states, and hide them behind some attractive API, and
-// the PresenterConsole should link VCL directly ...
+/**
+ * Return the real VCL screen number to show the presenter console
+ * on or -1 to not show anything.
+ */
sal_Int32 PresenterScreen::GetPresenterScreenNumber (
const Reference<presentation::XPresentation2>& rxPresentation) const
{
@@ -475,6 +476,8 @@ sal_Int32 PresenterScreen::GetPresenterScreenNumber (
return -1;
}
+ SAL_INFO("sdext.presenter", "Display number is " << nDisplayNumber);
+
if (nDisplayNumber > 0)
{
nScreenNumber = nDisplayNumber - 1;
@@ -518,7 +521,7 @@ sal_Int32 PresenterScreen::GetPresenterScreenNumber (
// For some reason we can not access the screen number. Use
// the default instead.
}
-
+ SAL_INFO("sdext.presenter", "Get presenter screen for screen " << nScreenNumber);
return GetPresenterScreenFromScreen(nScreenNumber);
}
@@ -538,6 +541,8 @@ sal_Int32 PresenterScreen::GetPresenterScreenFromScreen( sal_Int32 nPresentation
break;
default:
+ SAL_INFO("sdext.presenter", "Warning unexpected, out of bound screen "
+ "mapped to 0" << nPresentationScreen);
// When the full screen presentation is displayed on a screen
// other than 0 or 1 then place the presenter on the first
// available screen.