vcl/unx/gtk3/gtkinst.cxx |    4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

New commits:
commit 405cf00e4818886b0d3053d03cfb2e3f3a5e8eb8
Author:     Michael Weghorn <[email protected]>
AuthorDate: Tue May 28 11:50:12 2024 +0200
Commit:     Michael Weghorn <[email protected]>
CommitDate: Wed May 29 09:47:21 2024 +0200

    related tdf#160971 gtk3 a11y: Keep new combobox value
    
    Selecting a new value in an editable combobox using
    the gtk3 VCL plugin using the popup didn't work when
    that popup was opened using the keyboard, sample
    scenario:
    
    1) Start Writer
    2) Press F6 until the Formatting toolbar has focus
    3) Press Tab until the "Font Name" combobox has focus
    4) Press Alt+Down to open the combobox popup
    5) Press Down key a few times to select another font, e.g.
       "Carlito"
    6) Press Enter to confirm
    
    Rather than the newly selected font, the previously
    set one would still be set in the combobox.
    
    Selecting a new font using the popup would work however
    when clicking the combobox's button using the mouse
    instead of steps 1-4 above.
    
    The problem was that restoring focus was resulting
    in the newly selected value not getting saved.
    
    Backtrace for how the value already got properly saved
    for the case where the button was previously clicked
    using the mouse:
    
        1 weld::ComboBox::save_value weld.hxx 853 0x7f19a7af3f81
        2 FontNameBox::save_value ctrlbox.hxx 369 0x7f19a7b01f3d
        3 (anonymous namespace)::SvxFontNameBox_Base::statusChanged_Impl 
tbcontrl.cxx 3432 0x7f19a7ad95e0
        4 (anonymous namespace)::SvxFontNameToolBoxControl::statusChanged 
tbcontrl.cxx 3439 0x7f19a7ad8312
        5 SfxStatusDispatcher::sendStatusChanged(rtl::OUString const&, 
com::sun::star::frame::FeatureStateEvent 
const&)::$_0::operator()(com::sun::star::uno::Reference<com::sun::star::frame::XStatusListener>
 const&) const unoctitm.cxx 132 0x7f19a98ae241
        6 
comphelper::OInterfaceContainerHelper4<com::sun::star::frame::XStatusListener>::forEach<SfxStatusDispatcher::sendStatusChanged(rtl::OUString
 const&, com::sun::star::frame::FeatureStateEvent 
const&)::$_0>(std::unique_lock<std::mutex>&, 
SfxStatusDispatcher::sendStatusChanged(rtl::OUString const&, 
com::sun::star::frame::FeatureStateEvent const&)::$_0 const&) const 
interfacecontainer4.hxx 304 0x7f19a98a4411
        7 SfxStatusDispatcher::sendStatusChanged unoctitm.cxx 129 0x7f19a98a42aa
        8 SfxDispatchController_Impl::sendStatusChanged unoctitm.cxx 802 
0x7f19a98a907c
        9 SfxDispatchController_Impl::StateChanged unoctitm.cxx 885 
0x7f19a98a987a
        10 SfxStateCache::SetState_Impl statcach.cxx 424 0x7f19a98308cc
        11 SfxStateCache::SetState statcach.cxx 328 0x7f19a98306f2
        12 SfxBindings::UpdateControllers_Impl bindings.cxx 1211 0x7f19a97aeffd
        13 SfxBindings::Update_Impl bindings.cxx 274 0x7f19a97ae5cf
        14 SfxBindings::Update bindings.cxx 353 0x7f19a97af682
        15 SfxDispatcher::Call_Impl dispatch.cxx 280 0x7f19a97c731c
        16 SfxDispatcher::Execute_ dispatch.cxx 753 0x7f19a97cbc4b
        17 SfxDispatcher::Execute dispatch.cxx 812 0x7f19a97cc02f
        18 SfxDispatchController_Impl::dispatch unoctitm.cxx 671 0x7f19a98a6673
        19 SfxOfficeDispatch::dispatch unoctitm.cxx 250 0x7f19a98a511a
        20 SfxToolBoxControl::Dispatch tbxitem.cxx 253 0x7f19a9df168f
        21 (anonymous namespace)::SvxFontNameBox_Base::Select tbcontrl.cxx 2007 
0x7f19a7adb44a
        22 (anonymous namespace)::SvxFontNameBox_Base::SelectHdl tbcontrl.cxx 
1962 0x7f19a7adafb4
        23 (anonymous namespace)::SvxFontNameBox_Base::LinkStubSelectHdl 
tbcontrl.cxx 1960 0x7f19a7adab9d
        24 Link<weld::ComboBox&, void>::Call link.hxx 111 0x7f199a19ddd8
        25 weld::ComboBox::signal_changed weld.hxx 731 0x7f199a19dd8c
        26 (anonymous namespace)::GtkInstanceComboBox::fire_signal_changed 
gtkinst.cxx 21229 0x7f199a0e1880
        27 (anonymous namespace)::GtkInstanceComboBox::handle_row_activated 
gtkinst.cxx 21891 0x7f199a0e17f9
        28 (anonymous namespace)::GtkInstanceComboBox::signalRowActivated 
gtkinst.cxx 21876 0x7f199a0dd299
        29 ?? 0x7f1999695931
        30 ?? 0x7f19a87b4939
        31 ?? 0x7f19a87ca33f
        32 g_signal_emit_valist 0x7f19a87cff06
        33 g_signal_emit 0x7f19a87cffc3
        34 ?? 0x7f199993384b
        35 ?? 0x7f1999697085
        36 ?? 0x7f19a87b4939
        37 ?? 0x7f19a87ca33f
        38 g_signal_emit_valist 0x7f19a87cff06
        39 g_signal_emit 0x7f19a87cffc3
        40 ?? 0x7f19997b317e
        41 g_cclosure_marshal_VOID__BOXEDv 0x7f19a87b7b76
        42 ?? 0x7f19a87b4939
        43 ?? 0x7f19a87ca33f
        44 g_signal_emit_valist 0x7f19a87cff06
        45 g_signal_emit 0x7f19a87cffc3
        46 ?? 0x7f19997b0213
        47 ?? 0x7f19997b1803
        48 ?? 0x7f19997b4a42
        49 gtk_event_controller_handle_event 0x7f1999779361
        50 ?? 0x7f19999488bd
        51 ?? 0x7f1999690db8
        52 ?? 0x7f19a87b4939
        53 ?? 0x7f19a87c9693
        54 g_signal_emit_valist 0x7f19a87cff06
        55 g_signal_emit 0x7f19a87cffc3
        56 ?? 0x7f199994a314
        57 ?? 0x7f19997fc84e
        58 gtk_main_do_event 0x7f19997fe4be
        59 ?? 0x7f199a7b1a79
        60 ?? 0x7f199a7e5586
        61 ?? 0x7f199ed1ce3f
        62 ?? 0x7f199ed1eec7
        63 g_main_context_iteration 0x7f199ed1f4e0
        64 GtkSalData::Yield gtkdata.cxx 405 0x7f199a08827f
        65 GtkInstance::DoYield gtkinst.cxx 427 0x7f199a08d6e3
        66 ImplYield svapp.cxx 384 0x7f19a47bf65c
        67 Application::Yield svapp.cxx 472 0x7f19a47bef6b
        68 Application::Execute svapp.cxx 359 0x7f19a47bed02
        69 desktop::Desktop::Main app.cxx 1652 0x7f19ad928434
        70 ImplSVMain svmain.cxx 229 0x7f19a47e226e
        71 SVMain svmain.cxx 261 0x7f19a47e4299
        72 soffice_main sofficemain.cxx 93 0x7f19ad9aca7c
        73 sal_main main.c 51 0x55cb2e25aa5d
        74 main main.c 49 0x55cb2e25aa37
    
    However, for the keyboard-only case, `GtkInstanceComboBox::m_bChangedByMenu`
    got reset to false in `set_active_including_mru` with this backtrace:
    
        1  (anonymous namespace)::GtkInstanceComboBox::set_active_including_mru 
gtkinst.cxx     21976 0x7f199a0e812b
        2  (anonymous namespace)::GtkInstanceComboBox::set_active               
gtkinst.cxx     22406 0x7f199a0de9dc
        3  FontNameBox::set_active_or_entry_text                                
ctrlbox.cxx     897   0x7f19a64d904c
        4  (anonymous namespace)::SvxFontNameBox_Base::set_active_or_entry_text 
tbcontrl.cxx    1823  0x7f19a7ad983d
        5  (anonymous namespace)::SvxFontNameBox_Base::FocusOutHdl              
tbcontrl.cxx    1872  0x7f19a7adb9e2
        6  (anonymous namespace)::SvxFontNameBox_Base::LinkStubFocusOutHdl      
tbcontrl.cxx    1868  0x7f19a7adac5d
        7  Link<weld::Widget&, void>::Call                                      
link.hxx        111   0x7f199a13b618
        8  (anonymous namespace)::GtkInstanceWidget::signal_focus_out           
gtkinst.cxx     2630  0x7f199a0a1ef6
        9  (anonymous namespace)::GtkInstanceComboBox::signal_entry_focus_out   
gtkinst.cxx     21427 0x7f199a0e83f6
        10 (anonymous namespace)::GtkInstanceComboBox::signalEntryFocusOut      
gtkinst.cxx     21412 0x7f199a0dd525
        11 ??                                                                   
                      0x7f1999690caa
        12 g_closure_invoke                                                     
                      0x7f19a87b4730
        13 ??                                                                   
                      0x7f19a87c887c
        14 ??                                                                   
                      0x7f19a87c9ad1
        15 g_signal_emit_valist                                                 
                      0x7f19a87cff06
        16 g_signal_emit                                                        
                      0x7f19a87cffc3
        17 ??                                                                   
                      0x7f199994a314
        18 gtk_widget_send_focus_change                                         
                      0x7f199995c0ea
        19 ??                                                                   
                      0x7f199996153b
        20 ??                                                                   
                      0x7f1999961822
        21 g_closure_invoke                                                     
                      0x7f19a87b4730
        22 ??                                                                   
                      0x7f19a87c8f08
        23 ??                                                                   
                      0x7f19a87ca281
        24 g_signal_emit_valist                                                 
                      0x7f19a87cff06
        25 g_signal_emit                                                        
                      0x7f19a87cffc3
        26 ??                                                                   
                      0x7f19a87b4939
        27 ??                                                                   
                      0x7f19a87ca33f
        28 g_signal_emit_valist                                                 
                      0x7f19a87cff06
        29 g_signal_emit                                                        
                      0x7f19a87cffc3
        30 gtk_widget_grab_focus                                                
                      0x7f199994e7fa
        31 (anonymous namespace)::GtkInstanceComboBox::menu_toggled             
gtkinst.cxx     21320 0x7f199a0ea4b8
        32 (anonymous namespace)::GtkInstanceComboBox::signal_popup_toggled     
gtkinst.cxx     21356 0x7f199a0de2e9
        33 (anonymous namespace)::GtkInstanceComboBox::signalPopupToggled       
gtkinst.cxx     21236 0x7f199a0dd375
        34 g_closure_invoke                                                     
                      0x7f19a87b4730
        35 ??                                                                   
                      0x7f19a87c887c
        36 ??                                                                   
                      0x7f19a87ca281
        37 g_signal_emit_valist                                                 
                      0x7f19a87cff06
        38 g_signal_emit                                                        
                      0x7f19a87cffc3
        39 ??                                                                   
                      0x7f19998f7ac5
        40 ??                                                                   
                      0x7f19a87b4939
        41 ??                                                                   
                      0x7f19a87ca33f
        42 g_signal_emit_valist                                                 
                      0x7f19a87cff06
        43 g_signal_emit                                                        
                      0x7f19a87cffc3
        44 gtk_toggle_button_set_active                                         
                      0x7f19998f7868
        45 (anonymous namespace)::GtkInstanceComboBox::handle_row_activated     
gtkinst.cxx     21890 0x7f199a0e17f0
        46 (anonymous namespace)::GtkInstanceComboBox::signalRowActivated       
gtkinst.cxx     21876 0x7f199a0dd299
        47 ??                                                                   
                      0x7f1999695931
        48 ??                                                                   
                      0x7f19a87b4939
        49 ??                                                                   
                      0x7f19a87ca33f
        50 g_signal_emit_valist                                                 
                      0x7f19a87cff06
        51 g_signal_emit                                                        
                      0x7f19a87cffc3
        52 ??                                                                   
                      0x7f1999935562
        53 ??                                                                   
                      0x7f1999693eca
        54 g_closure_invoke                                                     
                      0x7f19a87b4730
        55 ??                                                                   
                      0x7f19a87c8f08
        56 g_signal_emitv                                                       
                      0x7f19a87cfcf2
        57 ??                                                                   
                      0x7f19996c773d
        58 ??                                                                   
                      0x7f19996c7bf8
        59 ??                                                                   
                      0x7f19996c7d80
        60 gtk_bindings_activate_event                                          
                      0x7f19996c922b
        61 ??                                                                   
                      0x7f1999936b18
        62 ??                                                                   
                      0x7f1999690db8
        63 ??                                                                   
                      0x7f19a87b4894
        64 ??                                                                   
                      0x7f19a87c9693
        65 g_signal_emit_valist                                                 
                      0x7f19a87cff06
        66 g_signal_emit                                                        
                      0x7f19a87cffc3
        67 ??                                                                   
                      0x7f199994a314
        68 gtk_window_propagate_key_event                                       
                      0x7f199996cdeb
        69 ??                                                                   
                      0x7f199997143b
        70 ??                                                                   
                      0x7f1999690caa
        71 g_closure_invoke                                                     
                      0x7f19a87b4730
        72 ??                                                                   
                      0x7f19a87c8f08
        73 ??                                                                   
                      0x7f19a87c9ad1
        74 g_signal_emit_valist                                                 
                      0x7f19a87cff06
        75 g_signal_emit                                                        
                      0x7f19a87cffc3
        76 ??                                                                   
                      0x7f199994a314
        77 ??                                                                   
                      0x7f19997fc8ff
        78 gtk_main_do_event                                                    
                      0x7f19997fe4be
        79 ??                                                                   
                      0x7f199a7b1a79
        80 ??                                                                   
                      0x7f199a7e5586
        81 ??                                                                   
                      0x7f199ed1ce3f
        82 ??                                                                   
                      0x7f199ed1eec7
        83 g_main_context_iteration                                             
                      0x7f199ed1f4e0
        84 GtkSalData::Yield                                                    
gtkdata.cxx     405   0x7f199a08827f
        85 GtkInstance::DoYield                                                 
gtkinst.cxx     427   0x7f199a08d6e3
        86 ImplYield                                                            
svapp.cxx       384   0x7f19a47bf65c
        87 Application::Yield                                                   
svapp.cxx       472   0x7f19a47bef6b
        88 Application::Execute                                                 
svapp.cxx       359   0x7f19a47bed02
        89 desktop::Desktop::Main                                               
app.cxx         1652  0x7f19ad928434
        90 ImplSVMain                                                           
svmain.cxx      229   0x7f19a47e226e
        91 SVMain                                                               
svmain.cxx      261   0x7f19a47e4299
        92 soffice_main                                                         
sofficemain.cxx 93    0x7f19ad9aca7c
        93 sal_main                                                             
main.c          51    0x55cb2e25aa5d
        94 main                                                                 
main.c          49    0x55cb2e25aa37
    
    As a consequence, `GtkInstanceComboBox::changed_by_direct_pick` would
    then return false when called in `SvxFontNameBox_Base::SelectHdl` (s.
    frame 21 in the first backtrace above), so the new value wouldn't get
    saved, but the previous one would get used instead since
    
        commit 131c1c7da8c567636ca55751e49d24cb6d6c9b9e
        Date:   Sun Nov 21 19:53:47 2021 +0000
    
            Related: tdf#145786 cooperate between our own grabs
    
    , which introduced grabbing the focus for the combobox
    in `GtkInstanceComboBox::menu_toggled` (s. frame 31 in above
    backtrace).
    
    Fix this by calling `fire_signal_changed` before
    `gtk_toggle_button_set_active` in
    `GtkInstanceComboBox::handle_row_activated`
    (s. frame 26 in the first and frame 44 in the second
    backtrace above), so `m_bChangedByMenu` only gets reset
    to false at the end of `fire_signal_changed`, not before it gets
    called.
    
    With that in place, the new value now gets set and the
    combobox shows the newly selected value as expected.
    
    Change-Id: Ib1919a99b46c33981593d9c5ec9a0d21443890b3
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/168146
    Tested-by: Jenkins
    Reviewed-by: Michael Weghorn <[email protected]>

diff --git a/vcl/unx/gtk3/gtkinst.cxx b/vcl/unx/gtk3/gtkinst.cxx
index 6e4f95dc7e3d..94963428f305 100644
--- a/vcl/unx/gtk3/gtkinst.cxx
+++ b/vcl/unx/gtk3/gtkinst.cxx
@@ -20101,8 +20101,8 @@ private:
         else
             tree_view_set_cursor(nActive);
 #endif
-        enable_notify_events();
 //        gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(m_pToggleButton), 
false);
+        enable_notify_events();
         fire_signal_changed();
         update_mru();
     }
@@ -21887,8 +21887,8 @@ private:
         else
             tree_view_set_cursor(nActive);
         enable_notify_events();
-        gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(m_pToggleButton), 
false);
         fire_signal_changed();
+        gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(m_pToggleButton), 
false);
         update_mru();
     }
 

Reply via email to