]> git.saurik.com Git - wxWidgets.git/blobdiff - include/wx/event.h
set eol-style
[wxWidgets.git] / include / wx / event.h
index 6fce7406bd4eba43baa5898158953862a1e07783..1278284950454bde4bc8cabc208c1bdfb221ecb4 100644 (file)
@@ -13,6 +13,7 @@
 #define _WX_EVENT_H__
 
 #include "wx/defs.h"
+#include "wx/cpp.h"
 #include "wx/object.h"
 #include "wx/clntdata.h"
 
 // forward declarations
 // ----------------------------------------------------------------------------
 
-class WXDLLIMPEXP_BASE wxList;
+class WXDLLIMPEXP_FWD_BASE wxList;
 
 #if wxUSE_GUI
-    class WXDLLIMPEXP_CORE wxDC;
-    class WXDLLIMPEXP_CORE wxMenu;
-    class WXDLLIMPEXP_CORE wxWindow;
-    class WXDLLIMPEXP_CORE wxWindowBase;
+    class WXDLLIMPEXP_FWD_CORE wxDC;
+    class WXDLLIMPEXP_FWD_CORE wxMenu;
+    class WXDLLIMPEXP_FWD_CORE wxWindow;
+    class WXDLLIMPEXP_FWD_CORE wxWindowBase;
 #endif // wxUSE_GUI
 
-class WXDLLIMPEXP_BASE wxEvtHandler;
+class WXDLLIMPEXP_FWD_BASE wxEvtHandler;
 
 // ----------------------------------------------------------------------------
 // Event types
@@ -46,6 +47,8 @@ class WXDLLIMPEXP_BASE wxEvtHandler;
 
 typedef int wxEventType;
 
+#define wxEVT_ANY           ((wxEventType)-1)
+
 // this is used to make the event table entry type safe, so that for an event
 // handler only a function with proper parameter list can be given.
 #define wxStaticCastEvent(type, val) wx_static_cast(type, val)
@@ -94,8 +97,6 @@ typedef int wxEventType;
 #define DECLARE_EVENT_TABLE_ENTRY(type, winid, idLast, fn, obj) \
     wxEventTableEntry(type, winid, idLast, fn, obj)
 
-#define EMPTY_PARAMETER_VALUE /* Fake macro parameter value */
-
 #define BEGIN_DECLARE_EVENT_TYPES()
 #define END_DECLARE_EVENT_TYPES()
 #define DECLARE_EXPORTED_EVENT_TYPE(expdecl, name, value) \
@@ -103,7 +104,7 @@ typedef int wxEventType;
 #define DECLARE_EVENT_TYPE(name, value) \
     DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_CORE, name, value)
 #define DECLARE_LOCAL_EVENT_TYPE(name, value) \
-    DECLARE_EXPORTED_EVENT_TYPE(EMPTY_PARAMETER_VALUE, name, value)
+    DECLARE_EXPORTED_EVENT_TYPE(wxEMPTY_PARAMETER_VALUE, name, value)
 #define DEFINE_EVENT_TYPE(name) const wxEventType name = wxNewEventType();
 #define DEFINE_LOCAL_EVENT_TYPE(name) DEFINE_EVENT_TYPE(name)
 
@@ -154,9 +155,12 @@ BEGIN_DECLARE_EVENT_TYPES()
     DECLARE_EVENT_TYPE(wxEVT_COMMAND_TOOL_ENTER, 17)
     DECLARE_EVENT_TYPE(wxEVT_COMMAND_SPINCTRL_UPDATED, 18)
 
+    // Toolbar dropdown arrows
+    DECLARE_EVENT_TYPE(wxEVT_COMMAND_TOOL_DROPDOWN_CLICKED, 19)
+
         // Sockets and timers send events, too
     DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_BASE, wxEVT_SOCKET, 50)
-    DECLARE_EVENT_TYPE(wxEVT_TIMER , 80)
+    DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_BASE, wxEVT_TIMER , 80)
 
         // Mouse event types
     DECLARE_EVENT_TYPE(wxEVT_LEFT_DOWN, 100)
@@ -230,7 +234,7 @@ BEGIN_DECLARE_EVENT_TYPES()
     DECLARE_EVENT_TYPE(wxEVT_END_SESSION, 403)
     DECLARE_EVENT_TYPE(wxEVT_QUERY_END_SESSION, 404)
     DECLARE_EVENT_TYPE(wxEVT_ACTIVATE_APP, 405)
-    DECLARE_EVENT_TYPE(wxEVT_POWER, 406)
+    // 406..408 are power events
     DECLARE_EVENT_TYPE(wxEVT_ACTIVATE, 409)
     DECLARE_EVENT_TYPE(wxEVT_CREATE, 410)
     DECLARE_EVENT_TYPE(wxEVT_DESTROY, 411)
@@ -238,14 +242,14 @@ BEGIN_DECLARE_EVENT_TYPES()
     DECLARE_EVENT_TYPE(wxEVT_ICONIZE, 413)
     DECLARE_EVENT_TYPE(wxEVT_MAXIMIZE, 414)
     DECLARE_EVENT_TYPE(wxEVT_MOUSE_CAPTURE_CHANGED, 415)
-    DECLARE_EVENT_TYPE(wxEVT_PAINT, 416)
-    DECLARE_EVENT_TYPE(wxEVT_ERASE_BACKGROUND, 417)
-    DECLARE_EVENT_TYPE(wxEVT_NC_PAINT, 418)
-    DECLARE_EVENT_TYPE(wxEVT_PAINT_ICON, 419)
-    DECLARE_EVENT_TYPE(wxEVT_MENU_OPEN, 420)
-    DECLARE_EVENT_TYPE(wxEVT_MENU_CLOSE, 421)
-    DECLARE_EVENT_TYPE(wxEVT_MENU_HIGHLIGHT, 422)
-    // DECLARE_EVENT_TYPE(wxEVT_POPUP_MENU_INIT, 423) -- free slot
+    DECLARE_EVENT_TYPE(wxEVT_MOUSE_CAPTURE_LOST, 416)
+    DECLARE_EVENT_TYPE(wxEVT_PAINT, 417)
+    DECLARE_EVENT_TYPE(wxEVT_ERASE_BACKGROUND, 418)
+    DECLARE_EVENT_TYPE(wxEVT_NC_PAINT, 419)
+    DECLARE_EVENT_TYPE(wxEVT_PAINT_ICON, 420)
+    DECLARE_EVENT_TYPE(wxEVT_MENU_OPEN, 421)
+    DECLARE_EVENT_TYPE(wxEVT_MENU_CLOSE, 422)
+    DECLARE_EVENT_TYPE(wxEVT_MENU_HIGHLIGHT, 423)
     DECLARE_EVENT_TYPE(wxEVT_CONTEXT_MENU, 424)
     DECLARE_EVENT_TYPE(wxEVT_SYS_COLOUR_CHANGED, 425)
     DECLARE_EVENT_TYPE(wxEVT_DISPLAY_CHANGED, 426)
@@ -266,6 +270,7 @@ BEGIN_DECLARE_EVENT_TYPES()
     DECLARE_EVENT_TYPE(wxEVT_SIZING, 441)
     DECLARE_EVENT_TYPE(wxEVT_MOVING, 442)
     DECLARE_EVENT_TYPE(wxEVT_HIBERNATE, 443)
+    // more power events follow -- see wx/power.h
 
         // Clipboard events
     DECLARE_EVENT_TYPE(wxEVT_COMMAND_TEXT_COPY, 444)
@@ -351,7 +356,7 @@ public:
     // to allow the event processing by the base classes (calling event.Skip()
     // is the analog of calling the base class version of a virtual function)
     void Skip(bool skip = true) { m_skipped = skip; }
-    bool GetSkipped() const { return m_skipped; };
+    bool GetSkipped() const { return m_skipped; }
 
     // this function is used to create a copy of the event polymorphically and
     // all derived classes must implement it because otherwise wxPostEvent()
@@ -382,11 +387,7 @@ public:
         m_propagationLevel = propagationLevel;
     }
 
-#if WXWIN_COMPATIBILITY_2_4
-public:
-#else
 protected:
-#endif
     wxObject*         m_eventObject;
     wxEventType       m_eventType;
     long              m_timeStamp;
@@ -404,17 +405,13 @@ protected:
     // backwards compatibility as it is new
     int               m_propagationLevel;
 
-#if WXWIN_COMPATIBILITY_2_4
-public:
-#else
 protected:
-#endif
     bool              m_skipped;
     bool              m_isCommandEvent;
 
 private:
     // it needs to access our m_propagationLevel
-    friend class WXDLLIMPEXP_BASE wxPropagateOnce;
+    friend class WXDLLIMPEXP_FWD_BASE wxPropagateOnce;
 
     DECLARE_ABSTRACT_CLASS(wxEvent)
 };
@@ -467,6 +464,7 @@ private:
     DECLARE_NO_COPY_CLASS(wxPropagateOnce)
 };
 
+
 #if wxUSE_GUI
 
 
@@ -489,26 +487,6 @@ private:
  wxEVT_COMMAND_TOGGLEBUTTON_CLICKED
 */
 
-#if WXWIN_COMPATIBILITY_2_4
-// Backwards compatibility for wxCommandEvent::m_commandString, will lead to compilation errors in some cases of usage
-class WXDLLIMPEXP_CORE wxCommandEvent;
-
-class WXDLLIMPEXP_CORE wxCommandEventStringHelper
-{
-public:
-    wxCommandEventStringHelper(wxCommandEvent * evt)
-        : m_evt(evt)
-        { }
-
-    void operator=(const wxString &str);
-    operator wxString();
-    const wxChar* c_str() const;
-
-private:
-    wxCommandEvent* m_evt;
-};
-#endif
-
 class WXDLLIMPEXP_CORE wxCommandEvent : public wxEvent
 {
 public:
@@ -516,9 +494,6 @@ public:
 
     wxCommandEvent(const wxCommandEvent& event)
         : wxEvent(event),
-#if WXWIN_COMPATIBILITY_2_4
-          m_commandString(this),
-#endif
           m_cmdString(event.m_cmdString),
           m_commandInt(event.m_commandInt),
           m_extraLong(event.m_extraLong),
@@ -555,12 +530,7 @@ public:
 
     virtual wxEvent *Clone() const { return new wxCommandEvent(*this); }
 
-#if WXWIN_COMPATIBILITY_2_4
-public:
-    wxCommandEventStringHelper m_commandString;
-#else
 protected:
-#endif
     wxString          m_cmdString;     // String event argument
     int               m_commandInt;
     long              m_extraLong;     // Additional information (e.g. select/deselect)
@@ -571,23 +541,6 @@ private:
     DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxCommandEvent)
 };
 
-#if WXWIN_COMPATIBILITY_2_4
-inline void wxCommandEventStringHelper::operator=(const wxString &str)
-{
-    m_evt->SetString(str);
-}
-
-inline wxCommandEventStringHelper::operator wxString()
-{
-    return m_evt->GetString();
-}
-
-inline const wxChar* wxCommandEventStringHelper::c_str() const
-{
-    return m_evt->GetString().c_str();
-}
-#endif
-
 // this class adds a possibility to react (from the user) code to a control
 // notification: allow or veto the operation being reported.
 class WXDLLIMPEXP_CORE wxNotifyEvent  : public wxCommandEvent
@@ -679,11 +632,7 @@ public:
 
     virtual wxEvent *Clone() const { return new wxScrollWinEvent(*this); }
 
-#if WXWIN_COMPATIBILITY_2_4
-public:
-#else
 protected:
-#endif
     int               m_commandInt;
     long              m_extraLong;
 
@@ -852,10 +801,15 @@ public:
     // should occur for each delta.
     int GetWheelDelta() const { return m_wheelDelta; }
 
+    // Gets the axis the wheel operation concerns, 0 being the y axis as on
+    // most mouse wheels, 1 is the x axis for things like MightyMouse scrolls
+    // or horizontal trackpad scrolling
+    int GetWheelAxis() const { return m_wheelAxis; }
+
     // Returns the configured number of lines (or whatever) to be scrolled per
     // wheel action.  Defaults to one.
     int GetLinesPerAction() const { return m_linesPerAction; }
-
+    
     // Is the system set to do page scrolling?
     bool IsPageScroll() const { return ((unsigned int)m_linesPerAction == UINT_MAX); }
 
@@ -874,7 +828,8 @@ public:
     bool          m_shiftDown;
     bool          m_altDown;
     bool          m_metaDown;
-
+    
+    int           m_wheelAxis;
     int           m_wheelRotation;
     int           m_wheelDelta;
     int           m_linesPerAction;
@@ -1139,11 +1094,7 @@ public:
 
     virtual wxEvent *Clone() const { return new wxMoveEvent(*this); }
 
-#if WXWIN_COMPATIBILITY_2_4
-public:
-#else
 protected:
-#endif
     wxPoint m_pos;
     wxRect m_rect;
 
@@ -1184,7 +1135,7 @@ public:
         g_isPainting++;
     }
 
-    ~wxPaintEvent()
+    virtual ~wxPaintEvent()
     {
         g_isPainting--;
     }
@@ -1231,11 +1182,7 @@ public:
 
     virtual wxEvent *Clone() const { return new wxEraseEvent(*this); }
 
-#if WXWIN_COMPATIBILITY_2_4
-public:
-#else
 protected:
-#endif
     wxDC *m_dc;
 
 private:
@@ -1521,11 +1468,7 @@ enum
 
 class WXDLLIMPEXP_CORE wxJoystickEvent : public wxEvent
 {
-#if WXWIN_COMPATIBILITY_2_4
-public:
-#else
 protected:
-#endif
     wxPoint   m_pos;
     int       m_zPosition;
     int       m_buttonChange;   // Which button changed?
@@ -1788,7 +1731,7 @@ public:
 
     virtual wxEvent *Clone() const { return new wxMouseCaptureChangedEvent(*this); }
 
-    wxWindow* GetCapturedWindow() const { return m_gainedCapture; };
+    wxWindow* GetCapturedWindow() const { return m_gainedCapture; }
 
 private:
     wxWindow* m_gainedCapture;
@@ -1796,6 +1739,29 @@ private:
     DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxMouseCaptureChangedEvent)
 };
 
+/*
+ wxEVT_MOUSE_CAPTURE_LOST
+ The window losing the capture receives this message, unless it released it
+ it itself or unless wxWindow::CaptureMouse was called on another window
+ (and so capture will be restored when the new capturer releases it).
+ */
+
+class WXDLLIMPEXP_CORE wxMouseCaptureLostEvent : public wxEvent
+{
+public:
+    wxMouseCaptureLostEvent(wxWindowID winid = 0)
+        : wxEvent(winid, wxEVT_MOUSE_CAPTURE_LOST)
+    {}
+
+    wxMouseCaptureLostEvent(const wxMouseCaptureLostEvent& event)
+        : wxEvent(event)
+    {}
+
+    virtual wxEvent *Clone() const { return new wxMouseCaptureLostEvent(*this); }
+
+    DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxMouseCaptureLostEvent)
+};
+
 /*
  wxEVT_DISPLAY_CHANGED
  */
@@ -2102,6 +2068,8 @@ private:
     DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxContextMenuEvent)
 };
 
+#endif // wxUSE_GUI
+
 // Idle event
 /*
  wxEVT_IDLE
@@ -2121,7 +2089,7 @@ enum wxIdleMode
     wxIDLE_PROCESS_SPECIFIED
 };
 
-class WXDLLIMPEXP_CORE wxIdleEvent : public wxEvent
+class WXDLLIMPEXP_BASE wxIdleEvent : public wxEvent
 {
 public:
     wxIdleEvent()
@@ -2146,9 +2114,6 @@ public:
     // Returns the idle event mode
     static wxIdleMode GetMode() { return sm_idleMode; }
 
-    // Can we send an idle event?
-    static bool CanSend(wxWindow* win);
-
 protected:
     bool m_requestMore;
     static wxIdleMode sm_idleMode;
@@ -2157,10 +2122,7 @@ private:
     DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxIdleEvent)
 };
 
-#endif // wxUSE_GUI
-
 /* TODO
- wxEVT_POWER,
  wxEVT_MOUSE_CAPTURE_CHANGED,
  wxEVT_SETTING_CHANGED, // WM_WININICHANGE (NT) / WM_SETTINGCHANGE (Win95)
 // wxEVT_FONT_CHANGED,  // WM_FONTCHANGE: roll into wxEVT_SETTING_CHANGED, but remember to propagate
@@ -2323,8 +2285,10 @@ public:
     // Clear table
     void Clear();
 
+#if defined(__WXDEBUG__) && wxUSE_MEMORY_TRACING 
     // Clear all tables
     static void ClearAll();
+#endif // __WXDEBUG__ && wxUSE_MEMORY_TRACING
 
 protected:
     // Init the hash table with the entries of the static event table.
@@ -2373,13 +2337,12 @@ public:
     virtual bool ProcessEvent(wxEvent& event);
 
     // add an event to be processed later
-    void AddPendingEvent(wxEvent& event);
+    virtual void AddPendingEvent(const wxEvent& event);
 
-    // process all pending events
     void ProcessPendingEvents();
 
 #if wxUSE_THREADS
-    bool ProcessThreadEvent(wxEvent& event);
+    bool ProcessThreadEvent(const wxEvent& event);
 #endif
 
     // Dynamic association of a member function handler with the event handler,
@@ -2535,7 +2498,7 @@ private:
 
 // Post a message to the given eventhandler which will be processed during the
 // next event loop iteration
-inline void wxPostEvent(wxEvtHandler *dest, wxEvent& event)
+inline void wxPostEvent(wxEvtHandler *dest, const wxEvent& event)
 {
     wxCHECK_RET( dest, wxT("need an object to post event to in wxPostEvent") );
 
@@ -2549,6 +2512,30 @@ typedef void (wxEvtHandler::*wxEventFunction)(wxEvent&);
 
 #if wxUSE_GUI
 
+// ----------------------------------------------------------------------------
+// wxEventBlocker: helper class to temporarily disable event handling for a window
+// ----------------------------------------------------------------------------
+
+class WXDLLIMPEXP_CORE wxEventBlocker : public wxEvtHandler
+{
+public:
+    wxEventBlocker(wxWindow *win, wxEventType type = wxEVT_ANY);
+    virtual ~wxEventBlocker();
+
+    void Block(wxEventType type)
+    {
+        m_eventsToBlock.push_back(type);
+    }
+
+    virtual bool ProcessEvent(wxEvent& event);
+
+protected:
+    wxArrayInt m_eventsToBlock;
+    wxWindow *m_window;
+
+    DECLARE_NO_COPY_CLASS(wxEventBlocker)
+};
+
 typedef void (wxEvtHandler::*wxCommandEventFunction)(wxCommandEvent&);
 typedef void (wxEvtHandler::*wxScrollEventFunction)(wxScrollEvent&);
 typedef void (wxEvtHandler::*wxScrollWinEventFunction)(wxScrollWinEvent&);
@@ -2584,15 +2571,9 @@ typedef void (wxEvtHandler::*wxNotifyEventFunction)(wxNotifyEvent&);
 typedef void (wxEvtHandler::*wxHelpEventFunction)(wxHelpEvent&);
 typedef void (wxEvtHandler::*wxContextMenuEventFunction)(wxContextMenuEvent&);
 typedef void (wxEvtHandler::*wxMouseCaptureChangedEventFunction)(wxMouseCaptureChangedEvent&);
+typedef void (wxEvtHandler::*wxMouseCaptureLostEventFunction)(wxMouseCaptureLostEvent&);
 typedef void (wxEvtHandler::*wxClipboardTextEventFunction)(wxClipboardTextEvent&);
 
-// these typedefs don't have the same name structure as the others, keep for
-// backwards compatibility only
-#if WXWIN_COMPATIBILITY_2_4
-    typedef wxSysColourChangedEventFunction wxSysColourChangedFunction;
-    typedef wxDisplayChangedEventFunction wxDisplayChangedFunction;
-#endif // WXWIN_COMPATIBILITY_2_4
-
 
 #define wxCommandEventHandler(func) \
     (wxObjectEventFunction)(wxEventFunction)wxStaticCastEvent(wxCommandEventFunction, &func)
@@ -2665,6 +2646,8 @@ typedef void (wxEvtHandler::*wxClipboardTextEventFunction)(wxClipboardTextEvent&
     (wxObjectEventFunction)(wxEventFunction)wxStaticCastEvent(wxContextMenuEventFunction, &func)
 #define wxMouseCaptureChangedEventHandler(func) \
     (wxObjectEventFunction)(wxEventFunction)wxStaticCastEvent(wxMouseCaptureChangedEventFunction, &func)
+#define wxMouseCaptureLostEventHandler(func) \
+    (wxObjectEventFunction)(wxEventFunction)wxStaticCastEvent(wxMouseCaptureLostEventFunction, &func)
 #define wxClipboardTextEventHandler(func) \
     (wxObjectEventFunction)(wxEventFunction)wxStaticCastEvent(wxClipboardTextEventFunction, &func)
 
@@ -2883,6 +2866,7 @@ typedef void (wxEvtHandler::*wxClipboardTextEventFunction)(wxClipboardTextEvent&
 #define EVT_WINDOW_DESTROY(func) wx__DECLARE_EVT0(wxEVT_DESTROY, wxWindowDestroyEventHandler(func))
 #define EVT_SET_CURSOR(func) wx__DECLARE_EVT0(wxEVT_SET_CURSOR, wxSetCursorEventHandler(func))
 #define EVT_MOUSE_CAPTURE_CHANGED(func) wx__DECLARE_EVT0(wxEVT_MOUSE_CAPTURE_CHANGED, wxMouseCaptureChangedEventHandler(func))
+#define EVT_MOUSE_CAPTURE_LOST(func) wx__DECLARE_EVT0(wxEVT_MOUSE_CAPTURE_LOST, wxMouseCaptureLostEventHandler(func))
 
 // Mouse events
 #define EVT_LEFT_DOWN(func) wx__DECLARE_EVT0(wxEVT_LEFT_DOWN, wxMouseEventHandler(func))
@@ -3006,6 +2990,7 @@ typedef void (wxEvtHandler::*wxClipboardTextEventFunction)(wxClipboardTextEvent&
 #define EVT_VLBOX(winid, func) wx__DECLARE_EVT1(wxEVT_COMMAND_VLBOX_SELECTED, winid, wxCommandEventHandler(func))
 #define EVT_COMBOBOX(winid, func) wx__DECLARE_EVT1(wxEVT_COMMAND_COMBOBOX_SELECTED, winid, wxCommandEventHandler(func))
 #define EVT_TOOL(winid, func) wx__DECLARE_EVT1(wxEVT_COMMAND_TOOL_CLICKED, winid, wxCommandEventHandler(func))
+#define EVT_TOOL_DROPDOWN(winid, func) wx__DECLARE_EVT1(wxEVT_COMMAND_TOOL_DROPDOWN_CLICKED, winid, wxCommandEventHandler(func))
 #define EVT_TOOL_RANGE(id1, id2, func) wx__DECLARE_EVT2(wxEVT_COMMAND_TOOL_CLICKED, id1, id2, wxCommandEventHandler(func))
 #define EVT_TOOL_RCLICKED(winid, func) wx__DECLARE_EVT1(wxEVT_COMMAND_TOOL_RCLICKED, winid, wxCommandEventHandler(func))
 #define EVT_TOOL_RCLICKED_RANGE(id1, id2, func) wx__DECLARE_EVT2(wxEVT_COMMAND_TOOL_RCLICKED, id1, id2, wxCommandEventHandler(func))
@@ -3028,12 +3013,6 @@ typedef void (wxEvtHandler::*wxClipboardTextEventFunction)(wxClipboardTextEvent&
 #define EVT_JOY_MOVE(func) wx__DECLARE_EVT0(wxEVT_JOY_MOVE, wxJoystickEventHandler(func))
 #define EVT_JOY_ZMOVE(func) wx__DECLARE_EVT0(wxEVT_JOY_ZMOVE, wxJoystickEventHandler(func))
 
-// These are obsolete, see _BUTTON_ events
-#if WXWIN_COMPATIBILITY_2_4
-    #define EVT_JOY_DOWN(func) EVT_JOY_BUTTON_DOWN(func)
-    #define EVT_JOY_UP(func) EVT_JOY_BUTTON_UP(func)
-#endif // WXWIN_COMPATIBILITY_2_4
-
 // All joystick events
 #define EVT_JOYSTICK_EVENTS(func) \
     EVT_JOY_BUTTON_DOWN(func) \