Include event sequence number in ALiS frames

This commit is contained in:
Marcin Kulik
2025-02-15 17:06:37 +01:00
parent b7d66e5f63
commit fd04f1acb9
4 changed files with 41 additions and 17 deletions

View File

@@ -451,7 +451,7 @@ div.ap-player div.ap-control-bar {
opacity: 0; opacity: 0;
transition: opacity 0.15s linear; transition: opacity 0.15s linear;
user-select: none; user-select: none;
border-top: 2px solid color-mix(in oklab, black 33%, var(--term-color-background)); border-top: 2px solid color-mix(in oklab, var(--term-color-background) 80%, var(--term-color-foreground));
z-index: 30; z-index: 30;
} }
div.ap-player div.ap-control-bar * { div.ap-player div.ap-control-bar * {
@@ -712,7 +712,6 @@ span.ap-marker-container:hover span.ap-marker {
font-size: 18px; font-size: 18px;
color: var(--term-color-foreground); color: var(--term-color-foreground);
background-color: var(--term-color-background); background-color: var(--term-color-background);
border-radius: 6px;
box-sizing: border-box; box-sizing: border-box;
margin-bottom: 32px; margin-bottom: 32px;
} }
@@ -728,6 +727,8 @@ span.ap-marker-container:hover span.ap-marker {
.ap-player .ap-overlay-help > div div { .ap-player .ap-overlay-help > div div {
padding: calc(min(4cqw, 40px)); padding: calc(min(4cqw, 40px));
font-size: calc(min(1.9cqw, 18px)); font-size: calc(min(1.9cqw, 18px));
border: 1px solid color-mix(in oklab, var(--term-color-background) 90%, var(--term-color-foreground));
border-radius: 6px;
} }
.ap-player .ap-overlay-help > div div p { .ap-player .ap-overlay-help > div div p {
font-weight: bold; font-weight: bold;

File diff suppressed because one or more lines are too long

View File

@@ -37,7 +37,8 @@ fn serialize_event(event: session::Event, prev_event_time: u64) -> (Vec<u8>, u64
use session::Event::*; use session::Event::*;
match event { match event {
Init(time, size, theme, init) => { Init(last_id, time, size, theme, init) => {
let last_id_bytes = leb128::encode(last_id);
let time_bytes = leb128::encode(time); let time_bytes = leb128::encode(time);
let cols_bytes = leb128::encode(size.0); let cols_bytes = leb128::encode(size.0);
let rows_bytes = leb128::encode(size.1); let rows_bytes = leb128::encode(size.1);
@@ -45,6 +46,7 @@ fn serialize_event(event: session::Event, prev_event_time: u64) -> (Vec<u8>, u64
let init_len_bytes = leb128::encode(init_len); let init_len_bytes = leb128::encode(init_len);
let mut msg = vec![0x01]; let mut msg = vec![0x01];
msg.extend_from_slice(&last_id_bytes);
msg.extend_from_slice(&time_bytes); msg.extend_from_slice(&time_bytes);
msg.extend_from_slice(&cols_bytes); msg.extend_from_slice(&cols_bytes);
msg.extend_from_slice(&rows_bytes); msg.extend_from_slice(&rows_bytes);
@@ -77,12 +79,14 @@ fn serialize_event(event: session::Event, prev_event_time: u64) -> (Vec<u8>, u64
(msg, time) (msg, time)
} }
Output(time, text) => { Output(id, time, text) => {
let id_bytes = leb128::encode(id);
let time_bytes = leb128::encode(time - prev_event_time); let time_bytes = leb128::encode(time - prev_event_time);
let text_len = text.len() as u32; let text_len = text.len() as u32;
let text_len_bytes = leb128::encode(text_len); let text_len_bytes = leb128::encode(text_len);
let mut msg = vec![b'o']; let mut msg = vec![b'o'];
msg.extend_from_slice(&id_bytes);
msg.extend_from_slice(&time_bytes); msg.extend_from_slice(&time_bytes);
msg.extend_from_slice(&text_len_bytes); msg.extend_from_slice(&text_len_bytes);
msg.extend_from_slice(text.as_bytes()); msg.extend_from_slice(text.as_bytes());
@@ -90,12 +94,14 @@ fn serialize_event(event: session::Event, prev_event_time: u64) -> (Vec<u8>, u64
(msg, time) (msg, time)
} }
Input(time, text) => { Input(id, time, text) => {
let id_bytes = leb128::encode(id);
let time_bytes = leb128::encode(time - prev_event_time); let time_bytes = leb128::encode(time - prev_event_time);
let text_len = text.len() as u32; let text_len = text.len() as u32;
let text_len_bytes = leb128::encode(text_len); let text_len_bytes = leb128::encode(text_len);
let mut msg = vec![b'i']; let mut msg = vec![b'i'];
msg.extend_from_slice(&id_bytes);
msg.extend_from_slice(&time_bytes); msg.extend_from_slice(&time_bytes);
msg.extend_from_slice(&text_len_bytes); msg.extend_from_slice(&text_len_bytes);
msg.extend_from_slice(text.as_bytes()); msg.extend_from_slice(text.as_bytes());
@@ -103,12 +109,14 @@ fn serialize_event(event: session::Event, prev_event_time: u64) -> (Vec<u8>, u64
(msg, time) (msg, time)
} }
Resize(time, size) => { Resize(id, time, size) => {
let id_bytes = leb128::encode(id);
let time_bytes = leb128::encode(time - prev_event_time); let time_bytes = leb128::encode(time - prev_event_time);
let cols_bytes = leb128::encode(size.0); let cols_bytes = leb128::encode(size.0);
let rows_bytes = leb128::encode(size.1); let rows_bytes = leb128::encode(size.1);
let mut msg = vec![b'r']; let mut msg = vec![b'r'];
msg.extend_from_slice(&id_bytes);
msg.extend_from_slice(&time_bytes); msg.extend_from_slice(&time_bytes);
msg.extend_from_slice(&cols_bytes); msg.extend_from_slice(&cols_bytes);
msg.extend_from_slice(&rows_bytes); msg.extend_from_slice(&rows_bytes);
@@ -116,12 +124,14 @@ fn serialize_event(event: session::Event, prev_event_time: u64) -> (Vec<u8>, u64
(msg, time) (msg, time)
} }
Marker(time, text) => { Marker(id, time, text) => {
let id_bytes = leb128::encode(id);
let time_bytes = leb128::encode(time - prev_event_time); let time_bytes = leb128::encode(time - prev_event_time);
let text_len = text.len() as u32; let text_len = text.len() as u32;
let text_len_bytes = leb128::encode(text_len); let text_len_bytes = leb128::encode(text_len);
let mut msg = vec![b'm']; let mut msg = vec![b'm'];
msg.extend_from_slice(&id_bytes);
msg.extend_from_slice(&time_bytes); msg.extend_from_slice(&time_bytes);
msg.extend_from_slice(&text_len_bytes); msg.extend_from_slice(&text_len_bytes);
msg.extend_from_slice(text.as_bytes()); msg.extend_from_slice(text.as_bytes());

View File

@@ -13,6 +13,7 @@ pub struct Session {
vt: avt::Vt, vt: avt::Vt,
broadcast_tx: broadcast::Sender<Event>, broadcast_tx: broadcast::Sender<Event>,
stream_time: u64, stream_time: u64,
last_event_id: u64,
last_event_time: Instant, last_event_time: Instant,
theme: Option<tty::Theme>, theme: Option<tty::Theme>,
output_decoder: util::Utf8Decoder, output_decoder: util::Utf8Decoder,
@@ -21,11 +22,11 @@ pub struct Session {
#[derive(Clone)] #[derive(Clone)]
pub enum Event { pub enum Event {
Init(u64, tty::TtySize, Option<tty::Theme>, String), Init(u64, u64, tty::TtySize, Option<tty::Theme>, String),
Output(u64, String), Output(u64, u64, String),
Input(u64, String), Input(u64, u64, String),
Resize(u64, tty::TtySize), Resize(u64, u64, tty::TtySize),
Marker(u64, String), Marker(u64, u64, String),
} }
pub struct Client(oneshot::Sender<Subscription>); pub struct Client(oneshot::Sender<Subscription>);
@@ -43,6 +44,7 @@ impl Session {
vt: build_vt(tty_size), vt: build_vt(tty_size),
broadcast_tx, broadcast_tx,
stream_time: 0, stream_time: 0,
last_event_id: 0,
last_event_time: Instant::now(), last_event_time: Instant::now(),
theme, theme,
output_decoder: util::Utf8Decoder::new(), output_decoder: util::Utf8Decoder::new(),
@@ -55,7 +57,8 @@ impl Session {
if !text.is_empty() { if !text.is_empty() {
self.vt.feed_str(&text); self.vt.feed_str(&text);
let _ = self.broadcast_tx.send(Event::Output(time, text)); let id = self.get_next_event_id();
let _ = self.broadcast_tx.send(Event::Output(id, time, text));
} }
self.stream_time = time; self.stream_time = time;
@@ -66,7 +69,8 @@ impl Session {
let text = self.input_decoder.feed(data); let text = self.input_decoder.feed(data);
if !text.is_empty() { if !text.is_empty() {
let _ = self.broadcast_tx.send(Event::Input(time, text)); let id = self.get_next_event_id();
let _ = self.broadcast_tx.send(Event::Input(id, time, text));
} }
self.stream_time = time; self.stream_time = time;
@@ -76,7 +80,8 @@ impl Session {
pub fn resize(&mut self, time: u64, tty_size: tty::TtySize) { pub fn resize(&mut self, time: u64, tty_size: tty::TtySize) {
if tty_size != self.vt.size().into() { if tty_size != self.vt.size().into() {
self.vt.resize(tty_size.0.into(), tty_size.1.into()); self.vt.resize(tty_size.0.into(), tty_size.1.into());
let _ = self.broadcast_tx.send(Event::Resize(time, tty_size)); let id = self.get_next_event_id();
let _ = self.broadcast_tx.send(Event::Resize(id, time, tty_size));
} }
self.stream_time = time; self.stream_time = time;
@@ -84,13 +89,15 @@ impl Session {
} }
pub fn marker(&mut self, time: u64) { pub fn marker(&mut self, time: u64) {
let _ = self.broadcast_tx.send(Event::Marker(time, String::new())); let id = self.get_next_event_id();
let _ = self.broadcast_tx.send(Event::Marker(id, time, String::new()));
self.stream_time = time; self.stream_time = time;
self.last_event_time = Instant::now(); self.last_event_time = Instant::now();
} }
pub fn subscribe(&self) -> Subscription { pub fn subscribe(&self) -> Subscription {
let init = Event::Init( let init = Event::Init(
self.last_event_id,
self.elapsed_time(), self.elapsed_time(),
self.vt.size().into(), self.vt.size().into(),
self.theme.clone(), self.theme.clone(),
@@ -106,6 +113,12 @@ impl Session {
self.broadcast_tx.receiver_count() self.broadcast_tx.receiver_count()
} }
fn get_next_event_id(&mut self) -> u64 {
self.last_event_id += 1;
self.last_event_id
}
fn elapsed_time(&self) -> u64 { fn elapsed_time(&self) -> u64 {
self.stream_time + self.last_event_time.elapsed().as_micros() as u64 self.stream_time + self.last_event_time.elapsed().as_micros() as u64
} }