Enlightenment CVS committal

Author  : raster
Project : e17
Module  : apps/e

Dir     : e17/apps/e/src/bin


Modified Files:
        e_main.c e_pointer.c e_pointer.h 


Log Message:


pointer gets more singals now - needed this for my new theme for e17 - it
works like a charm though! it's really slick!

===================================================================
RCS file: /cvs/e/e17/apps/e/src/bin/e_main.c,v
retrieving revision 1.238
retrieving revision 1.239
diff -u -3 -r1.238 -r1.239
--- e_main.c    16 Oct 2007 03:22:38 -0000      1.238
+++ e_main.c    4 Nov 2007 04:13:59 -0000       1.239
@@ -500,6 +500,14 @@
      }
    _e_main_shutdown_push(e_config_shutdown);
    
+   TS("pointer");
+   if (!e_pointer_init())
+     {
+       e_error_message_show(_("Enlightenment cannot set up the pointer 
system."));
+       _e_main_shutdown(-1);
+     }
+   _e_main_shutdown_push(e_pointer_shutdown);
+   
    TS("path");
    /* setup paths for finding things */
    if (!_e_main_path_init())
===================================================================
RCS file: /cvs/e/e17/apps/e/src/bin/e_pointer.c,v
retrieving revision 1.32
retrieving revision 1.33
diff -u -3 -r1.32 -r1.33
--- e_pointer.c 5 Oct 2007 04:54:45 -0000       1.32
+++ e_pointer.c 4 Nov 2007 04:13:59 -0000       1.33
@@ -18,6 +18,7 @@
 };
 
 static Evas_List *_e_pointers = NULL;
+static Evas_List *handlers = NULL;
 
 static void _e_pointer_canvas_add(E_Pointer *p);
 static void _e_pointer_canvas_del(E_Pointer *p);
@@ -25,8 +26,41 @@
 static void _e_pointer_free(E_Pointer *p);
 static void _e_pointer_stack_free(E_Pointer_Stack *elem);
 static int  _e_pointer_type_set(E_Pointer *p, const char *type);
+static void _e_pointer_active_handle(E_Pointer *p);
+
+static int _e_pointer_cb_mouse_down(void *data, int type, void *event);
+static int _e_pointer_cb_mouse_up(void *data, int type, void *event);
+static int _e_pointer_cb_mouse_move(void *data, int type, void *event);
+static int _e_pointer_cb_mouse_wheel(void *data, int type, void *event);
+static int _e_pointer_cb_idle_timer_pre(void *data);
+static int _e_pointer_cb_idle_timer(void *data);
 
 /* externally accessible functions */
+EAPI int
+e_pointer_init(void)
+{
+   handlers = evas_list_append(handlers, 
ecore_event_handler_add(ECORE_X_EVENT_MOUSE_BUTTON_DOWN, 
_e_pointer_cb_mouse_down, NULL));
+   handlers = evas_list_append(handlers, 
ecore_event_handler_add(ECORE_X_EVENT_MOUSE_BUTTON_UP, _e_pointer_cb_mouse_up, 
NULL));
+   handlers = evas_list_append(handlers, 
ecore_event_handler_add(ECORE_X_EVENT_MOUSE_MOVE, _e_pointer_cb_mouse_move, 
NULL));
+   handlers = evas_list_append(handlers, 
ecore_event_handler_add(ECORE_X_EVENT_MOUSE_WHEEL, _e_pointer_cb_mouse_wheel, 
NULL));
+   return 1;
+}
+
+EAPI int
+e_pointer_shutdown(void)
+{
+   while (handlers)
+     {
+       Ecore_Event_Handler *h;
+       
+       h = handlers->data;
+       handlers = evas_list_remove_list(handlers, handlers);
+       ecore_event_handler_del(h);
+     }
+   
+   return 1;
+}
+
 EAPI E_Pointer *
 e_pointer_window_new(Ecore_X_Window win, int filled)
 {
@@ -210,7 +244,7 @@
    evas_output_method_set(p->evas, rmethod);
    evas_output_size_set(p->evas, p->w, p->h);
    evas_output_viewport_set(p->evas, 0, 0, p->w, p->h);
-   
+
    p->pixels = malloc(p->w * p->h * sizeof(int));
    if (!p->pixels)
      {
@@ -295,6 +329,9 @@
      }
 
    if (p->type) evas_stringshare_del(p->type);
+   
+   if (p->idle_timer) ecore_timer_del(p->idle_timer);
+   
    free(p);
 }
 
@@ -425,5 +462,142 @@
          }
        if (cursor) ecore_x_cursor_free(cursor);
      }
+   return 1;
+}
+
+static void
+_e_pointer_active_handle(E_Pointer *p)
+{
+   /* we got some mouse event - if there was an idle timer emit an active
+    * signal as we WERE idle, NOW we are active */
+   if (p->idle_timer) ecore_timer_del(p->idle_timer);
+   if (p->idle)
+     {
+       if (p->pointer_object)
+         edje_object_signal_emit(p->pointer_object, "e,state,mouse,active", 
"e");
+       p->idle = 0;
+     }
+   /* and scedule a pre-idle check in 1 second if no more events happen */
+   p->idle_timer = ecore_timer_add(1.0, _e_pointer_cb_idle_timer_pre, p);
+}
+
+static int
+_e_pointer_cb_mouse_down(void *data, int type, void *event)
+{
+   Ecore_X_Event_Mouse_Button_Down *ev;
+   Evas_List *l;
+   E_Pointer *p;
+                                     
+   ev = event;
+   for (l = _e_pointers; l; l = l->next)
+     {
+       p = l->data;
+       _e_pointer_active_handle(p);
+       if (p->pointer_object)
+         edje_object_signal_emit(p->pointer_object, "e,action,mouse,down", 
"e");
+     }
+   return 1;
+}
+
+static int
+_e_pointer_cb_mouse_up(void *data, int type, void *event)
+{
+   Ecore_X_Event_Mouse_Button_Up *ev;
+   Evas_List *l;
+   E_Pointer *p;
+                                     
+   ev = event;
+   for (l = _e_pointers; l; l = l->next)
+     {
+       p = l->data;
+       _e_pointer_active_handle(p);
+       if (p->pointer_object)
+         edje_object_signal_emit(p->pointer_object, "e,action,mouse,up", "e");
+     }
+   return 1;
+}
+
+static int
+_e_pointer_cb_mouse_move(void *data, int type, void *event)
+{
+   Ecore_X_Event_Mouse_Move *ev;
+   Evas_List *l;
+   E_Pointer *p;
+                                     
+   ev = event;
+   for (l = _e_pointers; l; l = l->next)
+     {
+       p = l->data;
+       _e_pointer_active_handle(p);
+       if (p->pointer_object)
+         edje_object_signal_emit(p->pointer_object, "e,action,mouse,move", 
"e");
+     }
+   return 1;
+}
+
+static int
+_e_pointer_cb_mouse_wheel(void *data, int type, void *event)
+{
+   Ecore_X_Event_Mouse_Wheel *ev;
+   Evas_List *l;
+   E_Pointer *p;
+                                     
+   ev = event;
+   for (l = _e_pointers; l; l = l->next)
+     {
+       p = l->data;
+       _e_pointer_active_handle(p);
+       if (p->pointer_object)
+         edje_object_signal_emit(p->pointer_object, "e,action,mouse,wheel", 
"e");
+     }
+   return 1;
+}
+
+static int
+_e_pointer_cb_idle_timer_pre(void *data)
+{
+   E_Pointer *p;
+   int x, y;
+   
+   p = data;
+   ecore_x_pointer_xy_get(p->win, &x, &y);
+   p->x = x;
+   p->y = y;
+   p->idle_timer = ecore_timer_add(4.0, _e_pointer_cb_idle_timer, p);
+   return 0;
+}
+
+static int
+_e_pointer_cb_idle_timer(void *data)
+{
+   E_Pointer *p;
+   int x, y;
+   
+   p = data;
+   /* check if pointer actually moved since the 1 second post-mouse move idle
+    * pre-timer that fetches the position */
+   ecore_x_pointer_xy_get(p->win, &x, &y);
+   if ((x != p->x) || (y != p->y))
+     {
+       /* it moved - so we are not idle yet - record position and wait 
+        * 4 secons more */
+       p->x = x;
+       p->y = y;
+       if (p->idle)
+         {
+            if (p->pointer_object)
+              edje_object_signal_emit(p->pointer_object, 
"e,state,mouse,active", "e");
+            p->idle = 0;
+         }
+       return 1;
+     }
+   /* we are idle - report it if not idle before */
+   if (!p->idle)
+     {
+       if (p->pointer_object)
+         edje_object_signal_emit(p->pointer_object, "e,state,mouse,idle", "e");
+       p->idle = 1;
+     }
+   /* and check again in 4 seconds */
    return 1;
 }
===================================================================
RCS file: /cvs/e/e17/apps/e/src/bin/e_pointer.h,v
retrieving revision 1.14
retrieving revision 1.15
diff -u -3 -r1.14 -r1.15
--- e_pointer.h 20 Aug 2006 04:48:27 -0000      1.14
+++ e_pointer.h 4 Nov 2007 04:13:59 -0000       1.15
@@ -17,6 +17,7 @@
 
    unsigned char     e_cursor : 1;
    unsigned char     color : 1;
+   unsigned char     idle : 1;
 
    Evas             *evas;
    Evas_Object      *pointer_object;
@@ -24,6 +25,8 @@
    int              *pixels;
    Ecore_X_Window    win;
    int               w, h;
+   Ecore_Timer      *idle_timer;
+   int               x, y;
 
    const char       *type;
    void             *obj;
@@ -35,6 +38,8 @@
    } hot;
 };
 
+EAPI int        e_pointer_init(void);
+EAPI int        e_pointer_shutdown(void);    
 EAPI E_Pointer *e_pointer_window_new(Ecore_X_Window win, int filled);
 EAPI void       e_pointer_type_push(E_Pointer *p, void *obj, const char *type);
 EAPI void       e_pointer_type_pop(E_Pointer *p, void *obj, const char *type);



-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems?  Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >> http://get.splunk.com/
_______________________________________________
enlightenment-cvs mailing list
enlightenment-cvs@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs

Reply via email to