2
0
Эх сурвалжийг харах

Added Keyboard.GetChar(), Keyboard.PeekChar() and Keyboard.FlushChars().

Mark Sibly 9 жил өмнө
parent
commit
eab76f4d17

+ 1 - 1
modules/mojo/app/app.monkey2

@@ -714,7 +714,7 @@ Class AppInstance
 			_window=Window.WindowForID( tevent->windowID )
 			If Not _window Return
 			
-			_keyChar=String.FromChar( tevent->text[0] )
+			_keyChar=String.FromUtf8String( tevent->text )
 			
 			SendKeyEvent( EventType.KeyChar )
 			

+ 72 - 17
modules/mojo/input/keyboard.monkey2

@@ -132,6 +132,29 @@ Class KeyboardDevice Extends InputDevice
 		Return KeyPressed( key )
 	End
 	
+	#rem monkeydoc Peeks at the next character in the character queue.
+	#end
+	Method PeekChar:Int()
+		If _charPut=_charGet Return 0
+		Return _charQueue[_charGet & CHAR_QUEUE_MASK]
+	End
+	
+	#rem monkeydoc Gets the next character from the character queue.
+	#end
+	Method GetChar:Int()
+		If _charPut=_charGet Return 0
+		Local char:=_charQueue[_charGet & CHAR_QUEUE_MASK]
+		_charGet+=1
+		Return char
+	End
+	
+	#rem monkeydoc Flushes the character queue.
+	#end
+	Method FlushChars()
+		_charPut=0
+		_charGet=0
+	End
+	
 	'***** Internal *****
 	
 	#rem monkeydoc @hidden
@@ -176,7 +199,7 @@ Class KeyboardDevice Extends InputDevice
 #Else
 			_key2scan[key]=SDL_GetScancodeFromKey( Cast<SDL_Keycode>( keyCode ) )
 #Endif
-			_scan2key[_key2scan[key]]=scanCode
+			_scan2key[_key2scan[key]]=key
 			
 			p=p+1
 		Wend
@@ -209,22 +232,27 @@ Class KeyboardDevice Extends InputDevice
 			
 			Local scode:=kevent->keysym.scancode
 			
-			If _down[scode] Return
+			If Not _down[scode]
 			
-			_down[scode]=True
-			_pressed[scode]=True
-			_pressedKeys.Push( scode )
-				
-			Select kevent->keysym.sym
-			Case $400000e0 _modifiers|=Modifier.LeftControl
-			Case $400000e1 _modifiers|=Modifier.LeftShift
-			Case $400000e2 _modifiers|=Modifier.LeftAlt
-			Case $400000e3 _modifiers|=Modifier.LeftGui
-			Case $400000e4 _modifiers|=Modifier.RightControl
-			Case $400000e5 _modifiers|=Modifier.RightShift
-			Case $400000e6 _modifiers|=Modifier.RightAlt
-			Case $400000e7 _modifiers|=Modifier.RightGui
-			End
+				_down[scode]=True
+				_pressed[scode]=True
+				_pressedKeys.Push( scode )
+					
+				Select kevent->keysym.sym
+				Case $400000e0 _modifiers|=Modifier.LeftControl
+				Case $400000e1 _modifiers|=Modifier.LeftShift
+				Case $400000e2 _modifiers|=Modifier.LeftAlt
+				Case $400000e3 _modifiers|=Modifier.LeftGui
+				Case $400000e4 _modifiers|=Modifier.RightControl
+				Case $400000e5 _modifiers|=Modifier.RightShift
+				Case $400000e6 _modifiers|=Modifier.RightAlt
+				Case $400000e7 _modifiers|=Modifier.RightGui
+				End
+			
+			Endif
+			
+			Local char:=KeyToChar( _scan2key[scode] )
+			If char PushChar( char )
 
 		Case SDL_KEYUP
 		
@@ -248,13 +276,21 @@ Class KeyboardDevice Extends InputDevice
 			Case $400000e6 _modifiers&=~Modifier.RightAlt
 			Case $400000e7 _modifiers&=~Modifier.RightGui
 			End
-
+			
+		Case SDL_TEXTINPUT
+		
+			Local tevent:=Cast<SDL_TextInputEvent Ptr>( event )
+			Local char:=tevent->text[0]
+			If char PushChar( char )
 		End
 
 	End
 
 	Private
 	
+	Const CHAR_QUEUE_SIZE:=32
+	Const CHAR_QUEUE_MASK:=31
+	
 	Field _modifiers:Modifier
 	Field _down:=New Bool[512]
 	Field _pressed:=New Bool[512]
@@ -266,8 +302,27 @@ Class KeyboardDevice Extends InputDevice
 	Field _scan2raw:=New Key[512]	'no translate
 	Field _key2scan:=New Int[512]	'translate
 	Field _scan2key:=New Int[512]	'translate
+	Field _charQueue:=New Int[CHAR_QUEUE_SIZE]
+	Field _charPut:Int
+	Field _charGet:Int
 	
 	Method New()
 	End
+
+	Function KeyToChar:Int( key:Int )
+		Select key
+		Case Key.Backspace,Key.Tab,Key.Enter,Key.Escape,Key.KeyDelete
+			Return key
+		Case Key.PageUp,Key.PageDown,Key.KeyEnd,Key.Home,Key.Left,Key.Up,Key.Right,Key.Down,Key.Insert
+			Return key | $10000
+		End
+		Return 0
+	End
+	
+	Method PushChar( char:Int )
+		If _charPut-_charGet=CHAR_QUEUE_SIZE Return
+		_charQueue[ _charPut & CHAR_QUEUE_MASK ]=char
+		_charPut+=1
+	End
 	
 End