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

Reply via email to