[Libreoffice-commits] core.git: 2 commits - cui/source cui/uiconfig extras/source include/vcl solenv/bin solenv/sanitizers vcl/source vcl/unx

Libreoffice Gerrit user logerrit at kemper.freedesktop.org
Sun Feb 17 15:46:21 UTC 2019


 cui/source/dialogs/hangulhanjadlg.cxx          |  267 ++++++++++---------------
 cui/source/inc/hangulhanjadlg.hxx              |   84 ++++---
 cui/uiconfig/ui/hangulhanjaeditdictdialog.ui   |  149 +++++++------
 extras/source/glade/libreoffice-catalog.xml.in |    3 
 include/vcl/weld.hxx                           |    2 
 solenv/bin/native-code.py                      |    1 
 solenv/sanitizers/ui/cui.suppr                 |    4 
 vcl/source/app/salvtables.cxx                  |   63 +++++
 vcl/unx/gtk3/gtk3gtkinst.cxx                   |   12 +
 9 files changed, 305 insertions(+), 280 deletions(-)

New commits:
commit 1213cfde6b9052c1eb50b46d5cae2eef28d4b8b5
Author:     Caolán McNamara <caolanm at redhat.com>
AuthorDate: Sat Feb 16 20:19:12 2019 +0000
Commit:     Caolán McNamara <caolanm at redhat.com>
CommitDate: Sun Feb 17 16:46:13 2019 +0100

    weld HangulHanjaEditDictDialog
    
    Change-Id: If0d49a65735b66eaa8db11686099ed29b01711c4
    Reviewed-on: https://gerrit.libreoffice.org/67929
    Tested-by: Jenkins
    Reviewed-by: Caolán McNamara <caolanm at redhat.com>
    Tested-by: Caolán McNamara <caolanm at redhat.com>

diff --git a/cui/source/dialogs/hangulhanjadlg.cxx b/cui/source/dialogs/hangulhanjadlg.cxx
index 53d72894911e..46fa519c8f3f 100644
--- a/cui/source/dialogs/hangulhanjadlg.cxx
+++ b/cui/source/dialogs/hangulhanjadlg.cxx
@@ -1063,8 +1063,8 @@ namespace svx
         DBG_ASSERT( pEntry, "+HangulHanjaEditDictDialog::EditDictHdl(): call of edit should not be possible with no selection!" );
         if( pEntry )
         {
-            ScopedVclPtrInstance< HangulHanjaEditDictDialog > aEdDlg(this, m_aDictList, m_pDictsLB->GetSelectedEntryPos());
-            aEdDlg->Execute();
+            HangulHanjaEditDictDialog aEdDlg(GetFrameWeld(), m_aDictList, m_pDictsLB->GetSelectedEntryPos());
+            aEdDlg.run();
         }
     }
 
@@ -1324,12 +1324,12 @@ namespace svx
         if( _bUp )
         {
             if( !m_pPrev )
-                bRet = m_pScrollBar->GetThumbPos() > m_pScrollBar->GetRangeMin();
+                bRet = m_pScrollBar->vadjustment_get_value() > m_pScrollBar->vadjustment_get_lower();
         }
         else
         {
             if( !m_pNext )
-                bRet = m_pScrollBar->GetThumbPos() < ( m_pScrollBar->GetRangeMax() - 4 );
+                bRet = m_pScrollBar->vadjustment_get_value() < ( m_pScrollBar->vadjustment_get_upper() - 4 );
         }
 
         return bRet;
@@ -1337,92 +1337,71 @@ namespace svx
 
     void SuggestionEdit::DoJump( bool _bUp )
     {
-        const Link<Control&,void>& rLoseFocusHdl = GetLoseFocusHdl();
-        rLoseFocusHdl.Call( *this );
-        m_pScrollBar->SetThumbPos( m_pScrollBar->GetThumbPos() + ( _bUp? -1 : 1 ) );
-
-        static_cast< HangulHanjaEditDictDialog* >( GetParentDialog() )->UpdateScrollbar();
+        m_pScrollBar->vadjustment_set_value( m_pScrollBar->vadjustment_get_value() + ( _bUp? -1 : 1 ) );
+        m_pParent->UpdateScrollbar();
     }
 
-    SuggestionEdit::SuggestionEdit( vcl::Window* pParent, WinBits nBits )
-        : Edit(pParent, nBits)
+    SuggestionEdit::SuggestionEdit(std::unique_ptr<weld::Entry> xEntry, HangulHanjaEditDictDialog* pParent)
+        : m_pParent(pParent)
         , m_pPrev(nullptr)
         , m_pNext(nullptr)
         , m_pScrollBar(nullptr)
+        , m_xEntry(std::move(xEntry))
     {
+        m_xEntry->connect_key_press(LINK(this, SuggestionEdit, KeyInputHdl));
     }
 
-    SuggestionEdit::~SuggestionEdit()
-    {
-        disposeOnce();
-    }
-
-    void SuggestionEdit::dispose()
-    {
-        m_pPrev.clear();
-        m_pNext.clear();
-        m_pScrollBar.clear();
-        Edit::dispose();
-    }
-
-    bool SuggestionEdit::PreNotify( NotifyEvent& rNEvt )
+    IMPL_LINK(SuggestionEdit, KeyInputHdl, const KeyEvent&, rKEvt, bool)
     {
         bool bHandled = false;
-        if( rNEvt.GetType() == MouseNotifyEvent::KEYINPUT )
+
+        const vcl::KeyCode& rKeyCode = rKEvt.GetKeyCode();
+        sal_uInt16          nMod = rKeyCode.GetModifier();
+        sal_uInt16          nCode = rKeyCode.GetCode();
+        if( nCode == KEY_TAB && ( !nMod || KEY_SHIFT == nMod ) )
         {
-            const KeyEvent*     pKEvt = rNEvt.GetKeyEvent();
-            const vcl::KeyCode& rKeyCode = pKEvt->GetKeyCode();
-            sal_uInt16          nMod = rKeyCode.GetModifier();
-            sal_uInt16          nCode = rKeyCode.GetCode();
-            if( nCode == KEY_TAB && ( !nMod || KEY_SHIFT == nMod ) )
+            bool        bUp = KEY_SHIFT == nMod;
+            if( ShouldScroll( bUp ) )
             {
-                bool        bUp = KEY_SHIFT == nMod;
-                if( ShouldScroll( bUp ) )
-                {
-                    DoJump( bUp );
-                    SetSelection( Selection( 0, SELECTION_MAX ) );
-                        // Tab-travel doesn't really happen, so emulate it by setting a selection manually
-                    bHandled = true;
-                }
+                DoJump( bUp );
+                m_xEntry->select_region(0, -1);
+                    // Tab-travel doesn't really happen, so emulate it by setting a selection manually
+                bHandled = true;
             }
-            else if( KEY_UP == nCode || KEY_DOWN == nCode )
+        }
+        else if( KEY_UP == nCode || KEY_DOWN == nCode )
+        {
+            bool        bUp = KEY_UP == nCode;
+            if( ShouldScroll( bUp ) )
             {
-                bool        bUp = KEY_UP == nCode;
-                if( ShouldScroll( bUp ) )
-                {
-                    DoJump( bUp );
-                    bHandled = true;
-                }
-                else if( bUp )
-                {
-                    if( m_pPrev )
-                    {
-                        m_pPrev->GrabFocus();
-                        bHandled = true;
-                    }
-                }
-                else if( m_pNext )
+                DoJump( bUp );
+                bHandled = true;
+            }
+            else if( bUp )
+            {
+                if( m_pPrev )
                 {
-                    m_pNext->GrabFocus();
+                    m_pPrev->grab_focus();
                     bHandled = true;
                 }
             }
+            else if( m_pNext )
+            {
+                m_pNext->grab_focus();
+                bHandled = true;
+            }
         }
 
-        if( !bHandled )
-            bHandled = Edit::PreNotify( rNEvt );
         return bHandled;
     }
 
-    void SuggestionEdit::init( ScrollBar* pScrollBar, SuggestionEdit* pPrev, SuggestionEdit* pNext)
+    void SuggestionEdit::init(weld::ScrolledWindow* pScrollBar, SuggestionEdit* pPrev, SuggestionEdit* pNext)
     {
         m_pScrollBar = pScrollBar;
         m_pPrev = pPrev;
         m_pNext = pNext;
     }
 
-    VCL_BUILDER_FACTORY_ARGS(SuggestionEdit, WB_LEFT|WB_VCENTER|WB_BORDER)
-
     namespace
     {
         bool GetConversions(    const Reference< XConversionDictionary >&  _xDict,
@@ -1450,47 +1429,46 @@ namespace svx
         }
     }
 
-
-    IMPL_LINK_NOARG( HangulHanjaEditDictDialog, ScrollHdl, ScrollBar*, void )
+    IMPL_LINK_NOARG( HangulHanjaEditDictDialog, ScrollHdl, weld::ScrolledWindow&, void )
     {
         UpdateScrollbar();
     }
 
-    IMPL_LINK_NOARG( HangulHanjaEditDictDialog, OriginalModifyHdl, Edit&, void )
+    IMPL_LINK_NOARG( HangulHanjaEditDictDialog, OriginalModifyHdl, weld::ComboBox&, void )
     {
         m_bModifiedOriginal = true;
-        m_aOriginal = comphelper::string::stripEnd( m_aOriginalLB->GetText(), ' ' );
+        m_aOriginal = comphelper::string::stripEnd( m_xOriginalLB->get_active_text(), ' ' );
 
         UpdateSuggestions();
         UpdateButtonStates();
     }
 
-    IMPL_LINK( HangulHanjaEditDictDialog, EditModifyHdl1, Edit&, rEdit, void )
+    IMPL_LINK( HangulHanjaEditDictDialog, EditModifyHdl1, weld::Entry&, rEdit, void )
     {
         EditModify( &rEdit, 0 );
     }
 
-    IMPL_LINK( HangulHanjaEditDictDialog, EditModifyHdl2, Edit&, rEdit, void )
+    IMPL_LINK( HangulHanjaEditDictDialog, EditModifyHdl2, weld::Entry&, rEdit, void )
     {
         EditModify( &rEdit, 1 );
     }
 
-    IMPL_LINK( HangulHanjaEditDictDialog, EditModifyHdl3, Edit&, rEdit, void )
+    IMPL_LINK( HangulHanjaEditDictDialog, EditModifyHdl3, weld::Entry&, rEdit, void )
     {
         EditModify( &rEdit, 2 );
     }
 
-    IMPL_LINK( HangulHanjaEditDictDialog, EditModifyHdl4, Edit&, rEdit, void )
+    IMPL_LINK( HangulHanjaEditDictDialog, EditModifyHdl4, weld::Entry&, rEdit, void )
     {
         EditModify( &rEdit, 3 );
     }
 
-    IMPL_LINK_NOARG( HangulHanjaEditDictDialog, BookLBSelectHdl, ListBox&, void )
+    IMPL_LINK_NOARG( HangulHanjaEditDictDialog, BookLBSelectHdl, weld::ComboBox&, void )
     {
-        InitEditDictDialog( m_aBookLB->GetSelectedEntryPos() );
+        InitEditDictDialog( m_xBookLB->get_active() );
     }
 
-    IMPL_LINK_NOARG( HangulHanjaEditDictDialog, NewPBPushHdl, Button*, void )
+    IMPL_LINK_NOARG( HangulHanjaEditDictDialog, NewPBPushHdl, weld::Button&, void )
     {
         DBG_ASSERT( m_pSuggestions, "-HangulHanjaEditDictDialog::NewPBPushHdl(): no suggestions... search in hell..." );
         Reference< XConversionDictionary >  xDict = m_rDictList[ m_nCurrentDict ];
@@ -1558,7 +1536,7 @@ namespace svx
         return bRemovedSomething;
     }
 
-    IMPL_LINK_NOARG( HangulHanjaEditDictDialog, DeletePBPushHdl, Button*, void )
+    IMPL_LINK_NOARG( HangulHanjaEditDictDialog, DeletePBPushHdl, weld::Button&, void )
     {
         if( DeleteEntryFromDictionary( m_rDictList[ m_nCurrentDict ] ) )
         {
@@ -1568,22 +1546,23 @@ namespace svx
         }
     }
 
-    void HangulHanjaEditDictDialog::InitEditDictDialog( sal_uInt32 _nSelDict )
+    void HangulHanjaEditDictDialog::InitEditDictDialog( sal_uInt32 nSelDict )
     {
         if( m_pSuggestions )
             m_pSuggestions->Clear();
 
-        if( m_nCurrentDict != _nSelDict )
+        if( m_nCurrentDict != nSelDict )
         {
-            m_nCurrentDict = _nSelDict;
+            m_nCurrentDict = nSelDict;
             m_aOriginal.clear();
             m_bModifiedOriginal = true;
         }
 
         UpdateOriginalLB();
 
-        m_aOriginalLB->SetText( !m_aOriginal.isEmpty() ? m_aOriginal : m_aEditHintText, Selection( 0, SELECTION_MAX ) );
-        m_aOriginalLB->GrabFocus();
+        m_xOriginalLB->set_entry_text( !m_aOriginal.isEmpty() ? m_aOriginal : m_aEditHintText);
+        m_xOriginalLB->select_entry_region(0, -1);
+        m_xOriginalLB->grab_focus();
 
         UpdateSuggestions();
         UpdateButtonStates();
@@ -1591,7 +1570,7 @@ namespace svx
 
     void HangulHanjaEditDictDialog::UpdateOriginalLB()
     {
-        m_aOriginalLB->Clear();
+        m_xOriginalLB->clear();
         Reference< XConversionDictionary >  xDict = m_rDictList[ m_nCurrentDict ];
         if( xDict.is() )
         {
@@ -1600,7 +1579,7 @@ namespace svx
             OUString*               pEntry = aEntries.getArray();
             while( n )
             {
-                m_aOriginalLB->InsertEntry( *pEntry );
+                m_xOriginalLB->append_text( *pEntry );
 
                 ++pEntry;
                 --n;
@@ -1618,8 +1597,8 @@ namespace svx
         bool bNew = bHaveValidOriginalString && m_pSuggestions && m_pSuggestions->GetCount() > 0;
         bNew = bNew && ( m_bModifiedSuggestions || m_bModifiedOriginal );
 
-        m_aNewPB->Enable( bNew );
-        m_aDeletePB->Enable(!m_bModifiedOriginal && bHaveValidOriginalString);
+        m_xNewPB->set_sensitive( bNew );
+        m_xDeletePB->set_sensitive(!m_bModifiedOriginal && bHaveValidOriginalString);
     }
 
     void HangulHanjaEditDictDialog::UpdateSuggestions()
@@ -1652,26 +1631,26 @@ namespace svx
             m_bModifiedSuggestions = false;
         }
 
-        m_aScrollSB->SetThumbPos( 0 );
+        m_xScrollSB->vadjustment_set_value( 0 );
         UpdateScrollbar();              // will force edits to be filled new
     }
 
-    void HangulHanjaEditDictDialog::SetEditText( Edit& _rEdit, sal_uInt16 _nEntryNum )
+    void HangulHanjaEditDictDialog::SetEditText(SuggestionEdit& rEdit, sal_uInt16 nEntryNum)
     {
         OUString  aStr;
         if( m_pSuggestions )
         {
-            aStr = m_pSuggestions->Get( _nEntryNum );
+            aStr = m_pSuggestions->Get(nEntryNum);
         }
 
-        _rEdit.SetText( aStr );
+        rEdit.set_text(aStr);
     }
 
-    void HangulHanjaEditDictDialog::EditModify( Edit const * _pEdit, sal_uInt8 _nEntryOffset )
+    void HangulHanjaEditDictDialog::EditModify(const weld::Entry* pEdit, sal_uInt8 _nEntryOffset)
     {
         m_bModifiedSuggestions = true;
 
-        OUString  aTxt( _pEdit->GetText() );
+        OUString  aTxt( pEdit->get_text() );
         sal_uInt16 nEntryNum = m_nTopPos + _nEntryOffset;
         if( aTxt.isEmpty() )
         {
@@ -1690,54 +1669,55 @@ namespace svx
         UpdateButtonStates();
     }
 
-    HangulHanjaEditDictDialog::HangulHanjaEditDictDialog( vcl::Window* _pParent, HHDictList& _rDictList, sal_uInt32 _nSelDict )
-        :ModalDialog            ( _pParent, "HangulHanjaEditDictDialog", "cui/ui/hangulhanjaeditdictdialog.ui" )
-        ,m_aEditHintText        ( CuiResId(RID_SVXSTR_EDITHINT) )
-        ,m_rDictList            ( _rDictList )
-        ,m_nCurrentDict         ( 0xFFFFFFFF )
-        ,m_nTopPos              ( 0 )
-        ,m_bModifiedSuggestions ( false )
-        ,m_bModifiedOriginal    ( false )
+    HangulHanjaEditDictDialog::HangulHanjaEditDictDialog(weld::Window* pParent, HHDictList& _rDictList, sal_uInt32 nSelDict)
+        : GenericDialogController(pParent, "cui/ui/hangulhanjaeditdictdialog.ui", "HangulHanjaEditDictDialog")
+        , m_aEditHintText        ( CuiResId(RID_SVXSTR_EDITHINT) )
+        , m_rDictList            ( _rDictList )
+        , m_nCurrentDict         ( 0xFFFFFFFF )
+        , m_nTopPos              ( 0 )
+        , m_bModifiedSuggestions ( false )
+        , m_bModifiedOriginal    ( false )
+        , m_xBookLB(m_xBuilder->weld_combo_box("book"))
+        , m_xOriginalLB(m_xBuilder->weld_combo_box("original"))
+        , m_xEdit1(new SuggestionEdit(m_xBuilder->weld_entry("edit1"), this))
+        , m_xEdit2(new SuggestionEdit(m_xBuilder->weld_entry("edit2"), this))
+        , m_xEdit3(new SuggestionEdit(m_xBuilder->weld_entry("edit3"), this))
+        , m_xEdit4(new SuggestionEdit(m_xBuilder->weld_entry("edit4"), this))
+        , m_xContents(m_xBuilder->weld_widget("box"))
+        , m_xScrollSB(m_xBuilder->weld_scrolled_window("scrollbar"))
+        , m_xNewPB(m_xBuilder->weld_button("new"))
+        , m_xDeletePB(m_xBuilder->weld_button("delete"))
     {
-        get( m_aBookLB, "book" );
-        get( m_aOriginalLB, "original" );
-        get( m_aNewPB, "new" );
-        get( m_aDeletePB, "delete" );
-        get( m_aScrollSB, "scrollbar" );
-        get( m_aEdit1, "edit1" );
-        get( m_aEdit2, "edit2" );
-        get( m_aEdit3, "edit3" );
-        get( m_aEdit4, "edit4" );
+        m_xScrollSB->set_user_managed_scrolling();
 
-        m_aEdit1->init( m_aScrollSB, nullptr, m_aEdit2 );
-        m_aEdit2->init( m_aScrollSB, m_aEdit1, m_aEdit3 );
-        m_aEdit3->init( m_aScrollSB, m_aEdit2, m_aEdit4 );
-        m_aEdit4->init( m_aScrollSB, m_aEdit3, nullptr );
+        Size aSize(m_xContents->get_preferred_size());
+        m_xScrollSB->set_size_request(-1, aSize.Height());
 
-        m_aOriginalLB->SetModifyHdl( LINK( this, HangulHanjaEditDictDialog, OriginalModifyHdl ) );
+        m_xEdit1->init( m_xScrollSB.get(), nullptr, m_xEdit2.get() );
+        m_xEdit2->init( m_xScrollSB.get(), m_xEdit1.get(), m_xEdit3.get() );
+        m_xEdit3->init( m_xScrollSB.get(), m_xEdit2.get(), m_xEdit4.get() );
+        m_xEdit4->init( m_xScrollSB.get(), m_xEdit3.get(), nullptr );
 
-        m_aNewPB->SetClickHdl( LINK( this, HangulHanjaEditDictDialog, NewPBPushHdl ) );
-        m_aNewPB->Enable( false );
+        m_xOriginalLB->connect_changed( LINK( this, HangulHanjaEditDictDialog, OriginalModifyHdl ) );
 
-        m_aDeletePB->SetClickHdl( LINK( this, HangulHanjaEditDictDialog, DeletePBPushHdl ) );
-        m_aDeletePB->Enable( false );
+        m_xNewPB->connect_clicked( LINK( this, HangulHanjaEditDictDialog, NewPBPushHdl ) );
+        m_xNewPB->set_sensitive( false );
+
+        m_xDeletePB->connect_clicked( LINK( this, HangulHanjaEditDictDialog, DeletePBPushHdl ) );
+        m_xDeletePB->set_sensitive( false );
 
         static_assert(MAXNUM_SUGGESTIONS >= 5, "number of suggestions should not under-run the value of 5");
 
-        Link<ScrollBar*,void>  aScrLk( LINK( this, HangulHanjaEditDictDialog, ScrollHdl ) );
-        m_aScrollSB->SetScrollHdl( aScrLk );
-        m_aScrollSB->SetEndScrollHdl( aScrLk );
-        m_aScrollSB->SetRangeMin( 0 );
-        m_aScrollSB->SetRangeMax( MAXNUM_SUGGESTIONS );
-        m_aScrollSB->SetPageSize( 4 );       // because we have 4 edits / page
-        m_aScrollSB->SetVisibleSize( 4 );
+        // 4 here, because we have 4 edits / page
+        m_xScrollSB->vadjustment_configure(0, 0, MAXNUM_SUGGESTIONS, 1, 4, 4);
+        m_xScrollSB->connect_vadjustment_changed(LINK(this, HangulHanjaEditDictDialog, ScrollHdl));
 
-        m_aEdit1->SetModifyHdl( LINK( this, HangulHanjaEditDictDialog, EditModifyHdl1 ) );
-        m_aEdit2->SetModifyHdl( LINK( this, HangulHanjaEditDictDialog, EditModifyHdl2 ) );
-        m_aEdit3->SetModifyHdl( LINK( this, HangulHanjaEditDictDialog, EditModifyHdl3 ) );
-        m_aEdit4->SetModifyHdl( LINK( this, HangulHanjaEditDictDialog, EditModifyHdl4 ) );
+        m_xEdit1->connect_changed( LINK( this, HangulHanjaEditDictDialog, EditModifyHdl1 ) );
+        m_xEdit2->connect_changed( LINK( this, HangulHanjaEditDictDialog, EditModifyHdl2 ) );
+        m_xEdit3->connect_changed( LINK( this, HangulHanjaEditDictDialog, EditModifyHdl3 ) );
+        m_xEdit4->connect_changed( LINK( this, HangulHanjaEditDictDialog, EditModifyHdl4 ) );
 
-        m_aBookLB->SetSelectHdl( LINK( this, HangulHanjaEditDictDialog, BookLBSelectHdl ) );
+        m_xBookLB->connect_changed( LINK( this, HangulHanjaEditDictDialog, BookLBSelectHdl ) );
         sal_uInt32  nDictCnt = m_rDictList.size();
         for( sal_uInt32 n = 0 ; n < nDictCnt ; ++n )
         {
@@ -1745,46 +1725,27 @@ namespace svx
             OUString aName;
             if( xDic.is() )
                 aName = xDic->getName();
-            m_aBookLB->InsertEntry( aName );
+            m_xBookLB->append_text( aName );
         }
-        m_aBookLB->SelectEntryPos( sal_uInt16( _nSelDict ) );
+        m_xBookLB->set_active(nSelDict);
 
-        InitEditDictDialog( _nSelDict );
+        InitEditDictDialog(nSelDict);
     }
 
     HangulHanjaEditDictDialog::~HangulHanjaEditDictDialog()
     {
-        disposeOnce();
-    }
-
-    void HangulHanjaEditDictDialog::dispose()
-    {
-        m_pSuggestions.reset();
-        m_aBookLB.clear();
-        m_aOriginalLB.clear();
-        m_aEdit1.clear();
-        m_aEdit2.clear();
-        m_aEdit3.clear();
-        m_aEdit4.clear();
-        m_aScrollSB.clear();
-        m_aNewPB.clear();
-        m_aDeletePB.clear();
-        ModalDialog::dispose();
     }
 
     void HangulHanjaEditDictDialog::UpdateScrollbar()
     {
-        sal_uInt16  nPos = sal_uInt16( m_aScrollSB->GetThumbPos() );
+        sal_uInt16  nPos = m_xScrollSB->vadjustment_get_value();
         m_nTopPos = nPos;
 
-        SetEditText( *m_aEdit1, nPos++ );
-        SetEditText( *m_aEdit2, nPos++ );
-        SetEditText( *m_aEdit3, nPos++ );
-        SetEditText( *m_aEdit4, nPos );
+        SetEditText( *m_xEdit1, nPos++ );
+        SetEditText( *m_xEdit2, nPos++ );
+        SetEditText( *m_xEdit3, nPos++ );
+        SetEditText( *m_xEdit4, nPos );
     }
-
-
 }
 
-
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/cui/source/inc/hangulhanjadlg.hxx b/cui/source/inc/hangulhanjadlg.hxx
index 92fceadfc5ad..390e8663433e 100644
--- a/cui/source/inc/hangulhanjadlg.hxx
+++ b/cui/source/inc/hangulhanjadlg.hxx
@@ -244,26 +244,31 @@ namespace svx
     };
 
     class SuggestionList;
+    class HangulHanjaEditDictDialog;
 
-    class SuggestionEdit : public Edit
+    class SuggestionEdit
     {
     private:
-        VclPtr<SuggestionEdit>     m_pPrev;
-        VclPtr<SuggestionEdit>     m_pNext;
-        VclPtr<ScrollBar>          m_pScrollBar;
+        HangulHanjaEditDictDialog* m_pParent;
+        SuggestionEdit*     m_pPrev;
+        SuggestionEdit*     m_pNext;
+        weld::ScrolledWindow* m_pScrollBar;
+        std::unique_ptr<weld::Entry> m_xEntry;
 
         bool                ShouldScroll( bool _bUp ) const;
         void                DoJump( bool _bUp );
     public:
-                            SuggestionEdit( vcl::Window* pParent, WinBits nBits );
-        virtual             ~SuggestionEdit() override;
-        virtual void        dispose() override;
-        virtual bool        PreNotify( NotifyEvent& rNEvt ) override;
-        void init( ScrollBar* pScrollBar, SuggestionEdit* pPrev, SuggestionEdit* pNext);
+        SuggestionEdit(std::unique_ptr<weld::Entry> xEntry, HangulHanjaEditDictDialog* pParent);
+        DECL_LINK(KeyInputHdl, const KeyEvent&, bool);
+        void init(weld::ScrolledWindow* pScrollBar, SuggestionEdit* pPrev, SuggestionEdit* pNext);
+
+        void grab_focus() { m_xEntry->grab_focus(); }
+        OUString get_text() const { return m_xEntry->get_text(); }
+        void set_text(const OUString& rText) { m_xEntry->set_text(rText); }
+        void connect_changed(const Link<weld::Entry&, void>& rLink) { m_xEntry->connect_changed(rLink); }
     };
 
-
-    class HangulHanjaEditDictDialog : public ModalDialog
+    class HangulHanjaEditDictDialog : public weld::GenericDialogController
     {
     private:
         const OUString  m_aEditHintText;
@@ -273,53 +278,50 @@ namespace svx
         OUString        m_aOriginal;
         std::unique_ptr<SuggestionList> m_pSuggestions;
 
-        VclPtr<ListBox>        m_aBookLB;
-        VclPtr<ComboBox>       m_aOriginalLB;
-        VclPtr<SuggestionEdit> m_aEdit1;
-        VclPtr<SuggestionEdit> m_aEdit2;
-        VclPtr<SuggestionEdit> m_aEdit3;
-        VclPtr<SuggestionEdit> m_aEdit4;
-        VclPtr<ScrollBar>      m_aScrollSB;
-        VclPtr<PushButton>     m_aNewPB;
-        VclPtr<PushButton>     m_aDeletePB;
-
         sal_uInt16      m_nTopPos;
         bool            m_bModifiedSuggestions;
         bool            m_bModifiedOriginal;
 
-        DECL_LINK( OriginalModifyHdl, Edit&, void );
-        DECL_LINK( ScrollHdl, ScrollBar*, void );
-        DECL_LINK( EditModifyHdl1, Edit&, void );
-        DECL_LINK( EditModifyHdl2, Edit&, void );
-        DECL_LINK( EditModifyHdl3, Edit&, void );
-        DECL_LINK( EditModifyHdl4, Edit&, void );
-
-        DECL_LINK( BookLBSelectHdl, ListBox&, void );
-        DECL_LINK( NewPBPushHdl, Button*, void );
-        DECL_LINK( DeletePBPushHdl, Button*, void );
-
-        void            InitEditDictDialog( sal_uInt32 _nSelDict );
+        std::unique_ptr<weld::ComboBox> m_xBookLB;
+        std::unique_ptr<weld::ComboBox> m_xOriginalLB;
+        std::unique_ptr<SuggestionEdit> m_xEdit1;
+        std::unique_ptr<SuggestionEdit> m_xEdit2;
+        std::unique_ptr<SuggestionEdit> m_xEdit3;
+        std::unique_ptr<SuggestionEdit> m_xEdit4;
+        std::unique_ptr<weld::Widget> m_xContents;
+        std::unique_ptr<weld::ScrolledWindow> m_xScrollSB;
+        std::unique_ptr<weld::Button> m_xNewPB;
+        std::unique_ptr<weld::Button> m_xDeletePB;
+
+        DECL_LINK( OriginalModifyHdl, weld::ComboBox&, void );
+        DECL_LINK( ScrollHdl, weld::ScrolledWindow&, void );
+        DECL_LINK( EditModifyHdl1, weld::Entry&, void );
+        DECL_LINK( EditModifyHdl2, weld::Entry&, void );
+        DECL_LINK( EditModifyHdl3, weld::Entry&, void );
+        DECL_LINK( EditModifyHdl4, weld::Entry&, void );
+
+        DECL_LINK( BookLBSelectHdl, weld::ComboBox&, void );
+        DECL_LINK( NewPBPushHdl, weld::Button&, void );
+        DECL_LINK( DeletePBPushHdl, weld::Button&, void );
+
+        void            InitEditDictDialog(sal_uInt32 nSelDict);
         void            UpdateOriginalLB();
         void            UpdateSuggestions();
         void            UpdateButtonStates();
 
-        void            SetEditText( Edit& _rEdit, sal_uInt16 _nEntryNum );
-        void            EditModify( Edit const * _pEdit, sal_uInt8 _nEntryOffset );
+        void            SetEditText( SuggestionEdit& rEdit, sal_uInt16 nEntryNum );
+        void            EditModify( const weld::Entry* pEdit, sal_uInt8 nEntryOffset );
 
         bool            DeleteEntryFromDictionary( const css::uno::Reference< css::linguistic2::XConversionDictionary >& xDict );
 
     public:
-                        HangulHanjaEditDictDialog( vcl::Window* _pParent, HHDictList& _rDictList, sal_uInt32 _nSelDict );
-                        virtual ~HangulHanjaEditDictDialog() override;
-        virtual void    dispose() override;
+        HangulHanjaEditDictDialog(weld::Window* pParent, HHDictList& rDictList, sal_uInt32 nSelDict);
+        virtual ~HangulHanjaEditDictDialog() override;
 
         void            UpdateScrollbar();
     };
-
-
 }
 
-
 #endif // SVX_HANGUL_HANJA_HXX
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/cui/uiconfig/ui/hangulhanjaeditdictdialog.ui b/cui/uiconfig/ui/hangulhanjaeditdictdialog.ui
index dda3a5219479..9d076b3e3943 100644
--- a/cui/uiconfig/ui/hangulhanjaeditdictdialog.ui
+++ b/cui/uiconfig/ui/hangulhanjaeditdictdialog.ui
@@ -1,13 +1,18 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!-- Generated with glade 3.18.3 -->
+<!-- Generated with glade 3.22.1 -->
 <interface domain="cui">
   <requires lib="gtk+" version="3.18"/>
-  <requires lib="LibreOffice" version="1.0"/>
   <object class="GtkDialog" id="HangulHanjaEditDictDialog">
     <property name="can_focus">False</property>
     <property name="border_width">6</property>
     <property name="title" translatable="yes" context="hangulhanjaeditdictdialog|HangulHanjaEditDictDialog">Edit Custom Dictionary</property>
+    <property name="modal">True</property>
+    <property name="default_width">0</property>
+    <property name="default_height">0</property>
     <property name="type_hint">dialog</property>
+    <child>
+      <placeholder/>
+    </child>
     <child internal-child="vbox">
       <object class="GtkBox" id="dialog-vbox1">
         <property name="can_focus">False</property>
@@ -85,7 +90,7 @@
                         <property name="can_focus">False</property>
                         <property name="spacing">12</property>
                         <child>
-                          <object class="GtkComboBox" id="book">
+                          <object class="GtkComboBoxText" id="book">
                             <property name="visible">True</property>
                             <property name="can_focus">False</property>
                           </object>
@@ -103,10 +108,10 @@
                   <object class="GtkLabel" id="label4">
                     <property name="visible">True</property>
                     <property name="can_focus">False</property>
-                    <property name="xalign">0</property>
                     <property name="label" translatable="yes" context="hangulhanjaeditdictdialog|label4">Book</property>
                     <property name="use_underline">True</property>
                     <property name="mnemonic_widget">book</property>
+                    <property name="xalign">0</property>
                     <attributes>
                       <attribute name="weight" value="bold"/>
                     </attributes>
@@ -138,7 +143,7 @@
                         <property name="row_spacing">6</property>
                         <property name="column_spacing">12</property>
                         <child>
-                          <object class="GtkComboBox" id="original">
+                          <object class="GtkComboBoxText" id="original">
                             <property name="visible">True</property>
                             <property name="can_focus">False</property>
                             <property name="valign">start</property>
@@ -147,7 +152,6 @@
                             <child internal-child="entry">
                               <object class="GtkEntry" id="combobox-entry">
                                 <property name="can_focus">True</property>
-                                <property name="xalign">0.5</property>
                                 <property name="shadow_type">none</property>
                                 <property name="caps_lock_warning">False</property>
                               </object>
@@ -209,9 +213,9 @@
                   <object class="GtkLabel" id="label2">
                     <property name="visible">True</property>
                     <property name="can_focus">False</property>
-                    <property name="xalign">0</property>
                     <property name="label" translatable="yes" context="hangulhanjaeditdictdialog|label2">Original</property>
                     <property name="use_underline">True</property>
+                    <property name="xalign">0</property>
                     <attributes>
                       <attribute name="weight" value="bold"/>
                     </attributes>
@@ -228,6 +232,7 @@
               <object class="GtkFrame" id="frame1">
                 <property name="visible">True</property>
                 <property name="can_focus">False</property>
+                <property name="hexpand">True</property>
                 <property name="label_xalign">0</property>
                 <property name="shadow_type">none</property>
                 <child>
@@ -237,82 +242,77 @@
                     <property name="top_padding">6</property>
                     <property name="left_padding">12</property>
                     <child>
-                      <object class="GtkBox" id="box3">
+                      <object class="GtkScrolledWindow" id="scrollbar">
                         <property name="visible">True</property>
-                        <property name="can_focus">False</property>
-                        <property name="spacing">6</property>
+                        <property name="can_focus">True</property>
+                        <property name="valign">start</property>
+                        <property name="hscrollbar_policy">never</property>
+                        <property name="vscrollbar_policy">always</property>
+                        <property name="shadow_type">in</property>
                         <child>
-                          <object class="GtkBox" id="box4">
+                          <object class="GtkViewport">
                             <property name="visible">True</property>
                             <property name="can_focus">False</property>
-                            <property name="orientation">vertical</property>
-                            <child>
-                              <object class="cuilo-SuggestionEdit" id="edit1">
-                                <property name="visible">True</property>
-                                <property name="can_focus">True</property>
-                                <property name="hexpand">True</property>
-                                <property name="width_chars">40</property>
-                              </object>
-                              <packing>
-                                <property name="expand">True</property>
-                                <property name="fill">True</property>
-                                <property name="position">0</property>
-                              </packing>
-                            </child>
-                            <child>
-                              <object class="cuilo-SuggestionEdit" id="edit2">
-                                <property name="visible">True</property>
-                                <property name="can_focus">True</property>
-                                <property name="hexpand">True</property>
-                              </object>
-                              <packing>
-                                <property name="expand">True</property>
-                                <property name="fill">True</property>
-                                <property name="position">1</property>
-                              </packing>
-                            </child>
-                            <child>
-                              <object class="cuilo-SuggestionEdit" id="edit3">
-                                <property name="visible">True</property>
-                                <property name="can_focus">True</property>
-                                <property name="hexpand">True</property>
-                              </object>
-                              <packing>
-                                <property name="expand">True</property>
-                                <property name="fill">True</property>
-                                <property name="position">2</property>
-                              </packing>
-                            </child>
                             <child>
-                              <object class="cuilo-SuggestionEdit" id="edit4">
+                              <object class="GtkBox" id="box">
                                 <property name="visible">True</property>
-                                <property name="can_focus">True</property>
+                                <property name="can_focus">False</property>
                                 <property name="hexpand">True</property>
+                                <property name="border_width">3</property>
+                                <property name="orientation">vertical</property>
+                                <property name="spacing">6</property>
+                                <child>
+                                  <object class="GtkEntry" id="edit1">
+                                    <property name="visible">True</property>
+                                    <property name="can_focus">True</property>
+                                    <property name="hexpand">True</property>
+                                    <property name="width_chars">40</property>
+                                  </object>
+                                  <packing>
+                                    <property name="expand">True</property>
+                                    <property name="fill">True</property>
+                                    <property name="position">0</property>
+                                  </packing>
+                                </child>
+                                <child>
+                                  <object class="GtkEntry" id="edit2">
+                                    <property name="visible">True</property>
+                                    <property name="can_focus">True</property>
+                                    <property name="hexpand">True</property>
+                                  </object>
+                                  <packing>
+                                    <property name="expand">True</property>
+                                    <property name="fill">True</property>
+                                    <property name="position">1</property>
+                                  </packing>
+                                </child>
+                                <child>
+                                  <object class="GtkEntry" id="edit3">
+                                    <property name="visible">True</property>
+                                    <property name="can_focus">True</property>
+                                    <property name="hexpand">True</property>
+                                  </object>
+                                  <packing>
+                                    <property name="expand">True</property>
+                                    <property name="fill">True</property>
+                                    <property name="position">2</property>
+                                  </packing>
+                                </child>
+                                <child>
+                                  <object class="GtkEntry" id="edit4">
+                                    <property name="visible">True</property>
+                                    <property name="can_focus">True</property>
+                                    <property name="hexpand">True</property>
+                                  </object>
+                                  <packing>
+                                    <property name="expand">True</property>
+                                    <property name="fill">True</property>
+                                    <property name="position">3</property>
+                                  </packing>
+                                </child>
                               </object>
-                              <packing>
-                                <property name="expand">True</property>
-                                <property name="fill">True</property>
-                                <property name="position">3</property>
-                              </packing>
                             </child>
                           </object>
-                          <packing>
-                            <property name="expand">True</property>
-                            <property name="fill">True</property>
-                            <property name="position">0</property>
-                          </packing>
-                        </child>
-                        <child>
-                          <object class="GtkScrollbar" id="scrollbar">
-                            <property name="visible">True</property>
-                            <property name="can_focus">False</property>
-                            <property name="orientation">vertical</property>
-                          </object>
-                          <packing>
-                            <property name="expand">False</property>
-                            <property name="fill">True</property>
-                            <property name="position">1</property>
-                          </packing>
                         </child>
                       </object>
                     </child>
@@ -322,10 +322,10 @@
                   <object class="GtkLabel" id="label3">
                     <property name="visible">True</property>
                     <property name="can_focus">False</property>
-                    <property name="xalign">0</property>
                     <property name="label" translatable="yes" context="hangulhanjaeditdictdialog|label3">Suggestions</property>
                     <property name="use_underline">True</property>
                     <property name="ellipsize">end</property>
+                    <property name="xalign">0</property>
                     <attributes>
                       <attribute name="weight" value="bold"/>
                     </attributes>
@@ -348,6 +348,7 @@
       </object>
     </child>
     <action-widgets>
+      <action-widget response="-7">close</action-widget>
       <action-widget response="-11">help</action-widget>
     </action-widgets>
   </object>
diff --git a/extras/source/glade/libreoffice-catalog.xml.in b/extras/source/glade/libreoffice-catalog.xml.in
index 1d98ea2862bf..784b173d5e33 100644
--- a/extras/source/glade/libreoffice-catalog.xml.in
+++ b/extras/source/glade/libreoffice-catalog.xml.in
@@ -521,9 +521,6 @@
                         generic-name="DataTreeListBox" parent="GtkTreeView"
                         icon-name="widget-gtk-treeview"/>
 
-    <glade-widget-class title="Suggestion Edit" name="cuilo-SuggestionEdit"
-                        generic-name="SuggestionEdit" parent="GtkEntry"
-                        icon-name="widget-gtk-textentry"/>
     <glade-widget-class title="Suggestion Display" name="cuilo-SuggestionDisplay"
                         generic-name="SuggestionDisplay" parent="GtkTextView"
                         icon-name="widget-gtk-textview"/>
diff --git a/include/vcl/weld.hxx b/include/vcl/weld.hxx
index 868a444dcf87..4fb71ca77bf1 100644
--- a/include/vcl/weld.hxx
+++ b/include/vcl/weld.hxx
@@ -217,6 +217,8 @@ public:
     virtual int vadjustment_get_upper() const = 0;
     virtual void vadjustment_set_upper(int upper) = 0;
     virtual int vadjustment_get_page_size() const = 0;
+    virtual int vadjustment_get_lower() const = 0;
+    virtual void vadjustment_set_lower(int upper) = 0;
     virtual void set_vpolicy(VclPolicyType eVPolicy) = 0;
     virtual VclPolicyType get_vpolicy() const = 0;
     void connect_vadjustment_changed(const Link<ScrolledWindow&, void>& rLink)
diff --git a/solenv/bin/native-code.py b/solenv/bin/native-code.py
index c95a0a48d51a..be38032d6d90 100755
--- a/solenv/bin/native-code.py
+++ b/solenv/bin/native-code.py
@@ -502,7 +502,6 @@ custom_widgets = [
     'StatusBar',
     'StructListBox',
     'SuggestionDisplay',
-    'SuggestionEdit',
     'SvSimpleTableContainer',
     'SvTreeListBox',
     'SvtFileView',
diff --git a/solenv/sanitizers/ui/cui.suppr b/solenv/sanitizers/ui/cui.suppr
index 2e83d8eed13e..c472d257df2a 100644
--- a/solenv/sanitizers/ui/cui.suppr
+++ b/solenv/sanitizers/ui/cui.suppr
@@ -237,6 +237,10 @@ cui/uiconfig/ui/hangulhanjaconversiondialog.ui://GtkLabel[@id='label4'] orphan-l
 cui/uiconfig/ui/hangulhanjaconversiondialog.ui://cuilo-SuggestionDisplay[@id='suggestions:border'] no-labelled-by
 cui/uiconfig/ui/hangulhanjaconversiondialog.ui://GtkLabel[@id='label5'] orphan-label
 cui/uiconfig/ui/hangulhanjaconversiondialog.ui://GtkLabel[@id='label6'] orphan-label
+cui/uiconfig/ui/hangulhanjaeditdictdialog.ui://GtkEntry[@id='edit1'] no-labelled-by
+cui/uiconfig/ui/hangulhanjaeditdictdialog.ui://GtkEntry[@id='edit2'] no-labelled-by
+cui/uiconfig/ui/hangulhanjaeditdictdialog.ui://GtkEntry[@id='edit3'] no-labelled-by
+cui/uiconfig/ui/hangulhanjaeditdictdialog.ui://GtkEntry[@id='edit4'] no-labelled-by
 cui/uiconfig/ui/hatchpage.ui://GtkLabel[@id='angleft'] orphan-label
 cui/uiconfig/ui/hatchpage.ui://GtkScale[@id='angleslider'] no-labelled-by
 cui/uiconfig/ui/hatchpage.ui://GtkSpinButton[@id='anglemtr'] no-labelled-by
diff --git a/vcl/source/app/salvtables.cxx b/vcl/source/app/salvtables.cxx
index 7bbda76e9dfb..55a6e36077c3 100644
--- a/vcl/source/app/salvtables.cxx
+++ b/vcl/source/app/salvtables.cxx
@@ -1180,6 +1180,18 @@ public:
         rVertScrollBar.SetRangeMax(upper);
     }
 
+    virtual int vadjustment_get_lower() const override
+    {
+        ScrollBar& rVertScrollBar = m_xScrolledWindow->getVertScrollBar();
+        return rVertScrollBar.GetRangeMin();
+    }
+
+    virtual void vadjustment_set_lower(int lower) override
+    {
+        ScrollBar& rVertScrollBar = m_xScrolledWindow->getVertScrollBar();
+        rVertScrollBar.SetRangeMin(lower);
+    }
+
     virtual int vadjustment_get_page_size() const override
     {
         ScrollBar& rVertScrollBar = m_xScrolledWindow->getVertScrollBar();
diff --git a/vcl/unx/gtk3/gtk3gtkinst.cxx b/vcl/unx/gtk3/gtk3gtkinst.cxx
index 3afb2e260b28..baf0d649cc9a 100644
--- a/vcl/unx/gtk3/gtk3gtkinst.cxx
+++ b/vcl/unx/gtk3/gtk3gtkinst.cxx
@@ -3051,6 +3051,18 @@ public:
         enable_notify_events();
     }
 
+    virtual int vadjustment_get_lower() const override
+    {
+         return gtk_adjustment_get_lower(m_pVAdjustment);
+    }
+
+    virtual void vadjustment_set_lower(int lower) override
+    {
+        disable_notify_events();
+        gtk_adjustment_set_lower(m_pVAdjustment, lower);
+        enable_notify_events();
+    }
+
     virtual int vadjustment_get_page_size() const override
     {
         return gtk_adjustment_get_page_size(m_pVAdjustment);
commit 3901a75e4acf15dcb711b7d71a1cc5afd3933984
Author:     Caolán McNamara <caolanm at redhat.com>
AuthorDate: Sat Feb 16 21:57:43 2019 +0000
Commit:     Caolán McNamara <caolanm at redhat.com>
CommitDate: Sun Feb 17 16:45:59 2019 +0100

    use Application::AddKeyListener to be able to mark key events as handled
    
    Change-Id: I1f9ced535bcd12569c355c332652babf5740434c
    Reviewed-on: https://gerrit.libreoffice.org/67931
    Tested-by: Jenkins
    Reviewed-by: Caolán McNamara <caolanm at redhat.com>
    Tested-by: Caolán McNamara <caolanm at redhat.com>

diff --git a/vcl/source/app/salvtables.cxx b/vcl/source/app/salvtables.cxx
index c24d6f5ab745..7bbda76e9dfb 100644
--- a/vcl/source/app/salvtables.cxx
+++ b/vcl/source/app/salvtables.cxx
@@ -236,9 +236,11 @@ private:
     VclPtr<vcl::Window> m_xWidget;
 
     DECL_LINK(EventListener, VclWindowEvent&, void);
+    DECL_LINK(KeyEventListener, VclWindowEvent&, bool);
 
     const bool m_bTakeOwnership;
     bool m_bEventListener;
+    bool m_bKeyEventListener;
     int m_nBlockNotify;
 
     void ensure_event_listener()
@@ -250,14 +252,28 @@ private:
         }
     }
 
+    // we want the ability to mark key events as handled, so use this variant
+    // for those, we get all keystrokes in this case, so we will need to filter
+    // them later
+    void ensure_key_listener()
+    {
+        if (!m_bKeyEventListener)
+        {
+            Application::AddKeyListener(LINK(this, SalInstanceWidget, KeyEventListener));
+            m_bKeyEventListener = true;
+        }
+    }
+
 protected:
     virtual void HandleEventListener(VclWindowEvent& rEvent);
+    virtual bool HandleKeyEventListener(VclWindowEvent& rEvent);
 
 public:
     SalInstanceWidget(vcl::Window* pWidget, bool bTakeOwnership)
         : m_xWidget(pWidget)
         , m_bTakeOwnership(bTakeOwnership)
         , m_bEventListener(false)
+        , m_bKeyEventListener(false)
         , m_nBlockNotify(0)
     {
     }
@@ -475,13 +491,13 @@ public:
 
     virtual void connect_key_press(const Link<const KeyEvent&, bool>& rLink) override
     {
-        ensure_event_listener();
+        ensure_key_listener();
         weld::Widget::connect_key_press(rLink);
     }
 
     virtual void connect_key_release(const Link<const KeyEvent&, bool>& rLink) override
     {
-        ensure_event_listener();
+        ensure_key_listener();
         weld::Widget::connect_key_release(rLink);
     }
 
@@ -534,6 +550,8 @@ public:
 
     virtual ~SalInstanceWidget() override
     {
+        if (m_bKeyEventListener)
+            Application::RemoveKeyListener(LINK(this, SalInstanceWidget, KeyEventListener));
         if (m_bEventListener)
             m_xWidget->RemoveEventListener(LINK(this, SalInstanceWidget, EventListener));
         if (m_bTakeOwnership)
@@ -574,23 +592,37 @@ void SalInstanceWidget::HandleEventListener(VclWindowEvent& rEvent)
         m_aFocusOutHdl.Call(*this);
     else if (rEvent.GetId() == VclEventId::WindowResize)
         m_aSizeAllocateHdl.Call(m_xWidget->GetSizePixel());
-    else if (rEvent.GetId() == VclEventId::WindowKeyInput)
+}
+
+bool SalInstanceWidget::HandleKeyEventListener(VclWindowEvent& rEvent)
+{
+    // we get all key events here, ignore them unless we have focus
+    if (!m_xWidget->HasFocus())
+        return false;
+    if (rEvent.GetId() == VclEventId::WindowKeyInput)
     {
         const KeyEvent* pKeyEvent = static_cast<const KeyEvent*>(rEvent.GetData());
-        m_aKeyPressHdl.Call(*pKeyEvent);
+        return m_aKeyPressHdl.Call(*pKeyEvent);
     }
     else if (rEvent.GetId() == VclEventId::WindowKeyUp)
     {
         const KeyEvent* pKeyEvent = static_cast<const KeyEvent*>(rEvent.GetData());
-        m_aKeyReleaseHdl.Call(*pKeyEvent);
+        return m_aKeyReleaseHdl.Call(*pKeyEvent);
     }
+    return false;
 }
 
+
 IMPL_LINK(SalInstanceWidget, EventListener, VclWindowEvent&, rEvent, void)
 {
     HandleEventListener(rEvent);
 }
 
+IMPL_LINK(SalInstanceWidget, KeyEventListener, VclWindowEvent&, rEvent, bool)
+{
+    return HandleKeyEventListener(rEvent);
+}
+
 namespace
 {
     Image createImage(const OUString& rImage)
@@ -3147,15 +3179,18 @@ private:
     // in VclDrawingArea
     virtual void HandleEventListener(VclWindowEvent& rEvent) override
     {
-        if (rEvent.GetId() == VclEventId::WindowResize ||
-            rEvent.GetId() == VclEventId::WindowKeyInput ||
-            rEvent.GetId() == VclEventId::WindowKeyUp)
+        if (rEvent.GetId() == VclEventId::WindowResize)
         {
             return;
         }
         SalInstanceWidget::HandleEventListener(rEvent);
     }
 
+    virtual bool HandleKeyEventListener(VclWindowEvent& /*rEvent*/) override
+    {
+        return false;
+    }
+
 public:
     SalInstanceDrawingArea(VclDrawingArea* pDrawingArea, const a11yref& rAlly,
             FactoryFunction pUITestFactoryFunction, void* pUserData, bool bTakeOwnership)


More information about the Libreoffice-commits mailing list