note
	description: "Controller of the game library."
	author: "Louis Marchand"
	date: "Sat, 28 Mar 2015 03:42:16 +0000"
	revision: "2.1"

class interface
	GAME_LIBRARY_CONTROLLER

create 
	default_create
			-- Initialization for Current.
			-- Clean up library on segfault

	make_no_parachute
			-- Initialization for Current.
			-- Don't clean up library on segfault

feature -- Access

	append_all_dollar_gesture_template (a_filename: READABLE_STRING_GENERAL)
			-- Save every dollar gesture templates loaded in the library
			-- inside the file located at a_filename. If it exists, the data will
			-- be added to the end. If it does not, it will be created.
			-- Note: The templates hashes are not saved in the file. You have to save
			-- them yourself for future utilisation
			-- (from GAME_DOLLAR_GESTURE_MANAGER)
		require -- from GAME_DOLLAR_GESTURE_MANAGER
			is_file_valid: attached (create {RAW_FILE}.make_with_name (a_filename)) as la_file implies ((la_file.exists implies la_file.is_access_writable) and (not la_file.exists implies la_file.is_creatable))

	append_dollar_gesture_template (a_hash: INTEGER_64; a_filename: READABLE_STRING_GENERAL)
			-- Save the dollar gesture templates identified by a_hash
			-- inside the file located at a_filename. If it exists, the data will
			-- be added to the end. If it does not, it will be created.
			-- Note: The a_hash is not saved in the file. You have to save it
			-- yourself for future utilisation
			-- (from GAME_DOLLAR_GESTURE_MANAGER)
		require -- from GAME_DOLLAR_GESTURE_MANAGER
			is_file_valid: attached (create {RAW_FILE}.make_with_name (a_filename)) as la_file implies ((la_file.exists implies la_file.is_access_writable) and (not la_file.exists implies la_file.is_creatable))

	clear_events
			-- Remove common library event.
			-- Note: does not clear other events like window events, joystick events, etc. To clear every events
			-- in the system, used GAME_LIBRARY_CONTROLLER.clear_all_events.
			-- (from GAME_COMMON_EVENTS)
		ensure -- from GAME_EVENTS
			running_unchanged: is_events_running = old is_events_running

	file_dropped_actions: ACTION_SEQUENCE [NATURAL_32, READABLE_STRING_GENERAL]
			-- Called when the file (or any other string) filename is drag and drop on a GAME_WINDOW.
			-- The event is not enabled by default. Use events_controller.enable_file_dropped_event to enable it.
			-- (from GAME_COMMON_EVENTS)
		require -- from GAME_COMMON_EVENTS
			joystick_found_event_enabled: events_controller.is_joy_device_founded_event_enable

	generating_type: TYPE [detachable GAME_LIBRARY_CONTROLLER]
			-- Type of current object
			-- (type of which it is a direct instance)
			-- (from ANY)
		ensure -- from ANY
			generating_type_not_void: Result /= Void

	generator: STRING_8
			-- Name of current object's generating class
			-- (base class of the type of which it is a direct instance)
			-- (from ANY)
		ensure -- from ANY
			generator_not_void: Result /= Void
			generator_not_empty: not Result.is_empty

	has_error: BOOLEAN
			-- Is the library has generate an error
			-- (from GAME_ERROR_MANAGER)

	is_events_running: BOOLEAN assign set_is_running
			-- Is Current active
			-- (from GAME_EVENTS)

	iteration_actions: ACTION_SEQUENCE [NATURAL_32]
			-- Called at each game loop
			-- (from GAME_COMMON_EVENTS)

	joystick_found_actions: ACTION_SEQUENCE [NATURAL_32, GAME_JOYSTICK]
			-- Called when a new joystick has been founded
			-- Automatically added to GAME_LIBRARY_CONTROLLER.joysticks
			-- (from GAME_COMMON_EVENTS)
		require -- from GAME_COMMON_EVENTS
			joystick_found_event_enabled: events_controller.is_joy_device_founded_event_enable

	joystick_remove_actions: ACTION_SEQUENCE [NATURAL_32, GAME_JOYSTICK]
			-- Called when a new joystick has been removed
			-- The joystick will be removed from GAME_LIBRARY_CONTROLLER.joysticks after the
			-- calls of this feature.
			-- (from GAME_COMMON_EVENTS)
		require -- from GAME_COMMON_EVENTS
			joystick_remove_event_enabled: events_controller.is_joy_device_removed_event_enable

	last_error: READABLE_STRING_GENERAL
			-- The last error generate by the library
			-- (from GAME_SDL_ANY)

	last_loaded_dollar_gesture_template: INTEGER_32
			-- How many dollar gesture template has been load on the last
			-- call of the load_dollar_gesture_template feature
			-- (from GAME_DOLLAR_GESTURE_MANAGER)

	last_saved_dollar_gesture_template: INTEGER_32
			-- How many dollar gesture template has been save on the last
			-- call of the save_dollar_gesture_template,
			-- save_all_dollar_gesture_template, append_dollar_gesture_template
			-- or append_all_dollar_gesture_template feature
			-- (from GAME_DOLLAR_GESTURE_MANAGER)

	load_dollar_gesture_template (a_filename: READABLE_STRING_GENERAL)
			-- Load in Current every dollar gesture templates
			-- inside the file located at a_filename
			-- Note: The unique hash returned by the record_dollar_gesture
			-- feature has to be saved on the client side.
			-- (from GAME_DOLLAR_GESTURE_MANAGER)
		require -- from GAME_DOLLAR_GESTURE_MANAGER
			file_is_readable: attached (create {RAW_FILE}.make_with_name (a_filename)) as la_file implies (la_file.exists and then la_file.is_access_readable)

	quit_signal_actions: ACTION_SEQUENCE [NATURAL_32]
			-- When the application receive a quit signal.
			-- (from GAME_COMMON_EVENTS)
		require -- from GAME_COMMON_EVENTS
			quit_event_enabled: events_controller.is_quit_signal_event_enable

	run_events
			-- Put Current active.
			-- (from GAME_COMMON_EVENTS)
		require -- from GAME_EVENTS
			run_not_already_running: not is_events_running
		ensure -- from GAME_EVENTS
			is_running: is_events_running

	save_all_dollar_gesture_template (a_filename: READABLE_STRING_GENERAL)
			-- Save every dollar gesture templates loaded in the library
			-- inside the file located at a_filename. If it exists, the file will be
			-- overwrited.
			-- Note: The templates hashes are not saved in the file. You have to save
			-- them yourself for future utilisation
			-- (from GAME_DOLLAR_GESTURE_MANAGER)
		require -- from GAME_DOLLAR_GESTURE_MANAGER
			is_file_creatable: (create {RAW_FILE}.make_with_name (a_filename)).is_creatable

	save_dollar_gesture_template (a_hash: INTEGER_64; a_filename: READABLE_STRING_GENERAL)
			-- Save the dollar gesture templates identified by a_hash
			-- inside the file located at a_filename. If it exists, the file will be
			-- overwrited.
			-- Note: The a_hash is not saved in the file. You have to save it
			-- yourself for future utilisation
			-- (from GAME_DOLLAR_GESTURE_MANAGER)
		require -- from GAME_DOLLAR_GESTURE_MANAGER
			is_file_creatable: (create {RAW_FILE}.make_with_name (a_filename)).is_creatable

	set_is_running (a_value: BOOLEAN)
			-- Assign to is_running the value of a_value
			-- (from GAME_EVENTS)
		ensure -- from GAME_EVENTS
			is_assign: is_events_running ~ a_value

	stop_events
			-- Put Current innactive.
			-- (from GAME_COMMON_EVENTS)
		require -- from GAME_EVENTS
			stop_is_running: is_events_running
		ensure -- from GAME_EVENTS
			is_stopped: not is_events_running
	
feature -- Comparison

	frozen deep_equal (a: detachable ANY; b: like arg #1): BOOLEAN
			-- Are a and b either both void
			-- or attached to isomorphic object structures?
			-- (from ANY)
		ensure -- from ANY
			instance_free: class
			shallow_implies_deep: standard_equal (a, b) implies Result
			both_or_none_void: (a = Void) implies (Result = (b = Void))
			same_type: (Result and (a /= Void)) implies (b /= Void and then a.same_type (b))
			symmetric: Result implies deep_equal (b, a)

	frozen equal (a: detachable ANY; b: like arg #1): BOOLEAN
			-- Are a and b either both void or attached
			-- to objects considered equal?
			-- (from ANY)
		ensure -- from ANY
			instance_free: class
			definition: Result = (a = Void and b = Void) or else ((a /= Void and b /= Void) and then a.is_equal (b))

	frozen is_deep_equal alias "≡≡≡" (other: GAME_LIBRARY_CONTROLLER): BOOLEAN
			-- Are Current and other attached to isomorphic object structures?
			-- (from ANY)
		require -- from ANY
			other_not_void: other /= Void
		ensure -- from ANY
			shallow_implies_deep: standard_is_equal (other) implies Result
			same_type: Result implies same_type (other)
			symmetric: Result implies other.is_deep_equal (Current)

	is_equal (other: GAME_LIBRARY_CONTROLLER): BOOLEAN
			-- Is other attached to an object considered
			-- equal to current object?
			-- (from ANY)
		require -- from ANY
			other_not_void: other /= Void
		ensure -- from ANY
			symmetric: Result implies other ~ Current
			consistent: standard_is_equal (other) implies Result

	frozen standard_equal (a: detachable ANY; b: like arg #1): BOOLEAN
			-- Are a and b either both void or attached to
			-- field-by-field identical objects of the same type?
			-- Always uses default object comparison criterion.
			-- (from ANY)
		ensure -- from ANY
			instance_free: class
			definition: Result = (a = Void and b = Void) or else ((a /= Void and b /= Void) and then a.standard_is_equal (b))

	frozen standard_is_equal alias "" (other: GAME_LIBRARY_CONTROLLER): BOOLEAN
			-- Is other attached to an object of the same type
			-- as current object, and field-by-field identical to it?
			-- (from ANY)
		require -- from ANY
			other_not_void: other /= Void
		ensure -- from ANY
			same_type: Result implies same_type (other)
			symmetric: Result implies other.standard_is_equal (Current)
	
feature -- Status report

	conforms_to (other: ANY): BOOLEAN
			-- Does type of current object conform to type
			-- of other (as per Eiffel: The Language, chapter 13)?
			-- (from ANY)
		require -- from ANY
			other_not_void: other /= Void

	same_type (other: ANY): BOOLEAN
			-- Is type of current object identical to type of other?
			-- (from ANY)
		require -- from ANY
			other_not_void: other /= Void
		ensure -- from ANY
			definition: Result = (conforms_to (other) and other.conforms_to (Current))
	
feature -- Duplication

	copy (other: GAME_LIBRARY_CONTROLLER)
			-- Update current object using fields of object attached
			-- to other, so as to yield equal objects.
			-- (from ANY)
		require -- from ANY
			other_not_void: other /= Void
			type_identity: same_type (other)
		ensure -- from ANY
			is_equal: Current ~ other

	frozen deep_copy (other: GAME_LIBRARY_CONTROLLER)
			-- Effect equivalent to that of:
			--		copy (other . deep_twin)
			-- (from ANY)
		require -- from ANY
			other_not_void: other /= Void
		ensure -- from ANY
			deep_equal: deep_equal (Current, other)

	frozen deep_twin: GAME_LIBRARY_CONTROLLER
			-- New object structure recursively duplicated from Current.
			-- (from ANY)
		ensure -- from ANY
			deep_twin_not_void: Result /= Void
			deep_equal: deep_equal (Current, Result)

	frozen standard_copy (other: GAME_LIBRARY_CONTROLLER)
			-- Copy every field of other onto corresponding field
			-- of current object.
			-- (from ANY)
		require -- from ANY
			other_not_void: other /= Void
			type_identity: same_type (other)
		ensure -- from ANY
			is_standard_equal: standard_is_equal (other)

	frozen standard_twin: GAME_LIBRARY_CONTROLLER
			-- New object field-by-field identical to other.
			-- Always uses default copying semantics.
			-- (from ANY)
		ensure -- from ANY
			standard_twin_not_void: Result /= Void
			equal: standard_equal (Result, Current)

	frozen twin: GAME_LIBRARY_CONTROLLER
			-- New object equal to Current
			-- twin calls copy; to change copying/twinning semantics, redefine copy.
			-- (from ANY)
		ensure -- from ANY
			twin_not_void: Result /= Void
			is_equal: Result ~ Current
	
feature -- Basic operations

	frozen default: detachable GAME_LIBRARY_CONTROLLER
			-- Default value of object's type
			-- (from ANY)

	frozen default_pointer: POINTER
			-- Default value of type POINTER
			-- (Avoid the need to write p.default for
			-- some p of type POINTER.)
			-- (from ANY)
		ensure -- from ANY
			instance_free: class

	default_rescue
			-- Process exception for routines with no Rescue clause.
			-- (Default: do nothing.)
			-- (from ANY)

	frozen do_nothing
			-- Execute a null action.
			-- (from ANY)
		ensure -- from ANY
			instance_free: class
	
feature -- Implementation

	disable_print_on_error
			-- Desactive the print_on_error functionnality.
			-- (from GAME_ERROR_MANAGER)

	enable_print_on_error
			-- Active the print_on_error functionnality.
			-- (from GAME_ERROR_MANAGER)

	print_on_error: BOOLEAN
			-- When an error occured, the library will print
			-- informations about the error on the error console
			-- output (default is True).
			-- (from GAME_ERROR_MANAGER)

	set_print_on_error (a_value: BOOLEAN)
			-- Assign to print_on_error the value of a_value
			-- (from GAME_ERROR_MANAGER)
		ensure -- from GAME_ERROR_MANAGER
			is_assign: print_on_error ~ a_value
	
feature -- Haptic methods

	haptic_maximum_gain: INTEGER_32 assign set_haptic_maximum_gain
			-- The maximum gain used by haptics in the system.
			-- The GAME_HAPTIC.set_gain always take 0-100
			-- gain value, but the real value is scaled
		require
			haptic_enabled: is_haptic_enable
		ensure
			result_valid: Result >= 0 and Result <= 100

	haptics: CHAIN_INDEXABLE_ITERATOR [GAME_HAPTIC_DEVICE]
			-- Every haptic devices on the system
		require
			haptic_is_haptic_enabled: is_haptic_enable

	refresh_haptics
			-- Update the haptics list (if haptics as been add or remove)
			-- Warning: This will close all opened haptics
		require
			controller_update_haptics_haptic_enabled: is_haptic_enable

	set_haptic_maximum_gain (a_gain: INTEGER_32)
			-- Assign haptic_maximum_gain with the value of a_gain
		require
			haptic_enabled: is_haptic_enable
			gain_is_valid: a_gain >= 0 and a_gain <= 100
		ensure
			is_assign: not has_error implies haptic_maximum_gain = a_gain
	
feature -- Joystick methods

	joysticks: CHAIN_INDEXABLE_ITERATOR [GAME_JOYSTICK]
			-- Every GAME_JOYSTICK detected by Current
		require
			joysticks_is_joystick_enabled: is_joystick_enable

	update_joysticks_state
			-- Update the state of all opened joystick. This procedure is
			-- Called at each game loop instead you disable every joystick event
			-- with GAME_EVENTS_CONTROLLER.disable_joy_*_event or with
			-- GAME_EVENTS_CONTROLLER.disable_every_joy_events
	
feature -- Mouse		

	cursor: GAME_CURSOR
			-- The GAME_CURSOR presently used in Current

	default_cursor: GAME_CURSOR
			-- The GAME_CURSOR used in the creation of Current

	disable_relative_mouse
			-- Unset the is_relative_mouse_enabled mode
		ensure
			is_assign: not has_error implies not is_relative_mouse_enabled

	enable_relative_mouse
			-- Set the is_relative_mouse_enabled mode
		ensure
			is_assign: not has_error implies is_relative_mouse_enabled

	hide_mouse_cursor
			-- Don't show the mouse cursor when the mouse is on a window created by the library.
		ensure
			hide_mouse_cursor_valid: not is_cursor_visible

	is_cursor_visible: BOOLEAN assign set_is_cursor_visible
			-- Return true if the library is set to show the mous cursor when the mouse is on a window created by the library.

	is_relative_mouse_enabled: BOOLEAN assign set_is_relative_mouse_enabled
			-- While Enabled, the cursor is hidden, and only relative motion events (delta_x and delta_y)
			-- will be delivered to the current window the mouse position will not change.
			-- Note: This function will flush any pending mouse motion.

	redraw_cursor
			-- Redraw the cursor

	set_cursor (a_cursor: GAME_CURSOR)
			-- Assign cursor with the value of a_cursor
		require
			cursor_valid: a_cursor.exists
		ensure
			is_assign: not has_error implies cursor ~ a_cursor

	set_default_cursor
			-- Put back the default GAME_CURSOR

	set_is_cursor_visible (a_value: BOOLEAN)
			-- Assign to is_cursor_visible the value of a_value
		ensure
			is_assign: is_cursor_visible ~ a_value

	set_is_relative_mouse_enabled (a_value: BOOLEAN)
			-- Assign is_relative_mouse_enabled with the value of a_value
		ensure
			is_assign: not has_error implies is_relative_mouse_enabled ~ a_value

	show_mouse_cursor
			-- Show the mouse cursor when the mouse is on a window created by the library.
		ensure
			show_mouse_cursor_valid: is_cursor_visible
	
feature -- OpenGL

	disable_gl
			-- Unload the OpenGL library
		require
			is_gl_enabled: is_gl_enabled

	enable_gl
			-- Load the OpenGL library
		require
			not_already_enabled: not is_gl_enabled
			video_must_be_loaded: is_video_enable

	enable_gl_from_file (a_file_name: READABLE_STRING_GENERAL)
			-- Load the OpenGL library contained in file at a_file_name
		require
			not_already_enabled: not is_gl_enabled
			video_must_be_loaded: is_video_enable
			file_valid: attached (create {RAW_FILE}.make_with_name (a_file_name)) as la_file and then (la_file.exists and la_file.is_access_readable)

	is_gl_enabled: BOOLEAN
			-- The OpenGL library has been loaded
	
feature -- Other methods

	base_path: PATH
			-- The PATH of the executable. This PATH is not safe for writing file.

	clear_all_events
			-- Clear every events set in the system

	delay (a_millisecond: NATURAL_32)
			-- Pause the execution for given time in millisecond.

	events_controller: GAME_EVENTS_CONTROLLER
			-- Manage every internal events

	get_preference_path (a_organisation, a_application_name: READABLE_STRING_GENERAL)
			-- Retreive the preference_path. Create the directory if it does not already exist.

	is_preference_path_retreived: BOOLEAN
			-- Is preference_path has been correctly retreived by get_preference_path

	iteration_per_second: NATURAL_32 assign set_iteration_per_second
			-- An approximation of the number of event loop iteration per second.
			-- Not used by launch_no_delay

	launch
			-- Start the main loop. Used to get a Event-driven programming only.
			-- Don't forget to execute the method stop in an event handeler.

	launch_no_delay
			-- Start the main loop without any loop delay. Use it if you have
			-- a synchronisation system (like vsync) included inside the event handler
			-- Used to get a Event-driven programming only.
			-- Don't forget to execute the method stop in an event handler.

	launch_with_iteration_per_second (a_iteration_per_second: NATURAL_32)
			-- Start the main loop. Used to get a Event-driven programming only.
			-- Don't forget to execute the method stop in an event handeler.
			-- Set iteration_per_second to a_iteration_per_second before launching.

	library_variable (a_variable: READABLE_STRING_GENERAL): READABLE_STRING_GENERAL assign set_library_variable
			-- Retreive the internal variable a_variable or an empty text if it does not exist.

	mouse_haptic: GAME_HAPTIC_MOUSE
			-- The haptic device inside the mouse
		require
			mouse_has_haptic: mouse_has_haptic

	mouse_has_haptic: BOOLEAN
			-- Has the mouse have an internal haptic device

	preference_path: PATH
			-- The PATH to save preference files. Is retreived (or created) by get_preference_path
			-- The directory pointed by this PATH should be writable
			-- Do not use the base_path to write files
		require
			path_retreived: is_preference_path_retreived

	quit_library
			-- Close the library. Must be used before the end of the application

	set_iteration_per_second (a_iteration_per_second: NATURAL_32)
			-- Set iteration_per_second to a_iteration_per_second
			-- Note that this is an aproximation.

	set_library_variable (a_variable, a_value: READABLE_STRING_GENERAL)
			-- Assign the internal variable a_variable with the value a_value.

	stop
			-- Stop the main loop

	time_since_create: NATURAL_32
			-- Number of millisecond since the initialisation of the library.

	update_events
			-- Execute the event polling and throw the event handeler execution for each event.
	
feature -- Output

	Io: STD_FILES
			-- Handle to standard file setup
			-- (from ANY)
		ensure -- from ANY
			instance_free: class
			io_not_void: Result /= Void

	out: STRING_8
			-- New string containing terse printable representation
			-- of current object
			-- (from ANY)
		ensure -- from ANY
			out_not_void: Result /= Void

	print (o: detachable ANY)
			-- Write terse external representation of o
			-- on standard output.
			-- (from ANY)
		ensure -- from ANY
			instance_free: class

	frozen tagged_out: STRING_8
			-- New string containing terse printable representation
			-- of current object
			-- (from ANY)
		ensure -- from ANY
			tagged_out_not_void: Result /= Void
	
feature -- Platform

	Operating_environment: OPERATING_ENVIRONMENT
			-- Objects available from the operating system
			-- (from ANY)
		ensure -- from ANY
			instance_free: class
			operating_environment_not_void: Result /= Void
	
feature -- Subs Systems

	disable_events
			-- Disable the events fonctionality
		require
			sdl_controller_disable_events_not_enabled: is_events_enable
		ensure
			sdl_controller_disable_events_disabled: not is_events_enable

	disable_haptic
			-- Disable the haptic (force feedback) fonctionality
		require
			sdl_controller_disable_haptic_not_enabled: is_haptic_enable
		ensure
			sdl_controller_disable_haptic_disabled: not is_haptic_enable

	disable_joystick
			-- Disable the joystick fonctionality
		require
			sdl_controller_disable_joystick_not_enabled: is_joystick_enable
		ensure
			sdl_controller_disable_joystick_disabled: not is_joystick_enable

	disable_video
			-- Disable the video functionalities
		require
			sdl_controller_disable_video_not_enabled: is_video_enable
		ensure
			sdl_controller_disable_video_disabled: not is_video_enable

	enable_events
			-- Unable the events functionality.
		require
			sdl_controller_enable_events_already_enabled: not is_events_enable
		ensure
			sdl_controller_enable_events_enabled: is_events_enable

	enable_haptic
			-- Unable the haptic (force feedback) functionality.
			-- Often use for Controller rumble.
		require
			sdl_controller_enable_haptic_already_enabled: not is_haptic_enable
		ensure
			sdl_controller_enable_haptic_enabled: is_haptic_enable

	enable_joystick
			-- Unable the joystick functionality
		require
			sdl_controller_enable_joystick_already_enabled: not is_joystick_enable
		ensure
			sdl_controller_enable_joystick_enabled: is_joystick_enable

	enable_video
			-- Unable the video functionalities
		require
			sdl_controller_enable_video_already_enabled: not is_video_enable
		ensure
			sdl_controller_enable_video_enabled: is_video_enable

	is_events_enable: BOOLEAN assign set_is_events_enable
			-- Return true if the events functionnality is enabled.

	is_haptic_enable: BOOLEAN assign set_is_haptic_enable
			-- Return true if the haptic (force feedback) functionnality is enabled.

	is_joystick_enable: BOOLEAN assign set_is_joystick_enable
			-- Return true if the joystick functionnality is enabled.

	is_video_enable: BOOLEAN assign set_is_video_enable
			-- Return true if the text surface functionnality is enabled.

	set_is_events_enable (a_value: BOOLEAN)
			-- Assign to is_events_enable the value of a_value
		ensure
			is_assign: is_events_enable ~ a_value

	set_is_haptic_enable (a_value: BOOLEAN)
			-- Assign to is_haptic_enable the value of a_value
		ensure
			is_assign: is_haptic_enable ~ a_value

	set_is_joystick_enable (a_value: BOOLEAN)
			-- Assign to is_joystick_enable the value of a_value
		ensure
			is_assign: is_joystick_enable ~ a_value

	set_is_video_enable (a_value: BOOLEAN)
			-- Assign to is_video_enable the value of a_value
		ensure
			is_assign: is_video_enable ~ a_value
	
feature -- Touch devices

	refresh_touch_devices
			-- Update the touch_devices list. Note that
			-- all touch events will have to be reset

	touch_device_count: INTEGER_32
			-- The number of touch device detected on the system.
			-- Note: Not necessary the same as touch_devices.count
			-- because a touch device can have been added or remove
			-- since the creation of the touch_devices list.
			-- In that case, used refresh_touch_devices to update
			-- the touch_devices (all touch events will have to be
			-- reset)

	touch_devices: CHAIN_INDEXABLE_ITERATOR [GAME_TOUCH_DEVICE]
			-- Every finger touch device detected in he system.
			-- This list does not update itself, you have to call
			-- refresh_touch_devices to update it (all touch
			-- events will have to be reset)
	
feature -- Touch devices implementation

	Dollar_gesture_template_index: INTEGER_64 = -1
			-- The internal index of the managed touch device
	
feature -- Video methods

	displays: LIST [GAME_DISPLAY]
			-- All displays of the system. 0 display on error.
		require
			displays_is_video_enabled: is_video_enable

	displays_count: INTEGER_32
			-- Return the number of display. 0 if error.
		require
			displays_count_is_video_enabled: is_video_enable

	renderer_drivers: LIST [GAME_RENDERER_DRIVER]
			-- All renderer driver of the system. 0 driver on error.
		require
			displays_is_video_enabled: is_video_enable

	renderer_drivers_count: INTEGER_32
			-- Return the number of renderer driver. 0 if error.
		require
			video_enabled: is_video_enable

	windows: CHAIN_INDEXABLE_ITERATOR [GAME_WINDOW]
			-- Every GAME_WINDOW in the system.
	
invariant
	is_singleton: Instance_count.item = 1

		-- from ANY
	reflexive_equality: standard_is_equal (Current)
	reflexive_conformance: conforms_to (Current)

end -- class GAME_LIBRARY_CONTROLLER

Generated by ISE EiffelStudio