diff --git a/src/connection.c b/src/connection.c index 45a2e784..bc373f6b 100644 --- a/src/connection.c +++ b/src/connection.c @@ -314,6 +314,12 @@ wl_connection_flush(struct wl_connection *connection) return connection->out.head - tail; } +uint32_t +wl_connection_pending_input(struct wl_connection *connection) +{ + return wl_buffer_size(&connection->in); +} + int wl_connection_read(struct wl_connection *connection) { @@ -350,7 +356,7 @@ wl_connection_read(struct wl_connection *connection) connection->in.head += len; - return connection->in.head - connection->in.tail; + return wl_connection_pending_input(connection); } int diff --git a/src/wayland-private.h b/src/wayland-private.h index 0e3420c3..da578d16 100644 --- a/src/wayland-private.h +++ b/src/wayland-private.h @@ -122,6 +122,9 @@ wl_connection_consume(struct wl_connection *connection, size_t size); int wl_connection_flush(struct wl_connection *connection); +uint32_t +wl_connection_pending_input(struct wl_connection *connection); + int wl_connection_read(struct wl_connection *connection); diff --git a/src/wayland-server.c b/src/wayland-server.c index 9e26b185..2158c088 100644 --- a/src/wayland-server.c +++ b/src/wayland-server.c @@ -313,7 +313,6 @@ wl_client_connection_data(int fd, uint32_t mask, void *data) closure = wl_connection_demarshal(client->connection, size, &client->objects, message); - len -= size; if (closure == NULL && errno == ENOMEM) { wl_resource_post_no_memory(resource); @@ -346,6 +345,8 @@ wl_client_connection_data(int fd, uint32_t mask, void *data) if (client->error) break; + + len = wl_connection_pending_input(connection); } if (client->error)