pollEvent method

Event? pollEvent()

Poll events.

SDL Docs

Implementation

Event? pollEvent() {
  final n = sdl.SDL_PollEvent(_eventHandle);
  if (n != 0) {
    final e = _eventHandle.ref;
    Event event;
    final type = e.type.toEventType();
    switch (type) {
      case EventType.firstevent:
        throwInvalidEvent(type);
      case EventType.quit:
        event = QuitEvent(this, e.quit.timestamp);
        break;
      case EventType.appTerminating:
        event = AppTerminatingEvent(this, e.common.timestamp);
        break;
      case EventType.appLowmemory:
        event = AppLowMemoryEvent(this, e.common.timestamp);
        break;
      case EventType.appWillenterbackground:
        event = AppWillEnterBackgroundEvent(this, e.common.timestamp);
        break;
      case EventType.appDidenterbackground:
        event = AppDidEnterBackgroundEvent(this, e.common.timestamp);
        break;
      case EventType.appWillenterforeground:
        event = AppWillEnterForegroundEvent(this, e.common.timestamp);
        break;
      case EventType.appDidenterforeground:
        event = AppDidEnterForegroundEvent(this, e.common.timestamp);
        break;
      case EventType.localechanged:
        event = LocaleChangedEvent(this, e.common.timestamp);
        break;
      case EventType.displayevent:
        event = DisplayEvent.fromEvent(this, e);
        break;
      case EventType.windowevent:
        final windowEvent = e.window;
        final timestamp = windowEvent.timestamp;
        final windowId = windowEvent.windowID;
        switch (windowEvent.event.toWindowEventID()) {
          case WindowEventID.none:
            throw SdlError(windowEvent.event, 'No event ID.');
          case WindowEventID.shown:
            event = WindowShownEvent(this, timestamp, windowId);
            break;
          case WindowEventID.hidden:
            event = WindowHiddenEvent(this, timestamp, windowId);
            break;
          case WindowEventID.exposed:
            event = WindowExposedEvent(this, timestamp, windowId);
            break;
          case WindowEventID.moved:
            event = WindowMovedEvent(
              this,
              timestamp,
              windowId,
              Point<int>(windowEvent.data1, windowEvent.data2),
            );
            break;
          case WindowEventID.resized:
            event = WindowResizedEvent(
              this,
              timestamp,
              windowId,
              WindowSize(windowEvent.data1, windowEvent.data2),
            );
            break;
          case WindowEventID.sizeChanged:
            event = WindowSizeChangedEvent(this, timestamp, windowId);
            break;
          case WindowEventID.minimized:
            event = WindowMinimizedEvent(this, timestamp, windowId);
            break;
          case WindowEventID.maximized:
            event = WindowMaximizedEvent(this, timestamp, windowId);
            break;
          case WindowEventID.restored:
            event = WindowRestoredEvent(this, timestamp, windowId);
            break;
          case WindowEventID.enter:
            event = WindowEnterEvent(this, timestamp, windowId);
            break;
          case WindowEventID.leave:
            event = WindowLeaveEvent(this, timestamp, windowId);
            break;
          case WindowEventID.focusGained:
            event = WindowFocusGainedEvent(this, timestamp, windowId);
            break;
          case WindowEventID.focusLost:
            event = WindowFocusLostEvent(this, timestamp, windowId);
            break;
          case WindowEventID.close:
            event = WindowClosedEvent(this, timestamp, windowId);
            break;
          case WindowEventID.takeFocus:
            event = WindowTakeFocusEvent(this, timestamp, windowId);
            break;
          case WindowEventID.hitTest:
            event = WindowHitTestEvent(this, timestamp, windowId);
            break;
          case WindowEventID.iccprofChanged:
            event = IccprofChangedEvent(this, timestamp, windowId);
            break;
          case WindowEventID.displayChanged:
            event = DisplayChangedEvent(
              this,
              timestamp,
              windowId,
              windowEvent.data1,
            );
            break;
        }
        break;
      case EventType.syswmevent:
        final msg = e.syswm.msg;
        event = SysWmEvent(this, e.syswm.timestamp, msg);
        break;
      case EventType.keydown:
        event = KeyboardEvent.fromSdlEvent(this, e.key);
        break;
      case EventType.keyup:
        event = KeyboardEvent.fromSdlEvent(this, e.key);
        break;
      case EventType.textediting:
        final s = String.fromCharCodes(
          [for (var i = 0; i < e.edit.length; i++) e.edit.text[i]],
        );
        event = TextEditingEvent(
          sdl: this,
          timestamp: e.edit.timestamp,
          wndId: e.edit.windowID,
          text: s,
          start: e.edit.start,
          length: e.edit.length,
        );
        break;
      case EventType.textinput:
        final charCodes = <int>[];
        var i = 0;
        while (true) {
          var c = e.text.text[i];
          if (c == 0) {
            break;
          } else {
            if (c < 0) {
              c += 256;
            }
            charCodes.add(c);
            i++;
          }
        }
        event =
            TextInputEvent(this, e.text.timestamp, utf8.decode(charCodes));
        break;
      case EventType.keymapchanged:
        event = KeymapChangedEvent(this, e.common.timestamp);
        break;
      case EventType.mousemotion:
        final motion = e.motion;
        event = MouseMotionEvent(
          sdl: this,
          timestamp: motion.timestamp,
          wndId: motion.windowID,
          which: motion.which,
          state: motion.state,
          x: motion.x,
          y: motion.y,
          relativeX: motion.xrel,
          relativeY: motion.yrel,
        );
        break;
      case EventType.mousebuttondown:
        event = MouseButtonEvent.fromSdlEvent(this, e.button);
        break;
      case EventType.mousebuttonup:
        event = MouseButtonEvent.fromSdlEvent(this, e.button);
        break;
      case EventType.mousewheel:
        final wheel = e.wheel;
        event = MouseWheelEvent(
          sdl: this,
          timestamp: wheel.timestamp,
          windowId: wheel.windowID,
          which: wheel.which,
          x: wheel.x,
          y: wheel.y,
          direction: wheel.direction.toMouseWheelDirection(),
        );
        break;
      case EventType.joyaxismotion:
        final axis = e.jaxis;
        event = JoyAxisEvent(
          sdl: this,
          timestamp: axis.timestamp,
          joystickId: axis.which,
          axis: axis.axis,
          value: axis.value,
        );
        break;
      case EventType.joyballmotion:
        final ball = e.jball;
        event = JoyBallEvent(
          sdl: this,
          timestamp: ball.timestamp,
          joystickId: ball.which,
          ball: ball.ball,
          relativeX: ball.xrel,
          relativeY: ball.yrel,
        );
        break;
      case EventType.joyhatmotion:
        final hat = e.jhat;
        event = JoyHatEvent(
          sdl: this,
          timestamp: hat.timestamp,
          joystickId: hat.which,
          hat: hat.hat,
          value: hat.value.toJoyHatValue(),
        );
        break;
      case EventType.joybuttondown:
        event = JoyButtonEvent.fromSdlEvent(this, e.jbutton);
        break;
      case EventType.joybuttonup:
        event = JoyButtonEvent.fromSdlEvent(this, e.jbutton);
        break;
      case EventType.joydeviceadded:
        event = JoyDeviceEvent.fromSdlEvent(this, e.jdevice);
        break;
      case EventType.joydeviceremoved:
        event = JoyDeviceEvent.fromSdlEvent(this, e.jdevice);
        break;
      case EventType.controlleraxismotion:
        final axis = e.caxis;
        event = ControllerAxisEvent(
          sdl: this,
          timestamp: axis.timestamp,
          joystickId: axis.which,
          axis: axis.axis.toGameControllerAxis(),
          value: axis.value,
        );
        break;
      case EventType.controllerbuttondown:
        event = ControllerButtonEvent.fromSdlEvent(this, e.cbutton);
        break;
      case EventType.controllerbuttonup:
        event = ControllerButtonEvent.fromSdlEvent(this, e.cbutton);
        break;
      case EventType.controllerdeviceadded:
        event = ControllerDeviceEvent.fromSdlEvent(this, e.cdevice);
        break;
      case EventType.controllerdeviceremoved:
        event = ControllerDeviceEvent.fromSdlEvent(this, e.cdevice);
        break;
      case EventType.controllerdeviceremapped:
        event = ControllerDeviceEvent.fromSdlEvent(this, e.cdevice);
        break;
      case EventType.controllertouchpaddown:
        event = ControllerTouchpadEvent.fromSdlEvent(this, e.ctouchpad);
        break;
      case EventType.controllertouchpadmotion:
        event = ControllerTouchpadEvent.fromSdlEvent(this, e.ctouchpad);
        break;
      case EventType.controllertouchpadup:
        event = ControllerTouchpadEvent.fromSdlEvent(this, e.ctouchpad);
        break;
      case EventType.controllersensorupdate:
        event = ControllerSensorEvent.fromSdlEvent(this, e.csensor);
        break;
      case EventType.fingerdown:
        event = TouchFingerEvent.fromSdlEvent(this, e.tfinger);
        break;
      case EventType.fingerup:
        event = TouchFingerEvent.fromSdlEvent(this, e.tfinger);
        break;
      case EventType.fingermotion:
        event = TouchFingerEvent.fromSdlEvent(this, e.tfinger);
        break;
      case EventType.dollargesture:
        event = DollarGestureEvent.fromSdlEvent(this, e.dgesture);
        break;
      case EventType.dollarrecord:
        event = DollarGestureEvent.fromSdlEvent(this, e.dgesture);
        break;
      case EventType.multigesture:
        final gesture = e.mgesture;
        event = MultiGestureEvent(
          sdl: this,
          timestamp: gesture.timestamp,
          touchId: gesture.touchId,
          dTheta: gesture.dTheta,
          dDist: gesture.dDist,
          numFingers: gesture.numFingers,
          x: gesture.x,
          y: gesture.y,
        );
        break;
      case EventType.clipboardupdate:
        event = ClipboardChangedEvent(this, e.common.timestamp);
        break;
      case EventType.dropfile:
        event = DropEvent.fromSdlEvent(this, e.drop);
        break;
      case EventType.droptext:
        event = DropEvent.fromSdlEvent(this, e.drop);
        break;
      case EventType.dropbegin:
        event = DropEvent.fromSdlEvent(this, e.drop);
        break;
      case EventType.dropcomplete:
        event = DropEvent.fromSdlEvent(this, e.drop);
        break;
      case EventType.audiodeviceadded:
        event = AudioDeviceEvent.fromSdlEvent(this, e.adevice);
        break;
      case EventType.audiodeviceremoved:
        event = AudioDeviceEvent.fromSdlEvent(this, e.adevice);
        break;
      case EventType.sensorupdate:
        final sensor = e.sensor;
        event = SensorEvent(
          sdl: this,
          timestamp: sensor.timestamp,
          sensor: sensor.which,
          data1: sensor.data[0],
          data2: sensor.data[1],
          data3: sensor.data[2],
          data4: sensor.data[3],
          data5: sensor.data[4],
          data6: sensor.data[5],
        );
        break;
      case EventType.renderTargetsReset:
        event = RenderTargetsResetEvent(this, e.common.timestamp);
        break;
      case EventType.renderDeviceReset:
        event = RenderDeviceReset(this, e.common.timestamp);
        break;
      case EventType.userevent:
        final user = e.user;
        event = UserEvent(
          sdl: this,
          timestamp: user.timestamp,
          type: user.type,
          windowId: user.windowID == 0 ? null : user.windowID,
          code: user.code,
        );
        break;
      case EventType.lastevent:
        throw SdlError(e.type, 'Last event type.');
      case EventType.pollsentinel:
        event = PollSentinelEvent(this, e.common.timestamp);
        break;
    }
    return event;
  }
  return null;
}