1. -- 
  2. -- Copyright (c) 2013 Kevin Wellwood 
  3. -- All rights reserved. 
  4. -- 
  5. -- This source code is distributed under the Modified BSD License. For terms and 
  6. -- conditions, see license.txt. 
  7. -- 
  8.  
  9. with Allegro_Ids;                       use Allegro_Ids; 
  10. with Allegro.Displays;                  use Allegro.Displays; 
  11. with Allegro.Joystick;                  use Allegro.Joystick; 
  12. with Allegro.Keyboard;                  use Allegro.Keyboard; 
  13. with Allegro.Mouse;                     use Allegro.Mouse; 
  14. with Allegro.Time;                      use Allegro.Time; 
  15. with Allegro.Timers;                    use Allegro.Timers; 
  16. with Interfaces;                        use Interfaces; 
  17. with Interfaces.C;                      use Interfaces.C; 
  18. with System;                            use System; 
  19.  
  20. -- Allegro 5.0.9 - Event system and events 
  21. package Allegro.Events is 
  22.  
  23.     -- Event types 
  24.  
  25.     subtype Allegro_Event_Type is Unsigned_32; 
  26.  
  27.     ALLEGRO_EVENT_JOYSTICK_AXIS          : constant Allegro_Event_Type := 1; 
  28.     ALLEGRO_EVENT_JOYSTICK_BUTTON_DOWN   : constant Allegro_Event_Type := 2; 
  29.     ALLEGRO_EVENT_JOYSTICK_BUTTON_UP     : constant Allegro_Event_Type := 3; 
  30.     ALLEGRO_EVENT_JOYSTICK_CONFIGURATION : constant Allegro_Event_Type := 4; 
  31.  
  32.     ALLEGRO_EVENT_KEY_DOWN               : constant Allegro_Event_Type := 10; 
  33.     ALLEGRO_EVENT_KEY_CHAR               : constant Allegro_Event_Type := 11; 
  34.     ALLEGRO_EVENT_KEY_UP                 : constant Allegro_Event_Type := 12; 
  35.  
  36.     ALLEGRO_EVENT_MOUSE_AXES             : constant Allegro_Event_Type := 20; 
  37.     ALLEGRO_EVENT_MOUSE_BUTTON_DOWN      : constant Allegro_Event_Type := 21; 
  38.     ALLEGRO_EVENT_MOUSE_BUTTON_UP        : constant Allegro_Event_Type := 22; 
  39.     ALLEGRO_EVENT_MOUSE_ENTER_DISPLAY    : constant Allegro_Event_Type := 23; 
  40.     ALLEGRO_EVENT_MOUSE_LEAVE_DISPLAY    : constant Allegro_Event_Type := 24; 
  41.     ALLEGRO_EVENT_MOUSE_WARPED           : constant Allegro_Event_Type := 25; 
  42.  
  43.     ALLEGRO_EVENT_TIMER                  : constant Allegro_Event_Type := 30; 
  44.  
  45.     ALLEGRO_EVENT_DISPLAY_EXPOSE         : constant Allegro_Event_Type := 40; 
  46.     ALLEGRO_EVENT_DISPLAY_RESIZE         : constant Allegro_Event_Type := 41; 
  47.     ALLEGRO_EVENT_DISPLAY_CLOSE          : constant Allegro_Event_Type := 42; 
  48.     ALLEGRO_EVENT_DISPLAY_LOST           : constant Allegro_Event_Type := 43; 
  49.     ALLEGRO_EVENT_DISPLAY_FOUND          : constant Allegro_Event_Type := 44; 
  50.     ALLEGRO_EVENT_DISPLAY_SWITCH_IN      : constant Allegro_Event_Type := 45; 
  51.     ALLEGRO_EVENT_DISPLAY_SWITCH_OUT     : constant Allegro_Event_Type := 46; 
  52.     ALLEGRO_EVENT_DISPLAY_ORIENTATION    : constant Allegro_Event_Type := 47; 
  53.  
  54.     ---------------------------------------------------------------------------- 
  55.  
  56.     -- Type-specific event structures 
  57.  
  58.     type Allegro_Any_Event is 
  59.         record 
  60.             typ    : Allegro_Event_Type; 
  61.             source : A_Allegro_Event_Source; 
  62.         end record; 
  63.     pragma Convention( C, Allegro_Any_Event ); 
  64.  
  65.     type Allegro_Display_Event is 
  66.         record 
  67.             typ         : Allegro_Event_Type; 
  68.             source      : A_Allegro_Display; 
  69.             timestamp   : double; 
  70.             x, y        : Integer; 
  71.             width, 
  72.             height      : Integer; 
  73.             orientation : Allegro_Display_Orientation; 
  74.         end record; 
  75.     pragma Convention( C, Allegro_Display_Event ); 
  76.  
  77.     type Allegro_Joystick_Event is 
  78.         record 
  79.             typ       : Allegro_Event_Type; 
  80.             source    : A_Allegro_Joystick; 
  81.             timestamp : double; 
  82.             id        : A_Allegro_Joystick; 
  83.             stick     : Integer; 
  84.             axis      : Integer; 
  85.             pos       : Float; 
  86.             button    : Integer; 
  87.         end record; 
  88.     pragma Convention( C, Allegro_Joystick_Event ); 
  89.  
  90.     type Allegro_Keyboard_Event is 
  91.         record 
  92.             typ       : Allegro_Event_Type; 
  93.             source    : A_Allegro_Keyboard; 
  94.             timestamp : double; 
  95.             display   : A_Allegro_Display; 
  96.             keycode   : Integer; 
  97.             unichar   : Integer; 
  98.             modifiers : Unsigned_32; 
  99.             repeat    : Bool; 
  100.         end record; 
  101.     pragma Convention( C, Allegro_Keyboard_Event ); 
  102.  
  103.     type Allegro_Mouse_Event is 
  104.         record 
  105.             typ            : Allegro_Event_Type; 
  106.             source         : A_Allegro_Mouse; 
  107.             timestamp      : double; 
  108.             display        : A_Allegro_Display; 
  109.             x, y, z, w     : Integer; 
  110.             dx, dy, dz, dw : Integer; 
  111.             button         : Unsigned_32; 
  112.             pressure       : Float; 
  113.         end record; 
  114.     pragma Convention( C, Allegro_Mouse_Event ); 
  115.  
  116.     type Allegro_Timer_Event is 
  117.         record 
  118.             typ       : Allegro_Event_Type; 
  119.             source    : A_Allegro_Timer; 
  120.             timestamp : double; 
  121.             count     : Unsigned_64; 
  122.             error     : double; 
  123.         end record; 
  124.     pragma Convention( C, Allegro_Timer_Event ); 
  125.  
  126.     type Allegro_User_Event is 
  127.         record 
  128.             typ            : Allegro_Event_Type; 
  129.             source         : A_Allegro_Event_Source; 
  130.             timestamp      : double; 
  131.             internal_descr : Address; 
  132.             data1          : Address; 
  133.             data2          : Address; 
  134.             data3          : Address; 
  135.             data4          : Address; 
  136.         end record; 
  137.     pragma Convention( C, Allegro_User_Event ); 
  138.     type A_Allegro_User_Event is access all Allegro_User_Event; 
  139.  
  140.     ---------------------------------------------------------------------------- 
  141.  
  142.     -- Event structure 
  143.  
  144.     type Allegro_Event(t : Allegro_Event_Type := 0) is 
  145.         record 
  146.             case t is 
  147.                 when 0 => 
  148.                     any      : Allegro_Any_Event; 
  149.                 when 1..4 => 
  150.                     joystick : Allegro_Joystick_Event; 
  151.                 when 10..12 => 
  152.                     keyboard : Allegro_Keyboard_Event; 
  153.                 when 20..25 => 
  154.                     mouse    : Allegro_Mouse_Event; 
  155.                 when 30 => 
  156.                     timer    : Allegro_Timer_Event; 
  157.                 when 40..47 => 
  158.                     display  : Allegro_Display_Event; 
  159.                 when others => 
  160.                     user     : Allegro_User_Event; 
  161.             end case; 
  162.         end record; 
  163.      pragma Unchecked_Union( Allegro_Event ); 
  164.      pragma Convention( C, Allegro_Event ); 
  165.  
  166.     ---------------------------------------------------------------------------- 
  167.  
  168.     --    1 <= t < 512  - builtin events 
  169.     --  512 <= t < 1024 - reserved user events (for addons) 
  170.     -- 1024 <= t        - unreserved user events 
  171.     function Allegro_Event_Type_Is_User( t : Allegro_Event_Type ) return Boolean; 
  172.  
  173.     function Allegro_Get_Event_Type( a, b, c, d : Character ) return AL_ID renames Allegro_Ids.To_AL_ID; 
  174.  
  175.     -- Event queues 
  176.  
  177.     type Allegro_Event_Queue is limited private; 
  178.     type A_Allegro_Event_Queue is access all Allegro_Event_Queue; 
  179.  
  180.     function Al_Create_Event_Queue return A_Allegro_Event_Queue; 
  181.     pragma Import( C, Al_Create_Event_Queue, "al_create_event_queue" ); 
  182.  
  183.     procedure Al_Destroy_Event_Queue( queue : in out A_Allegro_Event_Queue ); 
  184.  
  185.     procedure Al_Register_Event_Source( queue  : A_Allegro_Event_Queue; 
  186.                                         source : A_Allegro_Event_Source ); 
  187.     pragma Import( C, Al_Register_Event_Source, "al_register_event_source" ); 
  188.  
  189.     procedure Al_Unregister_Event_Source( queue  : A_Allegro_Event_Queue; 
  190.                                           source : A_Allegro_Event_Source ); 
  191.     pragma Import( C, Al_Unregister_Event_Source, "al_unregister_event_source" ); 
  192.  
  193.     function Al_Is_Event_Queue_Empty( queue : A_Allegro_Event_Queue ) return Boolean; 
  194.  
  195.     function Al_Get_Next_Event( queue     : A_Allegro_Event_Queue; 
  196.                                 ret_event : access Allegro_Event ) return Boolean; 
  197.  
  198.     function Al_Peek_Next_Event( queue     : A_Allegro_Event_Queue; 
  199.                                  ret_event : access Allegro_Event ) return Boolean; 
  200.  
  201.     function Al_Drop_Next_Event( queue : A_Allegro_Event_Queue ) return Boolean; 
  202.  
  203.     procedure Al_Flush_Event_Queue( queue : A_Allegro_Event_Queue ); 
  204.     pragma Import( C, Al_Flush_Event_Queue, "al_flush_event_queue" ); 
  205.  
  206.     procedure Al_Wait_For_Event( queue     : A_Allegro_Event_Queue; 
  207.                                  ret_event : in out Allegro_Event ); 
  208.     pragma Import( C, Al_Wait_For_Event, "al_wait_for_event" ); 
  209.  
  210.     function Al_Wait_For_Event_Timed( queue     : A_Allegro_Event_Queue; 
  211.                                       ret_event : access Allegro_Event; 
  212.                                       secs      : Float ) return Boolean; 
  213.  
  214.     function Al_Wait_For_Event_Until( queue     : A_Allegro_Event_Queue; 
  215.                                       ret_event : access Allegro_Event; 
  216.                                       timeout   : Allegro_Timeout ) return Boolean; 
  217.  
  218.     -- User events 
  219.  
  220.     procedure Al_Init_User_Event_Source( src : A_Allegro_Event_Source ); 
  221.     pragma Import( C, Al_Init_User_Event_Source, "al_init_user_event_source" ); 
  222.  
  223.     procedure Al_Destroy_User_Event_Source( source : A_Allegro_Event_Source ); 
  224.     pragma Import( C, Al_Destroy_User_Event_Source, "al_destroy_user_event_source" ); 
  225.  
  226.     type A_User_Event_Destructor is access 
  227.         procedure( event : A_Allegro_User_Event ); 
  228.     pragma Convention( C, A_User_Event_Destructor ); 
  229.  
  230.     function Al_Emit_User_Event( src        : A_Allegro_Event_Source; 
  231.                                  event      : Allegro_Event; 
  232.                                  destructor : A_User_Event_Destructor ) return Boolean; 
  233.  
  234.     -- Calls Al_Emit_User_Event, ignoring any errors. 
  235.     procedure Al_Emit_User_Event( src        : A_Allegro_Event_Source; 
  236.                                   event      : Allegro_Event; 
  237.                                   destructor : A_User_Event_Destructor ); 
  238.  
  239.     procedure Al_Unref_User_Event( event : A_Allegro_User_Event ); 
  240.     pragma Import( C, Al_Unref_User_Event, "al_unref_user_event" ); 
  241.  
  242.     procedure Al_Set_Event_Source_Data( source : A_Allegro_Event_Source; 
  243.                                         data   : Address ); 
  244.     pragma Import( C, Al_Set_Event_Source_Data, "al_set_event_source_data" ); 
  245.  
  246.     function Al_Get_Event_Source_Data( source : A_Allegro_Event_Source ) return Address; 
  247.     pragma Import( C, Al_Get_Event_Source_Data, "al_get_event_source_data" ); 
  248.  
  249. private 
  250.  
  251.     type Allegro_Event_Queue is limited null record; 
  252.     pragma Convention( C, Allegro_Event_Queue ); 
  253.  
  254. end Allegro.Events;