WinBlitz3D full GUI intergration to blitz3d

Blitz3D Forums/Blitz3D Programming/WinBlitz3D full GUI intergration to blitz3d

I've found the bug in the old WinBlitz3D where it doesnt response when i close the window. It works now!!!
It seems that the bug was in WaitEvent(), because i played a little around with it and now it works. Code here, and i've added a useful command PeekEvent():

Function WaitEvent(events=1)
	

	apiSetWindowLong runtimewindow,GWL_WNDPROC,GRAB_BankAddr(WinProcBank)	
	ret_event=0
	.again
	PokeInt WinProcReturn,$04,0
	apiGetMessage(WinProcReturn,0,0,0)
	apiTranslateMessage(WinProcReturn) 
	apiDispatchMessage(WinProcReturn) 
			
	eventsource_RAW = 0
	eventdata_RAW = 0
	eventX_RAW = 0
	eventY_RAW = 0

	this_event = PeekInt(WinProcReturn,$04)
	
	
	Select this_event

		Case WM_RBUTTONUP
			ret_event = $202
			;
			If apiIsWindow(PeekInt(WinProcReturn,0)) <> 0 Then
			
				Gadget_BankDATA = apiGetWindowLong(PeekInt(WinProcReturn,0),GWL_USERDATA)
				If Gadget_BankDATA > 0 Then 
					If PeekInt(Gadget_BankDATA,$00) = PeekInt(WinProcReturn,0)
						;PopUpGadgetMenu(PeekInt(Gadget_BankDATA,$00))
					EndIf
				EndIf
				
			EndIf
			
		Case WM_KILLFOCUS

			apiGetMessage(WinProcReturn,0,0,0)
			apiTranslateMessage(WinProcReturn) 
			apiDispatchMessage(WinProcReturn) 
		
			ret_event = $401
			eventsource_RAW = apiGetFocus()
						
		Case WM_HSCROLL
			ret_event = $401
			eventsource_RAW = PeekInt(WinProcReturn,$0C)
			eventdata_RAW = LOWORD(PeekInt(WinProcReturn,$08))
			
			;WM_HSCROLL_pos = 1 + apiGetScrollPos(eventsource_RAW,SB_CTL) 
			;eventdata_RAW = apiSetScrollPos(eventsource_RAW,SB_CTL,WM_HSCROLL_pos,True)
			
							
		Case WM_VSCROLL
			ret_event = $401
			eventsource_RAW = PeekInt(WinProcReturn,$0C)
			eventdata_RAW = LOWORD(PeekInt(WinProcReturn,$08))

			;WM_VSCROLL_pos = 1 + apiGetScrollPos(eventsource_RAW,SB_CTL) 
			;eventdata_RAW = apiSetScrollPos(eventsource_RAW,SB_CTL,WM_VSCROLL_pos,True)
	
			
		Case WM_ACTIVATE
		
			If LOWORD(PeekInt(WinProcReturn,$08)) = WA_CLICKACTIVE Then
				ret_event = $804
				eventsource_RAW = PeekInt(WinProcReturn,$00)
			EndIf
			
		Case WM_ACTIVATEAPP
			eventName$ = "WM_ACTIVATEAPP"
						
		Case WM_NOTIFY
			
			
			
			If a = 1 Then
			;	PokeByte b,0,$CC
			EndIf
			a = a + 1	
			
			nmhdr_addr = PeekInt(WinProcReturn,$0C)
			apiCallWindowProcF b,0,0,GRAB_BankAddr(NMHDR),nmhdr_addr
			;Notify PeekInt(NMHDR,$04)		
				
			Select PeekInt(NMHDR,$08)
			
				Case NM_CLICK,TCN_SELCHANGE ; tabber
					ret_event = $401
					eventsource_RAW = PeekInt(NMHDR,$00)
					eventdata_RAW = apiSendMessage(eventsource_RAW,TCM_GETCURSEL,0,0)
																					
			Default
			;	ret_event = $401
			;	eventsource_RAW = PeekInt(NMHDR,$00)
			End Select
											
			;Notify "here "+PeekInt(NMHDR,$00)+" "+toolbar
			
																
		Case WM_COMMAND
								
			; check menu selected or gadget event
			eventsource_RAW = PeekInt(WinProcReturn,$0C)
			If eventsource_RAW = 0 Then
				If HIWORD(PeekInt(WinProcReturn,$08)) = 0 Then
					eventdata_RAW = LOWORD(PeekInt(WinProcReturn,$08))
					If eventdata_RAW > 0 Then
						ret_event = $1001
					EndIf	
				EndIf
			Else
				ret_event = $401
			EndIf	
			
			;Notify HIWORD(PeekInt(WinProcReturn,$08))
			
		Case WM_SIZE
			ret_event = $802
			eventsource_RAW = PeekInt(WinProcReturn,$00)
			EventX_RAW = LOWORD(PeekInt(WinProcReturn,$0C))
			EventY_RAW = HIWORD(PeekInt(WinProcReturn,$0C))
						
			; reposition status bars.
			If apiIsWindow(eventsource_RAW) <> 0 Then
				GAD_ID = apiGetWindowLong(eventsource_RAW,GWL_USERDATA)
				If GAD_ID > 0 Then
					statusbar = PeekInt(GAD_ID,4)
					If statusbar > 0 Then
						;SetGadgetShape statusbar,0,0,GadgetWidth(eventsource_RAW),GadgetHeight(statusbar)
						;apiInvalidateRect statusbar,0,True
						;apiSendMessage statusbar,WM_SIZE,0,0
					EndIf
				EndIf
			EndIf
						
		Case WM_MOVE
			
			ret_event = $801
			eventsource_RAW = PeekInt(WinProcReturn,$00)
			EventX_RAW = LOWORD(PeekInt(WinProcReturn,$0C))
			EventY_RAW = HIWORD(PeekInt(WinProcReturn,$0C))
		
		Case WM_CLOSE
		DebugLog "WM_CLOSE"
				
		Case WM_DESTROY
		DebugLog "WM_DESTROY"
			ret_event = $803
			eventsource_RAW = PeekInt(WinProcReturn,$00)
											
	End Select

	; cleanup events
	PokeInt(WinProcReturn,$00,0)
	PokeInt(WinProcReturn,$04,0)
	PokeInt(WinProcReturn,$08,0)
	PokeInt(WinProcReturn,$0C,0)
	If ret_event=0 Then Goto again
	
	apiSetWindowLong runtimewindow,GWL_WNDPROC,WinProcBlitz3D
	
	Return ret_event
	
End Function

Function PeekEvent(events=1)
	

	apiSetWindowLong runtimewindow,GWL_WNDPROC,GRAB_BankAddr(WinProcBank)	
	
	ret_event=0
		
	apiPeekMessage(WinProcReturn,0,0,0,0)
	apiTranslateMessage(WinProcReturn) 
	apiDispatchMessage(WinProcReturn) 
			
	eventsource_RAW = 0
	eventdata_RAW = 0
	eventX_RAW = 0
	eventY_RAW = 0

	this_event = PeekInt(WinProcReturn,$04)
	
	
	Select this_event

		Case WM_RBUTTONUP
			ret_event = $202
			;
			If apiIsWindow(PeekInt(WinProcReturn,0)) <> 0 Then
			
				Gadget_BankDATA = apiGetWindowLong(PeekInt(WinProcReturn,0),GWL_USERDATA)
				If Gadget_BankDATA > 0 Then 
					If PeekInt(Gadget_BankDATA,$00) = PeekInt(WinProcReturn,0)
						;PopUpGadgetMenu(PeekInt(Gadget_BankDATA,$00))
					EndIf
				EndIf
				
			EndIf
			
		Case WM_KILLFOCUS

			apiGetMessage(WinProcReturn,0,0,0)
			apiTranslateMessage(WinProcReturn) 
			apiDispatchMessage(WinProcReturn) 
		
			ret_event = $401
			eventsource_RAW = apiGetFocus()
						
		Case WM_HSCROLL
			ret_event = $401
			eventsource_RAW = PeekInt(WinProcReturn,$0C)
			eventdata_RAW = LOWORD(PeekInt(WinProcReturn,$08))
			
			;WM_HSCROLL_pos = 1 + apiGetScrollPos(eventsource_RAW,SB_CTL) 
			;eventdata_RAW = apiSetScrollPos(eventsource_RAW,SB_CTL,WM_HSCROLL_pos,True)
			
							
		Case WM_VSCROLL
			ret_event = $401
			eventsource_RAW = PeekInt(WinProcReturn,$0C)
			eventdata_RAW = LOWORD(PeekInt(WinProcReturn,$08))

			;WM_VSCROLL_pos = 1 + apiGetScrollPos(eventsource_RAW,SB_CTL) 
			;eventdata_RAW = apiSetScrollPos(eventsource_RAW,SB_CTL,WM_VSCROLL_pos,True)
	
			
		Case WM_ACTIVATE
		
			If LOWORD(PeekInt(WinProcReturn,$08)) = WA_CLICKACTIVE Then
				ret_event = $804
				eventsource_RAW = PeekInt(WinProcReturn,$00)
			EndIf
			
		Case WM_ACTIVATEAPP
			eventName$ = "WM_ACTIVATEAPP"
						
		Case WM_NOTIFY
			
			
			
			If a = 1 Then
			;	PokeByte b,0,$CC
			EndIf
			a = a + 1	
			
			nmhdr_addr = PeekInt(WinProcReturn,$0C)
			apiCallWindowProcF b,0,0,GRAB_BankAddr(NMHDR),nmhdr_addr
			;Notify PeekInt(NMHDR,$04)		
				
			Select PeekInt(NMHDR,$08)
			
				Case NM_CLICK,TCN_SELCHANGE ; tabber
					ret_event = $401
					eventsource_RAW = PeekInt(NMHDR,$00)
					eventdata_RAW = apiSendMessage(eventsource_RAW,TCM_GETCURSEL,0,0)
																					
			Default
			;	ret_event = $401
			;	eventsource_RAW = PeekInt(NMHDR,$00)
			End Select
											
			;Notify "here "+PeekInt(NMHDR,$00)+" "+toolbar
			
																
		Case WM_COMMAND
								
			; check menu selected or gadget event
			eventsource_RAW = PeekInt(WinProcReturn,$0C)
			If eventsource_RAW = 0 Then
				If HIWORD(PeekInt(WinProcReturn,$08)) = 0 Then
					eventdata_RAW = LOWORD(PeekInt(WinProcReturn,$08))
					If eventdata_RAW > 0 Then
						ret_event = $1001
					EndIf	
				EndIf
			Else
				ret_event = $401
			EndIf	
			
			;Notify HIWORD(PeekInt(WinProcReturn,$08))
			
		Case WM_SIZE
			ret_event = $802
			eventsource_RAW = PeekInt(WinProcReturn,$00)
			EventX_RAW = LOWORD(PeekInt(WinProcReturn,$0C))
			EventY_RAW = HIWORD(PeekInt(WinProcReturn,$0C))
						
			; reposition status bars.
			If apiIsWindow(eventsource_RAW) <> 0 Then
				GAD_ID = apiGetWindowLong(eventsource_RAW,GWL_USERDATA)
				If GAD_ID > 0 Then
					statusbar = PeekInt(GAD_ID,4)
					If statusbar > 0 Then
						;SetGadgetShape statusbar,0,0,GadgetWidth(eventsource_RAW),GadgetHeight(statusbar)
						;apiInvalidateRect statusbar,0,True
						;apiSendMessage statusbar,WM_SIZE,0,0
					EndIf
				EndIf
			EndIf
						
		Case WM_MOVE
			
			ret_event = $801
			eventsource_RAW = PeekInt(WinProcReturn,$00)
			EventX_RAW = LOWORD(PeekInt(WinProcReturn,$0C))
			EventY_RAW = HIWORD(PeekInt(WinProcReturn,$0C))
		
		Case WM_CLOSE
		DebugLog "WM_CLOSE"
				
		Case WM_DESTROY
		DebugLog "WM_DESTROY"
			ret_event = $803
			eventsource_RAW = PeekInt(WinProcReturn,$00)
											
	End Select

	; cleanup events
	PokeInt(WinProcReturn,$00,0)
	PokeInt(WinProcReturn,$04,0)
	PokeInt(WinProcReturn,$08,0)
	PokeInt(WinProcReturn,$0C,0)
	;If ret_event=0 Then Goto again  -- THIS IS PEEKEVENT SO JUST CONTINUE WITHOUT ANY EVENT!
	
	apiSetWindowLong runtimewindow,GWL_WNDPROC,WinProcBlitz3D
	
	Return ret_event
	
End Function