with Events;
with Keyboard; use Keyboard;
with Mouse; use Mouse;
pragma Elaborate_All( Events );
package Events.Input is
type Key_Event is abstract new Event with private;
type A_Key_Event is access all Key_Event'Class;
function Get_Char( this : not null access Key_Event'Class ) return Character;
function Get_Key( this : not null access Key_Event'Class ) return Positive;
procedure Get_Modifiers( this : not null access Key_Event'Class;
modifiers : out Modifiers_Array );
function No_Modifiers( this : not null access Key_Event'Class ) return Boolean;
function Only_Alt( this : not null access Key_Event'Class ) return Boolean;
function Only_Ctrl( this : not null access Key_Event'Class ) return Boolean;
function Only_Shift( this : not null access Key_Event'Class ) return Boolean;
function Is_Readable( this : not null access Key_Event'Class ) return Boolean;
KEY_HELD_ID : constant Event_Id := To_Event_Id( "Key_Held" );
KEY_PRESS_ID : constant Event_Id := To_Event_Id( "Key_Press" );
KEY_RELEASE_ID : constant Event_Id := To_Event_Id( "Key_Release" );
type Key_Held_Event is new Key_Event with private;
type Key_Press_Event is new Key_Event with private;
type Key_Release_Event is new Key_Event with private;
type Mouse_Event is abstract new Event with private;
type A_Mouse_Event is access all Mouse_Event'Class;
function Get_X( this : not null access Mouse_Event'Class ) return Integer;
function Get_Y( this : not null access Mouse_Event'Class ) return Integer;
procedure Set_XY( this : not null access Mouse_Event'Class; x, y : Integer );
MOUSE_MOVE_ID : constant Event_Id := To_Event_Id( "Mouse_Move" );
type Mouse_Move_Event is new Mouse_Event with private;
MOUSE_SCROLL_ID : constant Event_Id := To_Event_Id( "Mouse_Scroll" );
type Mouse_Scroll_Event is new Mouse_Event with private;
type A_Mouse_Scroll_Event is access all Mouse_Scroll_Event'Class;
function Get_Amount( this : not null access Mouse_Scroll_Event'Class ) return Integer;
pragma Postcondition( Get_Amount'Result /= 0 );
type Mouse_Button_Event is abstract new Mouse_Event with private;
type A_Mouse_Button_Event is access all Mouse_Button_Event'Class;
function Get_Button( this : not null access Mouse_Button_Event'Class ) return Mouse_Button;
function Get_Modifiers( this : not null access Mouse_Button_Event'Class ) return Modifiers_Array;
MOUSE_CLICK_ID : constant Event_Id := To_Event_Id( "Mouse_Click" );
MOUSE_DOUBLECLICK_ID : constant Event_Id := To_Event_Id( "Mouse_Doubleclick" );
MOUSE_HELD_ID : constant Event_Id := To_Event_Id( "Mouse_Held" );
MOUSE_PRESS_ID : constant Event_Id := To_Event_Id( "Mouse_Press" );
MOUSE_RELEASE_ID : constant Event_Id := To_Event_Id( "Mouse_Release" );
type Mouse_Click_Event is new Mouse_Button_Event with private;
type Mouse_Doubleclick_Event is new Mouse_Button_Event with private;
type Mouse_Held_Event is new Mouse_Button_Event with private;
type Mouse_Press_Event is new Mouse_Button_Event with private;
type Mouse_Release_Event is new Mouse_Button_Event with private;
procedure Queue_Key_Held( key : Positive;
modifiers : Modifiers_Array;
capslock : Boolean );
procedure Queue_Key_Press( key : Positive;
modifiers : Modifiers_Array;
capslock : Boolean );
procedure Queue_Key_Release( key : Positive;
modifiers : Modifiers_Array;
capslock : Boolean );
procedure Queue_Mouse_Click( x, y : Integer; btn : Mouse_Button );
procedure Queue_Mouse_Doubleclick( x, y : Integer; btn : Mouse_Button );
procedure Queue_Mouse_Held( x, y : Integer; btn : Mouse_Button );
procedure Queue_Mouse_Move( x, y : Integer );
procedure Queue_Mouse_Press( x, y : Integer;
btn : Mouse_Button;
modifiers : Modifiers_Array );
procedure Queue_Mouse_Release( x, y : Integer; btn : Mouse_Button );
function Create_Mouse_Release( x, y : Integer;
btn : Mouse_Button ) return A_Mouse_Button_Event;
procedure Queue_Mouse_Scroll( x, y, amount : Integer );
pragma Precondition( amount /= 0 );
private
type Key_Event is abstract new Event with
record
key : Positive := 1;
char : Character := ASCII.NUL;
modifiers : Modifiers_Array := (others => False);
end record;
procedure Construct( this : access Key_Event;
evtName : String;
key : Positive;
char : Character;
modifiers : Modifiers_Array );
function To_String( this : access Key_Event ) return String;
type Key_Held_Event is new Key_Event with null record;
type Key_Press_Event is new Key_Event with null record;
type Key_Release_Event is new Key_Event with null record;
type Mouse_Event is abstract new Event with
record
x, y : Integer := 0;
end record;
procedure Construct( this : access Mouse_Event;
evtName : String;
x, y : Integer );
function To_String( this : access Mouse_Event ) return String;
type Mouse_Move_Event is new Mouse_Event with null record;
type Mouse_Scroll_Event is new Mouse_Event with
record
amount : Integer := 0;
end record;
procedure Construct( this : access Mouse_Scroll_Event;
evtName : String;
x, y : Integer;
amount : Integer );
pragma Precondition( amount /= 0 );
type Mouse_Button_Event is abstract new Mouse_Event with
record
btn : Mouse_Button := Mouse_Left;
modifiers : Modifiers_Array := Modifiers_Array'(others=>False);
end record;
procedure Construct( this : access Mouse_Button_Event;
evtName : String;
x, y : Integer;
btn : Mouse_Button;
modifiers : Modifiers_Array );
function To_String( this : access Mouse_Button_Event ) return String;
type Mouse_Click_Event is new Mouse_Button_Event with null record;
type Mouse_Doubleclick_Event is new Mouse_Button_Event with null record;
type Mouse_Held_Event is new Mouse_Button_Event with null record;
type Mouse_Press_Event is new Mouse_Button_Event with null record;
type Mouse_Release_Event is new Mouse_Button_Event with null record;
end Events.Input;