From 632ac992ab4a032a3415b99a419c0c88c22157e5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C5=99emysl=20Eric=20Janouch?= Date: Sat, 10 Sep 2022 17:37:19 +0200 Subject: [PATCH] xC/xP: only send buffer stats in the initial sync The client and frontends track these separately, there is no need for hard synchronization. --- xC-proto | 6 ++++-- xC.c | 11 +++++++++++ xP/public/xP.js | 31 ++++++++++++++++++++----------- 3 files changed, 35 insertions(+), 13 deletions(-) diff --git a/xC-proto b/xC-proto index fd06491..7b77e5d 100644 --- a/xC-proto +++ b/xC-proto @@ -19,7 +19,7 @@ struct CommandMessage { case HELLO: u32 version; // If the version check succeeds, the client will receive - // an initial stream of BUFFER_UPDATE, BUFFER_LINE, + // an initial stream of BUFFER_UPDATE, BUFFER_STATS, BUFFER_LINE, // and finally a BUFFER_ACTIVATE message. case ACTIVE: void; @@ -50,6 +50,7 @@ struct EventMessage { union EventData switch (enum Event { PING, BUFFER_UPDATE, + BUFFER_STATS, BUFFER_RENAME, BUFFER_REMOVE, BUFFER_ACTIVATE, @@ -62,12 +63,13 @@ struct EventMessage { void; case BUFFER_UPDATE: string buffer_name; + case BUFFER_STATS: + string buffer_name; // These are cumulative, even for lines flushed out from buffers. // Updates to these values aren't broadcasted, thus handle: // - BUFFER_LINE by bumping/setting them as appropriate, // - BUFFER_ACTIVATE by clearing them for the previous buffer // (this way, they can be used to mark unread messages). - // Any updates received after the initial sync should be ignored. u32 new_messages; u32 new_unimportant_messages; bool highlighted; diff --git a/xC.c b/xC.c index 2644bce..13cd57d 100644 --- a/xC.c +++ b/xC.c @@ -3068,6 +3068,15 @@ relay_prepare_buffer_update (struct app_context *ctx, struct buffer *buffer) struct relay_event_data_buffer_update *e = &m->data.buffer_update; e->event = RELAY_EVENT_BUFFER_UPDATE; e->buffer_name = str_from_cstr (buffer->name); +} + +static void +relay_prepare_buffer_stats (struct app_context *ctx, struct buffer *buffer) +{ + struct relay_event_message *m = relay_prepare (ctx); + struct relay_event_data_buffer_stats *e = &m->data.buffer_stats; + e->event = RELAY_EVENT_BUFFER_STATS; + e->buffer_name = str_from_cstr (buffer->name); e->new_messages = MIN (UINT32_MAX, buffer->new_messages_count - buffer->new_unimportant_count); e->new_unimportant_messages = MIN (UINT32_MAX, @@ -15223,6 +15232,8 @@ client_resync (struct client *c) { relay_prepare_buffer_update (c->ctx, buffer); relay_send (c); + relay_prepare_buffer_stats (c->ctx, buffer); + relay_send (c); LIST_FOR_EACH (struct buffer_line, line, buffer->lines) { diff --git a/xP/public/xP.js b/xP/public/xP.js index 8820b69..7f64473 100644 --- a/xP/public/xP.js +++ b/xP/public/xP.js @@ -136,6 +136,12 @@ let bufferCurrent = undefined let bufferLog = undefined let bufferAutoscroll = true +function resetBufferStats(b) { + b.newMessages = 0 + b.newUnimportantMessages = 0 + b.highlighted = false +} + let connecting = true rpc.connect().then(result => { buffers.clear() @@ -162,15 +168,21 @@ rpc.addEventListener('Ping', event => { rpc.addEventListener('BufferUpdate', event => { let e = event.detail, b = buffers.get(e.bufferName) if (b === undefined) { - buffers.set(e.bufferName, { - lines: [], - newMessages: e.newMessages, - newUnimportantMessages: e.newUnimportantMessages, - highlighted: e.highlighted, - }) + buffers.set(e.bufferName, (b = {lines: []})) + resetBufferStats(b) } }) +rpc.addEventListener('BufferStats', event => { + let e = event.detail, b = buffers.get(e.bufferName) + if (b === undefined) + return + + b.newMessages = e.newMessages, + b.newUnimportantMessages = e.newUnimportantMessages + b.highlighted = e.highlighted +}) + rpc.addEventListener('BufferRename', event => { let e = event.detail buffers.set(e.new, buffers.get(e.bufferName)) @@ -184,11 +196,8 @@ rpc.addEventListener('BufferRemove', event => { rpc.addEventListener('BufferActivate', event => { let old = buffers.get(bufferCurrent) - if (old !== undefined) { - old.newMessages = 0 - old.newUnimportantMessages = 0 - old.highlighted = false - } + if (old !== undefined) + resetBufferStats(old) let e = event.detail, b = buffers.get(e.bufferName) bufferCurrent = e.bufferName