diff options
author | Caolán McNamara <caolanm@redhat.com> | 2016-08-11 15:03:00 +0100 |
---|---|---|
committer | Caolán McNamara <caolanm@redhat.com> | 2016-08-11 16:09:23 +0100 |
commit | d9bf3df8143779f0caea2094efa4891370038977 (patch) | |
tree | 71cae5b5caec4d90a56bdba75efd1a80c8909913 /sfx2 | |
parent | 8ff5e67dea29d9ceb100a67a69f6deb4c6f18e13 (diff) |
gtk3: style combobox never becomes sensitive if it starts insensitive
Place cursor inside a protected section in writer, e.g. a table of contents.
Save, and reload. The cursor starts inside the protected section.
With the native gtk3 menubar the styles dropdown in the top left is
grayed out. Moving the cursor outside the protected area does not
make it active again.
Under gen it works fine.
*Extensive* debugging shows that there is a cache based on the numeric
slots of commands to their dispatcher, e.g. SfxBindings::GetStateCache
so if you SfxBindings::QueryState for a given uno command then it will
look up what dispatcher to listen to by slot id.
This StyleApply command appears in a number of places in LibreOffice,
the toolbar as .uno:StyleApply, *but* .uno:StyleApply?A_Bunch_Of_Args
elsewhere in the menus.
In the gtk3 plugin it so happens that all the menu items are parsed
and listeners set before the toolbar is created. While in the gen
plugin the toolbar is created, and the menus are on-demand later.
So under gen the dispatcher is created for ".uno:StyleApply" and
other .uno:StyleApply?* go through that one. Under gtk3 the dispatcher
is created for ".uno:StyleApply?A_Bunch_Of_Args".
So, when SfxDispatchController_Impl::StateChanged is called, the
aDispatchURL.Complete argument is ".uno:StyleApply?A_Bunch_Of_Args", but,
because it was supplied as a cached result from the shared slot, some
listeners have been added that want to listen to ".uno:StyleApply".
The name doesn't match, so looking up the listeners listening to the
command with argument finds nothing, so those listeners on the name
without argument are not fired.
Here I look up all the property names that the listeners were added to listen
to (1 in all cases I've seen in casual testing) and if either the name with
full args or no args matches then inform that listener that something has
changed.
Change-Id: Ib5858ccb16dce41e249ee911751053fd277551b8
Diffstat (limited to 'sfx2')
-rw-r--r-- | sfx2/source/control/unoctitm.cxx | 8 |
1 files changed, 7 insertions, 1 deletions
diff --git a/sfx2/source/control/unoctitm.cxx b/sfx2/source/control/unoctitm.cxx index 33e611e4f181..14c28ce384d1 100644 --- a/sfx2/source/control/unoctitm.cxx +++ b/sfx2/source/control/unoctitm.cxx @@ -931,7 +931,13 @@ void SfxDispatchController_Impl::StateChanged( sal_uInt16 nSID, SfxItemState eSt InterceptLOKStateChangeEvent(pDispatcher->GetFrame(), aEvent); } - sendStatusChanged(aDispatchURL.Complete, aEvent); + Sequence< OUString > seqNames = pDispatch->GetListeners().getContainedTypes(); + sal_Int32 nLength = seqNames.getLength(); + for (sal_Int32 i = 0; i < nLength; ++i) + { + if (seqNames[i] == aDispatchURL.Main || seqNames[i] == aDispatchURL.Complete) + sendStatusChanged(seqNames[i], aEvent); + } } } |