Hi,
I was missing a "prepare" callback in Ecore's FD handler - a callback
that's executed just before the main loop actually checks for the file
descriptors' states. One use of this prepare callback is that you can
change the state the FD handler should check for.
Does anyone object to this in general? I attached a non-polished patch.
--
Regards,
Tilman
Index: src/lib/ecore/Ecore.h
===================================================================
RCS file: /cvsroot/enlightenment/e17/libs/ecore/src/lib/ecore/Ecore.h,v
retrieving revision 1.21
diff -u -r1.21 Ecore.h
--- src/lib/ecore/Ecore.h 22 Feb 2005 12:39:42 -0000 1.21
+++ src/lib/ecore/Ecore.h 27 Mar 2005 22:09:08 -0000
@@ -231,6 +231,7 @@
EAPI void ecore_main_loop_begin(void);
EAPI void ecore_main_loop_quit(void);
EAPI Ecore_Fd_Handler *ecore_main_fd_handler_add(int fd,
Ecore_Fd_Handler_Flags flags, int (*func) (void *data, Ecore_Fd_Handler
*fd_handler), const void *data, int (*buf_func) (void *buf_data,
Ecore_Fd_Handler *fd_handler), const void *buf_data);
+ EAPI void
ecore_main_fd_handler_prepare_cb_set(Ecore_Fd_Handler *fd_handler, void (*func)
(void *data, Ecore_Fd_Handler *fd_handler), const void *data);
EAPI void *ecore_main_fd_handler_del(Ecore_Fd_Handler
*fd_handler);
EAPI int ecore_main_fd_handler_fd_get(Ecore_Fd_Handler
*fd_handler);
EAPI int ecore_main_fd_handler_active_get(Ecore_Fd_Handler
*fd_handler, Ecore_Fd_Handler_Flags flags);
Index: src/lib/ecore/ecore_main.c
===================================================================
RCS file: /cvsroot/enlightenment/e17/libs/ecore/src/lib/ecore/ecore_main.c,v
retrieving revision 1.16
diff -u -r1.16 ecore_main.c
--- src/lib/ecore/ecore_main.c 2 Mar 2005 07:06:33 -0000 1.16
+++ src/lib/ecore/ecore_main.c 27 Mar 2005 22:09:08 -0000
@@ -165,6 +165,19 @@
return fd_handler->data;
}
+void
+ecore_main_fd_handler_prepare_cb_set(Ecore_Fd_Handler *fd_handler, void
(*func) (void *data, Ecore_Fd_Handler *fd_handler), const void *data)
+{
+ if (!ECORE_MAGIC_CHECK(fd_handler, ECORE_MAGIC_FD_HANDLER))
+ {
+ ECORE_MAGIC_FAIL(fd_handler, ECORE_MAGIC_FD_HANDLER,
+ "ecore_main_fd_handler_del");
+ return;
+ }
+ fd_handler->prep_func = func;
+ fd_handler->prep_data = data;
+}
+
/**
* Retrieves the file descriptor that the given handler is handling.
* @param fd_handler The given FD handler.
@@ -287,6 +300,17 @@
FD_ZERO(&rfds);
FD_ZERO(&wfds);
FD_ZERO(&exfds);
+
+ /* call the prepare callback for all handlers */
+ for (l = (Ecore_Oldlist *)fd_handlers; l; l = l->next)
+ {
+ Ecore_Fd_Handler *fdh;
+
+ fdh = (Ecore_Fd_Handler *)l;
+
+ if (fdh->prep_func)
+ fdh->prep_func (fdh->prep_data, fdh);
+ }
for (l = (Ecore_Oldlist *)fd_handlers; l; l = l->next)
{
Ecore_Fd_Handler *fdh;
Index: src/lib/ecore/ecore_private.h
===================================================================
RCS file: /cvsroot/enlightenment/e17/libs/ecore/src/lib/ecore/ecore_private.h,v
retrieving revision 1.12
diff -u -r1.12 ecore_private.h
--- src/lib/ecore/ecore_private.h 2 Mar 2005 07:06:33 -0000 1.12
+++ src/lib/ecore/ecore_private.h 27 Mar 2005 22:09:08 -0000
@@ -137,6 +137,8 @@
void *data;
int (*buf_func) (void *data, Ecore_Fd_Handler
*fd_handler);
void *buf_data;
+ void (*prep_func) (void *data, Ecore_Fd_Handler
*fd_handler);
+ void *prep_data;
};
struct _Ecore_Event_Handler