Deferred events

Rob Gayvert rtg at rochester.rr.com
Wed Feb 23 18:14:27 UTC 2005


Steven Swerling wrote:

> Rob Gayvert wrote:
>
>> Or you could also just disable the button, no?  The scenario that 
>> Cees describes with a lengthy database query is very similar. If the 
>> handler is executing Smalltalk code, then subsequent clicks elsewhere 
>> could likewise be handled immediately and either ignored or with some 
>> kind of busy response. But what if it's off in a primitive or FFI 
>> call for an extended period? I don't know what the wx core will do 
>> with clicks or keystrokes in this case.  Maybe there's something we 
>> can use here from the implementation of WxWindowDisabler.
>
>
> Yes, agreed on all counts. I lost a little bit the courage of my 
> convictions as soon as I hit the send button on that last deferred 
> events email. Cees was right that it doesn't clean up the problem, it 
> just shifts it.
>
> Perhaps, as you proceed with this difficult problem, you might want to 
> leave hooks in the vm so that you can experiment *from smalltalk* with 
> different approaches. For example, if you implement a loop in the VM 
> that "eats" events during a lengthy sync callback, perhaps you could 
> leave a hook in Smalltalk that turns the filter on and off. That way 
> the masses can experiment with approaches to the problem by 
> controlling event processing from the image. The guy that writes a 
> better WinAmp decides not to eat any events, and just handle the 
> consequences by putting checks into his own code. The guy that writes 
> a banking application says "no, too risky" and disables the interface 
> during transaction download.

Here's a first pass at adding deferred event handling. There's a 
'Deferred Events' demo in 'Other Samples' that exercises several 
variations on this theme.  WxWindowDisabler seems to do a good job of 
blocking all events.
-------------- next part --------------
'From Squeak3.7 of ''4 September 2004'' [latest update: #5989] on 23 February 2005 at 12:36:18 pm'!
WxObject subclass: #WxEvtHandler
	instanceVariableNames: 'eventHandlers'
	classVariableNames: 'CallbackProcesses CompositeEvents CurrentEvent DeferredEventProcess DeferredEvents EventClasses EventProcess EventSymbols ShowEvents Synonyms'
	poolDictionaries: ''
	category: 'WxWidgets-Events'!
WxPanel subclass: #WxDeferredButtonDemo
	instanceVariableNames: 'button1 button2 button3 button4 button5 button6 button7'
	classVariableNames: ''
	poolDictionaries: ''
	category: 'WxWidgets-Demo'!

!WxEvtHandler methodsFor: 'as yet unclassified' stamp: 'rtg 2/23/2005 10:15'!
addDeferredEvent: anArray

	self class deferredEvents nextPut: anArray.! !

!WxEvtHandler methodsFor: 'as yet unclassified' stamp: 'rtg 2/22/2005 18:28'!
handleEvent: aWxEvent

	"Evaluate some Smalltalk code to process the given event. We get here from a synchronous event
	 callback from wx."
	
	| arr eventSymbol handler |

	eventSymbol := self class valueToSymbol: aWxEvent getEventType.
	
	(self eventHandlers includesKey: eventSymbol) ifFalse: [
		"try a synonym"
		eventSymbol := self class synonyms keyAtValue: eventSymbol ifAbsent: [ eventSymbol ]. 
	].

	handler := self eventHandlers at: eventSymbol ifAbsent: [ 
		Transcript show: self; show: ': no handlers for '; show: eventSymbol; cr. 
		^false 
	].

	"Each handler should be an array containing an object, an action, and optionally a boolean deferred value.
	 The action may be a selector, a block, or an array. A block action is evaluated with the event; the object is
	 ignored. An array action allows an argument to be passed in along with a selector. If the handler is deferred,
	 it is placed in the DeferredEvents queue for evaluation after "
	
	arr := handler at: aWxEvent getId ifAbsent: [ 
		handler at: -1 ifAbsent: [ 
			Transcript show: 'WxEvtHandler.handleEvent: no handler for ', aWxEvent asString; cr. 
			^false 
		]
	].

	((arr size > 2) and: [ arr third ]) ifTrue: [ 
		self addDeferredEvent: (Array with: aWxEvent clone with: arr first with: arr second).
		^true 
	].
	
	self class processAction: (Array with: aWxEvent with: arr first with: arr second).

	^true! !

!WxEvtHandler methodsFor: 'as yet unclassified' stamp: 'rtg 2/22/2005 18:22'!
on: eventSymbol id: id send: selector

	self on: eventSymbol id: id send: selector to: self.
! !

!WxEvtHandler methodsFor: 'as yet unclassified' stamp: 'rtg 2/22/2005 18:21'!
on: eventSymbol id: id send: selector to: anObject

	self on: eventSymbol id: id send: selector to: anObject deferred: false.
! !

!WxEvtHandler methodsFor: 'as yet unclassified' stamp: 'rtg 2/22/2005 18:20'!
on: eventSymbol id: id send: selector to: anObject deferred: aBoolean

	| eventType |

	"Make sure eventSymbol is a unary selector -- it's easy to goof and tough to find"
	eventSymbol isUnary 
		ifFalse: [ self error: 'event symbol #', eventSymbol, ' should be unary' ].

	(CompositeEvents includesKey: eventSymbol) ifTrue: [
		^self onComposite: eventSymbol id: id send: selector to: anObject 
	].

	eventType := self class symbolToValue: eventSymbol.

	(eventType == 0) ifTrue: [
		self error: 'unknown event symbol #', eventSymbol.
	].

	(self handlerFor: eventSymbol) at: id put: (Array with: anObject with: selector with: aBoolean).

	Wx connect: self 
		id: id 
		type: (self class symbolToValue: eventSymbol).

! !

!WxEvtHandler methodsFor: 'as yet unclassified' stamp: 'rtg 2/22/2005 18:22'!
on: eventSymbol id: id sendDeferred: selector

	^self on: eventSymbol id: id send: selector to: self deferred: false
! !

!WxEvtHandler methodsFor: 'as yet unclassified' stamp: 'rtg 2/22/2005 18:22'!
on: eventSymbol id: id sendDeferred: selector to: anObject

	self on: eventSymbol id: id send: selector to: anObject deferred: true.
! !

!WxEvtHandler methodsFor: 'as yet unclassified' stamp: 'rtg 2/22/2005 18:23'!
on: eventSymbol sendDeferred: selector 

	self on: eventSymbol sendDeferred: selector to: self.! !

!WxEvtHandler methodsFor: 'as yet unclassified' stamp: 'rtg 2/22/2005 18:23'!
on: eventSymbol sendDeferred: selector to: anObject

	self on: eventSymbol id: wxIdAny send: selector to: anObject deferred: true.! !

!WxEvtHandler methodsFor: 'as yet unclassified' stamp: 'rtg 2/22/2005 18:20'!
onComposite: eventSymbol id: id send: selector to: anObject

	self onComposite: eventSymbol id: id send: selector to: anObject deferred: false.! !

!WxEvtHandler methodsFor: 'as yet unclassified' stamp: 'rtg 2/22/2005 18:20'!
onComposite: eventSymbol id: id send: selector to: anObject deferred: aBoolean

	( CompositeEvents at: eventSymbol ifAbsent: [ ^nil ]) do: [:evt |
		self on: evt id: id send: selector to: anObject deferred: aBoolean
	].! !


!WxDeferredButtonDemo methodsFor: 'as yet unclassified' stamp: 'rtg 2/23/2005 09:58'!
build
	
	self setBackgroundColour: wxWhite. 

	button1 := WxButton parent: self id: wxIdAny label: 'Regular send with delays' position: 20 at 20.
	button1 on: #wxEvtCommandButtonClicked send: #onClick1: to: self.
	button1 setToolTipString: 'Push me and wait...'.

	button2 := WxButton parent: self id: wxIdAny label: 'Defer with delays' position: 20 at 60. 
	button2 on: #wxEvtCommandButtonClicked sendDeferred: #onClick2: to: self.
	button2 setToolTipString: 'Push me and wait...'.

	button3 := WxButton parent: self id: wxIdAny label: 'Defer with wxSleep' position: 20 at 100.
	button3 on: #wxEvtCommandButtonClicked sendDeferred: #onClick3: to: self.
	button3 setToolTipString: 'Push me and wait...'.

	button4 := WxButton parent: self id: wxIdAny label: 'Regular send without disabling - keep clicking to hit limit' position: 20 at 140.
	button4 on: #wxEvtCommandButtonClicked send: #onClick4: to: self.
	button4 setToolTipString: 'Push me and wait...'.

	button5 := WxButton parent: self id: wxIdAny label: 'Regular send with WxWindowDisabler' position: 20 at 180.
	button5 on: #wxEvtCommandButtonClicked send: #onClick5: to: self.
	button5 setToolTipString: 'Push me and wait...'.

	button6 := WxButton parent: self id: wxIdAny label: 'Regular send with long primitive' position: 20 at 220.
	button6 on: #wxEvtCommandButtonClicked send: #onClick6: to: self.
	button6 setToolTipString: 'Push me and wait...'.

	button7 := WxButton parent: self id: wxIdAny label: 'Defer with long primitive' position: 20 at 260.
	button7 on: #wxEvtCommandButtonClicked sendDeferred: #onClick7: to: self.
	button7 setToolTipString: 'Push me and wait...'.


	! !

!WxDeferredButtonDemo methodsFor: 'as yet unclassified' stamp: 'rtg 2/23/2005 08:15'!
onClick1: aCommandEvent

	Wx logMessage: 'Button 1 click'.

	button1 disable.
	
	1 to: 5 do: [:i |
		Wx logMessage: 'Button 1 step ', i asString.
		(Delay forSeconds: 1) wait.
	].

	button1 enable.! !

!WxDeferredButtonDemo methodsFor: 'as yet unclassified' stamp: 'rtg 2/23/2005 08:10'!
onClick2: aCommandEvent

	Wx logMessage: 'Button 2 click'.
	
	button2 disable.
	
	1 to: 5 do: [:i |
		Wx logMessage: 'Button 2 step ', i asString.
		(Delay forSeconds: 1) wait.
	].

	button2 enable.! !

!WxDeferredButtonDemo methodsFor: 'as yet unclassified' stamp: 'rtg 2/23/2005 08:19'!
onClick3: aCommandEvent

	Wx logMessage: 'Button 3 click'.
	
	button3 disable.
	 
	1 to: 5 do: [:i |
		Wx logMessage: 'Button 3 step ', i asString.
		Wx sleep: 1.
	].

	button3 enable.! !

!WxDeferredButtonDemo methodsFor: 'as yet unclassified' stamp: 'rtg 2/23/2005 08:25'!
onClick4: aCommandEvent

	Wx logMessage: 'Button 4 click'.

	1 to: 5 do: [:i |
		Wx logMessage: 'Button 4 step ', i asString.
		(Delay forSeconds: 1) wait.
	].

! !

!WxDeferredButtonDemo methodsFor: 'as yet unclassified' stamp: 'rtg 2/23/2005 08:41'!
onClick5: aCommandEvent

	Wx logMessage: 'Button 5 click'.
	
	WxWindowDisabler disableEventsWhile: [	
		1 to: 5 do: [:i |
			Wx logMessage: 'Button 5 step ', i asString.
			(Delay forSeconds: 1) wait.
		].
	].

	Wx logMessage: 'Button 5 done'.

! !

!WxDeferredButtonDemo methodsFor: 'as yet unclassified' stamp: 'rtg 2/23/2005 10:03'!
onClick6: aCommandEvent

	| x |
	
	Wx logMessage: 'Button 6 click'.
	
	button6 disable.
	
	x := FloatArray new: 2000000.
	x += 1.
	Wx logMessage: 'Starting long primitive'.
	x squaredLength. 
	Wx logMessage: 'Done with long primitive'.

	button6 enable.

	Wx logMessage: 'Button 6 done'.
! !

!WxDeferredButtonDemo methodsFor: 'as yet unclassified' stamp: 'rtg 2/23/2005 10:02'!
onClick7: aCommandEvent

	| x |
	
	Wx logMessage: 'Button 7 click'.
	
	button7 disable.
	
	x := FloatArray new: 2000000.
	x += 1.
	Wx logMessage: 'Starting long primitive'.
	x squaredLength. 
	Wx logMessage: 'Done with long primitive'.

	button7 enable.
	
	Wx logMessage: 'Button 7 done'.

! !


!WxDemoFrame methodsFor: 'as yet unclassified' stamp: 'rtg 2/22/2005 22:06'!
demoItems

	^#(
		( 'Frames and Dialogs' (
        		('Dialog' 'WxSampleDialog' ('WxDialog'))
        		('Frame' 'WxFrameDemo' ('WxFrame'))
        		"('MDIWindows' 'WxMDIWindowsDemo')"
        		('MiniFrame' 'WxMiniFrameDemo' ('WxMiniFrame'))
       		('Wizard' 'WxWizardSample' ('WxWizardDemoTitledPage' 'WxWizardDemoSkipNextPage' 'WxWizard'  'WxWizardPageSimple' ))
		))
		( 'Common Dialogs' (
        		('ColourDialog' 'WxColourDialogDemo' ('WxColourDialog') ) 
        		('DirDialog' 'WxDirDialogDemo' ('WxDirDialog') ) 
       		('FileDialog' 'WxFileDialogDemo' ('WxFileDialog') ) 
		     ('FindReplaceDialog' 'WxFindReplaceDialogDemo' ('WxFindReplaceDialog') ) 
        		('FontDialog' 'WxFontDialogDemo' ('WxFontDialog') )
        		('MessageDialog' 'WxMessageDialogDemo' ('WxMessageDialog') )
        		('PageSetupDialog' 'WxPageSetupDialogDemo' ('WxPageSetupDialog') )
        		('PrintDialog' 'WxPrintDialogDemo' ('WxPrintDialog') )
        		('ProgressDialog' 'WxProgressDialogDemo' ('WxProgressDialog') )
        		('SingleChoiceDialog' 'WxSingleChoiceDialogDemo' ('WxSingleChoiceDialog') )
        		('TextEntryDialog' 'WxTextEntryDialogDemo' ('WxTextEntryDialog') )
       	))
"
		( 'More Dialogs' (
        		('ImageBrowser' 'WxImageBrowserDemo') 
        		('MultipleChoiceDialog' 'WxMultipleChoiceDialogDemo') 
       		('ScrolledMessageDialog' 'WxScrolledMessageDialogDemo') 
       	))
"
		( 'Core Windows/Controls' (
        		('BitmapButton' 'WxBitmapButtonDemo' ('WxBitmapButton') ) 
        		('Button' 'WxButtonDemo' ('WxButton') )
        		('CheckBox' 'WxCheckBoxDemo' ('WxCheckBox') )
       		('CheckListBox' 'WxCheckListBoxDemo' ('WxCheckListBox') ) 
        		('Choice' 'WxChoiceDemo' ('WxChoice') ) 
        		('ComboBox' 'WxComboBoxDemo' ('WxComboBox') ) 
        		('Gauge' 'WxGaugeDemo' ('WxGauge') )
       		('Grid' 'WxGridDemo' ('WxSimpleGrid' 'WxStdEdRendGrid' 'WxCustomDataTableGrid' 'WxHugeTableGrid' 'WxEnterHandlerGrid' 'WxCustEditorGrid' 'WxDragableGrid' 'WxDragAndDropGrid' ))
			('GridMegaExample' 'WxGridMegaDemo' ('WxMegaFontRenderer' 'WxMegaGrid' 'WxMegaImageRenderer' 'WxMegaTable'))
			('ListBox' 'WxListBoxDemo' ('WxListBox') )
			('ListCtrl' 'WxListCtrlDemo' ('WxListCtrl') )
			('ListCtrlVirtual' 'WxVirtualListCtrlDemo' ('WxVirtualListCtrl') )
			('Listbook' 'WxListbookDemo' ('WxListbook') )
			('Menu' 'WxMenuDemo' ('WxMenu') )
			('Notebook' 'WxNotebookDemo' ('WxDemoColorPanel' 'WxScrolledWindowDemo' 'WxSimpleGrid' 'WxListCtrlDemo'))
"
			('PopupMenu' 'WxPopupMenuDemo' ('WxMenu') )
			('PopupWindow' 'WxPopupWindowDemo' ('WxPopupWindow' 'WxPopupTransientWindow') )
"
			('RadioBox' 'WxRadioBoxDemo' ('WxRadioBox') )
			('RadioButton' 'WxRadioButtonDemo' ('WxRadioButton') )
			('SashWindow' 'WxSashWindowDemo' ('WxSashWindow') )
			('ScrolledWindow' 'WxScrolledWindowDemo' ('WxScrolledWindow') )
			('Slider' 'WxSliderDemo' ('WxSlider') )
			('SpinButton' 'WxSpinButtonDemo' ('WxSpinButton') )
			('SpinCtrl' 'WxSpinCtrlDemo' ('WxSpinCtrl') )
			('SplitterWindow' 'WxSplitterWindowDemo' ('WxSplitterWindow') )
			('StaticBitmap' 'WxStaticBitmapDemo' ('WxStaticBitmap') )
			('StaticText' 'WxStaticTextDemo' ('WxStaticText') )
			('StatusBar' 'WxStatusBarDemo' ('WxStatusBar') )
			('TextCtrl' 'WxTextCtrlDemo' ('WxTextCtrl') )
			('ToggleButton' 'WxToggleButtonDemo' ('WxToggleButton') )
			('ToolBar' 'WxToolBarDemo' ('WxToolBar') )
			('TreeCtrl' 'WxTreeCtrlDemo' ('WxTreeCtrl') )
			('Validator' 'WxValidatorDemo' ('WxDemoValidator' 'WxDemoValidatorDialog' 'WxDemoTextValidator'))
      	)) 
"
		( 'Custom Controls' (
        		('AnalogClockWindow' 'WxAnalogClockWindowDemo')
        		('ColourSelect' 'WxColourSelectDemo')
        		('Editor' 'WxEditorDemo')
       		('GenericButtons' 'WxGenericButtonsDemo') 
        		('GenericDirCtrl' 'WxGenericDirCtrlDemo') 
        		('LEDNumberCtrl' 'WxLEDNumberCtrlDemo') 
        		('MultiSash' 'WxMultiSashDemo')
       		('PopupControl' 'WxPopupControlDemo')
			('ColourChooser' 'WxColourChooserDemo')
			('TreeListCtrl' 'WxTreeListCtrlDemo')
       	)) 
"
		( 'More Windows/Controls' (
        		('CalendarCtrl' 'WxCalendarCtrlDemo' ('WxCalendarCtrl') )
        		('ContextHelp' 'WxContextHelpDemo' ('WxContextHelp') )
        		('MimeTypesManager' 'WxMimeTypesManagerDemo' ('WxMimeTypesManager') )
        		('StyledTextCtrl1' 'WxStyledTextCtrlDemo1' ('WxStyledTextCtrl') )
        		('VListBox' 'WxVListBoxDemo' ('WxVListBox') )

"        		('ActiveXFlashWindow' 'ActiveXFlashWindowDemo')
        		('ActiveXIEHtmlWindow' 'ActiveXIEHtmlWindowDemo')
        		('ActiveXPDFWindow' 'ActiveXPDFWindowDemo')
        		('Calendar' 'CalendarDemo')
        		('DynamicSashWindow' 'DynamicSashWindowDemo')
        		('EditableListBox' 'EditableListBoxDemo')
        		('FancyText' 'FancyTextDemo')
        		('FileBrowseButton' 'FileBrowseButtonDemo')
        		('FloatBar' 'FloatBarDemo')
        		('FloatCanvas' 'FloatCanvasDemo')
        		('HtmlWindow' 'HtmlWindowDemo')
        		('IntCtrl' 'IntCtrlDemo')
        		('MVCTree' 'MVCTreeDemo')
        		('MaskedEditControls' 'MaskedEditControlsDemo')
        		('MaskedNumCtrl' 'MaskedNumCtrlDemo')
        		('ScrolledPanel' 'ScrolledPanelDemo')
        		('SplitTree' 'SplitTreeDemo')
        		('StyledTextCtrl2' 'WxStyledTextCtrlDemo2')
        		('TablePrint' 'TablePrintDemo')
        		('Throbber' 'ThrobberDemo')
        		('TimeCtrl' 'TimeCtrlDemo')
"
       	)) 
		( 'Window Layout' (
        		('GridBagSizer' 'WxGridBagSizerDemo' ('WxGridBagSizer') )
        		('LayoutConstraints' 'WxLayoutConstraintsDemo' ('WxLayoutConstraints') )
         		('Sizers' 'WxSizersDemo' ('WxSizersDemoTestFrame' 'WxSizersDemoSampleWindow' 'WxSizer' 'WxBoxSizer' 'WxGridSizer' 'WxFlexGridSizer') )
       		('XmlResource' 'WxXmlResourceDemo' ('WxXmlResource') )
			('XmlResourceHandler' 'WxXmlResourceHandlerDemo' ('WxXmlResourceCustomHandler' 'WxXmlCustomPanel') )
			('XmlResourceSubclass' 'WxXmlResourceSubclassDemo' ('WxXmlCustomPanel2') )
       		"('LayoutAnchors' 'WxLayoutAnchorsDemo')
       		('Layoutf' 'WxLayoutfDemo') 
        		('RowColSizer' 'WxRowColSizerDemo') 
        		('ScrolledPanel' 'WxScrolledPanelDemo')"
       	)) 
"
		( 'Processes and Events' (
        		('EventManager' 'WxEventManagerDemo')
        		('KeyEvents' 'WxKeyEventsDemo')
        		('Process' 'WxProcessDemo')
       		('CustomEvents' 'WxCustomEventsDemo') 
        		('Threads' 'WxThreadsDemo') 
        		('Timer' 'WxTimerDemo') 
        	)) 
		( 'Clipboard and DnD' (
        		('CustomDragAndDrop' 'WxCustomDragAndDropDemo')
        		('DragAndDrop' 'WxDragAndDropDemo')
        		('URLDragAndDrop' 'WxURLDragAndDropDemo')
       	)) 
"
		( 'Using Images' (
        		('ArtProvider' 'WxArtProviderDemo' ('WxArtProvider') )
        		('Cursor' 'WxCursorDemo' ('WxCursor') )
        		('DragImage' 'WxDragImageSampleCanvas' ('WxDragImageSample' 'WxDragShape') )
       		('Image' 'WxImageDemo' ('WxImage') ) 
        		('ImageAlpha' 'WxImageAlphaDemo' ('WxImage') ) 
         		('Mask' 'WxMaskDemo' ('WxImage') )
       		"('ImageFromStream' 'WxImageFromStreamDemo') 
       		('Throbber' 'WxThrobberDemo')"
       	)) 
		( 'Miscellaneous' (
        		('DrawXXXList' 'WxDrawXXXListDemo' ('WxDC') )
        		('FileHistory' 'WxFileHistoryDemo' ('WxFileHistory') )
       		('FontEnumerator' 'WxFontEnumeratorDemo' ('WxFontEnumerator') ) 
        		('PrintFramework' 'WxPrintFrameworkDemo' ('WxDemoPrintout') )
       		('ShapedWindow' 'WxShapedWindowDemo' ('WxFrame') )
        		"('ColourDB' 'WxColourDBDemo')
        		('Joystick' 'WxJoystickDemo') 
        		('OGL' 'WxOGLDemo') 
			('Sound' 'WxSoundDemo')
			('Unicode' 'WxUnicodeDemo')"
       	)) 
		( 'Other Samples' (
        		('Minimal' 'WxMinimalSample')
			('AboutBox' 'WxHtmlAboutSample' ('WxHtmlWindow') )
        		('Deferred Events' 'WxDeferredButtonDemo'  )
        		('Dialogs' 'WxDialogSample' ('WxDialogSampleCanvas') )
        		('Controls' 'WxControlsSample' ('WxControl') )
			('HelpController' 'WxHelpControllerDemo' ('WxHelpController') )
       		"('DragImage2' 'WxDragImageSample' ('WxDragImageSampleCanvas' 'WxDragShape') ) 
        		('StyledText' 'WxSTCSample' ('WxStyledTextCtrl') ) 
        		('SplitterWindow2' 'WxSplitterSample' ('WxSplitterTestCanvas') )"
       		('SqueakDevTools' 'WxDevToolsSample' ('BrowserPresenter') )
			('XRC Sample' 'WxXrcDemoFrame' ('WxXrcDemoPreferencesDialog' 'WxXrcDemoResizableListCtrl') )
			('XRC Viewer' 'WxXrcViewerDemo' ('XMLDOMParser') )
       	)) 
	)! !


!WxEvtHandler class methodsFor: 'as yet unclassified' stamp: 'rtg 2/23/2005 10:15'!
deferredEvents

	^ DeferredEvents ifNil: [ DeferredEvents := SharedQueue new ]! !

!WxEvtHandler class methodsFor: 'as yet unclassified' stamp: 'rtg 2/23/2005 10:16'!
initialize

	DeferredEvents := nil.
	
	self initializeSynonyms.
	self initializeCompositeEvents.
	self initializeEventSymbols.
	self initializeEventClasses.
	
	! !

!WxEvtHandler class methodsFor: 'as yet unclassified' stamp: 'rtg 2/22/2005 18:28'!
processAction: anArray

	| obj  action evt |
	
	evt := anArray first.
	obj := anArray second.
	action := anArray third.

	action isBlock ifTrue: [
		"special case of a block context"
		action value: evt.
		^true
	].
 
	(action class == Array) ifTrue: [
		"special case of a selector-arg pair (see WxMenu>>add:target:selector:argument)"
		obj perform: action first with: action second.
		^true
	].

	action isUnary ifTrue: [
		obj perform: action.
	]
	ifFalse: [
		obj perform: action with: evt.
	].! !

!WxEvtHandler class methodsFor: 'as yet unclassified' stamp: 'rtg 2/23/2005 10:16'!
runDeferredEventProcess

	DeferredEventProcess ifNotNil: [ self stopDeferredEventProcess ].
	 
	DeferredEventProcess := 
	[
		[ true ] whileTrue: [
			self processAction: self deferredEvents next.
		].
	] forkAt: Processor userSchedulingPriority.


			! !

!WxEvtHandler class methodsFor: 'as yet unclassified' stamp: 'rtg 2/23/2005 08:27'!
runEventProcess

	EventProcess ifNotNil: [ self stopEventProcess ].
	 
	EventProcess := 
	[
		[ true ] whileTrue: [
			(Delay forMilliseconds: 5) wait.
			[ Wx processEvents == true ] whileTrue: [].
			
		].
	] forkAt: Processor userSchedulingPriority.


			! !

!WxEvtHandler class methodsFor: 'as yet unclassified' stamp: 'rtg 2/22/2005 21:47'!
startingUp: resuming

	self runEventProcess. 
	self startCallbackProcesses.
	self runDeferredEventProcess.
! !

!WxEvtHandler class methodsFor: 'as yet unclassified' stamp: 'rtg 2/22/2005 21:45'!
stopDeferredEventProcess

	DeferredEventProcess ifNotNil: [ DeferredEventProcess terminate ].
	DeferredEventProcess := nil.! !


!WxDeferredButtonDemo class methodsFor: 'as yet unclassified' stamp: 'rtg 2/22/2005 22:05'!
testPanel: parent

	^(self parent: parent) build

	! !


!WxWindowDisabler class methodsFor: 'generated' stamp: 'rtg 2/23/2005 08:39'!
disableEventsWhile: aBlock

	| disabler |
	
	disabler := self new.
	[ aBlock value ] ensure: [ disabler delete ].! !

WxEvtHandler initialize!

!WxEvtHandler class reorganize!
('as yet unclassified' callbackProcesses checkCallbackException cloneCurrentEvent compositeEvents convertWxEventNameToSymbol: deferredEvents eventClassForEventType:eventObject: eventClasses eventDeleted: eventProcess eventSymbols initialize initializeCompositeEvents initializeEventClasses initializeEventSymbols initializeSynonyms processAction: processEvent runCallbackProcess: runDeferredEventProcess runEventProcess showEvents showEvents: shuttingDown: startCallbackProcesses startingUp: stopCallbackProcess: stopCallbackProcesses stopDeferredEventProcess stopEventProcess symbolToValue: synonyms valueToSymbol:)
('generated' new)
!

WxEvtHandler startingUp: true.!


More information about the Wxsqueak mailing list