diff options
author | Caolán McNamara <caolanm@redhat.com> | 2019-11-27 14:58:00 +0000 |
---|---|---|
committer | Caolán McNamara <caolanm@redhat.com> | 2019-11-27 20:22:48 +0100 |
commit | e55a1dc163165cb79fc9113101d16ee8d3db7298 (patch) | |
tree | d80f08a7f040b2be82d43731188ce7b28f82829e | |
parent | 19503a467f73e7a619b9fbd8e0c7a6cc9d8ba237 (diff) |
don't put focus into unmapped windows
defer until the color selectors are activated to grab focus, otherwise
esc doesn't work to close a dialog under gtk3 until focus is put
into some visible widget
Change-Id: I297c2738c4103024bbefd70bbcb5d72b8429dd3e
Reviewed-on: https://gerrit.libreoffice.org/83917
Tested-by: Jenkins
Reviewed-by: Caolán McNamara <caolanm@redhat.com>
Tested-by: Caolán McNamara <caolanm@redhat.com>
-rw-r--r-- | include/svtools/ctrlbox.hxx | 1 | ||||
-rw-r--r-- | include/svx/colorbox.hxx | 3 | ||||
-rw-r--r-- | include/svx/colorwindow.hxx | 3 | ||||
-rw-r--r-- | svtools/source/control/ctrlbox.cxx | 13 | ||||
-rw-r--r-- | svx/source/tbxctrls/tbcontrl.cxx | 16 |
5 files changed, 26 insertions, 10 deletions
diff --git a/include/svtools/ctrlbox.hxx b/include/svtools/ctrlbox.hxx index e023a399e2bb..1de4677ffb77 100644 --- a/include/svtools/ctrlbox.hxx +++ b/include/svtools/ctrlbox.hxx @@ -254,6 +254,7 @@ private: void UpdatePaintLineColor(); // returns sal_True if maPaintCol has changed DECL_LINK(ValueSelectHdl, SvtValueSet*, void); DECL_LINK(FocusHdl, weld::Widget&, void); + DECL_LINK(ToggleHdl, weld::ToggleButton&, void); DECL_LINK(NoneHdl, weld::Button&, void); void UpdateEntries(); diff --git a/include/svx/colorbox.hxx b/include/svx/colorbox.hxx index b61443ce0b61..5bbc7e45dbde 100644 --- a/include/svx/colorbox.hxx +++ b/include/svx/colorbox.hxx @@ -104,6 +104,9 @@ private: void createColorWindow(); void LockWidthRequest(); ColorWindow* getColorWindow() const; + + DECL_LINK(ToggleHdl, weld::ToggleButton&, void); + public: ColorListBox(std::unique_ptr<weld::MenuButton> pControl, weld::Window* pWindow); ~ColorListBox(); diff --git a/include/svx/colorwindow.hxx b/include/svx/colorwindow.hxx index c7ff6d52c054..acc18149e2ca 100644 --- a/include/svx/colorwindow.hxx +++ b/include/svx/colorwindow.hxx @@ -154,7 +154,6 @@ private: DECL_LINK(SelectPaletteHdl, weld::ComboBox&, void); DECL_LINK(AutoColorClickHdl, weld::Button&, void); DECL_LINK(OpenPickerClickHdl, weld::Button&, void); - DECL_LINK(FocusHdl, weld::Widget&, void); static bool SelectValueSetEntry(ColorValueSet* pColorSet, const Color& rColor); static NamedColor GetSelectEntryColor(SvtValueSet const * pColorSet); @@ -176,6 +175,8 @@ public: void SelectEntry(const Color& rColor); NamedColor GetSelectEntryColor() const; + DECL_LINK(FocusHdl, weld::Widget&, void); + virtual void statusChanged( const css::frame::FeatureStateEvent& rEvent ) override; }; diff --git a/svtools/source/control/ctrlbox.cxx b/svtools/source/control/ctrlbox.cxx index 397524b934da..f186d39785f5 100644 --- a/svtools/source/control/ctrlbox.cxx +++ b/svtools/source/control/ctrlbox.cxx @@ -1536,6 +1536,7 @@ SvtLineListBox::SvtLineListBox(std::unique_ptr<weld::MenuButton> pControl) m_xTopLevel->connect_focus_in(LINK(this, SvtLineListBox, FocusHdl)); m_xControl->set_popover(m_xTopLevel.get()); + m_xControl->connect_toggled(LINK(this, SvtLineListBox, ToggleHdl)); // lock size to these maxes height/width so it doesn't jump around in size m_xControl->set_label(GetLineStyleName(SvxBorderLineStyle::NONE)); @@ -1563,6 +1564,12 @@ IMPL_LINK_NOARG(SvtLineListBox, FocusHdl, weld::Widget&, void) m_xLineSet->GrabFocus(); } +IMPL_LINK(SvtLineListBox, ToggleHdl, weld::ToggleButton&, rButton, void) +{ + if (rButton.get_active()) + FocusHdl(*m_xTopLevel); +} + IMPL_LINK_NOARG(SvtLineListBox, NoneHdl, weld::Button&, void) { SelectEntry(SvxBorderLineStyle::NONE); @@ -1595,15 +1602,9 @@ sal_Int32 SvtLineListBox::GetStylePos( sal_Int32 nListPos ) void SvtLineListBox::SelectEntry(SvxBorderLineStyle nStyle) { if (nStyle == SvxBorderLineStyle::NONE) - { m_xLineSet->SetNoSelection(); - m_xNoneButton->grab_focus(); - } else - { m_xLineSet->SelectItem(static_cast<sal_Int16>(nStyle) + 1); - m_xLineSet->GrabFocus(); - } UpdatePreview(); } diff --git a/svx/source/tbxctrls/tbcontrl.cxx b/svx/source/tbxctrls/tbcontrl.cxx index 564f7f43b2e2..f1830385a87f 100644 --- a/svx/source/tbxctrls/tbcontrl.cxx +++ b/svx/source/tbxctrls/tbcontrl.cxx @@ -1880,7 +1880,10 @@ ColorWindow::ColorWindow(std::shared_ptr<PaletteManager> const & rPaletteManager IMPL_LINK_NOARG(ColorWindow, FocusHdl, weld::Widget&, void) { - mxColorSet->GrabFocus(); + if (mxColorSet->IsNoSelection() && mpDefaultButton) + mpDefaultButton->grab_focus(); + else + mxColorSet->GrabFocus(); } void ColorWindow::ShowNoneButton() @@ -2081,7 +2084,9 @@ IMPL_LINK(ColorWindow, AutoColorClickHdl, weld::Button&, rButton, void) { NamedColor aNamedColor = &rButton == mxButtonAutoColor.get() ? GetAutoColor() : GetNoneColor(); + mxColorSet->SetNoSelection(); mxRecentColorSet->SetNoSelection(); + mpDefaultButton = &rButton; if (maMenuButton.get_active()) maMenuButton.set_active(false); @@ -2265,14 +2270,12 @@ void ColorWindow::SelectEntry(const NamedColor& rNamedColor) if (mxButtonAutoColor->get_visible() && (rColor == COL_TRANSPARENT || rColor == COL_AUTO)) { mpDefaultButton = mxButtonAutoColor.get(); - mxButtonAutoColor->grab_focus(); return; } if (mxButtonNoneColor->get_visible() && rColor == COL_NONE_COLOR) { mpDefaultButton = mxButtonNoneColor.get(); - mxButtonNoneColor->grab_focus(); return; } @@ -4123,11 +4126,18 @@ ColorListBox::ColorListBox(std::unique_ptr<weld::MenuButton> pControl, weld::Win , m_nSlotId(0) , m_bShowNoneButton(false) { + m_xButton->connect_toggled(LINK(this, ColorListBox, ToggleHdl)); m_aSelectedColor = GetAutoColor(m_nSlotId); LockWidthRequest(); ShowPreview(m_aSelectedColor); } +IMPL_LINK(ColorListBox, ToggleHdl, weld::ToggleButton&, rButton, void) +{ + if (rButton.get_active()) + getColorWindow()->FocusHdl(*m_xButton); +} + ColorListBox::~ColorListBox() { } |