2005-10-06 08:37:08 +10:00
/** \file event.h
2005-10-25 01:26:25 +10:00
Functions for handling event triggers
2005-10-06 08:37:08 +10:00
2007-10-02 20:09:37 +10:00
Because most of these functions can be called by signal
handler , it is important to make it well defined when these
functions produce output or perform memory allocations , since
such functions may not be safely called by signal handlers .
2011-12-26 19:18:46 -08:00
2005-10-06 08:37:08 +10:00
*/
# ifndef FISH_EVENT_H
# define FISH_EVENT_H
2012-02-10 21:25:06 +05:30
# include <memory>
2011-12-27 00:06:07 -08:00
# include "common.h"
2005-10-06 08:37:08 +10:00
/**
The signal number that is used to match any signal
*/
# define EVENT_ANY_SIGNAL -1
/**
The process id that is used to match any process id
*/
# define EVENT_ANY_PID 0
2005-12-15 23:59:02 +10:00
/**
Enumeration of event types
*/
2005-10-06 08:37:08 +10:00
enum
{
EVENT_ANY , /**< Matches any event type (Not always any event, as the function name may limit the choice as well */
EVENT_SIGNAL , /**< An event triggered by a signal */
EVENT_VARIABLE , /**< An event triggered by a variable update */
EVENT_EXIT , /**< An event triggered by a job or process exit */
2005-10-15 10:51:26 +10:00
EVENT_JOB_ID , /**< An event triggered by a job exit */
2007-08-20 02:42:30 +10:00
EVENT_GENERIC , /**< A generic event */
2005-10-06 08:37:08 +10:00
}
;
/**
The structure which represents an event . The event_t struct has
several event - related use - cases :
- When used as a parameter to event_add , it represents a class of events , and function_name is the name of the function which will be called whenever an event matching the specified class occurs . This is also how events are stored internally .
- When used as a parameter to event_get , event_remove and event_fire , it represents a class of events , and if the function_name field is non - zero , only events which call the specified function will be returned .
*/
2012-02-08 02:34:31 -08:00
struct event_t
2005-10-06 08:37:08 +10:00
{
/**
Type of event
*/
int type ;
2005-12-15 23:59:02 +10:00
2012-02-08 19:02:25 -08:00
/** The type-specific parameter. The int types are one of the following:
signal : Signal number for signal - type events . Use EVENT_ANY_SIGNAL to match any signal
pid : Process id for process - type events . Use EVENT_ANY_PID to match any pid .
job_id : Job id for EVENT_JOB_ID type events
*/
union {
int signal ;
int job_id ;
pid_t pid ;
} param1 ;
/** The string types are one of the following:
variable : Variable name for variable - type events .
param : The parameter describing this generic event .
*/
wcstring str_param1 ;
2005-10-06 08:37:08 +10:00
2005-12-04 05:46:18 +10:00
/**
The name of the event handler function
*/
2012-02-08 19:02:25 -08:00
wcstring function_name ;
2005-12-12 08:21:01 +10:00
/**
The argument list . Only used when sending a new event using
event_fire . In all other situations , the value of this variable
is ignored .
*/
2012-02-08 19:02:25 -08:00
std : : auto_ptr < wcstring_list_t > arguments ;
event_t ( int t ) : type ( t ) , param1 ( ) { }
/** Copy constructor */
event_t ( const event_t & x ) ;
static event_t signal_event ( int sig ) ;
static event_t variable_event ( const wcstring & str ) ;
static event_t generic_event ( const wcstring & str ) ;
2012-02-08 02:34:31 -08:00
} ;
2005-10-06 08:37:08 +10:00
/**
2011-12-26 19:18:46 -08:00
Add an event handler
2007-10-02 20:09:37 +10:00
May not be called by a signal handler , since it may allocate new memory .
2005-10-06 08:37:08 +10:00
*/
void event_add_handler ( event_t * event ) ;
/**
2011-12-26 19:18:46 -08:00
Remove all events matching the specified criterion .
2007-10-02 20:09:37 +10:00
May not be called by a signal handler , since it may free allocated memory .
2005-10-06 08:37:08 +10:00
*/
void event_remove ( event_t * event ) ;
/**
2011-12-26 19:18:46 -08:00
Return all events which match the specified event class
2005-10-06 08:37:08 +10:00
2007-04-17 06:10:53 +10:00
This function is safe to call from a signal handler _ONLY_ if the
out parameter is null .
2005-10-06 08:37:08 +10:00
\ param criterion Is the class of events to return . If the criterion has a non - null function_name , only events which trigger the specified function will return .
2005-10-06 21:54:16 +10:00
\ param out the list to add events to . May be 0 , in which case no events will be added , but the result count will still be valid
2011-12-26 19:18:46 -08:00
2005-10-06 21:54:16 +10:00
\ return the number of found matches
2005-10-06 08:37:08 +10:00
*/
2012-02-07 17:06:45 -08:00
int event_get ( event_t * criterion , std : : vector < event_t * > * out ) ;
2005-10-06 08:37:08 +10:00
/**
Fire the specified event . The function_name field of the event must
be set to 0. If the event is of type EVENT_SIGNAL , no the event is
queued , and will be dispatched the next time event_fire is
called . If event is a null - pointer , all pending events are
dispatched .
2007-04-17 06:10:53 +10:00
This function is safe to call from a signal handler _ONLY_ if the
2007-10-02 20:09:37 +10:00
event parameter is for a signal . Signal events not be fired , by the
call to event_fire , instead they will be fired the next time
event_fire is called with anull argument . This is needed to make
sure that no code evaluation is ever performed by a signal handler .
2007-04-17 06:10:53 +10:00
2007-10-02 20:09:37 +10:00
\ param event the specific event whose handlers should fire . If
null , then all delayed events will be fired .
2005-10-06 08:37:08 +10:00
*/
2005-12-12 08:21:01 +10:00
void event_fire ( event_t * event ) ;
2005-10-06 08:37:08 +10:00
/**
Initialize the event - handling library
*/
void event_init ( ) ;
/**
Destroy the event - handling library
*/
void event_destroy ( ) ;
/**
2007-10-02 20:09:37 +10:00
Free all memory used by the specified event
2005-10-06 08:37:08 +10:00
*/
void event_free ( event_t * e ) ;
2006-02-02 01:49:11 +10:00
/**
2012-02-08 16:20:48 -08:00
Returns a string describing the specified event .
2006-02-02 01:49:11 +10:00
*/
2012-02-08 16:20:48 -08:00
wcstring event_get_desc ( event_t * e ) ;
2006-02-02 01:49:11 +10:00
2007-08-20 02:42:30 +10:00
/**
Fire a generic event with the specified name
*/
2011-12-26 19:18:46 -08:00
# define event_fire_generic( ... ) event_fire_generic_internal( __VA_ARGS__, NULL )
2007-08-20 02:42:30 +10:00
2008-01-15 08:31:24 +10:00
void event_fire_generic_internal ( const wchar_t * name , . . . ) ;
2007-08-20 02:42:30 +10:00
2005-10-06 08:37:08 +10:00
# endif