Revert "ecore-evas reduce modifier modification on every event to cut cpu"

This reverts commit 3a9d54085b.

I got crash and a lot of valgrind warning with this patch. All in all, I
think we can just wait for next release and do a proper cleanup of our API
to not rely on strings at all.

For references this is the first valgrind warning I get (Not going to past the 100 following one) :

==11860== Invalid write of size 4
==11860==    at 0xB10DDD1: _ecore_event_evas_modifier_lock_update (ecore_input_evas.c:432)
==11860==    by 0xB10E3DD: ecore_event_evas_mouse_move (ecore_input_evas.c:725)
==11860==    by 0x5D5115D: _ecore_call_handler_cb (ecore_private.h:317)
==11860==    by 0x5D5115D: _ecore_event_call (ecore_events.c:518)
==11860==    by 0x5D5CC47: _ecore_main_loop_iterate_internal (ecore_main.c:2381)
==11860==    by 0x5D5D42E: ecore_main_loop_begin (ecore_main.c:1289)
==11860==    by 0x5D5D490: _efl_loop_begin (ecore_main.c:2831)
==11860==    by 0x5D59555: efl_loop_begin (efl_loop.eo.c:32)
==11860==    by 0x14F275: main (test.c:1188)
==11860==  Address 0x19a36828 is 7 bytes after a block of size 1 alloc'd
==11860==    at 0x4C2AACE: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==11860==    by 0x4C2CC81: realloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==11860==    by 0xB10DDA8: _ecore_event_evas_modifier_lock_update (ecore_input_evas.c:425)
==11860==    by 0xB10E3DD: ecore_event_evas_mouse_move (ecore_input_evas.c:725)
==11860==    by 0x5D5115D: _ecore_call_handler_cb (ecore_private.h:317)
==11860==    by 0x5D5115D: _ecore_event_call (ecore_events.c:518)
==11860==    by 0x5D5CC47: _ecore_main_loop_iterate_internal (ecore_main.c:2381)
==11860==    by 0x5D5D42E: ecore_main_loop_begin (ecore_main.c:1289)
==11860==    by 0x5D5D490: _efl_loop_begin (ecore_main.c:2831)
==11860==    by 0x5D59555: efl_loop_begin (efl_loop.eo.c:32)
==11860==    by 0x14F275: main (test.c:1188)
This commit is contained in:
Cedric BAIL 2017-03-13 11:11:44 -07:00
parent 3fa7570bda
commit ee866ca599
1 changed files with 28 additions and 135 deletions

View File

@ -15,28 +15,17 @@
int _ecore_input_evas_log_dom = -1;
typedef struct _Ecore_Input_Window Ecore_Input_Window;
typedef struct _Ecore_Input_Seat_State Ecore_Input_Seat_State;
typedef struct _Ecore_Input_Window Ecore_Input_Window;
struct _Ecore_Input_Window
{
Evas *evas;
void *window;
Ecore_Input_Seat_State *device_states;
Ecore_Event_Mouse_Move_Cb move_mouse;
Ecore_Event_Multi_Move_Cb move_multi;
Ecore_Event_Multi_Down_Cb down_multi;
Ecore_Event_Multi_Up_Cb up_multi;
Ecore_Event_Direct_Input_Cb direct;
int device_states_num;
int ignore_event;
};
struct _Ecore_Input_Seat_State
{
Evas_Device *seat;
unsigned int modifiers;
unsigned int invalid;
Evas *evas;
void *window;
Ecore_Event_Mouse_Move_Cb move_mouse;
Ecore_Event_Multi_Move_Cb move_multi;
Ecore_Event_Multi_Down_Cb down_multi;
Ecore_Event_Multi_Up_Cb up_multi;
Ecore_Event_Direct_Input_Cb direct;
int ignore_event;
};
typedef enum _Ecore_Input_State {
@ -289,9 +278,9 @@ _ecore_event_evas_push_mouse_move(Ecore_Event_Mouse_Move *e)
}
}
static void
_ecore_event_evas_seat_modifier_lock_update(Evas *e, unsigned int modifiers,
Evas_Device *seat)
EAPI void
ecore_event_evas_seat_modifier_lock_update(Evas *e, unsigned int modifiers,
Evas_Device *seat)
{
if (modifiers & ECORE_EVENT_MODIFIER_SHIFT)
evas_seat_key_modifier_on(e, "Shift", seat);
@ -337,102 +326,10 @@ _ecore_event_evas_seat_modifier_lock_update(Evas *e, unsigned int modifiers,
else evas_seat_key_lock_off(e, "Shift_Lock", seat);
}
static void
_ecore_event_evas_modifier_lock_invalidate(Ecore_Input_Window *w)
{
int i;
if (!w) return;
for (i = 0; i < w->device_states_num; i++) w->device_states[i].invalid = 1;
}
typedef struct
{
const Evas *evas;
Ecore_Input_Window *w;
} Find_Foreach_Data;
static Eina_Bool
_ecore_event_evas_window_evas_find_foreach_cb(const Eina_Hash *hash EINA_UNUSED,
const void *key EINA_UNUSED,
void *data, void *fdata)
{
Ecore_Input_Window *w = data;
Find_Foreach_Data *foreach_data = fdata;
if (foreach_data->evas == w->evas)
{
foreach_data->w = w;
return EINA_FALSE;
}
return EINA_TRUE;
}
static Ecore_Input_Window *
_ecore_event_evas_window_evas_find(const Evas *evas)
{
Find_Foreach_Data fdata;
fdata.evas = evas;
fdata.w = NULL;
eina_hash_foreach(_window_hash,
_ecore_event_evas_window_evas_find_foreach_cb,
&fdata);
return fdata.w;
}
EAPI void
ecore_event_evas_seat_modifier_lock_update(Evas *e, unsigned int modifiers,
Evas_Device *seat)
{
_ecore_event_evas_modifier_lock_invalidate
(_ecore_event_evas_window_evas_find(e));
_ecore_event_evas_seat_modifier_lock_update(e, modifiers, seat);
}
EAPI void
ecore_event_evas_modifier_lock_update(Evas *e, unsigned int modifiers)
{
_ecore_event_evas_modifier_lock_invalidate
(_ecore_event_evas_window_evas_find(e));
_ecore_event_evas_seat_modifier_lock_update(e, modifiers, NULL);
}
static void
_ecore_event_evas_modifier_lock_update(Ecore_Input_Window *w,
unsigned int modifiers,
Evas_Device *seat)
{
Ecore_Input_Seat_State *states;
int i;
for (i = 0; i < w->device_states_num; i++)
{
if (w->device_states[i].seat == seat)
{
if ((w->device_states[i].invalid) ||
(modifiers != w->device_states[i].modifiers))
{
w->device_states[i].invalid = 0;
w->device_states[i].modifiers = modifiers;
ecore_event_evas_seat_modifier_lock_update
(w->evas, modifiers, seat);
}
return;
}
}
w->device_states_num++;
states = realloc(w->device_states, w->device_states_num);
if (!states)
{
w->device_states_num--;
return;
}
states[w->device_states_num - 1].seat = seat;
states[w->device_states_num - 1].modifiers = modifiers;
states[w->device_states_num - 1].invalid = 0;
w->device_states = states;
_ecore_event_evas_seat_modifier_lock_update(w->evas, modifiers, seat);
ecore_event_evas_seat_modifier_lock_update(e, modifiers, NULL);
}
EAPI void
@ -469,14 +366,6 @@ ecore_event_window_register(Ecore_Window id, void *window, Evas *evas,
evas_key_lock_add(evas, "Scroll_Lock");
}
static void
_ecore_evas_input_win_free(void *data)
{
Ecore_Input_Window *w = data;
free(w->device_states);
free(w);
}
EAPI void
ecore_event_window_unregister(Ecore_Window id)
{
@ -531,8 +420,9 @@ _ecore_event_evas_key(Ecore_Event_Key *e, Ecore_Event_Press press)
lookup = _ecore_event_window_match(e->event_window);
if (!lookup) return ECORE_CALLBACK_PASS_ON;
_ecore_event_evas_modifier_lock_update
(lookup, e->modifiers, efl_input_device_seat_get(e->dev));
ecore_event_evas_seat_modifier_lock_update(lookup->evas,
e->modifiers,
efl_input_device_seat_get(e->dev));
if (press == ECORE_DOWN)
{
if (!lookup->direct ||
@ -641,8 +531,9 @@ _ecore_event_evas_mouse_button(Ecore_Event_Mouse_Button *e, Ecore_Event_Press pr
if (e->multi.device == 0)
{
_ecore_event_evas_modifier_lock_update
(lookup, e->modifiers, efl_input_device_seat_get(e->dev));
ecore_event_evas_seat_modifier_lock_update(lookup->evas,
e->modifiers,
efl_input_device_seat_get(e->dev));
if (press == ECORE_DOWN)
{
if (!lookup->direct ||
@ -722,8 +613,9 @@ ecore_event_evas_mouse_move(void *data EINA_UNUSED, int type EINA_UNUSED, void *
if (e->multi.device == 0)
{
_ecore_event_evas_push_mouse_move(e);
_ecore_event_evas_modifier_lock_update
(lookup, e->modifiers, efl_input_device_seat_get(e->dev));
ecore_event_evas_seat_modifier_lock_update(lookup->evas,
e->modifiers,
efl_input_device_seat_get(e->dev));
if (!lookup->direct ||
!lookup->direct(lookup->window, ECORE_EVENT_MOUSE_MOVE, e))
{
@ -782,8 +674,9 @@ _ecore_event_evas_mouse_io(Ecore_Event_Mouse_IO *e, Ecore_Event_IO io)
lookup = _ecore_event_window_match(e->event_window);
if (!lookup) return ECORE_CALLBACK_PASS_ON;
_ecore_event_evas_modifier_lock_update
(lookup, e->modifiers, efl_input_device_seat_get(e->dev));
ecore_event_evas_seat_modifier_lock_update(lookup->evas,
e->modifiers,
efl_input_device_seat_get(e->dev));
switch (io)
{
case ECORE_IN:
@ -829,8 +722,8 @@ ecore_event_evas_mouse_wheel(void *data EINA_UNUSED, int type EINA_UNUSED, void
e = event;
lookup = _ecore_event_window_match(e->event_window);
if (!lookup) return ECORE_CALLBACK_PASS_ON;
_ecore_event_evas_modifier_lock_update
(lookup, e->modifiers, efl_input_device_seat_get(e->dev));
ecore_event_evas_seat_modifier_lock_update(lookup->evas, e->modifiers,
efl_input_device_seat_get(e->dev));
if (!lookup->direct ||
!lookup->direct(lookup->window, ECORE_EVENT_MOUSE_WHEEL, e))
{
@ -927,7 +820,7 @@ ecore_event_evas_init(void)
ecore_event_evas_mouse_button_cancel,
NULL);
_window_hash = eina_hash_pointer_new(_ecore_evas_input_win_free);
_window_hash = eina_hash_pointer_new(free);
if (getenv("ECORE_INPUT_FIX"))
{