From 27c74e7837f8ec59d09ff85eae06b158b32fe1a5 Mon Sep 17 00:00:00 2001 From: Vadim Lopatin Date: Tue, 29 Apr 2014 22:56:00 +0400 Subject: [PATCH] SDL2 backend - keydown/keyup events support --- src/dlangui/core/events.d | 5 +- src/dlangui/platforms/sdl/sdlapp.d | 365 ++++++++++++++++++++++------- 2 files changed, 281 insertions(+), 89 deletions(-) diff --git a/src/dlangui/core/events.d b/src/dlangui/core/events.d index 4b0201a3..4230103a 100644 --- a/src/dlangui/core/events.d +++ b/src/dlangui/core/events.d @@ -289,7 +289,10 @@ enum KeyFlag : uint { Alt = 0x0080, RControl = 0x0108, RShift = 0x0104, - RAlt = 0x0180 + RAlt = 0x0180, + LControl = 0x0208, + LShift = 0x0204, + LAlt = 0x0280 } enum KeyCode : uint { diff --git a/src/dlangui/platforms/sdl/sdlapp.d b/src/dlangui/platforms/sdl/sdlapp.d index 7de16276..f2821996 100644 --- a/src/dlangui/platforms/sdl/sdlapp.d +++ b/src/dlangui/platforms/sdl/sdlapp.d @@ -8,7 +8,7 @@ version(USE_SDL) { import std.utf; import std.stdio; import std.algorithm; - import std.file; + import std.file; import dlangui.core.logger; import dlangui.core.events; @@ -100,10 +100,10 @@ version(USE_SDL) { _texture = null; } if (!_texture) { - _texture = SDL_CreateTexture(_renderer, - SDL_PIXELFORMAT_ARGB8888, - SDL_TEXTUREACCESS_STATIC, //SDL_TEXTUREACCESS_STREAMING, - _dx, + _texture = SDL_CreateTexture(_renderer, + SDL_PIXELFORMAT_ARGB8888, + SDL_TEXTUREACCESS_STATIC, //SDL_TEXTUREACCESS_STREAMING, + _dx, _dy); _txw = _dx; _txh = _dy; @@ -115,20 +115,20 @@ version(USE_SDL) { SDL_Rect rect; rect.w = buf.width; rect.h = buf.height; - SDL_UpdateTexture(_texture, - &rect, - cast(const void*)buf.scanLine(0), - buf.width * uint.sizeof); + SDL_UpdateTexture(_texture, + &rect, + cast(const void*)buf.scanLine(0), + buf.width * cast(int)uint.sizeof); SDL_RenderCopy(_renderer, _texture, &rect, &rect); } void redraw() { // check if size has been changed int w, h; - SDL_GetWindowSize(_win, - &w, - &h); - onResize(w, h); + SDL_GetWindowSize(_win, + &w, + &h); + onResize(w, h); if (_enableOpengl) { @@ -206,11 +206,193 @@ version(USE_SDL) { } uint convertKeyCode(uint keyCode) { - return 0x10000 | keyCode; + switch(keyCode) { + case SDLK_0: + return KeyCode.KEY_0; + case SDLK_1: + return KeyCode.KEY_1; + case SDLK_2: + return KeyCode.KEY_2; + case SDLK_3: + return KeyCode.KEY_3; + case SDLK_4: + return KeyCode.KEY_4; + case SDLK_5: + return KeyCode.KEY_5; + case SDLK_6: + return KeyCode.KEY_6; + case SDLK_7: + return KeyCode.KEY_7; + case SDLK_8: + return KeyCode.KEY_8; + case SDLK_9: + return KeyCode.KEY_9; + case SDLK_a: + return KeyCode.KEY_A; + case SDLK_b: + return KeyCode.KEY_B; + case SDLK_c: + return KeyCode.KEY_C; + case SDLK_d: + return KeyCode.KEY_D; + case SDLK_e: + return KeyCode.KEY_E; + case SDLK_f: + return KeyCode.KEY_F; + case SDLK_g: + return KeyCode.KEY_G; + case SDLK_h: + return KeyCode.KEY_H; + case SDLK_i: + return KeyCode.KEY_I; + case SDLK_j: + return KeyCode.KEY_J; + case SDLK_k: + return KeyCode.KEY_K; + case SDLK_l: + return KeyCode.KEY_L; + case SDLK_m: + return KeyCode.KEY_M; + case SDLK_n: + return KeyCode.KEY_N; + case SDLK_o: + return KeyCode.KEY_O; + case SDLK_p: + return KeyCode.KEY_P; + case SDLK_q: + return KeyCode.KEY_Q; + case SDLK_r: + return KeyCode.KEY_R; + case SDLK_s: + return KeyCode.KEY_S; + case SDLK_t: + return KeyCode.KEY_T; + case SDLK_u: + return KeyCode.KEY_U; + case SDLK_v: + return KeyCode.KEY_V; + case SDLK_w: + return KeyCode.KEY_W; + case SDLK_x: + return KeyCode.KEY_X; + case SDLK_y: + return KeyCode.KEY_Y; + case SDLK_z: + return KeyCode.KEY_Z; + case SDLK_F1: + return KeyCode.F1; + case SDLK_F2: + return KeyCode.F2; + case SDLK_F3: + return KeyCode.F3; + case SDLK_F4: + return KeyCode.F4; + case SDLK_F5: + return KeyCode.F5; + case SDLK_F6: + return KeyCode.F6; + case SDLK_F7: + return KeyCode.F7; + case SDLK_F8: + return KeyCode.F8; + case SDLK_F9: + return KeyCode.F9; + case SDLK_F10: + return KeyCode.F10; + case SDLK_F11: + return KeyCode.F11; + case SDLK_F12: + return KeyCode.F12; + case SDLK_F13: + return KeyCode.F13; + case SDLK_F14: + return KeyCode.F14; + case SDLK_F15: + return KeyCode.F15; + case SDLK_F16: + return KeyCode.F16; + case SDLK_F17: + return KeyCode.F17; + case SDLK_F18: + return KeyCode.F18; + case SDLK_F19: + return KeyCode.F19; + case SDLK_F20: + return KeyCode.F20; + case SDLK_F21: + return KeyCode.F21; + case SDLK_F22: + return KeyCode.F22; + case SDLK_F23: + return KeyCode.F23; + case SDLK_F24: + return KeyCode.F24; + case SDLK_BACKSPACE: + return KeyCode.BACK; + case SDLK_TAB: + return KeyCode.TAB; + case SDLK_RETURN: + return KeyCode.RETURN; + case SDLK_ESCAPE: + return KeyCode.ESCAPE; + case SDLK_DELETE: + return KeyCode.DEL; + case SDLK_INSERT: + return KeyCode.INS; + case SDLK_HOME: + return KeyCode.HOME; + case SDLK_PAGEUP: + return KeyCode.PAGEUP; + case SDLK_END: + return KeyCode.END; + case SDLK_PAGEDOWN: + return KeyCode.PAGEDOWN; + case SDLK_LEFT: + return KeyCode.LEFT; + case SDLK_RIGHT: + return KeyCode.RIGHT; + case SDLK_UP: + return KeyCode.UP; + case SDLK_DOWN: + return KeyCode.DOWN; + case SDLK_LCTRL: + return KeyCode.LCONTROL; + case SDLK_LSHIFT: + return KeyCode.LSHIFT; + case SDLK_LALT: + return KeyCode.LALT; + case SDLK_RCTRL: + return KeyCode.RCONTROL; + case SDLK_RSHIFT: + return KeyCode.RSHIFT; + case SDLK_RALT: + return KeyCode.RALT; + default: + return 0x10000 | keyCode; + } } uint convertKeyFlags(uint flags) { - return 0; + uint res; + if (flags & KMOD_CTRL) + res |= KeyFlag.Control; + if (flags & KMOD_SHIFT) + res |= KeyFlag.Shift; + if (flags & KMOD_ALT) + res |= KeyFlag.Alt; + if (flags & KMOD_RCTRL) + res |= KeyFlag.RControl; + if (flags & KMOD_RSHIFT) + res |= KeyFlag.RShift; + if (flags & KMOD_RALT) + res |= KeyFlag.RAlt; + if (flags & KMOD_LCTRL) + res |= KeyFlag.LControl; + if (flags & KMOD_LSHIFT) + res |= KeyFlag.LShift; + if (flags & KMOD_LALT) + res |= KeyFlag.LAlt; + return 0; } bool processKeyEvent(KeyAction action, uint keyCode, uint flags) { @@ -219,11 +401,11 @@ version(USE_SDL) { flags = convertKeyFlags(flags); Log.d("processKeyEvent ", action, " converted key=", keyCode, " converted flags=", flags); bool res = dispatchKeyEvent(new KeyEvent(action, keyCode, flags)); - if (keyCode & 0x10000 && (keyCode & 0xF000) != 0xF000) { - dchar[1] text; - text[0] = keyCode & 0xFFFF; - res = dispatchKeyEvent(new KeyEvent(KeyAction.Text, keyCode, flags, cast(dstring)text)) || res; - } +// if ((keyCode & 0x10000) && (keyCode & 0xF000) != 0xF000) { +// dchar[1] text; +// text[0] = keyCode & 0xFFFF; +// res = dispatchKeyEvent(new KeyEvent(KeyAction.Text, keyCode, flags, cast(dstring)text)) || res; +// } if (res) { Log.d("Calling update() after key event"); invalidate(); @@ -308,11 +490,11 @@ version(USE_SDL) { // found window switch (event.window.event) { case SDL_WINDOWEVENT_RESIZED: - Log.d("SDL_WINDOWEVENT_RESIZED win=", event.window.windowID, " pos=", event.window.data1, + Log.d("SDL_WINDOWEVENT_RESIZED win=", event.window.windowID, " pos=", event.window.data1, ",", event.window.data2); break; case SDL_WINDOWEVENT_SIZE_CHANGED: - Log.d("SDL_WINDOWEVENT_SIZE_CHANGED win=", event.window.windowID, " pos=", event.window.data1, + Log.d("SDL_WINDOWEVENT_SIZE_CHANGED win=", event.window.windowID, " pos=", event.window.data1, ",", event.window.data2); w.onResize(event.window.data1, event.window.data2); break; @@ -321,77 +503,84 @@ version(USE_SDL) { _windowMap.remove(windowID); destroy(w); break; - case SDL_WINDOWEVENT_SHOWN: - Log.d("SDL_WINDOWEVENT_SHOWN"); - break; - case SDL_WINDOWEVENT_HIDDEN: - Log.d("SDL_WINDOWEVENT_HIDDEN"); - break; - case SDL_WINDOWEVENT_EXPOSED: - Log.d("SDL_WINDOWEVENT_EXPOSED"); - w.redraw(); - break; + case SDL_WINDOWEVENT_SHOWN: + Log.d("SDL_WINDOWEVENT_SHOWN"); + break; + case SDL_WINDOWEVENT_HIDDEN: + Log.d("SDL_WINDOWEVENT_HIDDEN"); + break; + case SDL_WINDOWEVENT_EXPOSED: + Log.d("SDL_WINDOWEVENT_EXPOSED"); + w.redraw(); + break; case SDL_WINDOWEVENT_MOVED: - Log.d("SDL_WINDOWEVENT_MOVED"); - break; - case SDL_WINDOWEVENT_MINIMIZED: - Log.d("SDL_WINDOWEVENT_MINIMIZED"); - break; - case SDL_WINDOWEVENT_MAXIMIZED: - Log.d("SDL_WINDOWEVENT_MAXIMIZED"); - break; - case SDL_WINDOWEVENT_RESTORED: - Log.d("SDL_WINDOWEVENT_MAXIMIZED"); - break; - case SDL_WINDOWEVENT_ENTER: - Log.d("SDL_WINDOWEVENT_MAXIMIZED"); - break; - case SDL_WINDOWEVENT_LEAVE: - Log.d("SDL_WINDOWEVENT_MAXIMIZED"); - break; - case SDL_WINDOWEVENT_FOCUS_GAINED: - Log.d("SDL_WINDOWEVENT_MAXIMIZED"); - break; - case SDL_WINDOWEVENT_FOCUS_LOST: - Log.d("SDL_WINDOWEVENT_MAXIMIZED"); - break; + Log.d("SDL_WINDOWEVENT_MOVED"); + break; + case SDL_WINDOWEVENT_MINIMIZED: + Log.d("SDL_WINDOWEVENT_MINIMIZED"); + break; + case SDL_WINDOWEVENT_MAXIMIZED: + Log.d("SDL_WINDOWEVENT_MAXIMIZED"); + break; + case SDL_WINDOWEVENT_RESTORED: + Log.d("SDL_WINDOWEVENT_MAXIMIZED"); + break; + case SDL_WINDOWEVENT_ENTER: + Log.d("SDL_WINDOWEVENT_MAXIMIZED"); + break; + case SDL_WINDOWEVENT_LEAVE: + Log.d("SDL_WINDOWEVENT_MAXIMIZED"); + break; + case SDL_WINDOWEVENT_FOCUS_GAINED: + Log.d("SDL_WINDOWEVENT_MAXIMIZED"); + break; + case SDL_WINDOWEVENT_FOCUS_LOST: + Log.d("SDL_WINDOWEVENT_MAXIMIZED"); + break; default: break; } + break; } - break; - case SDL_KEYDOWN: - - break; - case SDL_KEYUP: - break; - case SDL_TEXTEDITING: - break; - case SDL_TEXTINPUT: - break; - case SDL_MOUSEMOTION: - SDLWindow w = getWindow(event.motion.windowID); - if (w) { - w.processMouseEvent(MouseAction.Move, 0, event.motion.state, event.motion.x, event.motion.y); - } - break; - case SDL_MOUSEBUTTONDOWN: - SDLWindow w = getWindow(event.button.windowID); - if (w) { - w.processMouseEvent(MouseAction.ButtonDown, event.button.button, event.button.state, event.button.x, event.button.y); - } - break; - case SDL_MOUSEBUTTONUP: - SDLWindow w = getWindow(event.button.windowID); - if (w) { - w.processMouseEvent(MouseAction.ButtonUp, event.button.button, event.button.state, event.button.x, event.button.y); - } - break; - case SDL_MOUSEWHEEL: - break; - default: - // not supported event - break; + case SDL_KEYDOWN: + SDLWindow w = getWindow(event.key.windowID); + if (w) { + w.processKeyEvent(KeyAction.KeyDown, event.key.keysym.sym, event.key.keysym.mod); + } + break; + case SDL_KEYUP: + SDLWindow w = getWindow(event.key.windowID); + if (w) { + w.processKeyEvent(KeyAction.KeyUp, event.key.keysym.sym, event.key.keysym.mod); + } + break; + case SDL_TEXTEDITING: + break; + case SDL_TEXTINPUT: + break; + case SDL_MOUSEMOTION: + SDLWindow w = getWindow(event.motion.windowID); + if (w) { + w.processMouseEvent(MouseAction.Move, 0, event.motion.state, event.motion.x, event.motion.y); + } + break; + case SDL_MOUSEBUTTONDOWN: + SDLWindow w = getWindow(event.button.windowID); + if (w) { + w.processMouseEvent(MouseAction.ButtonDown, event.button.button, event.button.state, event.button.x, event.button.y); + } + break; + case SDL_MOUSEBUTTONUP: + SDLWindow w = getWindow(event.button.windowID); + if (w) { + w.processMouseEvent(MouseAction.ButtonUp, event.button.button, event.button.state, event.button.x, event.button.y); + } + break; + case SDL_MOUSEWHEEL: + break; + default: + // not supported event + break; } } }