private void onTextEntered(SDL_TextInputEvent args) { var text = ""; unsafe { text = Encoding.UTF8.GetString(args.text, 32); } this.text.AddRange(text); }
/// <summary> /// Handles SDL2's TEXTINPUT event. /// </summary> private unsafe void OnTextInput(ref SDL_TextInputEvent evt) { var window = Ultraviolet.GetPlatform().Windows.GetByID((int)evt.windowID); fixed(byte *input = evt.text) { if (ConvertTextInputToUtf16(input)) { OnTextInput(window); } } }
private static string GetText(SDL_TextInputEvent textEvent) { unsafe { var i = 0; var data = new byte[SDL_TEXTINPUTEVENT_TEXT_SIZE]; for (; i < SDL_TEXTINPUTEVENT_TEXT_SIZE; i++) { var b = textEvent.text[i]; if (b == '\0') break; data[i] = b; } return Encoding.UTF8.GetString(data, 0, i); } }
/// <summary> /// 处理TextInput事件 /// </summary> private static unsafe void HandleTextInputEvent(SDL_TextInputEvent e) { uint byteCount = 0; // Loop until the null terminator is found or the max size is reached. while (byteCount < SDL_TextInputEvent.MaxTextSize && e.text[byteCount++] != 0) { } if (byteCount > 1) { // We don't want the null terminator. byteCount -= 1; int charCount = Encoding.UTF8.GetCharCount(e.text, (int)byteCount); char * charsPtr = stackalloc char[charCount]; var syt = Encoding.UTF8.GetString(e.text, (int)byteCount); string input_text = syt; CefRange range = new CefRange(); range.From = -1; _host.ImeCommitText(input_text, range, 0); } }
/// <summary> /// 直接转换相关事件 /// </summary> /// <param name="ev"></param> public static unsafe void HandleEvent(SDL_Event *ev) { if (_host == null) { return; } switch (ev->type) { case SDL_EventType.Quit: //Close(); break; case SDL_EventType.Terminating: //Close(); break; case SDL_EventType.WindowEvent: //SDL_WindowEvent windowEvent = Unsafe.Read<SDL_WindowEvent>(ev); //HandleWindowEvent(windowEvent); break; case SDL_EventType.KeyDown: case SDL_EventType.KeyUp: SDL_KeyboardEvent keyboardEvent = Unsafe.Read <SDL_KeyboardEvent>(ev); HandleKeyboardEvent(keyboardEvent); break; case SDL_EventType.TextEditing: break; case SDL_EventType.TextInput: SDL_TextInputEvent textInputEvent = Unsafe.Read <SDL_TextInputEvent>(ev); HandleTextInputEvent(textInputEvent); break; case SDL_EventType.KeyMapChanged: break; case SDL_EventType.MouseMotion: SDL_MouseMotionEvent mouseMotionEvent = Unsafe.Read <SDL_MouseMotionEvent>(ev); HandleMouseMotionEvent(mouseMotionEvent); break; case SDL_EventType.MouseButtonDown: case SDL_EventType.MouseButtonUp: SDL_MouseButtonEvent mouseButtonEvent = Unsafe.Read <SDL_MouseButtonEvent>(ev); HandleMouseButtonEvent(mouseButtonEvent); break; case SDL_EventType.MouseWheel: SDL_MouseWheelEvent mouseWheelEvent = Unsafe.Read <SDL_MouseWheelEvent>(ev); HandleMouseWheelEvent(mouseWheelEvent); break; case SDL_EventType.JoyAxisMotion: break; case SDL_EventType.JoyBallMotion: break; case SDL_EventType.JoyHatMotion: break; case SDL_EventType.JoyButtonDown: break; case SDL_EventType.JoyButtonUp: break; case SDL_EventType.JoyDeviceAdded: break; case SDL_EventType.JoyDeviceRemoved: break; case SDL_EventType.ControllerAxisMotion: break; case SDL_EventType.ControllerButtonDown: break; case SDL_EventType.ControllerButtonUp: break; case SDL_EventType.ControllerDeviceAdded: break; case SDL_EventType.ControllerDeviceRemoved: break; case SDL_EventType.ControllerDeviceRemapped: break; case SDL_EventType.FingerDown: break; case SDL_EventType.FingerUp: break; case SDL_EventType.FingerMotion: break; case SDL_EventType.DollarGesture: break; case SDL_EventType.DollarRecord: break; case SDL_EventType.MultiGesture: break; case SDL_EventType.ClipboardUpdate: break; case SDL_EventType.DropFile: break; case SDL_EventType.DropTest: break; case SDL_EventType.DropBegin: break; case SDL_EventType.DropComplete: break; case SDL_EventType.AudioDeviceAdded: break; case SDL_EventType.AudioDeviceRemoved: break; case SDL_EventType.RenderTargetsReset: break; case SDL_EventType.RenderDeviceReset: break; case SDL_EventType.UserEvent: break; case SDL_EventType.LastEvent: break; default: // Ignore break; } }