Quellcode durchsuchen

mojo cleanups - fix for 'dummy' windows crashing.

Mark Sibly vor 9 Jahren
Ursprung
Commit
f94bba4e52
2 geänderte Dateien mit 109 neuen und 83 gelöschten Zeilen
  1. 43 38
      modules/mojo/app/app.monkey2
  2. 66 45
      modules/mojo/app/window.monkey2

+ 43 - 38
modules/mojo/app/app.monkey2

@@ -44,6 +44,12 @@ Class AppInstance
 		SDL_Init( SDL_INIT_EVERYTHING )
 		
 		_sdlThread=SDL_ThreadID()
+		
+		Keyboard.Init()
+		
+		Mouse.Init()
+		
+		Audio.Init()
 
 #If __TARGET__<>"emscripten"
 
@@ -255,8 +261,8 @@ Class AppInstance
 	End
 	
 	Function EmscriptenMainLoop()
-	
-'		App._requestRender=True
+
+		App._requestRender=True
 		
 		App.MainLoop()
 	End
@@ -387,26 +393,11 @@ Class AppInstance
 		view.SendMouseEvent( event )
 	End
 	
-	Method SendWindowEvent( type:EventType,window:Window )
+	Method SendWindowEvent( type:EventType )
 	
-		Local event:=New WindowEvent( type,window )
+		Local event:=New WindowEvent( type,_window )
 		
-		window.SendWindowEvent( event )
-	End
-	
-	Method ValidateWindowShape( window:Window )
-
-		Local x:Int,y:Int,w:Int,h:Int
-		SDL_GetWindowPosition( window.NativeWindow,Varptr x,Varptr y )
-		SDL_GetWindowSize( window.NativeWindow,Varptr w,Varptr h )
-		
-		Local frame:=window.Frame
-		
-		window.Frame=New Recti( x,y,x+w,y+h )
-		
-		If x<>frame.X Or y<>frame.Y SendWindowEvent( EventType.WindowMoved,window )
-		
-		If w<>frame.Width Or h<>frame.Height SendWindowEvent( EventType.WindowResized,window )
+		_window.SendWindowEvent( event )
 	End
 	
 	Method DispatchEvent( event:SDL_Event Ptr )
@@ -418,6 +409,8 @@ Class AppInstance
 			Local t:=Cast<SDL_KeyboardEvent Ptr>( event )
 			
 			_window=Window.WindowForID( t[0].windowID )
+			If Not _window Return
+			
 			_key=Cast<Key>( Int( SDL_GetScancodeFromKey( t[0].keysym.sym ) ) )
 			Local tchar:=String.FromChar( t[0].keysym.sym )
 			_modifiers=Cast<Modifier>( t[0].keysym.mod_ )
@@ -430,6 +423,8 @@ Class AppInstance
 			Local t:=Cast<SDL_KeyboardEvent Ptr>( event )
 			
 			_window=Window.WindowForID( t[0].windowID )
+			If Not _window Return
+			
 			_key=Cast<Key>( Int( SDL_GetScancodeFromKey( t[0].keysym.sym ) ) )
 			_modifiers=Cast<Modifier>( t[0].keysym.mod_ )
 			_keyText=String.FromChar( t[0].keysym.sym )
@@ -441,6 +436,8 @@ Class AppInstance
 			Local t:=Cast<SDL_TextInputEvent Ptr>( event )
 
 			_window=Window.WindowForID( t[0].windowID )
+			If Not _window Return
+			
 			_keyText=String.FromChar( t[0].text[0] )
 			
 			SendKeyEvent( EventType.KeyChar )
@@ -450,6 +447,8 @@ Class AppInstance
 			Local mevent:=Cast<SDL_MouseButtonEvent Ptr>( event )
 			
 			_window=Window.WindowForID( mevent->windowID )
+			If Not _window Return
+			
 			_mouseLocation=New Vec2i( mevent->x,mevent->y )
 			_mouseButton=Cast<MouseButton>( mevent->button )
 			
@@ -457,9 +456,9 @@ Class AppInstance
 			
 				Local view:=_window.FindViewAtWindowPoint( _mouseLocation )
 				If view
-#If __HOSTOS__<>"linux"
+'#If __HOSTOS__<>"linux"
 					SDL_CaptureMouse( SDL_TRUE )
-#Endif
+'#Endif
 					_mouseView=view
 				Endif
 			Endif
@@ -471,15 +470,17 @@ Class AppInstance
 			Local mevent:=Cast<SDL_MouseButtonEvent Ptr>( event )
 			
 			_window=Window.WindowForID( mevent->windowID )
+			If Not _window Return
+			
 			_mouseLocation=New Vec2i( mevent->x,mevent->y )
 			_mouseButton=Cast<MouseButton>( mevent->button )
 			
 			If _mouseView
 
 				SendMouseEvent( EventType.MouseUp,_mouseView )
-#If __HOSTOS__<>"linux"				
+'#If __HOSTOS__<>"linux"				
 				SDL_CaptureMouse( SDL_FALSE )
-#Endif
+'#Endif
 				_mouseView=Null
 
 				_mouseButton=Null
@@ -490,6 +491,8 @@ Class AppInstance
 			Local mevent:=Cast<SDL_MouseMotionEvent Ptr>( event )
 			
 			_window=Window.WindowForID( mevent->windowID )
+			If Not _window Return
+			
 			_mouseLocation=New Vec2i( mevent->x,mevent->y )
 			
 			Local view:=_window.FindViewAtWindowPoint( _mouseLocation )
@@ -520,6 +523,8 @@ Class AppInstance
 			Local mevent:=Cast<SDL_MouseWheelEvent Ptr>( event )
 			
 			_window=Window.WindowForID( mevent->windowID )
+			If Not _window Return
+			
 			_mouseWheel=New Vec2i( mevent->x,mevent->y )
 			
 			If _mouseView
@@ -535,29 +540,27 @@ Class AppInstance
 		Case SDL_WINDOWEVENT
 		
 			Local wevent:=Cast<SDL_WindowEvent Ptr>( event )
-			Local window:=Window.WindowForID( wevent->windowID )
+			
+			_window=Window.WindowForID( wevent->windowID )
+			If Not _window Return
 			
 			Select wevent->event
 					
 			Case SDL_WINDOWEVENT_CLOSE
 			
-				SendWindowEvent( EventType.WindowClose,window )
+				SendWindowEvent( EventType.WindowClose )
 			
 			Case SDL_WINDOWEVENT_MOVED
 			
-'				ValidateWindowShape( window )
-
 			Case SDL_WINDOWEVENT_RESIZED
 			
-'				ValidateWindowShape( window )
-				
 			Case SDL_WINDOWEVENT_FOCUS_GAINED
 			
-				SendWindowEvent( EventType.WindowGainedFocus,window )
+				SendWindowEvent( EventType.WindowGainedFocus )
 			
 			Case SDL_WINDOWEVENT_FOCUS_LOST
 			
-				SendWindowEvent( EventType.WindowLostFocus,window )
+				SendWindowEvent( EventType.WindowLostFocus )
 				
 			Case SDL_WINDOWEVENT_LEAVE
 			
@@ -605,20 +608,22 @@ Class AppInstance
 		Case SDL_WINDOWEVENT
 
 			Local wevent:=Cast<SDL_WindowEvent Ptr>( event )
-			Local window:=Window.WindowForID( wevent->windowID )
+			
+			_window=Window.WindowForID( wevent->windowID )
+			If Not _window Return 1
 			
 			Select wevent->event
 			
 			Case SDL_WINDOWEVENT_MOVED
 			
-				ValidateWindowShape( window )
-				
+				SendWindowEvent( EventType.WindowMoved )
+			
 				Return 0
 					
-			Case SDL_WINDOWEVENT_RESIZED
+			Case SDL_WINDOWEVENT_RESIZED',SDL_WINDOWEVENT_SIZE_CHANGED
+
+				SendWindowEvent( EventType.WindowResized )
 			
-				ValidateWindowShape( window )
-				
 				If _requestRender
 				
 					_requestRender=False

+ 66 - 45
modules/mojo/app/window.monkey2

@@ -1,4 +1,4 @@
-
+	
 Namespace mojo.app
 
 #rem monkeydoc Window creation flags.
@@ -64,29 +64,39 @@ Class Window Extends View
 	#end
 	Method Update()
 	
-		'ugly...fixme.
+
 #If __TARGET__="emscripten"
+
+		'ugly...fixme.
 		Local w:Int,h:Int,fs:Int
 		emscripten_get_canvas_size( Varptr w,Varptr h,Varptr fs )
 		If w<>Frame.Width Or h<>Frame.Height
 			Frame=New Recti( 0,0,w,h )
 		Endif
-		
-#Endif
-
+	
+#Else
 		'ugly...fixme.
-		If MinSize<>_minSize Or MaxSize<>_maxSize Or Frame<>_frame
-			_minSize=MinSize
-			_maxSize=MaxSize
-			_frame=Frame
-#If __TARGET__<>"emscripten"
-			SDL_SetWindowMinimumSize( _sdlWindow,_minSize.x,_minSize.y )
-			SDL_SetWindowMinimumSize( _sdlWindow,_maxSize.x,_maxSize.y )
-			SDL_SetWindowPosition( _sdlWindow,_frame.X,_frame.Y )
-			SDL_SetWindowSize( _sdlWindow,_frame.Width,_frame.Height )
-#Endif
+		If MinSize<>_minSize
+			SDL_SetWindowMinimumSize( _sdlWindow,MinSize.x,MinSize.y )
+			_minSize=GetMinSize()
+			MinSize=_minSize
 		Endif
 		
+		If MaxSize<>_maxSize 
+			SDL_SetWindowMaximumSize( _sdlWindow,MaxSize.x,MaxSize.y )
+			_maxSize=GetMaxSize()
+			MaxSize=_maxSize
+		Endif
+		
+		If Frame<>_frame
+			SDL_SetWindowPosition( _sdlWindow,Frame.X,Frame.Y )
+			SDL_SetWindowSize( _sdlWindow,Frame.Width,Frame.Height )
+			_frame=GetFrame()
+			Frame=_frame
+		Endif
+		
+#Endif
+
 		Measure()
 		
 		UpdateLayout()
@@ -111,7 +121,7 @@ Class Window Extends View
 		_canvas.RenderBounds=viewport
 		
 		_canvas.Viewport=viewport
-		_canvas.Scissor=New Recti( 0,0,16384,16384 )
+		_canvas.Scissor=New Recti( 0,0,1000000,1000000 )'16384,16384 )
 		_canvas.ViewMatrix=New Mat4f
 		_canvas.ModelMatrix=New Mat4f
 
@@ -129,13 +139,6 @@ Class Window Extends View
 		SDL_GL_SwapWindow( _sdlWindow )
 	End
 	
-	#rem monkeydoc @hidden
-	#end
-	Method SendWindowEvent( event:WindowEvent )
-	
-		OnWindowEvent( event )
-	End
-	
 	#rem monkeydoc @hidden
 	#end
 	Method FindWindow:Window() Override
@@ -173,6 +176,19 @@ Class Window Extends View
 
 	'***** INTERNAL *****
 	
+	#rem monkeydoc @hidden
+	#end
+	Method SendWindowEvent( event:WindowEvent )
+	
+		Select event.Type
+		Case EventType.WindowMoved,EventType.WindowResized
+			_frame=GetFrame()
+			Frame=_frame
+		End
+		
+		OnWindowEvent( event )
+	End
+	
 	#rem monkeydoc @hidden
 	#end
 	Property KeyView:View()
@@ -186,13 +202,6 @@ Class Window Extends View
 	
 	Protected
 	
-	Method OnValidateStyle() Override
-	
-		SDL_SetWindowMinimumSize( _sdlWindow,MinSize.x,MinSize.y )
-		SDL_SetWindowMaximumSize( _sdlWindow,MaxSize.x,MaxSize.y )
-	
-	End
-	
 	#rem monkeydoc Window event handler.
 	
 	Called when the window is sent a window event.
@@ -238,6 +247,25 @@ Class Window Extends View
 	Global _visibleWindows:=New Stack<Window>
 	Global _windowsByID:=New Map<UInt,Window>
 	
+	Method GetMinSize:Vec2i()
+		Local w:Int,h:Int
+		SDL_GetWindowMinimumSize( _sdlWindow,Varptr w,Varptr h )
+		Return New Vec2i( w,h )
+	End
+	
+	Method GetMaxSize:Vec2i()
+		Local w:Int,h:Int
+		SDL_GetWindowMaximumSize( _sdlWindow,Varptr w,Varptr h )
+		Return New Vec2i( w,h )
+	End
+	
+	Method GetFrame:Recti()
+		Local x:Int,y:Int,w:Int,h:Int
+		SDL_GetWindowPosition( _sdlWindow,Varptr x,Varptr y )
+		SDL_GetWindowSize( _sdlWindow,Varptr w,Varptr h )
+		Return New Recti( x,y,x+w,y+h )
+	End
+	
 	Method Init( title:String,rect:Recti,flags:WindowFlags )
 	
 		Layout="fill"
@@ -256,32 +284,25 @@ Class Window Extends View
 		Assert( _sdlWindow,"Failed to create SDL_Window" )
 
 		_allWindows.Push( Self )
-		If Not (flags & WindowFlags.Hidden) _visibleWindows.Push( Self )
 		_windowsByID[SDL_GetWindowID( _sdlWindow )]=Self
+		If Not (flags & WindowFlags.Hidden) _visibleWindows.Push( Self )
 		
 		'Create GLContext and canvas
 		
 		_sdlGLContext=SDL_GL_CreateContext( _sdlWindow )
-		
 		SDL_GL_MakeCurrent( _sdlWindow,_sdlGLContext )
 		
-		_canvas=New Canvas( rect.Width,rect.Height )
-		
-		Local tx:Int,ty:Int,tw:Int,th:Int
-		SDL_GetWindowMinimumSize( _sdlWindow,Varptr tw,Varptr th )
-		_minSize=New Vec2i( tw,th )
-
-		SDL_GetWindowMaximumSize( _sdlWindow,Varptr tw,Varptr th )
-		_maxSize=New Vec2i( tw,th )
-		
-		SDL_GetWindowPosition( _sdlWindow,Varptr tx,Varptr ty )
-		SDL_GetWindowSize( _sdlWindow,Varptr tw,Varptr th )
-		_frame=New Recti( tx,ty,tx+tw,ty+th )
-		
+		_minSize=GetMinSize()
 		MinSize=_minSize
+		
+		_maxSize=GetMaxSize()
 		MaxSize=_maxSize
+		
+		_frame=GetFrame()
 		Frame=_frame
 		
+		_canvas=New Canvas( Frame.Width,Frame.Height )
+		
 		Update()
 	End
 End