X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/8ea30e360315c0a50d3049013a95471f7d941daf..264cb7f5f33e6d4fcae54093f5169c559190ecd0:/src/gtk/window.cpp diff --git a/src/gtk/window.cpp b/src/gtk/window.cpp index 82eec9cf62..b7ab6c34c8 100644 --- a/src/gtk/window.cpp +++ b/src/gtk/window.cpp @@ -27,15 +27,14 @@ #include "wx/dialog.h" #include "wx/settings.h" #include "wx/msgdlg.h" + #include "wx/textctrl.h" + #include "wx/toolbar.h" + #include "wx/combobox.h" + #include "wx/layout.h" + #include "wx/statusbr.h" #endif -#include "wx/layout.h" #include "wx/module.h" -#include "wx/combobox.h" - -#if wxUSE_TOOLBAR_NATIVE - #include "wx/toolbar.h" -#endif #if wxUSE_DRAG_AND_DROP #include "wx/dnd.h" @@ -49,11 +48,6 @@ #include "wx/caret.h" #endif // wxUSE_CARET -#if wxUSE_TEXTCTRL - #include "wx/textctrl.h" -#endif - -#include "wx/statusbr.h" #include "wx/fontutil.h" #ifdef __WXDEBUG__ @@ -2137,6 +2131,26 @@ gtk_scrollbar_button_press_event(GtkRange*, GdkEventButton*, wxWindow* win) } } +//----------------------------------------------------------------------------- +// "event_after" from scrollbar +//----------------------------------------------------------------------------- + +extern "C" { +static void +gtk_scrollbar_event_after(GtkRange* range, GdkEvent* event, wxWindow* win) +{ + if (event->type == GDK_BUTTON_RELEASE) + { + g_signal_handlers_block_by_func(range, (void*)gtk_scrollbar_event_after, win); + + const int orient = range == win->m_scrollBar[0] ? wxHORIZONTAL : wxVERTICAL; + wxScrollWinEvent event(wxEVT_SCROLLWIN_THUMBRELEASE, win->GetScrollPos(orient), orient); + event.SetEventObject(win); + win->GetEventHandler()->ProcessEvent(event); + } +} +} + //----------------------------------------------------------------------------- // "button_release_event" from scrollbar //----------------------------------------------------------------------------- @@ -2153,12 +2167,10 @@ gtk_scrollbar_button_release_event(GtkRange* range, GdkEventButton*, wxWindow* w if (win->m_isScrolling) { win->m_isScrolling = false; - const int orient = range == win->m_scrollBar[0] ? wxHORIZONTAL : wxVERTICAL; - wxScrollWinEvent event(wxEVT_SCROLLWIN_THUMBRELEASE, win->GetScrollPos(orient), orient); - event.SetEventObject(win); + // Hook up handler to send thumb release event after this emission is finished. // To allow setting scroll position from event handler, sending event must // be deferred until after the GtkRange handler for this signal has run - win->GetEventHandler()->AddPendingEvent(event); + g_signal_handlers_unblock_by_func(range, (void*)gtk_scrollbar_event_after, win); } return false; @@ -2575,6 +2587,13 @@ bool wxWindowGTK::Create( wxWindow *parent, G_CALLBACK(gtk_scrollbar_button_release_event), this); g_signal_connect(m_scrollBar[1], "button_release_event", G_CALLBACK(gtk_scrollbar_button_release_event), this); + gulong handler_id; + handler_id = g_signal_connect( + m_scrollBar[0], "event_after", G_CALLBACK(gtk_scrollbar_event_after), this); + g_signal_handler_block(m_scrollBar[0], handler_id); + handler_id = g_signal_connect( + m_scrollBar[1], "event_after", G_CALLBACK(gtk_scrollbar_event_after), this); + g_signal_handler_block(m_scrollBar[1], handler_id); // these handlers get notified when scrollbar slider moves