enum ALLEGRO_EVENT_TYPE {
   ALLEGRO_EVENT_JOYSTICK_AXIS        =  1,
   ALLEGRO_EVENT_JOYSTICK_BUTTON_DOWN =  2,
   ALLEGRO_EVENT_JOYSTICK_BUTTON_UP   =  3,
   ALLEGRO_EVENT_KEY_DOWN             = 10,
   ALLEGRO_EVENT_KEY_REPEAT           = 11,
   ALLEGRO_EVENT_KEY_UP               = 12,
   ALLEGRO_EVENT_MOUSE_AXES           = 20,
   ALLEGRO_EVENT_MOUSE_BUTTON_DOWN    = 21,
   ALLEGRO_EVENT_MOUSE_BUTTON_UP      = 22,
   ALLEGRO_EVENT_MOUSE_ENTER_DISPLAY  = 23,
   ALLEGRO_EVENT_MOUSE_LEAVE_DISPLAY  = 24,
   ALLEGRO_EVENT_MOUSE_WARPED         = 25,
   ALLEGRO_EVENT_TIMER                = 30,
   ALLEGRO_EVENT_DISPLAY_EXPOSE       = 40,
   ALLEGRO_EVENT_DISPLAY_RESIZE       = 41,
   ALLEGRO_EVENT_DISPLAY_CLOSE        = 42,
   ALLEGRO_EVENT_DISPLAY_LOST         = 43,
   ALLEGRO_EVENT_DISPLAY_FOUND        = 44,
   ALLEGRO_EVENT_DISPLAY_SWITCH_IN    = 45,
   ALLEGRO_EVENT_DISPLAY_SWITCH_OUT   = 46
}


typedef ALLEGRO_ANY_EVENT : struct {
    type      : ALLEGRO_EVENT_TYPE,
    source    : *ALLEGRO_EVENT_SOURCE,
    timestamp : double
};


typedef ALLEGRO_DISPLAY_EVENT : struct {
    type      : ALLEGRO_EVENT_TYPE,
    source    : *ALLEGRO_DISPLAY,
    timestamp : double,
    x         : int,
    y         : int,
    width     : int,
    height    : int
};


typedef ALLEGRO_JOYSTIC_EVENT : struct {
    type      : ALLEGRO_EVENT_TYPE,
    source    : *ALLEGRO_JOYSTICK,
    timestamp : double,
    stick     : int,
    axis      : int,
    pos       : float,
    button    : int
};


typedef ALLEGRO_KEYBOARD_EVENT : struct {
    type      : ALLEGRO_EVENT_TYPE,
    source    : *ALLEGRO_KEYBOARD,
    timestamp : double,
    keycode   : int,
    unichar   : uint,
    modifiers : uint
};


typedef ALLEGRO_MOUSE_EVENT : struct {
    type      : ALLEGRO_EVENT_TYPE,
    source    : *ALLEGRO_MOUSE,
    timestamp : double,
    display   : *ALLEGRO_DISPLAY,
    x         : int,
    y         : int,
    z         : int,
    w         : int,
    dx        : int,
    dy        : int,
    dz        : int,
    dw        : int,
    button    : uint
};


typedef ALLEGRO_TIMER_EVENT : struct {
    type      : ALLEGRO_EVENT_TYPE,
    source    : *ALLEGRO_TIMER,
    timestamp : double,
    count     : long,
    error     : double
};


typedef ALLEGRO_USER_EVENT : struct {
    type              : ALLEGRO_EVENT_TYPE,
    source            : *ALLEGRO_EVENT_SOURCE,
    timestamp         : double,
    __internal__descr : *ALLEGRO_USER_EVENT_DESCRIPTOR,
    data1             : intptr_t,
    data2             : intptr_t,
    dat31             : intptr_t,
    data4             : intptr_t
};


typedef ALLEGRO_EVENT : unsafe union {
    type     : ALLEGRO_EVENT_TYPE,
    any      : ALLEGRO_ANY_EVENT,
    display  : ALLEGRO_DISPLAY_EVENT,
    joystick : ALLEGRO_JOYSTICK_EVENT,
    keyboard : ALLEGRO_KEYBOARD_EVENT,
    mouse    : ALLEGRO_MOUSE_EVENT,
    timer    : ALLEGRO_TIMER_EVENT,
    user     : ALLEGRO_USER_EVENT
};
