From 711f14915049ff535c0fc59be36c350eb448f808 Mon Sep 17 00:00:00 2001 From: Stephan Bergmann Date: Fri, 5 Oct 2012 15:58:33 +0200 Subject: [PATCH] fdo#46071 Do not hide windows based on nil Visible property --- ...-hide-windows-based-on-nil-Visible-p.patch | 173 ++++++++++++++++++ libreoffice.spec | 7 +- 2 files changed, 179 insertions(+), 1 deletion(-) create mode 100644 0001-fdo-46071-Do-not-hide-windows-based-on-nil-Visible-p.patch diff --git a/0001-fdo-46071-Do-not-hide-windows-based-on-nil-Visible-p.patch b/0001-fdo-46071-Do-not-hide-windows-based-on-nil-Visible-p.patch new file mode 100644 index 0000000..318f032 --- /dev/null +++ b/0001-fdo-46071-Do-not-hide-windows-based-on-nil-Visible-p.patch @@ -0,0 +1,173 @@ +From d59639f10067f8bc449a7ad7241c461f59b8d5e4 Mon Sep 17 00:00:00 2001 +From: Stephan Bergmann +Date: Fri, 5 Oct 2012 15:00:39 +0200 +Subject: [PATCH] fdo#46071: Do not hide windows based on nil "Visible" + property + +This appears to be messy: The /org.openoffice.Office.Views/WindowType +configuration group template has both a nilable bool "Visible" property and a +UserData/Data string property that encodes various things like geometry---but +also visibility---in a string. + +Now, likely due to the problem that has meanwhile been fixed through +f3f79cc9e6c265baf48955d53f7e888205e0b3e0 "Resolves fdo#46074: Fix +Partial::contains for paths that go past a leaf node," some +registrymodification.xcu files in the wild contain such WindowType entries in +"default" state, without a UserData/Data string and with a nil "Visible" +property. + +The way SfxChildWindow::InitializeChildWinFactory_Impl and +SvtViewOptions::IsVisible are implemented, they will always lead to an invisible +window for such broken registrymodification.xcu data (as IsVisible unhelpfully +returns false for a nil value, and InitializeChildWinFactory_Impl uses that +value when there is no UserData/Data string). + +For the Math formula editor window (ID 30378) this means that it can disappear +from the UI completely, as there appears to be no UI trigger for the user to +show it in case it is hidden. + +The fix is to introdue SvtViewOptions::HasVisible (which only returns true if +the property is not nil) and change InitializeChidlWinFactory_Impl to only use +the value of IsVisible() if HasVisible() returns true. This makes the code even +more baroque, but this is a rather central, generic piece of code for all sorts +of windows, so I do not want to break any other uses by e.g. changing IsVisible +to return true for a nil property. + +Change-Id: Iae40075a7116a8aabd2d25aa9334709522e23d8f +(cherry picked from commit 9db74c6133ede2a28af077fd563398176ff0d858) +--- + sfx2/source/appl/childwin.cxx | 2 +- + unotools/inc/unotools/viewoptions.hxx | 7 ++++++ + unotools/source/config/viewoptions.cxx | 40 ++++++++++++++++++++++++++++------ + 3 files changed, 41 insertions(+), 8 deletions(-) + +diff --git a/sfx2/source/appl/childwin.cxx b/sfx2/source/appl/childwin.cxx +index a698002..13afd10 100644 +--- a/sfx2/source/appl/childwin.cxx ++++ b/sfx2/source/appl/childwin.cxx +@@ -365,7 +365,7 @@ void SfxChildWindow::InitializeChildWinFactory_Impl( sal_uInt16 nId, SfxChildWin + // load configuration + SvtViewOptions aWinOpt( E_WINDOW, String::CreateFromInt32( nId ) ); + +- if ( aWinOpt.Exists() ) ++ if ( aWinOpt.Exists() && aWinOpt.HasVisible() ) + rInfo.bVisible = aWinOpt.IsVisible(); // set state from configuration. Can be overwritten by UserData, see below + + ::com::sun::star::uno::Sequence < ::com::sun::star::beans::NamedValue > aSeq = aWinOpt.GetUserData(); +diff --git a/unotools/inc/unotools/viewoptions.hxx b/unotools/inc/unotools/viewoptions.hxx +index 34c0059..faad441 100644 +--- a/unotools/inc/unotools/viewoptions.hxx ++++ b/unotools/inc/unotools/viewoptions.hxx +@@ -264,6 +264,13 @@ class UNOTOOLS_DLLPUBLIC SvtViewOptions: public utl::detail::Options + sal_Bool IsVisible ( ) const; + void SetVisible( sal_Bool bState ); + ++ /** Return true if the "Visible" property actually has a non-nil value ++ ++ (IsVisible will somewhat arbitrarily return false if the property is ++ nil.) ++ */ ++ bool HasVisible() const; ++ + /*-****************************************************************************************************//** + @short use it to set/get the extended user data (consisting of a set of named scalar values) + @descr It's supported for ALL types! +diff --git a/unotools/source/config/viewoptions.cxx b/unotools/source/config/viewoptions.cxx +index 112ffbb..a327c77 100644 +--- a/unotools/source/config/viewoptions.cxx ++++ b/unotools/source/config/viewoptions.cxx +@@ -283,6 +283,8 @@ class SvtViewOptionsBase_Impl + { + //------------------------------------------------------------------------------------------------------------- + public: ++ enum State { STATE_NONE, STATE_FALSE, STATE_TRUE }; ++ + SvtViewOptionsBase_Impl ( const ::rtl::OUString& sList ); + virtual ~SvtViewOptionsBase_Impl ( ); + sal_Bool Exists ( const ::rtl::OUString& sName ); +@@ -296,7 +298,7 @@ class SvtViewOptionsBase_Impl + sal_Int32 GetPageID ( const ::rtl::OUString& sName ); + void SetPageID ( const ::rtl::OUString& sName , + sal_Int32 nID ); +- sal_Bool GetVisible ( const ::rtl::OUString& sName ); ++ State GetVisible ( const ::rtl::OUString& sName ); + void SetVisible ( const ::rtl::OUString& sName , + sal_Bool bVisible ); + css::uno::Any GetUserItem ( const ::rtl::OUString& sName , +@@ -703,28 +705,33 @@ void SvtViewOptionsBase_Impl::SetPageID( const ::rtl::OUString& sName , + } + + //***************************************************************************************************************** +-sal_Bool SvtViewOptionsBase_Impl::GetVisible( const ::rtl::OUString& sName ) ++SvtViewOptionsBase_Impl::State SvtViewOptionsBase_Impl::GetVisible( const ::rtl::OUString& sName ) + { + #ifdef DEBUG_VIEWOPTIONS + ++m_nReadCount; + #endif + +- sal_Bool bVisible = sal_False; ++ State eState = STATE_NONE; + try + { + css::uno::Reference< css::beans::XPropertySet > xNode( + impl_getSetNode(sName, sal_False), + css::uno::UNO_QUERY); + if (xNode.is()) +- xNode->getPropertyValue(PROPERTY_VISIBLE) >>= bVisible; ++ { ++ sal_Bool bVisible = sal_False; ++ if (xNode->getPropertyValue(PROPERTY_VISIBLE) >>= bVisible) ++ { ++ eState = bVisible ? STATE_TRUE : STATE_FALSE; ++ } ++ } + } + catch(const css::uno::Exception& ex) + { +- bVisible = sal_False; + SVTVIEWOPTIONS_LOG_UNEXPECTED_EXCEPTION(ex) + } + +- return bVisible; ++ return eState; + } + + //***************************************************************************************************************** +@@ -1082,7 +1089,7 @@ sal_Bool SvtViewOptions::IsVisible() const + + sal_Bool bState = sal_False; + if( m_eViewType == E_WINDOW ) +- bState = m_pDataContainer_Windows->GetVisible( m_sViewName ); ++ bState = m_pDataContainer_Windows->GetVisible( m_sViewName ) == SvtViewOptionsBase_Impl::STATE_TRUE; + + return bState; + } +@@ -1104,6 +1111,25 @@ void SvtViewOptions::SetVisible( sal_Bool bState ) + } + + //***************************************************************************************************************** ++// public method ++//***************************************************************************************************************** ++bool SvtViewOptions::HasVisible() const ++{ ++ // Ready for multithreading ++ ::osl::MutexGuard aGuard( GetOwnStaticMutex() ); ++ ++ // Safe impossible cases. ++ // These call isn't allowed for dialogs, tab-dialogs or tab-pages! ++ OSL_ENSURE( !(m_eViewType==E_DIALOG||m_eViewType==E_TABDIALOG||m_eViewType==E_TABPAGE), "SvtViewOptions::IsVisible()\nCall not allowed for Dialogs, TabDialogs or TabPages! I do nothing!\n" ); ++ ++ bool bState = false; ++ if( m_eViewType == E_WINDOW ) ++ bState = m_pDataContainer_Windows->GetVisible( m_sViewName ) != SvtViewOptionsBase_Impl::STATE_NONE; ++ ++ return bState; ++} ++ ++//***************************************************************************************************************** + css::uno::Sequence< css::beans::NamedValue > SvtViewOptions::GetUserData() const + { + // Ready for multithreading +-- +1.7.11.4 + diff --git a/libreoffice.spec b/libreoffice.spec index 9e07917..4f82edc 100644 --- a/libreoffice.spec +++ b/libreoffice.spec @@ -34,7 +34,7 @@ Summary: Free Software Productivity Suite Name: libreoffice Epoch: 1 Version: %{libo_version}.2 -Release: 2%{?libo_prerelease}%{?dist} +Release: 3%{?libo_prerelease}%{?dist} License: (MPLv1.1 or LGPLv3+) and LGPLv3 and LGPLv2+ and BSD and (MPLv1.1 or GPLv2 or LGPLv2 or Netscape) and Public Domain and ASL 2.0 and Artistic Group: Applications/Productivity URL: http://www.documentfoundation.org/develop @@ -173,6 +173,7 @@ Patch13: 0001-Resolves-rhbz-842292-crash-in-calling-callback-whose.patch Patch14: 0001-Resolves-rhbz-855972-crash-on-switching-to-outline-v.patch Patch15: 0001-Resolves-rhbz-855541-XIOError-handler-multithread-wo.patch Patch16: 0001-fdo-52022-Simple-LargeControlPoints-actually-can-hav.patch +Patch17: 0001-fdo-46071-Do-not-hide-windows-based-on-nil-Visible-p.patch %{!?python_sitearch: %global python_sitearch %(%{__python} -c "from distutils.sysconfig import get_python_lib; print(get_python_lib(1))")} %define instdir %{_libdir} @@ -785,6 +786,7 @@ mv -f redhat.soc extras/source/palettes/standard.soc %patch14 -p1 -b .rhbz-855972-crash-on-switching-to-outline-v.patch %patch15 -p1 -b .rhbz-855541-XIOError-handler-multithread-wo.patch %patch16 -p1 -b .fdo-52022-Simple-LargeControlPoints-actually-can-hav.patch +%patch17 -p1 -b .fdo-46071-Do-not-hide-windows-based-on-nil-Visible-p.patch # TODO: check this # these are horribly incomplete--empty translations and copied english @@ -2015,6 +2017,9 @@ update-desktop-database %{_datadir}/applications &> /dev/null || : %endif %changelog +* Fri Oct 05 2012 Stephan Bergmann - 1:3.6.2.2-3 +- Resolves: fdo#46071 Do not hide windows based on nil Visible property + * Fri Oct 05 2012 Stephan Bergmann - 1:3.6.2.2-2 - Resolves: fdo#52022 Part of data in userdir is lost on upgrade