Install structuring for ping-pong protocol
diff --git a/src/compositor.c b/src/compositor.c
index 9b7badf..4c59da6 100644
--- a/src/compositor.c
+++ b/src/compositor.c
@@ -1557,8 +1557,12 @@
 {
 	struct weston_input_device *wd = (struct weston_input_device *) device;
 	struct weston_compositor *compositor = wd->compositor;
+	struct weston_surface *focus = (struct weston_surface *) device->pointer_focus;
+	uint32_t serial = wl_display_next_serial(compositor->wl_display);
 
 	if (state) {
+		if (compositor->ping_handler && focus)
+			compositor->ping_handler(focus, serial);
 		weston_compositor_idle_inhibit(compositor);
 		if (device->button_count == 0) {
 			device->grab_button = button;
@@ -1587,6 +1591,11 @@
 {
 	struct weston_input_device *wd = (struct weston_input_device *) device;
 	struct weston_compositor *compositor = wd->compositor;
+	struct weston_surface *focus = (struct weston_surface *) device->pointer_focus;
+	uint32_t serial = wl_display_next_serial(compositor->wl_display);
+
+	if (compositor->ping_handler && focus)
+		compositor->ping_handler(focus, serial);
 
 	weston_compositor_activity(compositor);
 
@@ -1640,9 +1649,14 @@
 {
 	struct weston_input_device *wd = (struct weston_input_device *) device;
 	struct weston_compositor *compositor = wd->compositor;
+	struct weston_surface *focus = (struct weston_surface *) device->pointer_focus;
+	uint32_t serial = wl_display_next_serial(compositor->wl_display);
 	uint32_t *k, *end;
 
 	if (state) {
+		if (compositor->ping_handler && focus)
+			compositor->ping_handler(focus, serial);
+
 		weston_compositor_idle_inhibit(compositor);
 		device->grab_key = key;
 		device->grab_time = time;
@@ -2435,6 +2449,8 @@
 
 	screenshooter_create(ec);
 
+	ec->ping_handler = NULL;
+
 	wl_data_device_manager_init(ec->wl_display);
 
 	glActiveTexture(GL_TEXTURE0);