forked from enlightenment/enlightenment
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:
parent
bc031932da
commit
b7fae6decb
|
@ -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())
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue