include/svtools/ctrlbox.hxx        |    1 +
 include/svx/colorbox.hxx           |    3 +++
 include/svx/colorwindow.hxx        |    3 ++-
 svtools/source/control/ctrlbox.cxx |   13 +++++++------
 svx/source/tbxctrls/tbcontrl.cxx   |   16 +++++++++++++---
 5 files changed, 26 insertions(+), 10 deletions(-)

New commits:
commit 794d5a3bb225bbfaced4dd968734783f073ba70b
Author:     Caolán McNamara <caol...@redhat.com>
AuthorDate: Wed Nov 27 14:58:00 2019 +0000
Commit:     Caolán McNamara <caol...@redhat.com>
CommitDate: Thu Nov 28 13:31:44 2019 +0100

    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 <caol...@redhat.com>
    Tested-by: Caolán McNamara <caol...@redhat.com>
    (cherry picked from commit e55a1dc163165cb79fc9113101d16ee8d3db7298)
    Reviewed-on: https://gerrit.libreoffice.org/83966

diff --git a/include/svtools/ctrlbox.hxx b/include/svtools/ctrlbox.hxx
index 1805778aa3d2..a02484d005aa 100644
--- a/include/svtools/ctrlbox.hxx
+++ b/include/svtools/ctrlbox.hxx
@@ -255,6 +255,7 @@ private:
     DECL_LINK(StyleUpdated, weld::Widget&, void);
     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 16d5fa1be3d2..373b8cf11403 100644
--- a/include/svx/colorbox.hxx
+++ b/include/svx/colorbox.hxx
@@ -103,6 +103,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 c3863f80ee80..965727d0a536 100644
--- a/include/svx/colorwindow.hxx
+++ b/include/svx/colorwindow.hxx
@@ -155,7 +155,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);
@@ -177,6 +176,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 61d1d9e729ac..8efb03a0e568 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 4e6e10e84138..7fc12c76a47d 100644
--- a/svx/source/tbxctrls/tbcontrl.cxx
+++ b/svx/source/tbxctrls/tbcontrl.cxx
@@ -1872,7 +1872,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 SvxColorWindow::ShowNoneButton()
@@ -2078,7 +2081,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);
@@ -2262,14 +2267,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;
     }
 
@@ -4114,11 +4117,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()
 {
 }
_______________________________________________
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits

Reply via email to