]> git.saurik.com Git - wxWidgets.git/blobdiff - include/wx/event.h
Tinderbox build fix for wxUnivGTK build.
[wxWidgets.git] / include / wx / event.h
index f937cca16c15d9107f8cc1368f5385960d4b79c2..909ffbc4050282fdbe8bfacdad8090c9911dac73 100644 (file)
 #ifndef _WX_EVENT_H__
 #define _WX_EVENT_H__
 
-#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) && !defined(__EMX__)
-// Some older compilers (such as EMX) cannot handle
-// #pragma interface/implementation correctly, iff
-// #pragma implementation is used in _two_ translation
-// units (as created by e.g. event.cpp compiled for
-// libwx_base and event.cpp compiled for libwx_gui_core).
-// So we must not use those pragmas for those compilers in
-// such files.
-    #pragma interface "event.h"
-#endif
-
 #include "wx/defs.h"
 #include "wx/object.h"
 #include "wx/clntdata.h"
@@ -78,9 +67,12 @@ typedef int wxEventType;
 //     change the switch()es to if()s
 //
 // if these are real problems for you, define WXWIN_COMPATIBILITY_EVENT_TYPES
-// to get 100% old behaviour, however you won't be able to use the libraries
-// using the new dynamic event type allocation in such case, so avoid it if
-// possible.
+// as 1 to get 100% old behaviour, however you won't be able to use the
+// libraries using the new dynamic event type allocation in such case, so avoid
+// it if possible.
+#ifndef WXWIN_COMPATIBILITY_EVENT_TYPES
+    #define WXWIN_COMPATIBILITY_EVENT_TYPES 0
+#endif
 
 #if WXWIN_COMPATIBILITY_EVENT_TYPES
 
@@ -219,7 +211,7 @@ BEGIN_DECLARE_EVENT_TYPES()
     DECLARE_EVENT_TYPE(wxEVT_SCROLL_PAGEDOWN, 305)
     DECLARE_EVENT_TYPE(wxEVT_SCROLL_THUMBTRACK, 306)
     DECLARE_EVENT_TYPE(wxEVT_SCROLL_THUMBRELEASE, 307)
-    DECLARE_EVENT_TYPE(wxEVT_SCROLL_ENDSCROLL, 308)
+    DECLARE_EVENT_TYPE(wxEVT_SCROLL_CHANGED, 308)
 
         // Scroll events from wxWindow
     DECLARE_EVENT_TYPE(wxEVT_SCROLLWIN_TOP, 320)
@@ -512,11 +504,6 @@ private:
 };
 #endif
 
-#ifdef __VISUALC__
-    // 'this' : used in base member initializer list (for m_commandString)
-    #pragma warning(disable:4355)
-#endif
-
 class WXDLLIMPEXP_CORE wxCommandEvent : public wxEvent
 {
 public:
@@ -559,7 +546,7 @@ public:
     long GetExtraLong() const { return m_extraLong; }
 
     void SetInt(int i) { m_commandInt = i; }
-    long GetInt() const { return m_commandInt; }
+    int GetInt() const { return m_commandInt; }
 
     virtual wxEvent *Clone() const { return new wxCommandEvent(*this); }
 
@@ -579,10 +566,6 @@ private:
     DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxCommandEvent)
 };
 
-#ifdef __VISUALC__
-    #pragma warning(default:4355)
-#endif
-
 #if WXWIN_COMPATIBILITY_2_4
 inline void wxCommandEventStringHelper::operator=(const wxString &str)
 {
@@ -642,7 +625,7 @@ private:
  wxEVT_SCROLL_PAGEDOWN
  wxEVT_SCROLL_THUMBTRACK
  wxEVT_SCROLL_THUMBRELEASE
- wxEVT_SCROLL_ENDSCROLL
+ wxEVT_SCROLL_CHANGED
 */
 
 class WXDLLIMPEXP_CORE wxScrollEvent : public wxCommandEvent
@@ -952,11 +935,22 @@ public:
     wxKeyEvent(wxEventType keyType = wxEVT_NULL);
     wxKeyEvent(const wxKeyEvent& evt);
 
+    // can be used check if the key event has exactly the given modifiers:
+    // "GetModifiers() = wxMOD_CONTROL" is easier to write than "ControlDown()
+    // && !MetaDown() && !AltDown() && !ShiftDown()"
+    int GetModifiers() const
+    {
+        return (m_controlDown ? wxMOD_CONTROL : 0) |
+               (m_shiftDown ? wxMOD_SHIFT : 0) |
+               (m_metaDown ? wxMOD_META : 0) |
+               (m_altDown ? wxMOD_ALT : 0);
+    }
+
     // Find state of shift/control keys
     bool ControlDown() const { return m_controlDown; }
+    bool ShiftDown() const { return m_shiftDown; }
     bool MetaDown() const { return m_metaDown; }
     bool AltDown() const { return m_altDown; }
-    bool ShiftDown() const { return m_shiftDown; }
 
     // "Cmd" is a pseudo key which is Control for PC and Unix platforms but
     // Apple ("Command") key under Macs: it makes often sense to use it instead
@@ -1013,8 +1007,10 @@ public:
     // Get Y position
     wxCoord GetY() const { return m_y; }
 
+#if WXWIN_COMPATIBILITY_2_6
     // deprecated, Use GetKeyCode instead.
     wxDEPRECATED( long KeyCode() const );
+#endif // WXWIN_COMPATIBILITY_2_6
 
     virtual wxEvent *Clone() const { return new wxKeyEvent(*this); }
 
@@ -1046,10 +1042,13 @@ public:
 
     long          m_keyCode;
 
+    // TODO: replace those with a single m_modifiers bitmask of wxMOD_XXX?
     bool          m_controlDown;
     bool          m_shiftDown;
     bool          m_altDown;
     bool          m_metaDown;
+
+    // FIXME: what is this for? relation to m_rawXXX?
     bool          m_scanCode;
 
 #if wxUSE_UNICODE
@@ -1091,7 +1090,7 @@ public:
 
     wxSize GetSize() const { return m_size; }
     wxRect GetRect() const { return m_rect; }
-    void SetRect(wxRect rect) { m_rect = rect; }
+    void SetRect(const wxRect& rect) { m_rect = rect; }
 
     virtual wxEvent *Clone() const { return new wxSizeEvent(*this); }
 
@@ -1131,7 +1130,7 @@ public:
     wxPoint GetPosition() const { return m_pos; }
     void SetPosition(const wxPoint& pos) { m_pos = pos; }
     wxRect GetRect() const { return m_rect; }
-    void SetRect(wxRect rect) { m_rect = rect; }
+    void SetRect(const wxRect& rect) { m_rect = rect; }
 
     virtual wxEvent *Clone() const { return new wxMoveEvent(*this); }
 
@@ -1389,7 +1388,15 @@ public:
         m_canVeto(event.m_canVeto) {}
 
     void SetLoggingOff(bool logOff) { m_loggingOff = logOff; }
-    bool GetLoggingOff() const { return m_loggingOff; }
+    bool GetLoggingOff() const
+    {
+        // m_loggingOff flag is only used by wxEVT_[QUERY_]END_SESSION, it
+        // doesn't make sense for wxEVT_CLOSE_WINDOW
+        wxASSERT_MSG( m_eventType != wxEVT_CLOSE_WINDOW,
+                      _T("this flag is for end session events only") );
+
+        return m_loggingOff;
+    }
 
     void Veto(bool veto = true)
     {
@@ -1400,19 +1407,18 @@ public:
         m_veto = veto;
     }
     void SetCanVeto(bool canVeto) { m_canVeto = canVeto; }
-    // No more asserts here please, the one you put here was wrong.
     bool CanVeto() const { return m_canVeto; }
     bool GetVeto() const { return m_canVeto && m_veto; }
 
     virtual wxEvent *Clone() const { return new wxCloseEvent(*this); }
 
 protected:
-    bool m_loggingOff;
-    bool m_veto, m_canVeto;
+    bool m_loggingOff,
+         m_veto,
+         m_canVeto;
 
 private:
     DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxCloseEvent)
-
 };
 
 /*
@@ -1663,7 +1669,9 @@ public:
     {
         m_checked =
         m_enabled =
+        m_shown =
         m_setEnabled =
+        m_setShown =
         m_setText =
         m_setChecked = false;
     }
@@ -1671,7 +1679,9 @@ public:
         : wxCommandEvent(event),
           m_checked(event.m_checked),
           m_enabled(event.m_enabled),
+          m_shown(event.m_shown),
           m_setEnabled(event.m_setEnabled),
+          m_setShown(event.m_setShown),
           m_setText(event.m_setText),
           m_setChecked(event.m_setChecked),
           m_text(event.m_text)
@@ -1679,13 +1689,16 @@ public:
 
     bool GetChecked() const { return m_checked; }
     bool GetEnabled() const { return m_enabled; }
+    bool GetShown() const { return m_shown; }
     wxString GetText() const { return m_text; }
     bool GetSetText() const { return m_setText; }
     bool GetSetChecked() const { return m_setChecked; }
     bool GetSetEnabled() const { return m_setEnabled; }
+    bool GetSetShown() const { return m_setShown; }
 
     void Check(bool check) { m_checked = check; m_setChecked = true; }
     void Enable(bool enable) { m_enabled = enable; m_setEnabled = true; }
+    void Show(bool show) { m_shown = show; m_setShown = true; }
     void SetText(const wxString& text) { m_text = text; m_setText = true; }
 
     // Sets the interval between updates in milliseconds.
@@ -1715,7 +1728,9 @@ public:
 protected:
     bool          m_checked;
     bool          m_enabled;
+    bool          m_shown;
     bool          m_setEnabled;
+    bool          m_setShown;
     bool          m_setText;
     bool          m_setChecked;
     wxString      m_text;
@@ -2187,8 +2202,6 @@ private:
     wxEventTableEntry& operator=(const wxEventTableEntry&);
 };
 
-class WXDLLIMPEXP_BASE wxEvtHandler;
-
 // an entry used in dynamic event table managed by wxEvtHandler::Connect()
 struct WXDLLIMPEXP_BASE wxDynamicEventTableEntry : public wxEventTableEntryBase
 {
@@ -2229,7 +2242,6 @@ struct WXDLLIMPEXP_BASE wxEventTable
 // ----------------------------------------------------------------------------
 
 WX_DEFINE_ARRAY_PTR(const wxEventTableEntry*, wxEventTableEntryPointerArray);
-class WXDLLIMPEXP_BASE wxEvtHandler;
 
 class WXDLLIMPEXP_BASE wxEventHashTable
 {
@@ -2356,7 +2368,7 @@ public:
         { return Disconnect(winid, wxID_ANY, eventType, func, userData, eventSink); }
 
     bool Disconnect(wxEventType eventType,
-                    wxObjectEventFunction func = NULL,
+                    wxObjectEventFunction func,
                     wxObject *userData = (wxObject *) NULL,
                     wxEvtHandler *eventSink = (wxEvtHandler *) NULL)
         { return Disconnect(wxID_ANY, eventType, func, userData, eventSink); }
@@ -2403,7 +2415,7 @@ protected:
     // NB: This method is intentionally *not* inside wxUSE_VALIDATORS!
     //     It is part of wxBase which doesn't use validators and the code
     //     is compiled out when building wxBase w/o GUI classes, which affects
-    //     binary compatiblity and wxBase library can't be used by GUI
+    //     binary compatibility and wxBase library can't be used by GUI
     //     ports.
     virtual bool TryValidator(wxEvent& WXUNUSED(event)) { return false; }
 
@@ -2628,6 +2640,111 @@ typedef void (wxEvtHandler::*wxMouseCaptureChangedEventFunction)(wxMouseCaptureC
         { return theClass::sm_eventHashTable; } \
     const wxEventTableEntry theClass::sm_eventTableEntries[] = { \
 
+#define BEGIN_EVENT_TABLE_TEMPLATE1(theClass, baseClass, T1) \
+    template<typename T1> \
+    const wxEventTable theClass<T1>::sm_eventTable = \
+        { &baseClass::sm_eventTable, &theClass<T1>::sm_eventTableEntries[0] }; \
+    template<typename T1> \
+    const wxEventTable *theClass<T1>::GetEventTable() const \
+        { return &theClass<T1>::sm_eventTable; } \
+    template<typename T1> \
+    wxEventHashTable theClass<T1>::sm_eventHashTable(theClass<T1>::sm_eventTable); \
+    template<typename T1> \
+    wxEventHashTable &theClass<T1>::GetEventHashTable() const \
+        { return theClass<T1>::sm_eventHashTable; } \
+    template<typename T1> \
+    const wxEventTableEntry theClass<T1>::sm_eventTableEntries[] = { \
+
+#define BEGIN_EVENT_TABLE_TEMPLATE2(theClass, baseClass, T1, T2) \
+    template<typename T1, typename T2> \
+    const wxEventTable theClass<T1, T2>::sm_eventTable = \
+        { &baseClass::sm_eventTable, &theClass<T1, T2>::sm_eventTableEntries[0] }; \
+    template<typename T1, typename T2> \
+    const wxEventTable *theClass<T1, T2>::GetEventTable() const \
+        { return &theClass<T1, T2>::sm_eventTable; } \
+    template<typename T1, typename T2> \
+    wxEventHashTable theClass<T1, T2>::sm_eventHashTable(theClass<T1, T2>::sm_eventTable); \
+    template<typename T1, typename T2> \
+    wxEventHashTable &theClass<T1, T2>::GetEventHashTable() const \
+        { return theClass<T1, T2>::sm_eventHashTable; } \
+    template<typename T1, typename T2> \
+    const wxEventTableEntry theClass<T1, T2>::sm_eventTableEntries[] = { \
+
+#define BEGIN_EVENT_TABLE_TEMPLATE3(theClass, baseClass, T1, T2, T3) \
+    template<typename T1, typename T2, typename T3> \
+    const wxEventTable theClass<T1, T2, T3>::sm_eventTable = \
+        { &baseClass::sm_eventTable, &theClass<T1, T2, T3>::sm_eventTableEntries[0] }; \
+    template<typename T1, typename T2, typename T3> \
+    const wxEventTable *theClass<T1, T2, T3>::GetEventTable() const \
+        { return &theClass<T1, T2, T3>::sm_eventTable; } \
+    template<typename T1, typename T2, typename T3> \
+    wxEventHashTable theClass<T1, T2, T3>::sm_eventHashTable(theClass<T1, T2, T3>::sm_eventTable); \
+    template<typename T1, typename T2, typename T3> \
+    wxEventHashTable &theClass<T1, T2, T3>::GetEventHashTable() const \
+        { return theClass<T1, T2, T3>::sm_eventHashTable; } \
+    template<typename T1, typename T2, typename T3> \
+    const wxEventTableEntry theClass<T1, T2, T3>::sm_eventTableEntries[] = { \
+
+#define BEGIN_EVENT_TABLE_TEMPLATE4(theClass, baseClass, T1, T2, T3, T4) \
+    template<typename T1, typename T2, typename T3, typename T4> \
+    const wxEventTable theClass<T1, T2, T3, T4>::sm_eventTable = \
+        { &baseClass::sm_eventTable, &theClass<T1, T2, T3, T4>::sm_eventTableEntries[0] }; \
+    template<typename T1, typename T2, typename T3, typename T4> \
+    const wxEventTable *theClass<T1, T2, T3, T4>::GetEventTable() const \
+        { return &theClass<T1, T2, T3, T4>::sm_eventTable; } \
+    template<typename T1, typename T2, typename T3, typename T4> \
+    wxEventHashTable theClass<T1, T2, T3, T4>::sm_eventHashTable(theClass<T1, T2, T3, T4>::sm_eventTable); \
+    template<typename T1, typename T2, typename T3, typename T4> \
+    wxEventHashTable &theClass<T1, T2, T3, T4>::GetEventHashTable() const \
+        { return theClass<T1, T2, T3, T4>::sm_eventHashTable; } \
+    template<typename T1, typename T2, typename T3, typename T4> \
+    const wxEventTableEntry theClass<T1, T2, T3, T4>::sm_eventTableEntries[] = { \
+
+#define BEGIN_EVENT_TABLE_TEMPLATE5(theClass, baseClass, T1, T2, T3, T4, T5) \
+    template<typename T1, typename T2, typename T3, typename T4, typename T5> \
+    const wxEventTable theClass<T1, T2, T3, T4, T5>::sm_eventTable = \
+        { &baseClass::sm_eventTable, &theClass<T1, T2, T3, T4, T5>::sm_eventTableEntries[0] }; \
+    template<typename T1, typename T2, typename T3, typename T4, typename T5> \
+    const wxEventTable *theClass<T1, T2, T3, T4, T5>::GetEventTable() const \
+        { return &theClass<T1, T2, T3, T4, T5>::sm_eventTable; } \
+    template<typename T1, typename T2, typename T3, typename T4, typename T5> \
+    wxEventHashTable theClass<T1, T2, T3, T4, T5>::sm_eventHashTable(theClass<T1, T2, T3, T4, T5>::sm_eventTable); \
+    template<typename T1, typename T2, typename T3, typename T4, typename T5> \
+    wxEventHashTable &theClass<T1, T2, T3, T4, T5>::GetEventHashTable() const \
+        { return theClass<T1, T2, T3, T4, T5>::sm_eventHashTable; } \
+    template<typename T1, typename T2, typename T3, typename T4, typename T5> \
+    const wxEventTableEntry theClass<T1, T2, T3, T4, T5>::sm_eventTableEntries[] = { \
+
+#define BEGIN_EVENT_TABLE_TEMPLATE7(theClass, baseClass, T1, T2, T3, T4, T5, T6, T7) \
+    template<typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7> \
+    const wxEventTable theClass<T1, T2, T3, T4, T5, T6, T7>::sm_eventTable = \
+        { &baseClass::sm_eventTable, &theClass<T1, T2, T3, T4, T5, T6, T7>::sm_eventTableEntries[0] }; \
+    template<typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7> \
+    const wxEventTable *theClass<T1, T2, T3, T4, T5, T6, T7>::GetEventTable() const \
+        { return &theClass<T1, T2, T3, T4, T5, T6, T7>::sm_eventTable; } \
+    template<typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7> \
+    wxEventHashTable theClass<T1, T2, T3, T4, T5, T6, T7>::sm_eventHashTable(theClass<T1, T2, T3, T4, T5, T6, T7>::sm_eventTable); \
+    template<typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7> \
+    wxEventHashTable &theClass<T1, T2, T3, T4, T5, T6, T7>::GetEventHashTable() const \
+        { return theClass<T1, T2, T3, T4, T5, T6, T7>::sm_eventHashTable; } \
+    template<typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7> \
+    const wxEventTableEntry theClass<T1, T2, T3, T4, T5, T6, T7>::sm_eventTableEntries[] = { \
+
+#define BEGIN_EVENT_TABLE_TEMPLATE8(theClass, baseClass, T1, T2, T3, T4, T5, T6, T7, T8) \
+    template<typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8> \
+    const wxEventTable theClass<T1, T2, T3, T4, T5, T6, T7, T8>::sm_eventTable = \
+        { &baseClass::sm_eventTable, &theClass<T1, T2, T3, T4, T5, T6, T7, T8>::sm_eventTableEntries[0] }; \
+    template<typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8> \
+    const wxEventTable *theClass<T1, T2, T3, T4, T5, T6, T7, T8>::GetEventTable() const \
+        { return &theClass<T1, T2, T3, T4, T5, T6, T7, T8>::sm_eventTable; } \
+    template<typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8> \
+    wxEventHashTable theClass<T1, T2, T3, T4, T5, T6, T7, T8>::sm_eventHashTable(theClass<T1, T2, T3, T4, T5, T6, T7, T8>::sm_eventTable); \
+    template<typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8> \
+    wxEventHashTable &theClass<T1, T2, T3, T4, T5, T6, T7, T8>::GetEventHashTable() const \
+        { return theClass<T1, T2, T3, T4, T5, T6, T7, T8>::sm_eventHashTable; } \
+    template<typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8> \
+    const wxEventTableEntry theClass<T1, T2, T3, T4, T5, T6, T7, T8>::sm_eventTableEntries[] = { \
+
 #define END_EVENT_TABLE() DECLARE_EVENT_TABLE_ENTRY( wxEVT_NULL, 0, 0, 0, 0 ) };
 
 /*
@@ -2771,7 +2888,7 @@ typedef void (wxEvtHandler::*wxMouseCaptureChangedEventFunction)(wxMouseCaptureC
 #define EVT_SCROLL_PAGEDOWN(func) wx__DECLARE_EVT0(wxEVT_SCROLL_PAGEDOWN, wxScrollEventHandler(func))
 #define EVT_SCROLL_THUMBTRACK(func) wx__DECLARE_EVT0(wxEVT_SCROLL_THUMBTRACK, wxScrollEventHandler(func))
 #define EVT_SCROLL_THUMBRELEASE(func) wx__DECLARE_EVT0(wxEVT_SCROLL_THUMBRELEASE, wxScrollEventHandler(func))
-#define EVT_SCROLL_ENDSCROLL(func) wx__DECLARE_EVT0(wxEVT_SCROLL_ENDSCROLL, wxScrollEventHandler(func))
+#define EVT_SCROLL_CHANGED(func) wx__DECLARE_EVT0(wxEVT_SCROLL_CHANGED, wxScrollEventHandler(func))
 
 #define EVT_SCROLL(func) \
     EVT_SCROLL_TOP(func) \
@@ -2781,7 +2898,8 @@ typedef void (wxEvtHandler::*wxMouseCaptureChangedEventFunction)(wxMouseCaptureC
     EVT_SCROLL_PAGEUP(func) \
     EVT_SCROLL_PAGEDOWN(func) \
     EVT_SCROLL_THUMBTRACK(func) \
-    EVT_SCROLL_THUMBRELEASE(func)
+    EVT_SCROLL_THUMBRELEASE(func) \
+    EVT_SCROLL_CHANGED(func)
 
 // Scrolling from wxSlider and wxScrollBar, with an id
 #define EVT_COMMAND_SCROLL_TOP(winid, func) wx__DECLARE_EVT1(wxEVT_SCROLL_TOP, winid, wxScrollEventHandler(func))
@@ -2792,7 +2910,7 @@ typedef void (wxEvtHandler::*wxMouseCaptureChangedEventFunction)(wxMouseCaptureC
 #define EVT_COMMAND_SCROLL_PAGEDOWN(winid, func) wx__DECLARE_EVT1(wxEVT_SCROLL_PAGEDOWN, winid, wxScrollEventHandler(func))
 #define EVT_COMMAND_SCROLL_THUMBTRACK(winid, func) wx__DECLARE_EVT1(wxEVT_SCROLL_THUMBTRACK, winid, wxScrollEventHandler(func))
 #define EVT_COMMAND_SCROLL_THUMBRELEASE(winid, func) wx__DECLARE_EVT1(wxEVT_SCROLL_THUMBRELEASE, winid, wxScrollEventHandler(func))
-#define EVT_COMMAND_SCROLL_ENDSCROLL(winid, func) wx__DECLARE_EVT1(wxEVT_SCROLL_ENDSCROLL, winid, wxScrollEventHandler(func))
+#define EVT_COMMAND_SCROLL_CHANGED(winid, func) wx__DECLARE_EVT1(wxEVT_SCROLL_CHANGED, winid, wxScrollEventHandler(func))
 
 #define EVT_COMMAND_SCROLL(winid, func) \
     EVT_COMMAND_SCROLL_TOP(winid, func) \
@@ -2802,7 +2920,15 @@ typedef void (wxEvtHandler::*wxMouseCaptureChangedEventFunction)(wxMouseCaptureC
     EVT_COMMAND_SCROLL_PAGEUP(winid, func) \
     EVT_COMMAND_SCROLL_PAGEDOWN(winid, func) \
     EVT_COMMAND_SCROLL_THUMBTRACK(winid, func) \
-    EVT_COMMAND_SCROLL_THUMBRELEASE(winid, func)
+    EVT_COMMAND_SCROLL_THUMBRELEASE(winid, func) \
+    EVT_COMMAND_SCROLL_CHANGED(winid, func)
+
+#if WXWIN_COMPATIBILITY_2_6
+    // compatibility macros for the old name, deprecated in 2.8
+    #define wxEVT_SCROLL_ENDSCROLL wxEVT_SCROLL_CHANGED
+    #define EVT_COMMAND_SCROLL_ENDSCROLL EVT_COMMAND_SCROLL_CHANGED
+    #define EVT_SCROLL_ENDSCROLL EVT_SCROLL_CHANGED
+#endif // WXWIN_COMPATIBILITY_2_6
 
 // Convenience macros for commonly-used commands
 #define EVT_CHECKBOX(winid, func) wx__DECLARE_EVT1(wxEVT_COMMAND_CHECKBOX_CLICKED, winid, wxCommandEventHandler(func))
@@ -2895,9 +3021,8 @@ extern WXDLLIMPEXP_BASE wxList *wxPendingEvents;
 
 // Find a window with the focus, that is also a descendant of the given window.
 // This is used to determine the window to initially send commands to.
-wxWindow* wxFindFocusDescendant(wxWindow* ancestor);
+WXDLLIMPEXP_CORE wxWindow* wxFindFocusDescendant(wxWindow* ancestor);
 
 #endif // wxUSE_GUI
 
 #endif // _WX_EVENT_H__
-