1 ///////////////////////////////////////////////////////////////////////////// 
   3 // Purpose:     Event classes 
   4 // Author:      Julian Smart 
   8 // Copyright:   (c) Julian Smart and Markus Holzem 
   9 // Licence:     wxWindows licence 
  10 ///////////////////////////////////////////////////////////////////////////// 
  12 // ============================================================================ 
  14 // ============================================================================ 
  16 // ---------------------------------------------------------------------------- 
  18 // ---------------------------------------------------------------------------- 
  21     #pragma implementation "event.h" 
  24 // For compilers that support precompilation, includes "wx.h". 
  25 #include "wx/wxprec.h" 
  37         #include "wx/control.h" 
  46     #include "wx/validate.h" 
  49 // ---------------------------------------------------------------------------- 
  51 // ---------------------------------------------------------------------------- 
  53 IMPLEMENT_DYNAMIC_CLASS(wxEvtHandler
, wxObject
) 
  54 IMPLEMENT_ABSTRACT_CLASS(wxEvent
, wxObject
) 
  57     IMPLEMENT_DYNAMIC_CLASS(wxIdleEvent
, wxEvent
) 
  58     IMPLEMENT_DYNAMIC_CLASS(wxCommandEvent
, wxEvent
) 
  59     IMPLEMENT_DYNAMIC_CLASS(wxNotifyEvent
, wxCommandEvent
) 
  60     IMPLEMENT_DYNAMIC_CLASS(wxScrollEvent
, wxCommandEvent
) 
  61     IMPLEMENT_DYNAMIC_CLASS(wxScrollWinEvent
, wxEvent
) 
  62     IMPLEMENT_DYNAMIC_CLASS(wxMouseEvent
, wxEvent
) 
  63     IMPLEMENT_DYNAMIC_CLASS(wxKeyEvent
, wxEvent
) 
  64     IMPLEMENT_DYNAMIC_CLASS(wxSizeEvent
, wxEvent
) 
  65     IMPLEMENT_DYNAMIC_CLASS(wxPaintEvent
, wxEvent
) 
  66     IMPLEMENT_DYNAMIC_CLASS(wxNcPaintEvent
, wxEvent
) 
  67     IMPLEMENT_DYNAMIC_CLASS(wxEraseEvent
, wxEvent
) 
  68     IMPLEMENT_DYNAMIC_CLASS(wxMoveEvent
, wxEvent
) 
  69     IMPLEMENT_DYNAMIC_CLASS(wxFocusEvent
, wxEvent
) 
  70     IMPLEMENT_DYNAMIC_CLASS(wxChildFocusEvent
, wxCommandEvent
) 
  71     IMPLEMENT_DYNAMIC_CLASS(wxCloseEvent
, wxEvent
) 
  72     IMPLEMENT_DYNAMIC_CLASS(wxShowEvent
, wxEvent
) 
  73     IMPLEMENT_DYNAMIC_CLASS(wxMaximizeEvent
, wxEvent
) 
  74     IMPLEMENT_DYNAMIC_CLASS(wxIconizeEvent
, wxEvent
) 
  75     IMPLEMENT_DYNAMIC_CLASS(wxMenuEvent
, wxEvent
) 
  76     IMPLEMENT_DYNAMIC_CLASS(wxJoystickEvent
, wxEvent
) 
  77     IMPLEMENT_DYNAMIC_CLASS(wxDropFilesEvent
, wxEvent
) 
  78     IMPLEMENT_DYNAMIC_CLASS(wxActivateEvent
, wxEvent
) 
  79     IMPLEMENT_DYNAMIC_CLASS(wxInitDialogEvent
, wxEvent
) 
  80     IMPLEMENT_DYNAMIC_CLASS(wxSysColourChangedEvent
, wxEvent
) 
  81     IMPLEMENT_DYNAMIC_CLASS(wxUpdateUIEvent
, wxCommandEvent
) 
  82     IMPLEMENT_DYNAMIC_CLASS(wxNavigationKeyEvent
, wxCommandEvent
) 
  83     IMPLEMENT_DYNAMIC_CLASS(wxPaletteChangedEvent
, wxEvent
) 
  84     IMPLEMENT_DYNAMIC_CLASS(wxQueryNewPaletteEvent
, wxEvent
) 
  85     IMPLEMENT_DYNAMIC_CLASS(wxWindowCreateEvent
, wxEvent
) 
  86     IMPLEMENT_DYNAMIC_CLASS(wxWindowDestroyEvent
, wxEvent
) 
  87     IMPLEMENT_DYNAMIC_CLASS(wxHelpEvent
, wxCommandEvent
) 
  88     IMPLEMENT_DYNAMIC_CLASS(wxContextMenuEvent
, wxCommandEvent
) 
  91 const wxEventTable 
*wxEvtHandler::GetEventTable() const 
  92     { return &wxEvtHandler::sm_eventTable
; } 
  94 const wxEventTable 
wxEvtHandler::sm_eventTable 
= 
  95     { (const wxEventTable 
*)NULL
, &wxEvtHandler::sm_eventTableEntries
[0] }; 
  97 const wxEventTableEntry 
wxEvtHandler::sm_eventTableEntries
[] = 
  98     { DECLARE_EVENT_TABLE_ENTRY(wxEVT_NULL
, 0, 0, (wxObjectEventFunction
)NULL
, NULL
) }; 
 100 // ---------------------------------------------------------------------------- 
 102 // ---------------------------------------------------------------------------- 
 104 // To put pending event handlers 
 105 wxList 
*wxPendingEvents 
= (wxList 
*)NULL
; 
 108     // protects wxPendingEvents list 
 109     wxCriticalSection 
*wxPendingEventsLocker 
= (wxCriticalSection 
*)NULL
; 
 112 #if !WXWIN_COMPATIBILITY_EVENT_TYPES 
 114 // common event types are defined here, other event types are defined by the 
 115 // components which use them 
 117 DEFINE_EVENT_TYPE(wxEVT_NULL
) 
 118 DEFINE_EVENT_TYPE(wxEVT_COMMAND_BUTTON_CLICKED
) 
 119 DEFINE_EVENT_TYPE(wxEVT_COMMAND_CHECKBOX_CLICKED
) 
 120 DEFINE_EVENT_TYPE(wxEVT_COMMAND_CHOICE_SELECTED
) 
 121 DEFINE_EVENT_TYPE(wxEVT_COMMAND_LISTBOX_SELECTED
) 
 122 DEFINE_EVENT_TYPE(wxEVT_COMMAND_LISTBOX_DOUBLECLICKED
) 
 123 DEFINE_EVENT_TYPE(wxEVT_COMMAND_CHECKLISTBOX_TOGGLED
) 
 124 DEFINE_EVENT_TYPE(wxEVT_COMMAND_MENU_SELECTED
) 
 125 DEFINE_EVENT_TYPE(wxEVT_COMMAND_SLIDER_UPDATED
) 
 126 DEFINE_EVENT_TYPE(wxEVT_COMMAND_RADIOBOX_SELECTED
) 
 127 DEFINE_EVENT_TYPE(wxEVT_COMMAND_RADIOBUTTON_SELECTED
) 
 128 DEFINE_EVENT_TYPE(wxEVT_COMMAND_SCROLLBAR_UPDATED
) 
 129 DEFINE_EVENT_TYPE(wxEVT_COMMAND_VLBOX_SELECTED
) 
 130 DEFINE_EVENT_TYPE(wxEVT_COMMAND_COMBOBOX_SELECTED
) 
 131 DEFINE_EVENT_TYPE(wxEVT_COMMAND_TOOL_RCLICKED
) 
 132 DEFINE_EVENT_TYPE(wxEVT_COMMAND_TOOL_ENTER
) 
 133 DEFINE_EVENT_TYPE(wxEVT_COMMAND_SPINCTRL_UPDATED
) 
 135 // Sockets and timers send events, too 
 136 DEFINE_EVENT_TYPE(wxEVT_SOCKET
) 
 137 DEFINE_EVENT_TYPE(wxEVT_TIMER
) 
 140 DEFINE_EVENT_TYPE(wxEVT_LEFT_DOWN
) 
 141 DEFINE_EVENT_TYPE(wxEVT_LEFT_UP
) 
 142 DEFINE_EVENT_TYPE(wxEVT_MIDDLE_DOWN
) 
 143 DEFINE_EVENT_TYPE(wxEVT_MIDDLE_UP
) 
 144 DEFINE_EVENT_TYPE(wxEVT_RIGHT_DOWN
) 
 145 DEFINE_EVENT_TYPE(wxEVT_RIGHT_UP
) 
 146 DEFINE_EVENT_TYPE(wxEVT_MOTION
) 
 147 DEFINE_EVENT_TYPE(wxEVT_ENTER_WINDOW
) 
 148 DEFINE_EVENT_TYPE(wxEVT_LEAVE_WINDOW
) 
 149 DEFINE_EVENT_TYPE(wxEVT_LEFT_DCLICK
) 
 150 DEFINE_EVENT_TYPE(wxEVT_MIDDLE_DCLICK
) 
 151 DEFINE_EVENT_TYPE(wxEVT_RIGHT_DCLICK
) 
 152 DEFINE_EVENT_TYPE(wxEVT_SET_FOCUS
) 
 153 DEFINE_EVENT_TYPE(wxEVT_KILL_FOCUS
) 
 154 DEFINE_EVENT_TYPE(wxEVT_CHILD_FOCUS
) 
 155 DEFINE_EVENT_TYPE(wxEVT_MOUSEWHEEL
) 
 157 // Non-client mouse events 
 158 DEFINE_EVENT_TYPE(wxEVT_NC_LEFT_DOWN
) 
 159 DEFINE_EVENT_TYPE(wxEVT_NC_LEFT_UP
) 
 160 DEFINE_EVENT_TYPE(wxEVT_NC_MIDDLE_DOWN
) 
 161 DEFINE_EVENT_TYPE(wxEVT_NC_MIDDLE_UP
) 
 162 DEFINE_EVENT_TYPE(wxEVT_NC_RIGHT_DOWN
) 
 163 DEFINE_EVENT_TYPE(wxEVT_NC_RIGHT_UP
) 
 164 DEFINE_EVENT_TYPE(wxEVT_NC_MOTION
) 
 165 DEFINE_EVENT_TYPE(wxEVT_NC_ENTER_WINDOW
) 
 166 DEFINE_EVENT_TYPE(wxEVT_NC_LEAVE_WINDOW
) 
 167 DEFINE_EVENT_TYPE(wxEVT_NC_LEFT_DCLICK
) 
 168 DEFINE_EVENT_TYPE(wxEVT_NC_MIDDLE_DCLICK
) 
 169 DEFINE_EVENT_TYPE(wxEVT_NC_RIGHT_DCLICK
) 
 171 // Character input event type 
 172 DEFINE_EVENT_TYPE(wxEVT_CHAR
) 
 173 DEFINE_EVENT_TYPE(wxEVT_CHAR_HOOK
) 
 174 DEFINE_EVENT_TYPE(wxEVT_NAVIGATION_KEY
) 
 175 DEFINE_EVENT_TYPE(wxEVT_KEY_DOWN
) 
 176 DEFINE_EVENT_TYPE(wxEVT_KEY_UP
) 
 179 DEFINE_EVENT_TYPE(wxEVT_SET_CURSOR
) 
 181 // wxScrollbar and wxSlider event identifiers 
 182 DEFINE_EVENT_TYPE(wxEVT_SCROLL_TOP
) 
 183 DEFINE_EVENT_TYPE(wxEVT_SCROLL_BOTTOM
) 
 184 DEFINE_EVENT_TYPE(wxEVT_SCROLL_LINEUP
) 
 185 DEFINE_EVENT_TYPE(wxEVT_SCROLL_LINEDOWN
) 
 186 DEFINE_EVENT_TYPE(wxEVT_SCROLL_PAGEUP
) 
 187 DEFINE_EVENT_TYPE(wxEVT_SCROLL_PAGEDOWN
) 
 188 DEFINE_EVENT_TYPE(wxEVT_SCROLL_THUMBTRACK
) 
 189 DEFINE_EVENT_TYPE(wxEVT_SCROLL_THUMBRELEASE
) 
 191 // Scroll events from wxWindow 
 192 DEFINE_EVENT_TYPE(wxEVT_SCROLLWIN_TOP
) 
 193 DEFINE_EVENT_TYPE(wxEVT_SCROLLWIN_BOTTOM
) 
 194 DEFINE_EVENT_TYPE(wxEVT_SCROLLWIN_LINEUP
) 
 195 DEFINE_EVENT_TYPE(wxEVT_SCROLLWIN_LINEDOWN
) 
 196 DEFINE_EVENT_TYPE(wxEVT_SCROLLWIN_PAGEUP
) 
 197 DEFINE_EVENT_TYPE(wxEVT_SCROLLWIN_PAGEDOWN
) 
 198 DEFINE_EVENT_TYPE(wxEVT_SCROLLWIN_THUMBTRACK
) 
 199 DEFINE_EVENT_TYPE(wxEVT_SCROLLWIN_THUMBRELEASE
) 
 202 DEFINE_EVENT_TYPE(wxEVT_SIZE
) 
 203 DEFINE_EVENT_TYPE(wxEVT_MOVE
) 
 204 DEFINE_EVENT_TYPE(wxEVT_CLOSE_WINDOW
) 
 205 DEFINE_EVENT_TYPE(wxEVT_END_SESSION
) 
 206 DEFINE_EVENT_TYPE(wxEVT_QUERY_END_SESSION
) 
 207 DEFINE_EVENT_TYPE(wxEVT_ACTIVATE_APP
) 
 208 DEFINE_EVENT_TYPE(wxEVT_POWER
) 
 209 DEFINE_EVENT_TYPE(wxEVT_ACTIVATE
) 
 210 DEFINE_EVENT_TYPE(wxEVT_CREATE
) 
 211 DEFINE_EVENT_TYPE(wxEVT_DESTROY
) 
 212 DEFINE_EVENT_TYPE(wxEVT_SHOW
) 
 213 DEFINE_EVENT_TYPE(wxEVT_ICONIZE
) 
 214 DEFINE_EVENT_TYPE(wxEVT_MAXIMIZE
) 
 215 DEFINE_EVENT_TYPE(wxEVT_MOUSE_CAPTURE_CHANGED
) 
 216 DEFINE_EVENT_TYPE(wxEVT_PAINT
) 
 217 DEFINE_EVENT_TYPE(wxEVT_ERASE_BACKGROUND
) 
 218 DEFINE_EVENT_TYPE(wxEVT_NC_PAINT
) 
 219 DEFINE_EVENT_TYPE(wxEVT_PAINT_ICON
) 
 220 DEFINE_EVENT_TYPE(wxEVT_MENU_CHAR
) 
 221 DEFINE_EVENT_TYPE(wxEVT_MENU_INIT
) 
 222 DEFINE_EVENT_TYPE(wxEVT_MENU_HIGHLIGHT
) 
 223 DEFINE_EVENT_TYPE(wxEVT_POPUP_MENU_INIT
) 
 224 DEFINE_EVENT_TYPE(wxEVT_CONTEXT_MENU
) 
 225 DEFINE_EVENT_TYPE(wxEVT_SYS_COLOUR_CHANGED
) 
 226 DEFINE_EVENT_TYPE(wxEVT_SETTING_CHANGED
) 
 227 DEFINE_EVENT_TYPE(wxEVT_QUERY_NEW_PALETTE
) 
 228 DEFINE_EVENT_TYPE(wxEVT_PALETTE_CHANGED
) 
 229 DEFINE_EVENT_TYPE(wxEVT_JOY_BUTTON_DOWN
) 
 230 DEFINE_EVENT_TYPE(wxEVT_JOY_BUTTON_UP
) 
 231 DEFINE_EVENT_TYPE(wxEVT_JOY_MOVE
) 
 232 DEFINE_EVENT_TYPE(wxEVT_JOY_ZMOVE
) 
 233 DEFINE_EVENT_TYPE(wxEVT_DROP_FILES
) 
 234 DEFINE_EVENT_TYPE(wxEVT_DRAW_ITEM
) 
 235 DEFINE_EVENT_TYPE(wxEVT_MEASURE_ITEM
) 
 236 DEFINE_EVENT_TYPE(wxEVT_COMPARE_ITEM
) 
 237 DEFINE_EVENT_TYPE(wxEVT_INIT_DIALOG
) 
 238 DEFINE_EVENT_TYPE(wxEVT_IDLE
) 
 239 DEFINE_EVENT_TYPE(wxEVT_UPDATE_UI
) 
 241 // Generic command events 
 242 // Note: a click is a higher-level event than button down/up 
 243 DEFINE_EVENT_TYPE(wxEVT_COMMAND_LEFT_CLICK
) 
 244 DEFINE_EVENT_TYPE(wxEVT_COMMAND_LEFT_DCLICK
) 
 245 DEFINE_EVENT_TYPE(wxEVT_COMMAND_RIGHT_CLICK
) 
 246 DEFINE_EVENT_TYPE(wxEVT_COMMAND_RIGHT_DCLICK
) 
 247 DEFINE_EVENT_TYPE(wxEVT_COMMAND_SET_FOCUS
) 
 248 DEFINE_EVENT_TYPE(wxEVT_COMMAND_KILL_FOCUS
) 
 249 DEFINE_EVENT_TYPE(wxEVT_COMMAND_ENTER
) 
 252 DEFINE_EVENT_TYPE(wxEVT_HELP
) 
 253 DEFINE_EVENT_TYPE(wxEVT_DETAILED_HELP
) 
 255 #endif // !WXWIN_COMPATIBILITY_EVENT_TYPES 
 257 // ============================================================================ 
 259 // ============================================================================ 
 261 // ---------------------------------------------------------------------------- 
 262 // event initialization 
 263 // ---------------------------------------------------------------------------- 
 268     static int s_lastUsedEventType 
= wxEVT_FIRST
; 
 270 #if WXWIN_COMPATIBILITY_2 
 271     // check that we don't overlap with the user-defined types: if it does 
 272     // happen, the best solution is probably to update the existing code to 
 273     // use wxNewEventType() instead of wxEVT_USER_FIRST 
 275     // due to the uncertainty 
 276     wxASSERT_MSG( s_lastUsedEventType 
< wxEVT_USER_FIRST 
- 1, 
 277                   _T("possible event type conflict") ); 
 278 #endif // WXWIN_COMPATIBILITY_2 
 280     return s_lastUsedEventType
++; 
 283 // ---------------------------------------------------------------------------- 
 285 // ---------------------------------------------------------------------------- 
 288  * General wxWindows events, covering 
 289  * all interesting things that might happen (button clicking, resizing, 
 290  * setting text in widgets, etc.). 
 292  * For each completely new event type, derive a new event class. 
 296 wxEvent::wxEvent(int theId
) 
 298     m_eventType 
= wxEVT_NULL
; 
 299     m_eventObject 
= (wxObject 
*) NULL
; 
 303     m_callbackUserData 
= (wxObject 
*) NULL
; 
 304     m_isCommandEvent 
= FALSE
; 
 307 void wxEvent::CopyObject(wxObject
& object_dest
) const 
 309     wxEvent 
*obj 
= (wxEvent 
*)&object_dest
; 
 310     wxObject::CopyObject(object_dest
); 
 312     obj
->m_eventType 
= m_eventType
; 
 313     obj
->m_eventObject 
= m_eventObject
; 
 314     obj
->m_timeStamp 
= m_timeStamp
; 
 316     obj
->m_skipped 
= m_skipped
; 
 317     obj
->m_callbackUserData 
= m_callbackUserData
; 
 318     obj
->m_isCommandEvent 
= m_isCommandEvent
; 
 328 wxCommandEvent::wxCommandEvent(wxEventType commandType
, int theId
) 
 330     m_eventType 
= commandType
; 
 331     m_clientData 
= (char *) NULL
; 
 332     m_clientObject 
= (wxClientData 
*) NULL
; 
 336     m_commandString 
= wxEmptyString
; 
 337     m_isCommandEvent 
= TRUE
; 
 340 void wxCommandEvent::CopyObject(wxObject
& obj_d
) const 
 342     wxCommandEvent 
*obj 
= (wxCommandEvent 
*)&obj_d
; 
 344     wxEvent::CopyObject(obj_d
); 
 346     obj
->m_clientData    
= m_clientData
; 
 347     obj
->m_clientObject  
= m_clientObject
; 
 348     obj
->m_extraLong     
= m_extraLong
; 
 349     obj
->m_commandInt    
= m_commandInt
; 
 350     obj
->m_commandString 
= m_commandString
; 
 357 void wxNotifyEvent::CopyObject(wxObject
& obj_d
) const 
 359     wxNotifyEvent 
*obj 
= (wxNotifyEvent 
*)&obj_d
; 
 361     wxEvent::CopyObject(obj_d
); 
 363     if (!m_bAllow
) obj
->Veto(); 
 370 wxScrollEvent::wxScrollEvent(wxEventType commandType
, 
 374              : wxCommandEvent(commandType
, id
) 
 376     m_extraLong 
= orient
; 
 384 wxScrollWinEvent::wxScrollWinEvent(wxEventType commandType
, 
 388     m_eventType 
= commandType
; 
 389     m_extraLong 
= orient
; 
 393 void wxScrollWinEvent::CopyObject(wxObject
& obj_d
) const 
 395     wxScrollWinEvent 
*obj 
= (wxScrollWinEvent
*)&obj_d
; 
 397     wxEvent::CopyObject(obj_d
); 
 399     obj
->m_extraLong    
= m_extraLong
; 
 400     obj
->m_commandInt   
= m_commandInt
; 
 408 wxMouseEvent::wxMouseEvent(wxEventType commandType
) 
 410     m_eventType 
= commandType
; 
 413     m_controlDown 
= FALSE
; 
 417     m_middleDown 
= FALSE
; 
 422     m_linesPerAction 
= 0; 
 425 void wxMouseEvent::CopyObject(wxObject
& obj_d
) const 
 427     wxMouseEvent 
*obj 
= (wxMouseEvent 
*)&obj_d
; 
 429     wxEvent::CopyObject(obj_d
); 
 431     obj
->m_metaDown 
= m_metaDown
; 
 432     obj
->m_altDown 
= m_altDown
; 
 433     obj
->m_controlDown 
= m_controlDown
; 
 434     obj
->m_shiftDown 
= m_shiftDown
; 
 435     obj
->m_leftDown 
= m_leftDown
; 
 436     obj
->m_rightDown 
= m_rightDown
; 
 437     obj
->m_middleDown 
= m_middleDown
; 
 442 // True if was a button dclick event (1 = left, 2 = middle, 3 = right) 
 443 // or any button dclick event (but = -1) 
 444 bool wxMouseEvent::ButtonDClick(int but
) const 
 449             return (LeftDClick() || MiddleDClick() || RightDClick()); 
 453             return MiddleDClick(); 
 455             return RightDClick(); 
 457             wxFAIL_MSG(wxT("invalid parameter in wxMouseEvent::ButtonDClick")); 
 463 // True if was a button down event (1 = left, 2 = middle, 3 = right) 
 464 // or any button down event (but = -1) 
 465 bool wxMouseEvent::ButtonDown(int but
) const 
 470             return (LeftDown() || MiddleDown() || RightDown()); 
 478             wxFAIL_MSG(wxT("invalid parameter in wxMouseEvent::ButtonDown")); 
 484 // True if was a button up event (1 = left, 2 = middle, 3 = right) 
 485 // or any button up event (but = -1) 
 486 bool wxMouseEvent::ButtonUp(int but
) const 
 491             return (LeftUp() || MiddleUp() || RightUp()); 
 499             wxFAIL_MSG(wxT("invalid parameter in wxMouseEvent::ButtonUp")); 
 505 // True if the given button is currently changing state 
 506 bool wxMouseEvent::Button(int but
) const 
 511             return (ButtonUp(-1) || ButtonDown(-1) || ButtonDClick(-1)); 
 513             return (LeftDown() || LeftUp() || LeftDClick()); 
 515             return (MiddleDown() || MiddleUp() || MiddleDClick()); 
 517             return (RightDown() || RightUp() || RightDClick()); 
 519             wxFAIL_MSG(wxT("invalid parameter in wxMouseEvent::Button")); 
 525 bool wxMouseEvent::ButtonIsDown(int but
) const 
 530             return (LeftIsDown() || MiddleIsDown() || RightIsDown()); 
 534             return MiddleIsDown(); 
 536             return RightIsDown(); 
 538             wxFAIL_MSG(wxT("invalid parameter in wxMouseEvent::ButtonIsDown")); 
 544 int wxMouseEvent::GetButton() const 
 546     for ( int i 
= 1; i 
<= 3; i
++ ) 
 557 // Find the logical position of the event given the DC 
 558 wxPoint 
wxMouseEvent::GetLogicalPosition(const wxDC
& dc
) const 
 560     wxPoint 
pt(dc
.DeviceToLogicalX(m_x
), dc
.DeviceToLogicalY(m_y
)); 
 570 wxKeyEvent::wxKeyEvent(wxEventType type
) 
 574     m_controlDown 
= FALSE
; 
 581 void wxKeyEvent::CopyObject(wxObject
& obj_d
) const 
 583     wxKeyEvent 
*obj 
= (wxKeyEvent 
*)&obj_d
; 
 584     wxEvent::CopyObject(obj_d
); 
 588     obj
->m_keyCode 
= m_keyCode
; 
 590     obj
->m_shiftDown   
= m_shiftDown
; 
 591     obj
->m_controlDown 
= m_controlDown
; 
 592     obj
->m_metaDown    
= m_metaDown
; 
 593     obj
->m_altDown     
= m_altDown
; 
 594     obj
->m_keyCode     
= m_keyCode
; 
 602 void wxSizeEvent::CopyObject(wxObject
& obj_d
) const 
 604     wxSizeEvent 
*obj 
= (wxSizeEvent 
*)&obj_d
; 
 605     wxEvent::CopyObject(obj_d
); 
 607     obj
->m_size 
= m_size
; 
 610 void wxMoveEvent::CopyObject(wxObject
& obj_d
) const 
 612     wxMoveEvent 
*obj 
= (wxMoveEvent 
*)&obj_d
; 
 613     wxEvent::CopyObject(obj_d
); 
 618 void wxEraseEvent::CopyObject(wxObject
& obj_d
) const 
 620     wxEraseEvent 
*obj 
= (wxEraseEvent 
*)&obj_d
; 
 621     wxEvent::CopyObject(obj_d
); 
 626 void wxActivateEvent::CopyObject(wxObject
& obj_d
) const 
 628     wxActivateEvent 
*obj 
= (wxActivateEvent 
*)&obj_d
; 
 629     wxEvent::CopyObject(obj_d
); 
 631     obj
->m_active 
= m_active
; 
 634 void wxMenuEvent::CopyObject(wxObject
& obj_d
) const 
 636     wxMenuEvent 
*obj 
= (wxMenuEvent 
*)&obj_d
; 
 637     wxEvent::CopyObject(obj_d
); 
 639     obj
->m_menuId 
= m_menuId
; 
 642 void wxCloseEvent::CopyObject(wxObject
& obj_d
) const 
 644     wxCloseEvent 
*obj 
= (wxCloseEvent 
*)&obj_d
; 
 645     wxEvent::CopyObject(obj_d
); 
 647     obj
->m_loggingOff 
= m_loggingOff
; 
 648     obj
->m_veto 
= m_veto
; 
 649 #if WXWIN_COMPATIBILITY 
 650     obj
->m_force 
= m_force
; 
 652     obj
->m_canVeto 
= m_canVeto
; 
 655 void wxShowEvent::CopyObject(wxObject
& obj_d
) const 
 657     wxShowEvent 
*obj 
= (wxShowEvent 
*)&obj_d
; 
 658     wxEvent::CopyObject(obj_d
); 
 660     obj
->m_show 
= m_show
; 
 663 void wxJoystickEvent::CopyObject(wxObject
& obj_d
) const 
 665     wxJoystickEvent 
*obj 
= (wxJoystickEvent 
*)&obj_d
; 
 666     wxEvent::CopyObject(obj_d
); 
 669     obj
->m_zPosition 
= m_zPosition
; 
 670     obj
->m_buttonChange 
= m_buttonChange
; 
 671     obj
->m_buttonState 
= m_buttonState
; 
 672     obj
->m_joyStick 
= m_joyStick
; 
 675 void wxDropFilesEvent::CopyObject(wxObject
& obj_d
) const 
 677     wxDropFilesEvent 
*obj 
= (wxDropFilesEvent 
*)&obj_d
; 
 678     wxEvent::CopyObject(obj_d
); 
 680     obj
->m_noFiles 
= m_noFiles
; 
 682     // TODO: Problem with obj->m_files. It should be deallocated by the 
 683     // destructor of the event. 
 686 void wxUpdateUIEvent::CopyObject(wxObject 
&obj_d
) const 
 688     wxUpdateUIEvent 
*obj 
= (wxUpdateUIEvent 
*)&obj_d
; 
 689     wxEvent::CopyObject(obj_d
); 
 691     obj
->m_checked 
= m_checked
; 
 692     obj
->m_enabled 
= m_enabled
; 
 693     obj
->m_text 
= m_text
; 
 694     obj
->m_setText 
= m_setText
; 
 695     obj
->m_setChecked 
= m_setChecked
; 
 696     obj
->m_setEnabled 
= m_setEnabled
; 
 699 void wxPaletteChangedEvent::CopyObject(wxObject 
&obj_d
) const 
 701     wxPaletteChangedEvent 
*obj 
= (wxPaletteChangedEvent 
*)&obj_d
; 
 702     wxEvent::CopyObject(obj_d
); 
 704     obj
->m_changedWindow 
= m_changedWindow
; 
 707 void wxQueryNewPaletteEvent::CopyObject(wxObject
& obj_d
) const 
 709     wxQueryNewPaletteEvent 
*obj 
= (wxQueryNewPaletteEvent 
*)&obj_d
; 
 710     wxEvent::CopyObject(obj_d
); 
 712     obj
->m_paletteRealized 
= m_paletteRealized
; 
 715 wxWindowCreateEvent::wxWindowCreateEvent(wxWindow 
*win
) 
 717     SetEventType(wxEVT_CREATE
); 
 721 wxWindowDestroyEvent::wxWindowDestroyEvent(wxWindow 
*win
) 
 723     SetEventType(wxEVT_DESTROY
); 
 727 void wxIdleEvent::CopyObject(wxObject
& obj_d
) const 
 729     wxIdleEvent 
*obj 
= (wxIdleEvent 
*)&obj_d
; 
 730     wxEvent::CopyObject(obj_d
); 
 732     obj
->m_requestMore 
= m_requestMore
; 
 735 wxChildFocusEvent::wxChildFocusEvent(wxWindow 
*win
) 
 736                  : wxCommandEvent(wxEVT_CHILD_FOCUS
) 
 743 // ---------------------------------------------------------------------------- 
 745 // ---------------------------------------------------------------------------- 
 751 wxEvtHandler::wxEvtHandler() 
 753     m_nextHandler 
= (wxEvtHandler 
*) NULL
; 
 754     m_previousHandler 
= (wxEvtHandler 
*) NULL
; 
 756     m_dynamicEvents 
= (wxList 
*) NULL
; 
 758     m_pendingEvents 
= (wxList 
*) NULL
; 
 760 #  if !defined(__VISAGECPP__) 
 761     m_eventsLocker 
= new wxCriticalSection
; 
 766 wxEvtHandler::~wxEvtHandler() 
 768     // Takes itself out of the list of handlers 
 769     if (m_previousHandler
) 
 770         m_previousHandler
->m_nextHandler 
= m_nextHandler
; 
 773         m_nextHandler
->m_previousHandler 
= m_previousHandler
; 
 777         wxNode 
*node 
= m_dynamicEvents
->First(); 
 780 #if WXWIN_COMPATIBILITY_EVENT_TYPES 
 781             wxEventTableEntry 
*entry 
= (wxEventTableEntry
*)node
->Data(); 
 782 #else // !WXWIN_COMPATIBILITY_EVENT_TYPES 
 783             wxDynamicEventTableEntry 
*entry 
= (wxDynamicEventTableEntry
*)node
->Data(); 
 784 #endif // WXWIN_COMPATIBILITY_EVENT_TYPES/!WXWIN_COMPATIBILITY_EVENT_TYPES 
 786             if (entry
->m_callbackUserData
) 
 787                 delete entry
->m_callbackUserData
; 
 791         delete m_dynamicEvents
; 
 794     delete m_pendingEvents
; 
 797 #  if !defined(__VISAGECPP__) 
 798     delete m_eventsLocker
; 
 805 bool wxEvtHandler::ProcessThreadEvent(wxEvent
& event
) 
 807     // check that we are really in a child thread 
 808     wxASSERT_MSG( !wxThread::IsMain(), 
 809                   wxT("use ProcessEvent() in main thread") ); 
 811     AddPendingEvent(event
); 
 816 #endif // wxUSE_THREADS 
 818 void wxEvtHandler::AddPendingEvent(wxEvent
& event
) 
 820     // 1) Add event to list of pending events of this event handler 
 822 #if defined(__VISAGECPP__) 
 823     wxENTER_CRIT_SECT( m_eventsLocker
); 
 825     wxENTER_CRIT_SECT( *m_eventsLocker
); 
 828     if ( !m_pendingEvents 
) 
 829       m_pendingEvents 
= new wxList
; 
 831     wxEvent 
*event2 
= (wxEvent 
*)event
.Clone(); 
 833     m_pendingEvents
->Append(event2
); 
 835 #if defined(__VISAGECPP__) 
 836     wxLEAVE_CRIT_SECT( m_eventsLocker
); 
 838     wxLEAVE_CRIT_SECT( *m_eventsLocker
); 
 841     // 2) Add this event handler to list of event handlers that 
 842     //    have pending events. 
 844     wxENTER_CRIT_SECT(*wxPendingEventsLocker
); 
 846     if ( !wxPendingEvents 
) 
 847         wxPendingEvents 
= new wxList
; 
 848     wxPendingEvents
->Append(this); 
 850     wxLEAVE_CRIT_SECT(*wxPendingEventsLocker
); 
 852     // 3) Inform the system that new pending events are somwehere, 
 853     //    and that these should be processed in idle time. 
 857 void wxEvtHandler::ProcessPendingEvents() 
 859 #if defined(__VISAGECPP__) 
 860     wxENTER_CRIT_SECT( m_eventsLocker
); 
 862     wxENTER_CRIT_SECT( *m_eventsLocker
); 
 865     wxNode 
*node 
= m_pendingEvents
->First(); 
 868         wxEvent 
*event 
= (wxEvent 
*)node
->Data(); 
 871         // In ProcessEvent, new events might get added and 
 872         // we can safely leave the crtical section here. 
 873 #if defined(__VISAGECPP__) 
 874         wxLEAVE_CRIT_SECT( m_eventsLocker
); 
 876         wxLEAVE_CRIT_SECT( *m_eventsLocker
); 
 878         ProcessEvent(*event
); 
 880 #if defined(__VISAGECPP__) 
 881         wxENTER_CRIT_SECT( m_eventsLocker
); 
 883         wxENTER_CRIT_SECT( *m_eventsLocker
); 
 886         node 
= m_pendingEvents
->First(); 
 889 #if defined(__VISAGECPP__) 
 890     wxLEAVE_CRIT_SECT( m_eventsLocker
); 
 892     wxLEAVE_CRIT_SECT( *m_eventsLocker
); 
 900 bool wxEvtHandler::ProcessEvent(wxEvent
& event
) 
 904     // We have to use the actual window or processing events from wxWindowNative 
 905     // destructor won't work (we don't see the wxWindow class) 
 907     // check that our flag corresponds to reality 
 908     wxClassInfo
* info 
= NULL
; 
 909 #ifdef __WXUNIVERSAL__ 
 910 #  if defined(__WXMSW__) 
 911     info 
= CLASSINFO(wxWindowMSW
); 
 912 #  elif defined(__WXGTK__) 
 913     info 
= CLASSINFO(wxWindowGTK
); 
 914 #  elif defined(__WXMGL__) 
 915     info 
= CLASSINFO(wxWindowMGL
); 
 916 #  elif defined(__WXMAC__) 
 917     info 
= CLASSINFO(wxWindowMac
); 
 918 #  elif defined(__WXMOTIF__) 
 919     info 
= CLASSINFO(wxWindowMotif
); 
 922     info 
= CLASSINFO(wxWindow
); 
 925     wxASSERT_MSG( m_isWindow 
== IsKindOf(info
), 
 926                   _T("this should [not] be a window but it is [not]") ); 
 931     // An event handler can be enabled or disabled 
 932     if ( GetEvtHandlerEnabled() ) 
 937         What is this? When using GUI threads, a non main 
 938         threads can send an event and process it itself. 
 939         This breaks GTK's GUI threads, so please explain. 
 942         // Check whether we are in a child thread. 
 943         if ( !wxThread::IsMain() ) 
 944           return ProcessThreadEvent(event
); 
 947         // Handle per-instance dynamic event tables first 
 948         if ( m_dynamicEvents 
&& SearchDynamicEventTable(event
) ) 
 951         // Then static per-class event tables 
 952         const wxEventTable 
*table 
= GetEventTable(); 
 954 #if wxUSE_GUI && wxUSE_VALIDATORS 
 955         // Try the associated validator first, if this is a window. 
 956         // Problem: if the event handler of the window has been replaced, 
 957         // this wxEvtHandler may no longer be a window. 
 958         // Therefore validators won't be processed if the handler 
 959         // has been replaced with SetEventHandler. 
 960         // THIS CAN BE CURED if PushEventHandler is used instead of 
 961         // SetEventHandler, and then processing will be passed down the 
 962         // chain of event handlers. 
 965             wxWindow 
*win 
= (wxWindow 
*)this; 
 967             // Can only use the validator of the window which 
 968             // is receiving the event 
 969             if ( win 
== event
.GetEventObject() ) 
 971                 wxValidator 
*validator 
= win
->GetValidator(); 
 972                 if ( validator 
&& validator
->ProcessEvent(event
) ) 
 980         // Search upwards through the inheritance hierarchy 
 983             if ( SearchEventTable((wxEventTable
&)*table
, event
) ) 
 985             table 
= table
->baseTable
; 
 989     // Try going down the event handler chain 
 990     if ( GetNextHandler() ) 
 992         if ( GetNextHandler()->ProcessEvent(event
) ) 
 997     // Carry on up the parent-child hierarchy, but only if event is a command 
 998     // event: it wouldn't make sense for a parent to receive a child's size 
 999     // event, for example 
1000     if ( m_isWindow 
&& event
.IsCommandEvent() ) 
1002         wxWindow 
*win 
= (wxWindow 
*)this; 
1004         // honour the requests to stop propagation at this window: this is 
1005         // used by the dialogs, for example, to prevent processing the events 
1006         // from the dialog controls in the parent frame which rarely, if ever, 
1008         if ( !(win
->GetExtraStyle() & wxWS_EX_BLOCK_EVENTS
) ) 
1010             wxWindow 
*parent 
= win
->GetParent(); 
1011             if ( parent 
&& !parent
->IsBeingDeleted() ) 
1012                 return parent
->GetEventHandler()->ProcessEvent(event
); 
1017     // Last try - application object. 
1018     if ( wxTheApp 
&& (this != wxTheApp
) ) 
1020         // Special case: don't pass wxEVT_IDLE to wxApp, since it'll always 
1021         // swallow it. wxEVT_IDLE is sent explicitly to wxApp so it will be 
1022         // processed appropriately via SearchEventTable. 
1023         if ( event
.GetEventType() != wxEVT_IDLE 
) 
1025             if ( wxTheApp
->ProcessEvent(event
) ) 
1033 bool wxEvtHandler::SearchEventTable(wxEventTable
& table
, wxEvent
& event
) 
1035     wxEventType eventType 
= event
.GetEventType(); 
1036     int eventId 
= event
.GetId(); 
1038     // BC++ doesn't like testing for m_fn without != 0 
1039     for ( int i 
= 0; table
.entries
[i
].m_fn 
!= 0; i
++ ) 
1041         // the line using reference exposes a bug in gcc: although it _seems_ 
1042         // to work, it leads to weird crashes later on during program 
1045         wxEventTableEntry entry 
= table
.entries
[i
]; 
1047         const wxEventTableEntry
& entry 
= table
.entries
[i
]; 
1050         // match only if the event type is the same and the id is either -1 in 
1051         // the event table (meaning "any") or the event id matches the id 
1052         // specified in the event table either exactly or by falling into 
1053         // range between first and last 
1054         if ( eventType 
== entry
.m_eventType 
) 
1056             int tableId1 
= entry
.m_id
, 
1057                 tableId2 
= entry
.m_lastId
; 
1059             if ( (tableId1 
== -1) || 
1060                  (tableId2 
== -1 && eventId 
== tableId1
) || 
1062                     (eventId 
>= tableId1 
&& eventId 
<= tableId2
)) ) 
1065                 event
.m_callbackUserData 
= entry
.m_callbackUserData
; 
1067                 (this->*((wxEventFunction
) (entry
.m_fn
)))(event
); 
1069                 return !event
.GetSkipped(); 
1077 void wxEvtHandler::Connect( int id
, int lastId
, 
1079                             wxObjectEventFunction func
, 
1080                             wxObject 
*userData 
) 
1082 #if WXWIN_COMPATIBILITY_EVENT_TYPES 
1083     wxEventTableEntry 
*entry 
= new wxEventTableEntry
; 
1084     entry
->m_eventType 
= eventType
; 
1086     entry
->m_lastId 
= lastId
; 
1088     entry
->m_callbackUserData 
= userData
; 
1089 #else // !WXWIN_COMPATIBILITY_EVENT_TYPES 
1090     wxDynamicEventTableEntry 
*entry 
= 
1091         new wxDynamicEventTableEntry(eventType
, id
, lastId
, func
, userData
); 
1092 #endif // WXWIN_COMPATIBILITY_EVENT_TYPES/!WXWIN_COMPATIBILITY_EVENT_TYPES 
1094     if (!m_dynamicEvents
) 
1095         m_dynamicEvents 
= new wxList
; 
1097     m_dynamicEvents
->Append( (wxObject
*) entry 
); 
1100 bool wxEvtHandler::Disconnect( int id
, int lastId
, wxEventType eventType
, 
1101                   wxObjectEventFunction func
, 
1102                   wxObject 
*userData 
) 
1104     if (!m_dynamicEvents
) 
1107     wxNode 
*node 
= m_dynamicEvents
->First(); 
1110 #if WXWIN_COMPATIBILITY_EVENT_TYPES 
1111             wxEventTableEntry 
*entry 
= (wxEventTableEntry
*)node
->Data(); 
1112 #else // !WXWIN_COMPATIBILITY_EVENT_TYPES 
1113             wxDynamicEventTableEntry 
*entry 
= (wxDynamicEventTableEntry
*)node
->Data(); 
1114 #endif // WXWIN_COMPATIBILITY_EVENT_TYPES/!WXWIN_COMPATIBILITY_EVENT_TYPES 
1116         if ((entry
->m_id 
== id
) && 
1117             ((entry
->m_lastId 
== lastId
) || (lastId 
== -1)) && 
1118             ((entry
->m_eventType 
== eventType
) || (eventType 
== wxEVT_NULL
)) && 
1119             ((entry
->m_fn 
== func
) || (func 
== (wxObjectEventFunction
)NULL
)) && 
1120             ((entry
->m_callbackUserData 
== userData
) || (userData 
== (wxObject
*)NULL
))) 
1122             if (entry
->m_callbackUserData
) 
1123                 delete entry
->m_callbackUserData
; 
1124             m_dynamicEvents
->DeleteNode( node 
); 
1128         node 
= node
->Next(); 
1133 bool wxEvtHandler::SearchDynamicEventTable( wxEvent
& event 
) 
1135     wxCHECK_MSG( m_dynamicEvents
, FALSE
, 
1136                  wxT("caller should check that we have dynamic events") ); 
1138     int commandId 
= event
.GetId(); 
1140     wxNode 
*node 
= m_dynamicEvents
->First(); 
1143 #if WXWIN_COMPATIBILITY_EVENT_TYPES 
1144             wxEventTableEntry 
*entry 
= (wxEventTableEntry
*)node
->Data(); 
1145 #else // !WXWIN_COMPATIBILITY_EVENT_TYPES 
1146             wxDynamicEventTableEntry 
*entry 
= (wxDynamicEventTableEntry
*)node
->Data(); 
1147 #endif // WXWIN_COMPATIBILITY_EVENT_TYPES/!WXWIN_COMPATIBILITY_EVENT_TYPES 
1151             // Match, if event spec says any id will do (id == -1) 
1152             if ( (event
.GetEventType() == entry
->m_eventType
) && 
1153                  (entry
->m_id 
== -1 || 
1154                   (entry
->m_lastId 
== -1 && commandId 
== entry
->m_id
) || 
1155                   (entry
->m_lastId 
!= -1 && 
1156                   (commandId 
>= entry
->m_id 
&& commandId 
<= entry
->m_lastId
))) ) 
1159                 event
.m_callbackUserData 
= entry
->m_callbackUserData
; 
1161                 (this->*((wxEventFunction
) (entry
->m_fn
)))(event
); 
1163                 if (event
.GetSkipped()) 
1169         node 
= node
->Next(); 
1174 #if WXWIN_COMPATIBILITY 
1175 bool wxEvtHandler::OnClose() 
1177     if (GetNextHandler()) 
1178         return GetNextHandler()->OnClose(); 
1182 #endif // WXWIN_COMPATIBILITY 
1186 // Find a window with the focus, that is also a descendant of the given window. 
1187 // This is used to determine the window to initially send commands to. 
1188 wxWindow
* wxFindFocusDescendant(wxWindow
* ancestor
) 
1190     // Process events starting with the window with the focus, if any. 
1191     wxWindow
* focusWin 
= wxWindow::FindFocus(); 
1192     wxWindow
* win 
= focusWin
; 
1194     // Check if this is a descendant of this frame. 
1195     // If not, win will be set to NULL. 
1198         if (win 
== ancestor
) 
1201             win 
= win
->GetParent(); 
1203     if (win 
== (wxWindow
*) NULL
) 
1204         focusWin 
= (wxWindow
*) NULL
;