banthar / Go-SDL

Go bindings for SDL
218 stars 68 forks source link

PushEvent #54

Open salviati opened 12 years ago

salviati commented 12 years ago

cEvent() causes panic with panic: reflect.Value.UnsafeAddr of unaddressable value.. One can simply try pushing a UserEvent to get this.

salviati commented 12 years ago

This doesn't look as pretty, but at least it works:

func PushEvent(event Event) bool {
    var p cast
    switch ev := event.(type) {
        case ActiveEvent: p = cast(&ev)
        case KeyboardEvent: p = cast(&ev)
        case MouseMotionEvent: p = cast(&ev)
        case MouseButtonEvent: p = cast(&ev)
        case JoyAxisEvent: p = cast(&ev)
        case JoyBallEvent: p = cast(&ev)
        case JoyHatEvent: p = cast(&ev)
        case JoyButtonEvent: p = cast(&ev)
        case ResizeEvent: p = cast(&ev)
        case ExposeEvent: p = cast(&ev)
        case QuitEvent: p = cast(&ev)
        case UserEvent: p = cast(&ev)
        case SysWMEvent: p = cast(&ev)
        default: panic(fmt.Errorf("Unknown event type: %T", event))
    }
    ret := C.SDL_PushEvent((*C.SDL_Event)(p))
    return ret != 0
}
DeedleFake commented 12 years ago

Found the problem. cEvent() is attempting to run UnsafeAddr() on a pointer. I'll send in a pull-request with a fix.

One other thing to note, however: It looks like you're attempting to run PushEvent() on a non-pointer. You need to run it on a pointer:

PushEvent(UserEvent{})

will panic, but

PushEvent(&UserEvent{})

will succeed, after the fix is implemented. I'll also add something to the godoc comment for PushEvent() that explicitly states that.

salviati commented 12 years ago

This is not compatible with the current event-handling though (which needs to be changed anyway: Issue 55).