parent
01fb3649a8
commit
5db71d6bd8
@ -0,0 +1,252 @@
|
|||||||
|
From 94dd6a449fe3c17f97264dd01bf263eb268ac19d Mon Sep 17 00:00:00 2001
|
||||||
|
From: Michael Meeks <michael.meeks@suse.com>
|
||||||
|
Date: Thu, 18 Jul 2013 14:51:29 +0100
|
||||||
|
Subject: [PATCH] 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: I2c81175143ba8fdd7c9aee1dac433742c2a0ba69
|
||||||
|
Reviewed-on: https://gerrit.libreoffice.org/4971
|
||||||
|
Reviewed-by: Fridrich Strba <fridrich@documentfoundation.org>
|
||||||
|
Tested-by: Fridrich Strba <fridrich@documentfoundation.org>
|
||||||
|
---
|
||||||
|
.../schema/org/openoffice/Office/Impress.xcs | 5 +-
|
||||||
|
sd/source/ui/dlg/present.cxx | 63 +++++++++++++++-------
|
||||||
|
sd/source/ui/inc/present.hxx | 4 +-
|
||||||
|
sd/source/ui/slideshow/slideshow.cxx | 28 ++++------
|
||||||
|
sdext/source/presenter/PresenterScreen.cxx | 13 +++--
|
||||||
|
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 8161806..410a869 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 9fce09b..6aec289 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( RTL_CONSTASCII_USTRINGPARAM( "%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 393e03a..ef27bfb 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 f9154e2..50a93e5 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 f361912..f986944 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.
|
||||||
|
--
|
||||||
|
1.8.3.1
|
||||||
|
|
Loading…
Reference in new issue