ecore_x - restore move event skipper that was removed long ago

so i've been wondering what is going on for a few days... and i've
figured it out finally... my mouse seems ot like to generate 1000
events per second. not your usual 100 or 200. it only happened on this
one machine so i was wondering what on earth was up. this machine was
different in other ways like an arm cpu, differing gpu (rx550),
different distro and so on. this is creating a storm of motion events..
and this is causing all sorts of overhead in just trying to deal with
them all like generate more internal events, emit signals for every
one of them and so on. there is no attempt to play catch-up or
anything - just build up a bigger and bigger queue of them to deal
with. this is NOT GOOD. this restores our old commented out event
skipper that got commented out during some xcb work actually -
not on its own. it was a huge xcb patch that commented it out.

this restores it and makes it a little cleaner with a bool and now the
perf issues i was seeing are gone. this is such a major performance
fix that this deserves a backport.

@fix @optimize
This commit is contained in:
Carsten Haitzler 2019-06-18 11:21:13 +01:00
parent 639869703f
commit d16809d648
1 changed files with 74 additions and 55 deletions

View File

@ -36,9 +36,10 @@ typedef struct _Ecore_X_Mouse_Down_Info
Eina_Bool did_triple : 1;
} Ecore_X_Mouse_Down_Info;
static int _ecore_x_last_event_mouse_move = 0;
static Ecore_Event *_ecore_x_last_event_mouse_move_event = NULL;
static Eina_Inlist *_ecore_x_mouse_down_info_list = NULL;
static Eina_Bool _ecore_x_last_event_mouse_move = EINA_FALSE;
static Ecore_Event *_ecore_x_last_event_mouse_move_event = NULL;
static Ecore_Event_Mouse_Move *_ecore_x_last_event_mouse_move_event_e = NULL;
static Eina_Inlist *_ecore_x_mouse_down_info_list = NULL;
#ifdef ECORE_XKB
static Eina_Hash *emitted_events = NULL;
@ -106,7 +107,8 @@ _ecore_x_event_free_mouse_move(void *data EINA_UNUSED,
if (_ecore_x_last_event_mouse_move)
{
_ecore_x_last_event_mouse_move_event = NULL;
_ecore_x_last_event_mouse_move = 0;
_ecore_x_last_event_mouse_move_event_e = NULL;
_ecore_x_last_event_mouse_move = EINA_FALSE;
}
free(e);
@ -283,6 +285,7 @@ _ecore_mouse_move(unsigned int timestamp,
_ecore_x_event_last_root_y = y_root;
_ecore_x_last_event_mouse_move_event = event;
_ecore_x_last_event_mouse_move_event_e = e;
}
static void
@ -352,7 +355,7 @@ _ecore_key_press(int event,
int val;
int key_len, keyname_len, compose_len;
_ecore_x_last_event_mouse_move = 0;
_ecore_x_last_event_mouse_move = EINA_FALSE;
sym = _ecore_x_XKeycodeToKeysym(xevent->display, xevent->keycode, 0);
keyname = XKeysymToString(sym);
@ -614,7 +617,7 @@ _ecore_x_event_handle_button_press(XEvent *xevent)
INF("ButtonEvent:press time=%u x=%d y=%d button=%d", (unsigned int)xevent->xbutton.time, (int)xevent->xbutton.x, (int)xevent->xbutton.y, xevent->xbutton.button);
_ecore_x_last_event_mouse_move = 0;
_ecore_x_last_event_mouse_move = EINA_FALSE;
if ((xevent->xbutton.button > 3) && (xevent->xbutton.button < 8))
{
Ecore_Event_Mouse_Wheel *e;
@ -763,7 +766,7 @@ _ecore_x_event_handle_button_press(XEvent *xevent)
void
_ecore_x_event_handle_button_release(XEvent *xevent)
{
_ecore_x_last_event_mouse_move = 0;
_ecore_x_last_event_mouse_move = EINA_FALSE;
INF("ButtonEvent:release time=%u x=%d y=%d button=%d", (unsigned int)xevent->xbutton.time, (int)xevent->xbutton.x, (int)xevent->xbutton.y, xevent->xbutton.button);
/* filter out wheel buttons */
if ((xevent->xbutton.button <= 3) || (xevent->xbutton.button > 7))
@ -803,14 +806,30 @@ _ecore_x_event_handle_button_release(XEvent *xevent)
void
_ecore_x_event_handle_motion_notify(XEvent *xevent)
{
/*
if (_ecore_x_last_event_mouse_move)
{
ecore_event_del(_ecore_x_last_event_mouse_move_event);
_ecore_x_last_event_mouse_move = 0;
_ecore_x_last_event_mouse_move_event = NULL;
Ecore_Event_Mouse_Move *e = _ecore_x_last_event_mouse_move_event_e;
if ((e) &&
(xevent->xmotion.window == e->event_window) &&
(xevent->xmotion.root == e->root_window) &&
(xevent->xmotion.same_screen == e->same_screen) &&
(_ecore_x_event_modifiers(xevent->xmotion.state) == e->modifiers))
{
if (((xevent->xmotion.subwindow) &&
(xevent->xmotion.subwindow == e->window)) ||
((!xevent->xmotion.subwindow) &&
(xevent->xmotion.window == e->window)))
{
// XXX: shouldn't we store event history in the new event
// with prior x,y,timestamp (all else assumed the same)
ecore_event_del(_ecore_x_last_event_mouse_move_event);
_ecore_x_last_event_mouse_move = EINA_FALSE;
_ecore_x_last_event_mouse_move_event = NULL;
}
}
}
*/
_ecore_mouse_move(xevent->xmotion.time, xevent->xmotion.state,
xevent->xmotion.x, xevent->xmotion.y,
xevent->xmotion.x_root, xevent->xmotion.y_root,
@ -825,7 +844,7 @@ _ecore_x_event_handle_motion_notify(XEvent *xevent)
xevent->xmotion.x, xevent->xmotion.y,
xevent->xmotion.x_root, xevent->xmotion.y_root);
_ecore_x_last_event_mouse_move = 1;
_ecore_x_last_event_mouse_move = EINA_TRUE;
/* Xdnd handling */
_ecore_x_dnd_drag(xevent->xmotion.root,
@ -836,7 +855,7 @@ _ecore_x_event_handle_motion_notify(XEvent *xevent)
void
_ecore_x_event_handle_enter_notify(XEvent *xevent)
{
_ecore_x_last_event_mouse_move = 0;
_ecore_x_last_event_mouse_move = EINA_FALSE;
{
_ecore_mouse_move(xevent->xcrossing.time, xevent->xcrossing.state,
xevent->xcrossing.x, xevent->xcrossing.y,
@ -900,7 +919,7 @@ _ecore_x_event_handle_enter_notify(XEvent *xevent)
void
_ecore_x_event_handle_leave_notify(XEvent *xevent)
{
_ecore_x_last_event_mouse_move = 0;
_ecore_x_last_event_mouse_move = EINA_FALSE;
{
_ecore_mouse_move(xevent->xcrossing.time, xevent->xcrossing.state,
xevent->xcrossing.x, xevent->xcrossing.y,
@ -969,7 +988,7 @@ _ecore_x_event_handle_focus_in(XEvent *xevent)
{
Ecore_X_Event_Window_Focus_In *e;
_ecore_x_last_event_mouse_move = 0;
_ecore_x_last_event_mouse_move = EINA_FALSE;
e = calloc(1, sizeof(Ecore_X_Event_Window_Focus_In));
if (!e)
@ -1012,7 +1031,7 @@ _ecore_x_event_handle_focus_out(XEvent *xevent)
{
Ecore_X_Event_Window_Focus_Out *e;
_ecore_x_last_event_mouse_move = 0;
_ecore_x_last_event_mouse_move = EINA_FALSE;
e = calloc(1, sizeof(Ecore_X_Event_Window_Focus_Out));
if (!e)
@ -1053,7 +1072,7 @@ _ecore_x_event_handle_focus_out(XEvent *xevent)
void
_ecore_x_event_handle_keymap_notify(XEvent *xevent EINA_UNUSED)
{
_ecore_x_last_event_mouse_move = 0;
_ecore_x_last_event_mouse_move = EINA_FALSE;
/* FIXME: handle this event type */
}
@ -1062,7 +1081,7 @@ _ecore_x_event_handle_expose(XEvent *xevent)
{
Ecore_X_Event_Window_Damage *e;
_ecore_x_last_event_mouse_move = 0;
_ecore_x_last_event_mouse_move = EINA_FALSE;
e = calloc(1, sizeof(Ecore_X_Event_Window_Damage));
if (!e)
return;
@ -1082,7 +1101,7 @@ _ecore_x_event_handle_graphics_expose(XEvent *xevent)
{
Ecore_X_Event_Window_Damage *e;
_ecore_x_last_event_mouse_move = 0;
_ecore_x_last_event_mouse_move = EINA_FALSE;
e = calloc(1, sizeof(Ecore_X_Event_Window_Damage));
if (!e)
return;
@ -1100,7 +1119,7 @@ _ecore_x_event_handle_graphics_expose(XEvent *xevent)
void
_ecore_x_event_handle_visibility_notify(XEvent *xevent)
{
_ecore_x_last_event_mouse_move = 0;
_ecore_x_last_event_mouse_move = EINA_FALSE;
// if (xevent->xvisibility.state != VisibilityPartiallyObscured)
{
Ecore_X_Event_Window_Visibility_Change *e;
@ -1125,7 +1144,7 @@ _ecore_x_event_handle_create_notify(XEvent *xevent)
{
Ecore_X_Event_Window_Create *e;
_ecore_x_last_event_mouse_move = 0;
_ecore_x_last_event_mouse_move = EINA_FALSE;
e = calloc(1, sizeof(Ecore_X_Event_Window_Create));
if (!e)
return;
@ -1151,7 +1170,7 @@ _ecore_x_event_handle_destroy_notify(XEvent *xevent)
{
Ecore_X_Event_Window_Destroy *e;
_ecore_x_last_event_mouse_move = 0;
_ecore_x_last_event_mouse_move = EINA_FALSE;
e = calloc(1, sizeof(Ecore_X_Event_Window_Destroy));
if (!e)
return;
@ -1172,7 +1191,7 @@ _ecore_x_event_handle_unmap_notify(XEvent *xevent)
{
Ecore_X_Event_Window_Hide *e;
_ecore_x_last_event_mouse_move = 0;
_ecore_x_last_event_mouse_move = EINA_FALSE;
e = calloc(1, sizeof(Ecore_X_Event_Window_Hide));
if (!e)
return;
@ -1189,7 +1208,7 @@ _ecore_x_event_handle_map_notify(XEvent *xevent)
{
Ecore_X_Event_Window_Show *e;
_ecore_x_last_event_mouse_move = 0;
_ecore_x_last_event_mouse_move = EINA_FALSE;
e = calloc(1, sizeof(Ecore_X_Event_Window_Show));
if (!e)
return;
@ -1205,7 +1224,7 @@ _ecore_x_event_handle_map_request(XEvent *xevent)
{
Ecore_X_Event_Window_Show_Request *e;
_ecore_x_last_event_mouse_move = 0;
_ecore_x_last_event_mouse_move = EINA_FALSE;
e = calloc(1, sizeof(Ecore_X_Event_Window_Show_Request));
if (!e)
return;
@ -1221,7 +1240,7 @@ _ecore_x_event_handle_reparent_notify(XEvent *xevent)
{
Ecore_X_Event_Window_Reparent *e;
_ecore_x_last_event_mouse_move = 0;
_ecore_x_last_event_mouse_move = EINA_FALSE;
e = calloc(1, sizeof(Ecore_X_Event_Window_Reparent));
if (!e)
return;
@ -1238,7 +1257,7 @@ _ecore_x_event_handle_configure_notify(XEvent *xevent)
{
Ecore_X_Event_Window_Configure *e;
_ecore_x_last_event_mouse_move = 0;
_ecore_x_last_event_mouse_move = EINA_FALSE;
e = calloc(1, sizeof(Ecore_X_Event_Window_Configure));
if (!e)
return;
@ -1262,7 +1281,7 @@ _ecore_x_event_handle_configure_request(XEvent *xevent)
{
Ecore_X_Event_Window_Configure_Request *e;
_ecore_x_last_event_mouse_move = 0;
_ecore_x_last_event_mouse_move = EINA_FALSE;
e = calloc(1, sizeof(Ecore_X_Event_Window_Configure_Request));
if (!e)
return;
@ -1295,7 +1314,7 @@ _ecore_x_event_handle_configure_request(XEvent *xevent)
void
_ecore_x_event_handle_gravity_notify(XEvent *xevent EINA_UNUSED)
{
_ecore_x_last_event_mouse_move = 0;
_ecore_x_last_event_mouse_move = EINA_FALSE;
/* FIXME: handle this event type */
}
@ -1304,7 +1323,7 @@ _ecore_x_event_handle_resize_request(XEvent *xevent)
{
Ecore_X_Event_Window_Resize_Request *e;
_ecore_x_last_event_mouse_move = 0;
_ecore_x_last_event_mouse_move = EINA_FALSE;
e = calloc(1, sizeof(Ecore_X_Event_Window_Resize_Request));
if (!e)
return;
@ -1321,7 +1340,7 @@ _ecore_x_event_handle_circulate_notify(XEvent *xevent)
{
Ecore_X_Event_Window_Stack *e;
_ecore_x_last_event_mouse_move = 0;
_ecore_x_last_event_mouse_move = EINA_FALSE;
e = calloc(1, sizeof(Ecore_X_Event_Window_Stack));
if (!e)
return;
@ -1342,7 +1361,7 @@ _ecore_x_event_handle_circulate_request(XEvent *xevent)
{
Ecore_X_Event_Window_Stack_Request *e;
_ecore_x_last_event_mouse_move = 0;
_ecore_x_last_event_mouse_move = EINA_FALSE;
e = calloc(1, sizeof(Ecore_X_Event_Window_Stack_Request));
if (!e)
return;
@ -1361,7 +1380,7 @@ _ecore_x_event_handle_circulate_request(XEvent *xevent)
void
_ecore_x_event_handle_property_notify(XEvent *xevent)
{
_ecore_x_last_event_mouse_move = 0;
_ecore_x_last_event_mouse_move = EINA_FALSE;
{
Ecore_X_Event_Window_Property *e;
@ -1386,7 +1405,7 @@ _ecore_x_event_handle_selection_clear(XEvent *xevent)
Ecore_X_Atom sel;
LOGFN(__FILE__, __LINE__, __FUNCTION__);
_ecore_x_last_event_mouse_move = 0;
_ecore_x_last_event_mouse_move = EINA_FALSE;
d = _ecore_x_selection_get(xevent->xselectionclear.selection);
if (d && (xevent->xselectionclear.time <= d->time)) return;
/* errr..... why? paranoia.
@ -1425,7 +1444,7 @@ _ecore_x_event_handle_selection_request(XEvent *xevent)
int typesize;
LOGFN(__FILE__, __LINE__, __FUNCTION__);
_ecore_x_last_event_mouse_move = 0;
_ecore_x_last_event_mouse_move = EINA_FALSE;
/*
* Generate a selection request event.
*/
@ -1492,7 +1511,7 @@ _ecore_x_event_handle_selection_notify(XEvent *xevent)
int num_ret, format;
LOGFN(__FILE__, __LINE__, __FUNCTION__);
_ecore_x_last_event_mouse_move = 0;
_ecore_x_last_event_mouse_move = EINA_FALSE;
selection = xevent->xselection.selection;
if (xevent->xselection.target == ECORE_X_ATOM_SELECTION_TARGETS)
@ -1557,7 +1576,7 @@ _ecore_x_event_handle_colormap_notify(XEvent *xevent)
{
Ecore_X_Event_Window_Colormap *e;
_ecore_x_last_event_mouse_move = 0;
_ecore_x_last_event_mouse_move = EINA_FALSE;
e = calloc(1, sizeof(Ecore_X_Event_Window_Colormap));
if (!e)
return;
@ -1576,7 +1595,7 @@ _ecore_x_event_handle_colormap_notify(XEvent *xevent)
void
_ecore_x_event_handle_client_message(XEvent *xevent)
{
_ecore_x_last_event_mouse_move = 0;
_ecore_x_last_event_mouse_move = EINA_FALSE;
/* Special client message event handling here. need to put LOTS of if */
/* checks here and generate synthetic events per special message known */
/* otherwise generate generic client message event. this would handle*/
@ -2050,7 +2069,7 @@ _ecore_x_event_handle_mapping_notify(XEvent *xevent)
static unsigned long last_serial;
int type;
_ecore_x_last_event_mouse_move = 0;
_ecore_x_last_event_mouse_move = EINA_FALSE;
switch (xevent->xmapping.request)
{
@ -2092,7 +2111,7 @@ _ecore_x_event_handle_shape_change(XEvent *xevent)
XShapeEvent *shape_event;
Ecore_X_Event_Window_Shape *e;
_ecore_x_last_event_mouse_move = 0;
_ecore_x_last_event_mouse_move = EINA_FALSE;
shape_event = (XShapeEvent *)xevent;
e = calloc(1, sizeof(Ecore_X_Event_Window_Shape));
if (!e)
@ -2132,7 +2151,7 @@ _ecore_x_event_handle_screensaver_notify(XEvent *xevent)
XScreenSaverNotifyEvent *screensaver_event;
Ecore_X_Event_Screensaver_Notify *e;
_ecore_x_last_event_mouse_move = 0;
_ecore_x_last_event_mouse_move = EINA_FALSE;
screensaver_event = (XScreenSaverNotifyEvent *)xevent;
e = calloc(1, sizeof(Ecore_X_Event_Screensaver_Notify));
if (!e)
@ -2158,7 +2177,7 @@ _ecore_x_event_handle_sync_counter(XEvent *xevent)
XSyncCounterNotifyEvent *sync_counter_event;
Ecore_X_Event_Sync_Counter *e;
_ecore_x_last_event_mouse_move = 0;
_ecore_x_last_event_mouse_move = EINA_FALSE;
sync_counter_event = (XSyncCounterNotifyEvent *)xevent;
e = calloc(1, sizeof(Ecore_X_Event_Sync_Counter));
if (!e)
@ -2174,7 +2193,7 @@ _ecore_x_event_handle_sync_alarm(XEvent *xevent)
XSyncAlarmNotifyEvent *sync_alarm_event;
Ecore_X_Event_Sync_Alarm *e;
_ecore_x_last_event_mouse_move = 0;
_ecore_x_last_event_mouse_move = EINA_FALSE;
sync_alarm_event = (XSyncAlarmNotifyEvent *)xevent;
e = calloc(1, sizeof(Ecore_X_Event_Sync_Alarm));
@ -2193,7 +2212,7 @@ _ecore_x_event_handle_randr_change(XEvent *xevent)
XRRScreenChangeNotifyEvent *randr_event;
Ecore_X_Event_Screen_Change *e;
_ecore_x_last_event_mouse_move = 0;
_ecore_x_last_event_mouse_move = EINA_FALSE;
randr_event = (XRRScreenChangeNotifyEvent *)xevent;
if (!XRRUpdateConfiguration(xevent))
ERR("Can't update RR config!");
@ -2288,7 +2307,7 @@ _ecore_x_event_handle_randr_notify(XEvent *xevent)
{
const XRRNotifyEvent *randr_event;
_ecore_x_last_event_mouse_move = 0;
_ecore_x_last_event_mouse_move = EINA_FALSE;
randr_event = (const XRRNotifyEvent *)xevent;
LOGFN(__FILE__, __LINE__, __FUNCTION__);
switch (randr_event->subtype)
@ -2323,7 +2342,7 @@ _ecore_x_event_handle_fixes_selection_notify(XEvent *event)
Ecore_X_Event_Fixes_Selection_Notify *e;
Ecore_X_Atom sel;
_ecore_x_last_event_mouse_move = 0;
_ecore_x_last_event_mouse_move = EINA_FALSE;
/* Nothing here yet */
e = calloc(1, sizeof(*e));
@ -2359,7 +2378,7 @@ _ecore_x_event_handle_damage_notify(XEvent *event)
XDamageNotifyEvent *damage_event;
Ecore_X_Event_Damage *e;
_ecore_x_last_event_mouse_move = 0;
_ecore_x_last_event_mouse_move = EINA_FALSE;
damage_event = (XDamageNotifyEvent *)event;
e = calloc(1, sizeof(Ecore_X_Event_Damage));
@ -2454,7 +2473,7 @@ _ecore_x_event_handle_gesture_notify_flick(XEvent *xevent)
XGestureNotifyFlickEvent *xfe;
Ecore_X_Event_Gesture_Notify_Flick *e;
_ecore_x_last_event_mouse_move = 0;
_ecore_x_last_event_mouse_move = EINA_FALSE;
LOGFN(__FILE__, __LINE__, __FUNCTION__);
xfe = (XGestureNotifyFlickEvent *)xevent;
@ -2480,7 +2499,7 @@ _ecore_x_event_handle_gesture_notify_pan(XEvent *xevent)
XGestureNotifyPanEvent *xpe;
Ecore_X_Event_Gesture_Notify_Pan *e;
_ecore_x_last_event_mouse_move = 0;
_ecore_x_last_event_mouse_move = EINA_FALSE;
LOGFN(__FILE__, __LINE__, __FUNCTION__);
xpe = (XGestureNotifyPanEvent *)xevent;
@ -2507,7 +2526,7 @@ _ecore_x_event_handle_gesture_notify_pinchrotation(XEvent *xevent)
XGestureNotifyPinchRotationEvent *xpre;
Ecore_X_Event_Gesture_Notify_PinchRotation *e;
_ecore_x_last_event_mouse_move = 0;
_ecore_x_last_event_mouse_move = EINA_FALSE;
LOGFN(__FILE__, __LINE__, __FUNCTION__);
xpre = (XGestureNotifyPinchRotationEvent *)xevent;
@ -2534,7 +2553,7 @@ _ecore_x_event_handle_gesture_notify_tap(XEvent *xevent)
XGestureNotifyTapEvent *xte;
Ecore_X_Event_Gesture_Notify_Tap *e;
_ecore_x_last_event_mouse_move = 0;
_ecore_x_last_event_mouse_move = EINA_FALSE;
LOGFN(__FILE__, __LINE__, __FUNCTION__);
xte = (XGestureNotifyTapEvent *)xevent;
@ -2560,7 +2579,7 @@ _ecore_x_event_handle_gesture_notify_tapnhold(XEvent *xevent)
XGestureNotifyTapNHoldEvent *xthe;
Ecore_X_Event_Gesture_Notify_TapNHold *e;
_ecore_x_last_event_mouse_move = 0;
_ecore_x_last_event_mouse_move = EINA_FALSE;
LOGFN(__FILE__, __LINE__, __FUNCTION__);
xthe = (XGestureNotifyTapNHoldEvent *)xevent;
@ -2586,7 +2605,7 @@ _ecore_x_event_handle_gesture_notify_hold(XEvent *xevent)
XGestureNotifyHoldEvent *xhe;
Ecore_X_Event_Gesture_Notify_Hold *e;
_ecore_x_last_event_mouse_move = 0;
_ecore_x_last_event_mouse_move = EINA_FALSE;
LOGFN(__FILE__, __LINE__, __FUNCTION__);
xhe = (XGestureNotifyHoldEvent *)xevent;
@ -2611,7 +2630,7 @@ _ecore_x_event_handle_gesture_notify_group(XEvent *xevent)
XGestureNotifyGroupEvent *xge;
Ecore_X_Event_Gesture_Notify_Group *e;
_ecore_x_last_event_mouse_move = 0;
_ecore_x_last_event_mouse_move = EINA_FALSE;
LOGFN(__FILE__, __LINE__, __FUNCTION__);
xge = (XGestureNotifyGroupEvent *)xevent;