From b7fae6decbaf8f8359b4f33af2cca7d6e6406ba6 Mon Sep 17 00:00:00 2001 From: Carsten Haitzler Date: Sun, 4 Nov 2007 04:13:59 +0000 Subject: [PATCH] pointer gets more singals now - needed this for my new theme for e17 - it works like a charm though! it's really slick! SVN revision: 32333 --- src/bin/e_main.c | 8 ++ src/bin/e_pointer.c | 176 +++++++++++++++++++++++++++++++++++++++++++- src/bin/e_pointer.h | 5 ++ 3 files changed, 188 insertions(+), 1 deletion(-) diff --git a/src/bin/e_main.c b/src/bin/e_main.c index 820537bbd..fc1ea8b4c 100644 --- a/src/bin/e_main.c +++ b/src/bin/e_main.c @@ -500,6 +500,14 @@ main(int argc, char **argv) } _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()) diff --git a/src/bin/e_pointer.c b/src/bin/e_pointer.c index 659668fc6..8451d737d 100644 --- a/src/bin/e_pointer.c +++ b/src/bin/e_pointer.c @@ -18,6 +18,7 @@ struct _E_Pointer_Stack }; 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_cb_move(void *data, Evas *e __UNUSED__, Evas_Object *obj 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 @@ _e_pointer_canvas_add(E_Pointer *p) 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 @@ _e_pointer_free(E_Pointer *p) } if (p->type) evas_stringshare_del(p->type); + + if (p->idle_timer) ecore_timer_del(p->idle_timer); + free(p); } @@ -427,3 +464,140 @@ _e_pointer_type_set(E_Pointer *p, const char *type) } 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; +} diff --git a/src/bin/e_pointer.h b/src/bin/e_pointer.h index 50f8da29c..5a71d6745 100644 --- a/src/bin/e_pointer.h +++ b/src/bin/e_pointer.h @@ -17,6 +17,7 @@ struct _E_Pointer unsigned char e_cursor : 1; unsigned char color : 1; + unsigned char idle : 1; Evas *evas; Evas_Object *pointer_object; @@ -24,6 +25,8 @@ struct _E_Pointer 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 @@ struct _E_Pointer } 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);