updated to go-sdl2 v0.3; also fixed key runes

This commit is contained in:
Thomas Friedel 2018-05-09 19:17:59 +02:00
parent 53630c5cff
commit 6ed91cb412
3 changed files with 250 additions and 172 deletions

View file

@ -22,23 +22,23 @@ func main() {
defer sdl.Quit() defer sdl.Quit()
// the stencil size setting is required for the canvas to work // the stencil size setting is required for the canvas to work
sdl.GL_SetAttribute(sdl.GL_RED_SIZE, 8) sdl.GLSetAttribute(sdl.GL_RED_SIZE, 8)
sdl.GL_SetAttribute(sdl.GL_GREEN_SIZE, 8) sdl.GLSetAttribute(sdl.GL_GREEN_SIZE, 8)
sdl.GL_SetAttribute(sdl.GL_BLUE_SIZE, 8) sdl.GLSetAttribute(sdl.GL_BLUE_SIZE, 8)
sdl.GL_SetAttribute(sdl.GL_ALPHA_SIZE, 8) sdl.GLSetAttribute(sdl.GL_ALPHA_SIZE, 8)
sdl.GL_SetAttribute(sdl.GL_DEPTH_SIZE, 0) sdl.GLSetAttribute(sdl.GL_DEPTH_SIZE, 0)
sdl.GL_SetAttribute(sdl.GL_STENCIL_SIZE, 8) sdl.GLSetAttribute(sdl.GL_STENCIL_SIZE, 8)
sdl.GL_SetAttribute(sdl.GL_DOUBLEBUFFER, 1) sdl.GLSetAttribute(sdl.GL_DOUBLEBUFFER, 1)
sdl.GL_SetAttribute(sdl.GL_MULTISAMPLEBUFFERS, 1) sdl.GLSetAttribute(sdl.GL_MULTISAMPLEBUFFERS, 1)
sdl.GL_SetAttribute(sdl.GL_MULTISAMPLESAMPLES, 4) sdl.GLSetAttribute(sdl.GL_MULTISAMPLESAMPLES, 4)
// create window // create window
const title = "SDL Test" const title = "SDL Test"
window, err := sdl.CreateWindow(title, sdl.WINDOWPOS_CENTERED, sdl.WINDOWPOS_CENTERED, 1280, 720, sdl.WINDOW_RESIZABLE|sdl.WINDOW_OPENGL) window, err := sdl.CreateWindow(title, sdl.WINDOWPOS_CENTERED, sdl.WINDOWPOS_CENTERED, 1280, 720, sdl.WINDOW_RESIZABLE|sdl.WINDOW_OPENGL)
if err != nil { if err != nil {
// fallback in case multisample is not available // fallback in case multisample is not available
sdl.GL_SetAttribute(sdl.GL_MULTISAMPLEBUFFERS, 0) sdl.GLSetAttribute(sdl.GL_MULTISAMPLEBUFFERS, 0)
sdl.GL_SetAttribute(sdl.GL_MULTISAMPLESAMPLES, 0) sdl.GLSetAttribute(sdl.GL_MULTISAMPLESAMPLES, 0)
window, err = sdl.CreateWindow(title, sdl.WINDOWPOS_CENTERED, sdl.WINDOWPOS_CENTERED, 1280, 720, sdl.WINDOW_RESIZABLE|sdl.WINDOW_OPENGL) window, err = sdl.CreateWindow(title, sdl.WINDOWPOS_CENTERED, sdl.WINDOWPOS_CENTERED, 1280, 720, sdl.WINDOW_RESIZABLE|sdl.WINDOW_OPENGL)
if err != nil { if err != nil {
log.Fatalf("Error creating window: %v", err) log.Fatalf("Error creating window: %v", err)
@ -47,7 +47,7 @@ func main() {
defer window.Destroy() defer window.Destroy()
// create GL context // create GL context
glContext, err := sdl.GL_CreateContext(window) glContext, err := window.GLCreateContext()
if err != nil { if err != nil {
log.Fatalf("Error creating GL context: %v", err) log.Fatalf("Error creating GL context: %v", err)
} }
@ -59,7 +59,7 @@ func main() {
} }
// enable vsync and multisample (if available) // enable vsync and multisample (if available)
sdl.GL_SetSwapInterval(1) sdl.GLSetSwapInterval(1)
gl.Enable(gl.MULTISAMPLE) gl.Enable(gl.MULTISAMPLE)
// load canvas GL assets // load canvas GL assets
@ -72,7 +72,7 @@ func main() {
cv := canvas.New(0, 0, 0, 0) cv := canvas.New(0, 0, 0, 0)
for running := true; running; { for running := true; running; {
err := sdl.GL_MakeCurrent(window, glContext) err := window.GLMakeCurrent(glContext)
if err != nil { if err != nil {
time.Sleep(10 * time.Millisecond) time.Sleep(10 * time.Millisecond)
continue continue
@ -86,8 +86,8 @@ func main() {
} }
switch e := event.(type) { switch e := event.(type) {
case *sdl.KeyDownEvent: case *sdl.KeyboardEvent:
if e.Keysym.Scancode == sdl.SCANCODE_ESCAPE { if e.Type == sdl.KEYDOWN && e.Keysym.Scancode == sdl.SCANCODE_ESCAPE {
running = false running = false
} }
case *sdl.WindowEvent: case *sdl.WindowEvent:
@ -99,13 +99,13 @@ func main() {
// set canvas size // set canvas size
ww, wh := window.GetSize() ww, wh := window.GetSize()
cv.SetSize(ww, wh) cv.SetSize(int(ww), int(wh))
// call the run function to do all the drawing // call the run function to do all the drawing
run(cv, float64(ww), float64(wh)) run(cv, float64(ww), float64(wh))
// swap back and front buffer // swap back and front buffer
sdl.GL_SwapWindow(window) window.GLSwap()
} }
} }

View file

@ -2,139 +2,215 @@ package sdlcanvas
import "github.com/veandco/go-sdl2/sdl" import "github.com/veandco/go-sdl2/sdl"
var keyMap [262]string var keyNameMap [262]string
var keyRuneMap [262]rune
func init() { func init() {
keyMap[sdl.SCANCODE_ESCAPE] = "Escape" keyNameMap[sdl.SCANCODE_ESCAPE] = "Escape"
keyMap[sdl.SCANCODE_0] = "Digit0" keyNameMap[sdl.SCANCODE_0] = "Digit0"
keyMap[sdl.SCANCODE_1] = "Digit1" keyNameMap[sdl.SCANCODE_1] = "Digit1"
keyMap[sdl.SCANCODE_2] = "Digit2" keyNameMap[sdl.SCANCODE_2] = "Digit2"
keyMap[sdl.SCANCODE_3] = "Digit3" keyNameMap[sdl.SCANCODE_3] = "Digit3"
keyMap[sdl.SCANCODE_4] = "Digit4" keyNameMap[sdl.SCANCODE_4] = "Digit4"
keyMap[sdl.SCANCODE_5] = "Digit5" keyNameMap[sdl.SCANCODE_5] = "Digit5"
keyMap[sdl.SCANCODE_6] = "Digit6" keyNameMap[sdl.SCANCODE_6] = "Digit6"
keyMap[sdl.SCANCODE_7] = "Digit7" keyNameMap[sdl.SCANCODE_7] = "Digit7"
keyMap[sdl.SCANCODE_8] = "Digit8" keyNameMap[sdl.SCANCODE_8] = "Digit8"
keyMap[sdl.SCANCODE_9] = "Digit9" keyNameMap[sdl.SCANCODE_9] = "Digit9"
keyMap[sdl.SCANCODE_MINUS] = "Minus" keyNameMap[sdl.SCANCODE_MINUS] = "Minus"
keyMap[sdl.SCANCODE_EQUALS] = "Equal" keyNameMap[sdl.SCANCODE_EQUALS] = "Equal"
keyMap[sdl.SCANCODE_BACKSPACE] = "Backspace" keyNameMap[sdl.SCANCODE_BACKSPACE] = "Backspace"
keyMap[sdl.SCANCODE_TAB] = "Tab" keyNameMap[sdl.SCANCODE_TAB] = "Tab"
keyMap[sdl.SCANCODE_Q] = "KeyQ" keyNameMap[sdl.SCANCODE_Q] = "KeyQ"
keyMap[sdl.SCANCODE_W] = "KeyW" keyNameMap[sdl.SCANCODE_W] = "KeyW"
keyMap[sdl.SCANCODE_E] = "KeyE" keyNameMap[sdl.SCANCODE_E] = "KeyE"
keyMap[sdl.SCANCODE_R] = "KeyR" keyNameMap[sdl.SCANCODE_R] = "KeyR"
keyMap[sdl.SCANCODE_T] = "KeyT" keyNameMap[sdl.SCANCODE_T] = "KeyT"
keyMap[sdl.SCANCODE_Y] = "KeyY" keyNameMap[sdl.SCANCODE_Y] = "KeyY"
keyMap[sdl.SCANCODE_U] = "KeyU" keyNameMap[sdl.SCANCODE_U] = "KeyU"
keyMap[sdl.SCANCODE_I] = "KeyI" keyNameMap[sdl.SCANCODE_I] = "KeyI"
keyMap[sdl.SCANCODE_O] = "KeyO" keyNameMap[sdl.SCANCODE_O] = "KeyO"
keyMap[sdl.SCANCODE_P] = "KeyP" keyNameMap[sdl.SCANCODE_P] = "KeyP"
keyMap[sdl.SCANCODE_LEFTBRACKET] = "BracketLeft" keyNameMap[sdl.SCANCODE_LEFTBRACKET] = "BracketLeft"
keyMap[sdl.SCANCODE_RIGHTBRACKET] = "BracketRight" keyNameMap[sdl.SCANCODE_RIGHTBRACKET] = "BracketRight"
keyMap[sdl.SCANCODE_RETURN] = "Enter" keyNameMap[sdl.SCANCODE_RETURN] = "Enter"
keyMap[sdl.SCANCODE_LCTRL] = "ControlLeft" keyNameMap[sdl.SCANCODE_LCTRL] = "ControlLeft"
keyMap[sdl.SCANCODE_A] = "KeyA" keyNameMap[sdl.SCANCODE_A] = "KeyA"
keyMap[sdl.SCANCODE_S] = "KeyS" keyNameMap[sdl.SCANCODE_S] = "KeyS"
keyMap[sdl.SCANCODE_D] = "KeyD" keyNameMap[sdl.SCANCODE_D] = "KeyD"
keyMap[sdl.SCANCODE_F] = "KeyF" keyNameMap[sdl.SCANCODE_F] = "KeyF"
keyMap[sdl.SCANCODE_G] = "KeyG" keyNameMap[sdl.SCANCODE_G] = "KeyG"
keyMap[sdl.SCANCODE_H] = "KeyH" keyNameMap[sdl.SCANCODE_H] = "KeyH"
keyMap[sdl.SCANCODE_J] = "KeyJ" keyNameMap[sdl.SCANCODE_J] = "KeyJ"
keyMap[sdl.SCANCODE_K] = "KeyK" keyNameMap[sdl.SCANCODE_K] = "KeyK"
keyMap[sdl.SCANCODE_L] = "KeyL" keyNameMap[sdl.SCANCODE_L] = "KeyL"
keyMap[sdl.SCANCODE_SEMICOLON] = "Semicolon" keyNameMap[sdl.SCANCODE_SEMICOLON] = "Semicolon"
keyMap[sdl.SCANCODE_APOSTROPHE] = "Quote" keyNameMap[sdl.SCANCODE_APOSTROPHE] = "Quote"
keyMap[sdl.SCANCODE_GRAVE] = "Backquote" keyNameMap[sdl.SCANCODE_GRAVE] = "Backquote"
keyMap[sdl.SCANCODE_LSHIFT] = "ShiftLeft" keyNameMap[sdl.SCANCODE_LSHIFT] = "ShiftLeft"
keyMap[sdl.SCANCODE_BACKSLASH] = "Backslash" keyNameMap[sdl.SCANCODE_BACKSLASH] = "Backslash"
keyMap[sdl.SCANCODE_Z] = "KeyZ" keyNameMap[sdl.SCANCODE_Z] = "KeyZ"
keyMap[sdl.SCANCODE_X] = "KeyX" keyNameMap[sdl.SCANCODE_X] = "KeyX"
keyMap[sdl.SCANCODE_C] = "KeyC" keyNameMap[sdl.SCANCODE_C] = "KeyC"
keyMap[sdl.SCANCODE_V] = "KeyV" keyNameMap[sdl.SCANCODE_V] = "KeyV"
keyMap[sdl.SCANCODE_B] = "KeyB" keyNameMap[sdl.SCANCODE_B] = "KeyB"
keyMap[sdl.SCANCODE_N] = "KeyN" keyNameMap[sdl.SCANCODE_N] = "KeyN"
keyMap[sdl.SCANCODE_M] = "KeyM" keyNameMap[sdl.SCANCODE_M] = "KeyM"
keyMap[sdl.SCANCODE_COMMA] = "Comma" keyNameMap[sdl.SCANCODE_COMMA] = "Comma"
keyMap[sdl.SCANCODE_PERIOD] = "Period" keyNameMap[sdl.SCANCODE_PERIOD] = "Period"
keyMap[sdl.SCANCODE_SLASH] = "Slash" keyNameMap[sdl.SCANCODE_SLASH] = "Slash"
keyMap[sdl.SCANCODE_RSHIFT] = "RightShift" keyNameMap[sdl.SCANCODE_RSHIFT] = "RightShift"
keyMap[sdl.SCANCODE_KP_MULTIPLY] = "NumpadMultiply" keyNameMap[sdl.SCANCODE_KP_MULTIPLY] = "NumpadMultiply"
keyMap[sdl.SCANCODE_LALT] = "AltLeft" keyNameMap[sdl.SCANCODE_LALT] = "AltLeft"
keyMap[sdl.SCANCODE_SPACE] = "Space" keyNameMap[sdl.SCANCODE_SPACE] = "Space"
keyMap[sdl.SCANCODE_CAPSLOCK] = "CapsLock" keyNameMap[sdl.SCANCODE_CAPSLOCK] = "CapsLock"
keyMap[sdl.SCANCODE_F1] = "F1" keyNameMap[sdl.SCANCODE_F1] = "F1"
keyMap[sdl.SCANCODE_F2] = "F2" keyNameMap[sdl.SCANCODE_F2] = "F2"
keyMap[sdl.SCANCODE_F3] = "F3" keyNameMap[sdl.SCANCODE_F3] = "F3"
keyMap[sdl.SCANCODE_F4] = "F4" keyNameMap[sdl.SCANCODE_F4] = "F4"
keyMap[sdl.SCANCODE_F5] = "F5" keyNameMap[sdl.SCANCODE_F5] = "F5"
keyMap[sdl.SCANCODE_F6] = "F6" keyNameMap[sdl.SCANCODE_F6] = "F6"
keyMap[sdl.SCANCODE_F7] = "F7" keyNameMap[sdl.SCANCODE_F7] = "F7"
keyMap[sdl.SCANCODE_F8] = "F8" keyNameMap[sdl.SCANCODE_F8] = "F8"
keyMap[sdl.SCANCODE_F9] = "F9" keyNameMap[sdl.SCANCODE_F9] = "F9"
keyMap[sdl.SCANCODE_F10] = "F10" keyNameMap[sdl.SCANCODE_F10] = "F10"
keyMap[sdl.SCANCODE_PAUSE] = "Pause" keyNameMap[sdl.SCANCODE_PAUSE] = "Pause"
keyMap[sdl.SCANCODE_SCROLLLOCK] = "ScrollLock" keyNameMap[sdl.SCANCODE_SCROLLLOCK] = "ScrollLock"
keyMap[sdl.SCANCODE_KP_7] = "Numpad7" keyNameMap[sdl.SCANCODE_KP_7] = "Numpad7"
keyMap[sdl.SCANCODE_KP_8] = "Numpad8" keyNameMap[sdl.SCANCODE_KP_8] = "Numpad8"
keyMap[sdl.SCANCODE_KP_9] = "Numpad9" keyNameMap[sdl.SCANCODE_KP_9] = "Numpad9"
keyMap[sdl.SCANCODE_KP_MINUS] = "NumpadSubtract" keyNameMap[sdl.SCANCODE_KP_MINUS] = "NumpadSubtract"
keyMap[sdl.SCANCODE_KP_4] = "Numpad4" keyNameMap[sdl.SCANCODE_KP_4] = "Numpad4"
keyMap[sdl.SCANCODE_KP_5] = "Numpad5" keyNameMap[sdl.SCANCODE_KP_5] = "Numpad5"
keyMap[sdl.SCANCODE_KP_6] = "Numpad6" keyNameMap[sdl.SCANCODE_KP_6] = "Numpad6"
keyMap[sdl.SCANCODE_KP_PLUS] = "NumpadAdd" keyNameMap[sdl.SCANCODE_KP_PLUS] = "NumpadAdd"
keyMap[sdl.SCANCODE_KP_1] = "Numpad1" keyNameMap[sdl.SCANCODE_KP_1] = "Numpad1"
keyMap[sdl.SCANCODE_KP_2] = "Numpad2" keyNameMap[sdl.SCANCODE_KP_2] = "Numpad2"
keyMap[sdl.SCANCODE_KP_3] = "Numpad3" keyNameMap[sdl.SCANCODE_KP_3] = "Numpad3"
keyMap[sdl.SCANCODE_KP_0] = "Numpad0" keyNameMap[sdl.SCANCODE_KP_0] = "Numpad0"
keyMap[sdl.SCANCODE_KP_DECIMAL] = "NumpadDecimal" keyNameMap[sdl.SCANCODE_KP_DECIMAL] = "NumpadDecimal"
keyMap[sdl.SCANCODE_PRINTSCREEN] = "PrintScreen" keyNameMap[sdl.SCANCODE_PRINTSCREEN] = "PrintScreen"
keyMap[sdl.SCANCODE_NONUSBACKSLASH] = "IntlBackslash" keyNameMap[sdl.SCANCODE_NONUSBACKSLASH] = "IntlBackslash"
keyMap[sdl.SCANCODE_F11] = "F11" keyNameMap[sdl.SCANCODE_F11] = "F11"
keyMap[sdl.SCANCODE_F12] = "F12" keyNameMap[sdl.SCANCODE_F12] = "F12"
keyMap[sdl.SCANCODE_KP_EQUALS] = "NumpadEqual" keyNameMap[sdl.SCANCODE_KP_EQUALS] = "NumpadEqual"
keyMap[sdl.SCANCODE_F13] = "F13" keyNameMap[sdl.SCANCODE_F13] = "F13"
keyMap[sdl.SCANCODE_F14] = "F14" keyNameMap[sdl.SCANCODE_F14] = "F14"
keyMap[sdl.SCANCODE_F15] = "F15" keyNameMap[sdl.SCANCODE_F15] = "F15"
keyMap[sdl.SCANCODE_F16] = "F16" keyNameMap[sdl.SCANCODE_F16] = "F16"
keyMap[sdl.SCANCODE_F17] = "F17" keyNameMap[sdl.SCANCODE_F17] = "F17"
keyMap[sdl.SCANCODE_F18] = "F18" keyNameMap[sdl.SCANCODE_F18] = "F18"
keyMap[sdl.SCANCODE_F19] = "F19" keyNameMap[sdl.SCANCODE_F19] = "F19"
keyMap[sdl.SCANCODE_UNDO] = "Undo" keyNameMap[sdl.SCANCODE_UNDO] = "Undo"
keyMap[sdl.SCANCODE_PASTE] = "Paste" keyNameMap[sdl.SCANCODE_PASTE] = "Paste"
keyMap[sdl.SCANCODE_AUDIOPREV] = "MediaTrackPrevious" keyNameMap[sdl.SCANCODE_AUDIOPREV] = "MediaTrackPrevious"
keyMap[sdl.SCANCODE_CUT] = "Cut" keyNameMap[sdl.SCANCODE_CUT] = "Cut"
keyMap[sdl.SCANCODE_COPY] = "Copy" keyNameMap[sdl.SCANCODE_COPY] = "Copy"
keyMap[sdl.SCANCODE_AUDIONEXT] = "MediaTrackNext" keyNameMap[sdl.SCANCODE_AUDIONEXT] = "MediaTrackNext"
keyMap[sdl.SCANCODE_KP_ENTER] = "NumpadEnter" keyNameMap[sdl.SCANCODE_KP_ENTER] = "NumpadEnter"
keyMap[sdl.SCANCODE_RCTRL] = "ControlRight" keyNameMap[sdl.SCANCODE_RCTRL] = "ControlRight"
keyMap[sdl.SCANCODE_MUTE] = "AudioVolumeMute" keyNameMap[sdl.SCANCODE_MUTE] = "AudioVolumeMute"
keyMap[sdl.SCANCODE_AUDIOPLAY] = "MediaPlayPause" keyNameMap[sdl.SCANCODE_AUDIOPLAY] = "MediaPlayPause"
keyMap[sdl.SCANCODE_AUDIOSTOP] = "MediaStop" keyNameMap[sdl.SCANCODE_AUDIOSTOP] = "MediaStop"
keyMap[sdl.SCANCODE_VOLUMEDOWN] = "AudioVolumeDown" keyNameMap[sdl.SCANCODE_VOLUMEDOWN] = "AudioVolumeDown"
keyMap[sdl.SCANCODE_VOLUMEUP] = "AudioVolumeUp" keyNameMap[sdl.SCANCODE_VOLUMEUP] = "AudioVolumeUp"
keyMap[sdl.SCANCODE_KP_DIVIDE] = "NumpadDivide" keyNameMap[sdl.SCANCODE_KP_DIVIDE] = "NumpadDivide"
keyMap[sdl.SCANCODE_RALT] = "AltRight" keyNameMap[sdl.SCANCODE_RALT] = "AltRight"
keyMap[sdl.SCANCODE_HELP] = "Help" keyNameMap[sdl.SCANCODE_HELP] = "Help"
keyMap[sdl.SCANCODE_HOME] = "Home" keyNameMap[sdl.SCANCODE_HOME] = "Home"
keyMap[sdl.SCANCODE_UP] = "ArrowUp" keyNameMap[sdl.SCANCODE_UP] = "ArrowUp"
keyMap[sdl.SCANCODE_PAGEUP] = "PageUp" keyNameMap[sdl.SCANCODE_PAGEUP] = "PageUp"
keyMap[sdl.SCANCODE_LEFT] = "ArrowLeft" keyNameMap[sdl.SCANCODE_LEFT] = "ArrowLeft"
keyMap[sdl.SCANCODE_RIGHT] = "ArrowRight" keyNameMap[sdl.SCANCODE_RIGHT] = "ArrowRight"
keyMap[sdl.SCANCODE_END] = "End" keyNameMap[sdl.SCANCODE_END] = "End"
keyMap[sdl.SCANCODE_DOWN] = "ArrowDown" keyNameMap[sdl.SCANCODE_DOWN] = "ArrowDown"
keyMap[sdl.SCANCODE_INSERT] = "Insert" keyNameMap[sdl.SCANCODE_INSERT] = "Insert"
keyMap[sdl.SCANCODE_DELETE] = "Delete" keyNameMap[sdl.SCANCODE_DELETE] = "Delete"
keyMap[sdl.SCANCODE_APPLICATION] = "ContextMenu" keyNameMap[sdl.SCANCODE_APPLICATION] = "ContextMenu"
keyRuneMap[sdl.SCANCODE_0] = '0'
keyRuneMap[sdl.SCANCODE_1] = '1'
keyRuneMap[sdl.SCANCODE_2] = '2'
keyRuneMap[sdl.SCANCODE_3] = '3'
keyRuneMap[sdl.SCANCODE_4] = '4'
keyRuneMap[sdl.SCANCODE_5] = '5'
keyRuneMap[sdl.SCANCODE_6] = '6'
keyRuneMap[sdl.SCANCODE_7] = '7'
keyRuneMap[sdl.SCANCODE_8] = '8'
keyRuneMap[sdl.SCANCODE_9] = '9'
keyRuneMap[sdl.SCANCODE_MINUS] = '-'
keyRuneMap[sdl.SCANCODE_EQUALS] = '='
keyRuneMap[sdl.SCANCODE_TAB] = '\t'
keyRuneMap[sdl.SCANCODE_Q] = 'Q'
keyRuneMap[sdl.SCANCODE_W] = 'W'
keyRuneMap[sdl.SCANCODE_E] = 'E'
keyRuneMap[sdl.SCANCODE_R] = 'R'
keyRuneMap[sdl.SCANCODE_T] = 'T'
keyRuneMap[sdl.SCANCODE_Y] = 'Y'
keyRuneMap[sdl.SCANCODE_U] = 'U'
keyRuneMap[sdl.SCANCODE_I] = 'I'
keyRuneMap[sdl.SCANCODE_O] = 'O'
keyRuneMap[sdl.SCANCODE_P] = 'P'
keyRuneMap[sdl.SCANCODE_LEFTBRACKET] = '['
keyRuneMap[sdl.SCANCODE_RIGHTBRACKET] = ']'
keyRuneMap[sdl.SCANCODE_RETURN] = '\n'
keyRuneMap[sdl.SCANCODE_A] = 'A'
keyRuneMap[sdl.SCANCODE_S] = 'S'
keyRuneMap[sdl.SCANCODE_D] = 'D'
keyRuneMap[sdl.SCANCODE_F] = 'F'
keyRuneMap[sdl.SCANCODE_G] = 'G'
keyRuneMap[sdl.SCANCODE_H] = 'H'
keyRuneMap[sdl.SCANCODE_J] = 'J'
keyRuneMap[sdl.SCANCODE_K] = 'K'
keyRuneMap[sdl.SCANCODE_L] = 'L'
keyRuneMap[sdl.SCANCODE_SEMICOLON] = ';'
keyRuneMap[sdl.SCANCODE_APOSTROPHE] = '\''
keyRuneMap[sdl.SCANCODE_GRAVE] = '`'
keyRuneMap[sdl.SCANCODE_BACKSLASH] = '\\'
keyRuneMap[sdl.SCANCODE_Z] = 'Z'
keyRuneMap[sdl.SCANCODE_X] = 'X'
keyRuneMap[sdl.SCANCODE_C] = 'C'
keyRuneMap[sdl.SCANCODE_V] = 'V'
keyRuneMap[sdl.SCANCODE_B] = 'B'
keyRuneMap[sdl.SCANCODE_N] = 'N'
keyRuneMap[sdl.SCANCODE_M] = 'M'
keyRuneMap[sdl.SCANCODE_COMMA] = ','
keyRuneMap[sdl.SCANCODE_PERIOD] = '.'
keyRuneMap[sdl.SCANCODE_SLASH] = '/'
keyRuneMap[sdl.SCANCODE_KP_MULTIPLY] = '*'
keyRuneMap[sdl.SCANCODE_SPACE] = ' '
keyRuneMap[sdl.SCANCODE_KP_7] = '7'
keyRuneMap[sdl.SCANCODE_KP_8] = '8'
keyRuneMap[sdl.SCANCODE_KP_9] = '9'
keyRuneMap[sdl.SCANCODE_KP_MINUS] = '-'
keyRuneMap[sdl.SCANCODE_KP_4] = '4'
keyRuneMap[sdl.SCANCODE_KP_5] = '5'
keyRuneMap[sdl.SCANCODE_KP_6] = '6'
keyRuneMap[sdl.SCANCODE_KP_PLUS] = '+'
keyRuneMap[sdl.SCANCODE_KP_1] = '1'
keyRuneMap[sdl.SCANCODE_KP_2] = '2'
keyRuneMap[sdl.SCANCODE_KP_3] = '3'
keyRuneMap[sdl.SCANCODE_KP_0] = '0'
keyRuneMap[sdl.SCANCODE_KP_DECIMAL] = '.'
keyRuneMap[sdl.SCANCODE_KP_EQUALS] = '='
keyRuneMap[sdl.SCANCODE_KP_ENTER] = '\n'
keyRuneMap[sdl.SCANCODE_KP_DIVIDE] = '/'
} }
func keyName(s sdl.Scancode) string { func keyName(s sdl.Scancode) string {
if int(s) >= len(keyMap) { if int(s) >= len(keyNameMap) {
return "Unidentified" return "Unidentified"
} }
name := keyMap[s] name := keyNameMap[s]
if name == "" { if name == "" {
return "Unidentified" return "Unidentified"
} }
return name return name
} }
func keyRune(s sdl.Scancode) rune {
if int(s) >= len(keyNameMap) {
return 0
}
return keyRuneMap[s]
}

View file

@ -2,7 +2,7 @@ package sdlcanvas
import ( import (
"fmt" "fmt"
_ "image/gif" _ "image/gif" // Imported here so that applications based on this package support these formats by default
_ "image/jpeg" _ "image/jpeg"
_ "image/png" _ "image/png"
"runtime" "runtime"
@ -43,29 +43,29 @@ func CreateWindow(w, h int, title string) (*Window, *canvas.Canvas, error) {
return nil, nil, fmt.Errorf("Error initializing SDL: %v", err) return nil, nil, fmt.Errorf("Error initializing SDL: %v", err)
} }
sdl.GL_SetAttribute(sdl.GL_RED_SIZE, 8) sdl.GLSetAttribute(sdl.GL_RED_SIZE, 8)
sdl.GL_SetAttribute(sdl.GL_GREEN_SIZE, 8) sdl.GLSetAttribute(sdl.GL_GREEN_SIZE, 8)
sdl.GL_SetAttribute(sdl.GL_BLUE_SIZE, 8) sdl.GLSetAttribute(sdl.GL_BLUE_SIZE, 8)
sdl.GL_SetAttribute(sdl.GL_ALPHA_SIZE, 8) sdl.GLSetAttribute(sdl.GL_ALPHA_SIZE, 8)
sdl.GL_SetAttribute(sdl.GL_DEPTH_SIZE, 0) sdl.GLSetAttribute(sdl.GL_DEPTH_SIZE, 0)
sdl.GL_SetAttribute(sdl.GL_STENCIL_SIZE, 8) sdl.GLSetAttribute(sdl.GL_STENCIL_SIZE, 8)
sdl.GL_SetAttribute(sdl.GL_DOUBLEBUFFER, 1) sdl.GLSetAttribute(sdl.GL_DOUBLEBUFFER, 1)
sdl.GL_SetAttribute(sdl.GL_MULTISAMPLEBUFFERS, 1) sdl.GLSetAttribute(sdl.GL_MULTISAMPLEBUFFERS, 1)
sdl.GL_SetAttribute(sdl.GL_MULTISAMPLESAMPLES, 4) sdl.GLSetAttribute(sdl.GL_MULTISAMPLESAMPLES, 4)
// create window // create window
window, err := sdl.CreateWindow(title, sdl.WINDOWPOS_CENTERED, sdl.WINDOWPOS_CENTERED, w, h, sdl.WINDOW_RESIZABLE|sdl.WINDOW_OPENGL) window, err := sdl.CreateWindow(title, sdl.WINDOWPOS_CENTERED, sdl.WINDOWPOS_CENTERED, int32(w), int32(h), sdl.WINDOW_RESIZABLE|sdl.WINDOW_OPENGL)
if err != nil { if err != nil {
sdl.GL_SetAttribute(sdl.GL_MULTISAMPLEBUFFERS, 0) sdl.GLSetAttribute(sdl.GL_MULTISAMPLEBUFFERS, 0)
sdl.GL_SetAttribute(sdl.GL_MULTISAMPLESAMPLES, 0) sdl.GLSetAttribute(sdl.GL_MULTISAMPLESAMPLES, 0)
window, err = sdl.CreateWindow(title, sdl.WINDOWPOS_CENTERED, sdl.WINDOWPOS_CENTERED, w, h, sdl.WINDOW_RESIZABLE|sdl.WINDOW_OPENGL) window, err = sdl.CreateWindow(title, sdl.WINDOWPOS_CENTERED, sdl.WINDOWPOS_CENTERED, int32(w), int32(h), sdl.WINDOW_RESIZABLE|sdl.WINDOW_OPENGL)
if err != nil { if err != nil {
return nil, nil, fmt.Errorf("Error creating window: %v", err) return nil, nil, fmt.Errorf("Error creating window: %v", err)
} }
} }
// create GL context // create GL context
glContext, err := sdl.GL_CreateContext(window) glContext, err := window.GLCreateContext()
if err != nil { if err != nil {
return nil, nil, fmt.Errorf("Error creating GL context: %v", err) return nil, nil, fmt.Errorf("Error creating GL context: %v", err)
} }
@ -76,7 +76,7 @@ func CreateWindow(w, h int, title string) (*Window, *canvas.Canvas, error) {
return nil, nil, fmt.Errorf("Error initializing GL: %v", err) return nil, nil, fmt.Errorf("Error initializing GL: %v", err)
} }
sdl.GL_SetSwapInterval(1) sdl.GLSetSwapInterval(1)
gl.Enable(gl.MULTISAMPLE) gl.Enable(gl.MULTISAMPLE)
err = canvas.LoadGL(goglimpl.GLImpl{}) err = canvas.LoadGL(goglimpl.GLImpl{})
@ -96,7 +96,7 @@ func CreateWindow(w, h int, title string) (*Window, *canvas.Canvas, error) {
// Destroy destroys the GL context and the window // Destroy destroys the GL context and the window
func (wnd *Window) Destroy() { func (wnd *Window) Destroy() {
sdl.GL_DeleteContext(wnd.GLContext) sdl.GLDeleteContext(wnd.GLContext)
wnd.Window.Destroy() wnd.Window.Destroy()
} }
@ -112,7 +112,7 @@ func (wnd *Window) Close() {
// StartFrame handles events and gets the window ready for rendering // StartFrame handles events and gets the window ready for rendering
func (wnd *Window) StartFrame() error { func (wnd *Window) StartFrame() error {
err := sdl.GL_MakeCurrent(wnd.Window, wnd.GLContext) err := wnd.Window.GLMakeCurrent(wnd.GLContext)
if err != nil { if err != nil {
return err return err
} }
@ -143,17 +143,19 @@ func (wnd *Window) StartFrame() error {
wnd.MouseMove(int(e.X), int(e.Y)) wnd.MouseMove(int(e.X), int(e.Y))
handled = true handled = true
} }
case *sdl.KeyDownEvent: case *sdl.KeyboardEvent:
if e.Type == sdl.KEYDOWN {
if wnd.KeyDown != nil { if wnd.KeyDown != nil {
wnd.KeyDown(int(e.Keysym.Scancode), rune(e.Keysym.Unicode), keyName(e.Keysym.Scancode)) wnd.KeyDown(int(e.Keysym.Scancode), keyRune(e.Keysym.Scancode), keyName(e.Keysym.Scancode))
handled = true handled = true
} }
case *sdl.KeyUpEvent: } else if e.Type == sdl.KEYUP {
if wnd.KeyUp != nil { if wnd.KeyUp != nil {
wnd.KeyUp(int(e.Keysym.Scancode), rune(e.Keysym.Unicode), keyName(e.Keysym.Scancode)) wnd.KeyUp(int(e.Keysym.Scancode), keyRune(e.Keysym.Scancode), keyName(e.Keysym.Scancode))
handled = true handled = true
} }
} }
}
if !handled && wnd.Event != nil { if !handled && wnd.Event != nil {
wnd.Event(event) wnd.Event(event)
@ -181,7 +183,7 @@ func (wnd *Window) FinishFrame() {
wnd.fps = float32(wnd.frameCount-1) / float32(diff) wnd.fps = float32(wnd.frameCount-1) / float32(diff)
} }
sdl.GL_SwapWindow(wnd.Window) wnd.Window.GLSwap()
} }
// MainLoop runs a main loop and calls run on every frame // MainLoop runs a main loop and calls run on every frame
@ -202,8 +204,8 @@ func (wnd *Window) MainLoop(run func()) {
} }
case *sdl.QuitEvent: case *sdl.QuitEvent:
wnd.close = true wnd.close = true
case *sdl.KeyDownEvent: case *sdl.KeyboardEvent:
if e.Keysym.Scancode == sdl.SCANCODE_ESCAPE { if e.Type == sdl.KEYDOWN && e.Keysym.Scancode == sdl.SCANCODE_ESCAPE {
wnd.close = true wnd.close = true
} }
} }