forked from enlightenment/efl
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:
parent
3fa7570bda
commit
ee866ca599
|
@ -16,29 +16,18 @@
|
|||
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;
|
||||
|
||||
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;
|
||||
};
|
||||
|
||||
typedef enum _Ecore_Input_State {
|
||||
ECORE_INPUT_NONE = 0,
|
||||
ECORE_INPUT_DOWN,
|
||||
|
@ -289,8 +278,8 @@ _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,
|
||||
EAPI void
|
||||
ecore_event_evas_seat_modifier_lock_update(Evas *e, unsigned int modifiers,
|
||||
Evas_Device *seat)
|
||||
{
|
||||
if (modifiers & ECORE_EVENT_MODIFIER_SHIFT)
|
||||
|
@ -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"))
|
||||
{
|
||||
|
|
Loading…
Reference in New Issue