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
This commit is contained in:
Carsten Haitzler 2007-11-04 04:13:59 +00:00
parent bc031932da
commit b7fae6decb
3 changed files with 188 additions and 1 deletions

View File

@ -500,6 +500,14 @@ main(int argc, char **argv)
} }
_e_main_shutdown_push(e_config_shutdown); _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"); TS("path");
/* setup paths for finding things */ /* setup paths for finding things */
if (!_e_main_path_init()) if (!_e_main_path_init())

View File

@ -18,6 +18,7 @@ struct _E_Pointer_Stack
}; };
static Evas_List *_e_pointers = NULL; 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_add(E_Pointer *p);
static void _e_pointer_canvas_del(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_free(E_Pointer *p);
static void _e_pointer_stack_free(E_Pointer_Stack *elem); static void _e_pointer_stack_free(E_Pointer_Stack *elem);
static int _e_pointer_type_set(E_Pointer *p, const char *type); 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 */ /* 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 * EAPI E_Pointer *
e_pointer_window_new(Ecore_X_Window win, int filled) 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_method_set(p->evas, rmethod);
evas_output_size_set(p->evas, p->w, p->h); evas_output_size_set(p->evas, p->w, p->h);
evas_output_viewport_set(p->evas, 0, 0, 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)); p->pixels = malloc(p->w * p->h * sizeof(int));
if (!p->pixels) if (!p->pixels)
{ {
@ -295,6 +329,9 @@ _e_pointer_free(E_Pointer *p)
} }
if (p->type) evas_stringshare_del(p->type); if (p->type) evas_stringshare_del(p->type);
if (p->idle_timer) ecore_timer_del(p->idle_timer);
free(p); free(p);
} }
@ -427,3 +464,140 @@ _e_pointer_type_set(E_Pointer *p, const char *type)
} }
return 1; 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;
}

View File

@ -17,6 +17,7 @@ struct _E_Pointer
unsigned char e_cursor : 1; unsigned char e_cursor : 1;
unsigned char color : 1; unsigned char color : 1;
unsigned char idle : 1;
Evas *evas; Evas *evas;
Evas_Object *pointer_object; Evas_Object *pointer_object;
@ -24,6 +25,8 @@ struct _E_Pointer
int *pixels; int *pixels;
Ecore_X_Window win; Ecore_X_Window win;
int w, h; int w, h;
Ecore_Timer *idle_timer;
int x, y;
const char *type; const char *type;
void *obj; void *obj;
@ -35,6 +38,8 @@ struct _E_Pointer
} hot; } 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 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_push(E_Pointer *p, void *obj, const char *type);
EAPI void e_pointer_type_pop(E_Pointer *p, void *obj, const char *type); EAPI void e_pointer_type_pop(E_Pointer *p, void *obj, const char *type);