Bläddra i källkod

Implemented KEYCHAR events.

woollybah 10 år sedan
förälder
incheckning
070dc29164
2 ändrade filer med 41 tillägg och 0 borttagningar
  1. 4 0
      sdlsystem.mod/common.bmx
  2. 37 0
      sdlsystem.mod/glue.c

+ 4 - 0
sdlsystem.mod/common.bmx

@@ -61,6 +61,10 @@ Extern
 	' system stuff
 	Function SDL_ShowCursor:Int(visible:Int)
 	
+	' text input
+	Function SDL_StartTextInput()
+	Function SDL_StopTextInput()
+	
 	Function bmx_SDL_GetDisplayWidth:Int(display:Int)
 	Function bmx_SDL_GetDisplayHeight:Int(display:Int)
 	Function bmx_SDL_GetDisplayDepth:Int(display:Int)

+ 37 - 0
sdlsystem.mod/glue.c

@@ -48,22 +48,59 @@ int bmx_SDL_GetDisplayhertz(int display) {
 void bmx_SDL_EmitSDLEvent( SDL_Event *event, BBObject *source ) {
 	int data;
 	int mods;
+	int i;
+	BBString * s;
 	SDL_DisplayMode mode;
 	switch (event->type) {
 		case SDL_QUIT:
 			bbSDLSystemEmitEvent(BBEVENT_APPTERMINATE, source, 0, 0, 0, 0, &bbNullObject);
 			return;
 		case SDL_KEYDOWN:
+			i = 0;
+			// some keys are not raised as text input events..
+			// so we will push them ourselves.
+			switch (event->key.keysym.sym) {
+				case SDLK_BACKSPACE:
+					i = 0x08;
+					break;
+				case SDLK_DELETE:
+					i = 0x7f;
+					break;
+				case SDLK_RETURN:
+				case SDLK_RETURN2:
+				case SDLK_KP_ENTER:
+					i = 0x0d;
+					break;
+				case SDLK_ESCAPE:
+					i = 0x1b;
+					break;
+			}
+			// intentional fall-through...
 		case SDL_KEYUP:
 			data = mapkey(event->key.keysym.scancode);
 			mods = mapmods(event->key.keysym.mod);
+
 			if (event->key.repeat) {
 				bbSDLSystemEmitEvent( BBEVENT_KEYREPEAT,source,data,mods,0,0,&bbNullObject );
+				if (i) {
+					bbSDLSystemEmitEvent( BBEVENT_KEYCHAR,source,i,0,0,0,&bbNullObject );
+				}
 				return;
 			}
 			bbSDLSystemEmitEvent( (event->type == SDL_KEYDOWN) ? BBEVENT_KEYDOWN : BBEVENT_KEYUP,source,data,mods,0,0,&bbNullObject );
+			if (i) {
+				bbSDLSystemEmitEvent( BBEVENT_KEYCHAR,source,i,0,0,0,&bbNullObject );
+			}
 			return;
 			break;
+		case SDL_TEXTINPUT:
+			i = 0;
+			s = bbStringFromUTF8String(event->text.text);
+			while (i < s->length) {
+				bbSDLSystemEmitEvent( BBEVENT_KEYCHAR,source,s->buf[i],0,0,0,&bbNullObject );
+				i++;
+			}
+			return;
 		case SDL_MOUSEMOTION:
 			bbSDLSystemEmitEvent( BBEVENT_MOUSEMOVE,source,0,0,event->motion.x,event->motion.y,&bbNullObject );
 			return;