Currently we can end up sending pings to popups every screen redraw and every pointer move when they're focused. Instead let's send a maximum of 1 every 200ms by letting the ping timer expire before we send another ping.
With the old code I've logged 400+ pings per second on the right click pop-up. This is easily reproducible with a high refresh rate mouse. Signed-off-by: Derek Foreman <[email protected]> --- Changes from v1: Bill caught me - I've now removed the always-true conditional... desktop-shell/shell.c | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/desktop-shell/shell.c b/desktop-shell/shell.c index 4945bc1..f0b6596 100644 --- a/desktop-shell/shell.c +++ b/desktop-shell/shell.c @@ -243,6 +243,7 @@ struct shell_client { uint32_t ping_serial; int unresponsive; struct wl_list surface_list; + bool ponged; }; static struct desktop_shell * @@ -2092,6 +2093,11 @@ xdg_ping_timeout_handler(void *data) struct weston_seat *seat; struct shell_surface *shsurf; + if (sc->ponged) { + wl_event_source_remove(sc->ping_timer); + sc->ping_timer = NULL; + return 1; + } /* Client is not responding */ sc->unresponsive = 1; wl_list_for_each(seat, &sc->shell->compositor->seat_list, link) { @@ -2125,13 +2131,16 @@ handle_xdg_ping(struct shell_surface *shsurf) return; } + if (sc->ping_timer) + return; + serial = wl_display_next_serial(compositor->wl_display); sc->ping_serial = serial; loop = wl_display_get_event_loop(compositor->wl_display); - if (sc->ping_timer == NULL) - sc->ping_timer = - wl_event_loop_add_timer(loop, - xdg_ping_timeout_handler, sc); + sc->ponged = false; + sc->ping_timer = wl_event_loop_add_timer(loop, + xdg_ping_timeout_handler, + sc); if (sc->ping_timer == NULL) return; @@ -2218,11 +2227,7 @@ shell_client_pong(struct shell_client *sc, uint32_t serial) sc->unresponsive = 0; end_busy_cursor(sc->shell->compositor, sc->client); - if (sc->ping_timer) { - wl_event_source_remove(sc->ping_timer); - sc->ping_timer = NULL; - } - + sc->ponged = true; } static void -- 2.8.1 _______________________________________________ wayland-devel mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/wayland-devel
