summaryrefslogtreecommitdiff
path: root/vcl
diff options
context:
space:
mode:
authorCaolán McNamara <caolanm@redhat.com>2020-01-09 15:45:46 +0000
committerCaolán McNamara <caolanm@redhat.com>2020-01-10 15:13:45 +0100
commit14e26096f0476b8ecb70511c304a0cdf5440ef7a (patch)
tree9aca765b2599b23ad5d88e37877c345c1a71c254 /vcl
parent9b97efd4228489f2e54a948e676917e50902fd33 (diff)
make welded toolbars on-demand that were previously on-demand
Change-Id: I795723260deb317093e83d951d968e0b3d3a1850 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/86531 Tested-by: Jenkins Reviewed-by: Caolán McNamara <caolanm@redhat.com>
Diffstat (limited to 'vcl')
-rw-r--r--vcl/source/app/salvtables.cxx37
-rw-r--r--vcl/unx/gtk3/gtk3gtkinst.cxx20
2 files changed, 46 insertions, 11 deletions
diff --git a/vcl/source/app/salvtables.cxx b/vcl/source/app/salvtables.cxx
index 3ef767cb13fe..0dd8825754dc 100644
--- a/vcl/source/app/salvtables.cxx
+++ b/vcl/source/app/salvtables.cxx
@@ -950,8 +950,11 @@ private:
std::map<sal_uInt16, VclPtr<vcl::Window>> m_aFloats;
std::map<sal_uInt16, VclPtr<PopupMenu>> m_aMenus;
+ OString m_sStartShowIdent;
+
DECL_LINK(ClickHdl, ToolBox*, void);
DECL_LINK(DropdownClick, ToolBox*, void);
+ DECL_LINK(MenuToggleListener, VclWindowEvent&, void);
public:
SalInstanceToolbar(ToolBox* pToolBox, SalInstanceBuilder* pBuilder, bool bTakeOwnership)
@@ -1024,6 +1027,9 @@ public:
sal_uInt16 nItemId = m_xToolBox->GetItemId(OUString::fromUtf8(rIdent));
assert (m_xToolBox->GetItemBits(nItemId) & ToolBoxItemBits::DROPDOWN);
+ if (rIdent == m_sStartShowIdent)
+ return true;
+
auto aFloat = m_aFloats.find(nItemId);
if (aFloat != m_aFloats.end())
{
@@ -1045,9 +1051,17 @@ public:
vcl::Window* pFloat = pPopoverWidget ? pPopoverWidget->getWidget() : nullptr;
if (pFloat)
+ {
+ pFloat->AddEventListener(LINK(this, SalInstanceToolbar, MenuToggleListener));
pFloat->EnableDocking();
+ }
sal_uInt16 nId = m_xToolBox->GetItemId(OUString::fromUtf8(rIdent));
+ auto xOldFloat = m_aFloats[nId];
+ if (xOldFloat)
+ {
+ xOldFloat->RemoveEventListener(LINK(this, SalInstanceToolbar, MenuToggleListener));
+ }
m_aFloats[nId] = pFloat;
m_aMenus[nId] = nullptr;
}
@@ -1161,9 +1175,26 @@ IMPL_LINK_NOARG(SalInstanceToolbar, DropdownClick, ToolBox*, void)
{
sal_uInt16 nItemId = m_xToolBox->GetCurItemId();
- OString sIdent = m_xToolBox->GetItemCommand(nItemId).toUtf8();
- signal_show_menu(sIdent);
- set_menu_item_active(sIdent, true);
+ m_sStartShowIdent = m_xToolBox->GetItemCommand(nItemId).toUtf8();
+ signal_toggle_menu(m_sStartShowIdent);
+ set_menu_item_active(m_sStartShowIdent, true);
+ m_sStartShowIdent.clear();
+}
+
+IMPL_LINK(SalInstanceToolbar, MenuToggleListener, VclWindowEvent&, rEvent, void)
+{
+ if (rEvent.GetId() == VclEventId::WindowEndPopupMode)
+ {
+ for (auto& rFloat : m_aFloats)
+ {
+ if (rEvent.GetWindow() == rFloat.second)
+ {
+ sal_uInt16 nItemId = rFloat.first;
+ signal_toggle_menu(m_xToolBox->GetItemCommand(nItemId).toUtf8());
+ break;
+ }
+ }
+ }
}
namespace {
diff --git a/vcl/unx/gtk3/gtk3gtkinst.cxx b/vcl/unx/gtk3/gtk3gtkinst.cxx
index bc53e4cf3cce..d52fb782df6a 100644
--- a/vcl/unx/gtk3/gtk3gtkinst.cxx
+++ b/vcl/unx/gtk3/gtk3gtkinst.cxx
@@ -7118,7 +7118,7 @@ private:
if (pMenuButton)
{
m_aMenuButtonMap[id] = std::make_unique<GtkInstanceMenuButton>(pMenuButton, m_pBuilder, false);
- g_signal_connect(pToolItem, "show-menu", G_CALLBACK(signalItemShowMenu), this);
+ g_signal_connect(pMenuButton, "toggled", G_CALLBACK(signalItemToggled), this);
}
g_signal_connect(pToolItem, "clicked", G_CALLBACK(signalItemClicked), this);
}
@@ -7136,17 +7136,23 @@ private:
signal_clicked(OString(pStr, pStr ? strlen(pStr) : 0));
}
- static void signalItemShowMenu(GtkMenuToolButton* pItem, gpointer widget)
+ static void signalItemToggled(GtkToggleButton* pItem, gpointer widget)
{
GtkInstanceToolbar* pThis = static_cast<GtkInstanceToolbar*>(widget);
SolarMutexGuard aGuard;
- pThis->signal_item_show_menu(pItem);
+ pThis->signal_item_toggled(pItem);
}
- void signal_item_show_menu(GtkMenuToolButton* pItem)
+ void signal_item_toggled(GtkToggleButton* pItem)
{
- const gchar* pStr = gtk_buildable_get_name(GTK_BUILDABLE(pItem));
- signal_show_menu(OString(pStr, pStr ? strlen(pStr) : 0));
+ for (auto& a : m_aMenuButtonMap)
+ {
+ if (a.second->getWidget() == GTK_WIDGET(pItem))
+ {
+ signal_toggle_menu(a.first);
+ break;
+ }
+ }
}
static void set_item_image(GtkToolButton* pItem, const css::uno::Reference<css::graphic::XGraphic>& rIcon)
@@ -7189,7 +7195,6 @@ public:
for (auto& a : m_aMap)
{
g_signal_handlers_block_by_func(a.second, reinterpret_cast<void*>(signalItemClicked), this);
- g_signal_handlers_block_by_func(a.second, reinterpret_cast<void*>(signalItemShowMenu), this);
}
}
@@ -7197,7 +7202,6 @@ public:
{
for (auto& a : m_aMap)
{
- g_signal_handlers_unblock_by_func(a.second, reinterpret_cast<void*>(signalItemShowMenu), this);
g_signal_handlers_unblock_by_func(a.second, reinterpret_cast<void*>(signalItemClicked), this);
}
}