Enlightenment CVS committal Author : raster Project : e17 Module : libs/ecore
Dir : e17/libs/ecore/src/lib/ecore Modified Files: Tag: SPLIT Ecore.h ecore_events.c ecore_private.h Log Message: add event filter susbsystem and make the x module use it to filter out excess mouse motion events. just a start =================================================================== RCS file: /cvsroot/enlightenment/e17/libs/ecore/src/lib/ecore/Attic/Ecore.h,v retrieving revision 1.1.2.3 retrieving revision 1.1.2.4 diff -u -3 -r1.1.2.3 -r1.1.2.4 --- Ecore.h 23 Jan 2003 01:08:35 -0000 1.1.2.3 +++ Ecore.h 5 Feb 2003 00:10:19 -0000 1.1.2.4 @@ -33,6 +33,7 @@ typedef void Ecore_Idle_Enterer; typedef void Ecore_Fd_Handler; typedef void Ecore_Event_Handler; + typedef void Ecore_Event_Filter; typedef void Ecore_Event; #endif typedef struct _Ecore_Event_Exe_Exit Ecore_Event_Exe_Exit; @@ -85,6 +86,9 @@ Ecore_Event *ecore_event_add(int type, void *ev, void (*func_free) (void *ev, void *data), void *data); void *ecore_event_del(Ecore_Event *event); int ecore_event_type_new(void); + Ecore_Event_Filter *ecore_event_filter_add(void * (*func_start) (void *data), int +(*func_filter) (int type, void *event, void *loop_data, void *data), void (*func_end) +(void *loop_data, void *data), const void *data); + void *ecore_event_filter_del(Ecore_Event_Filter *ef); + Ecore_Exe *ecore_exe_run(const char *exe_cmd, const void *data); void *ecore_exe_free(Ecore_Exe *exe); =================================================================== RCS file: /cvsroot/enlightenment/e17/libs/ecore/src/lib/ecore/Attic/ecore_events.c,v retrieving revision 1.1.2.5 retrieving revision 1.1.2.6 diff -u -3 -r1.1.2.5 -r1.1.2.6 --- ecore_events.c 25 Jan 2003 02:17:02 -0000 1.1.2.5 +++ ecore_events.c 5 Feb 2003 00:10:19 -0000 1.1.2.6 @@ -7,6 +7,9 @@ static Ecore_Event_Handler *event_handlers = NULL; static int event_handlers_delete_me = 0; +static Ecore_Event_Filter *event_filters = NULL; +static int event_filters_delete_me = 0; + static int event_id_max = ECORE_EVENT_COUNT; /** @@ -109,6 +112,57 @@ return event_id_max - 1; } +#if 1 +/** + * Add a filter the current event queue + * @param func_start + * @param func_filter + * @param func_end + * @param data + * @return filter handle + * + * Add a filter to call callbacks to loop through the event queue and filter + */ +Ecore_Event_Filter * +ecore_event_filter_add(void * (*func_start) (void *data), int (*func_filter) (int +type, void *event, void *loop_data, void *data), void (*func_end) (void *loop_data, +void *data), const void *data) +{ + Ecore_Event_Filter *ef; + + if (!func_filter) return NULL; + ef = calloc(1, sizeof(Ecore_Event_Filter)); + if (!ef) return NULL; + ECORE_MAGIC_SET(ef, ECORE_MAGIC_EVENT_FILTER); + ef->func_start = func_start; + ef->func_filter = func_filter; + ef->func_end = func_end; + ef->data = (void *)data; + event_filters = _ecore_list_append(event_filters, ef); + return ef; +} + +/** + * Delete an event filter + * @param ef + * @return The data set for the filter + * + * Delete a filter that has been added + */ +void * +ecore_event_filter_del(Ecore_Event_Filter *ef) +{ + if (!ECORE_MAGIC_CHECK(ef, ECORE_MAGIC_EVENT_FILTER)) + { + ECORE_MAGIC_FAIL(ef, ECORE_MAGIC_EVENT_FILTER, + "ecore_event_filter_del"); + return NULL; + } + ef->delete_me = 1; + event_filters_delete_me = 1; + return ef->data; +} + +#endif + int _ecore_event_exist(void) { @@ -147,11 +201,60 @@ return data; } +static void +_ecore_event_filter_del(Ecore_Event_Filter *ef) +{ + ECORE_MAGIC_SET(ef, ECORE_MAGIC_NONE); + event_filters = _ecore_list_remove(event_filters, ef); + free(ef); +} + void _ecore_event_call(void) { Ecore_List *l; + for (l = (Ecore_List *)event_filters; l; l = l->next) + { + Ecore_Event_Filter *ef; + + ef = (Ecore_Event_Filter *)l; + if (!ef->delete_me) + { + Ecore_List *ll; + + if (ef->func_start) + ef->loop_data = ef->func_start(ef->data); + for (ll = (Ecore_List *)events; ll; ll = ll->next) + { + Ecore_Event *e; + + e = (Ecore_Event *)ll; + if (!ef->func_filter(e->type, e->event, + ef->loop_data, ef->data)) + ecore_event_del(e); + } + if (ef->func_end) + ef->func_end(ef->loop_data, ef->data); + } + } + if (event_filters_delete_me) + { + for (l = (Ecore_List *)event_filters; l; l = l->next) + { + Ecore_Event_Filter *ef; + + ef = (Ecore_Event_Filter *)l; + l = l->next; + if (ef->delete_me) + { + event_filters = _ecore_list_remove(event_filters, ef); + ECORE_MAGIC_SET(ef, ECORE_MAGIC_NONE); + free(ef); + } + } + event_filters_delete_me = 0; + } for (l = (Ecore_List *)events; l; l = l->next) { Ecore_List *ll; =================================================================== RCS file: /cvsroot/enlightenment/e17/libs/ecore/src/lib/ecore/Attic/ecore_private.h,v retrieving revision 1.1.2.6 retrieving revision 1.1.2.7 diff -u -3 -r1.1.2.6 -r1.1.2.7 --- ecore_private.h 25 Jan 2003 02:17:02 -0000 1.1.2.6 +++ ecore_private.h 5 Feb 2003 00:10:19 -0000 1.1.2.7 @@ -16,13 +16,14 @@ typedef enum _Ecore_Fd_Handler_Flags Ecore_Fd_Handler_Flags; #define ECORE_MAGIC_NONE 0x1234fedc -#define ECORE_MAGIC_EXE 0xf7e712f5 -#define ECORE_MAGIC_TIMER 0xf7d613f4 -#define ECORE_MAGIC_IDLER 0xf7c514f3 -#define ECORE_MAGIC_IDLE_ENTERER 0xf7b415f2 -#define ECORE_MAGIC_FD_HANDLER 0xf7a316f1 -#define ECORE_MAGIC_EVENT_HANDLER 0xf79217f0 -#define ECORE_MAGIC_EVENT 0xf78118ff +#define ECORE_MAGIC_EXE 0xf7e812f5 +#define ECORE_MAGIC_TIMER 0xf7d713f4 +#define ECORE_MAGIC_IDLER 0xf7c614f3 +#define ECORE_MAGIC_IDLE_ENTERER 0xf7b515f2 +#define ECORE_MAGIC_FD_HANDLER 0xf7a416f1 +#define ECORE_MAGIC_EVENT_HANDLER 0xf79317f0 +#define ECORE_MAGIC_EVENT_FILTER 0xf78218ff +#define ECORE_MAGIC_EVENT 0xf77119fe #define ECORE_MAGIC Ecore_Magic __magic @@ -40,6 +41,7 @@ typedef struct _Ecore_Idle_Enterer Ecore_Idle_Enterer; typedef struct _Ecore_Fd_Handler Ecore_Fd_Handler; typedef struct _Ecore_Event_Handler Ecore_Event_Handler; +typedef struct _Ecore_Event_Filter Ecore_Event_Filter; typedef struct _Ecore_Event Ecore_Event; struct _Ecore_List @@ -106,6 +108,18 @@ int type; int delete_me : 1; int (*func) (int type, void *event, void *data); + void *data; +}; + +struct _Ecore_Event_Filter +{ + Ecore_List __list_data; + ECORE_MAGIC; + int delete_me : 1; + void * (*func_start) (void *data); + int (*func_filter) (int type, void *event, void *loop_data, void *data); + void (*func_end) (void *loop_data, void *data); + void *loop_data; void *data; }; ------------------------------------------------------- This SF.NET email is sponsored by: SourceForge Enterprise Edition + IBM + LinuxWorld = Something 2 See! http://www.vasoftware.com _______________________________________________ enlightenment-cvs mailing list [EMAIL PROTECTED] https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs