some chunked reading fixes

This commit is contained in:
MeexReay 2025-04-19 18:24:42 +03:00
parent c3fd29812f
commit 8f539713f6
4 changed files with 44 additions and 21 deletions

View File

@ -6,7 +6,7 @@ build/windows-x86_64:
mkdir -p build mkdir -p build
mkdir -p $@ mkdir -p $@
cargo build -r --target x86_64-pc-windows-gnu cargo build -r --target x86_64-pc-windows-gnu
cp target/x86_64-pc-windows-gnu/release/bRAC $@/bin cp target/x86_64-pc-windows-gnu/release/bRAC.exe $@/bin
curl -s https://api.github.com/repos/wingtk/gvsbuild/releases/latest \ curl -s https://api.github.com/repos/wingtk/gvsbuild/releases/latest \
| grep -o ".*browser_download_url.*GTK4_Gvsbuild.*_x64.zip.*" \ | grep -o ".*browser_download_url.*GTK4_Gvsbuild.*_x64.zip.*" \
| cut -d : -f 2,3 \ | cut -d : -f 2,3 \
@ -21,7 +21,7 @@ build/linux-x86_64:
mkdir -p build mkdir -p build
mkdir -p $@ mkdir -p $@
cargo build -r --target x86_64-unknown-linux-gnu cargo build -r --target x86_64-unknown-linux-gnu
cp target/x86_64-pc-windows-gnu/release/bRAC $@ cp target/x86_64-unknown-linux-gnu/release/bRAC $@
clean: clean:
rm -r build rm -r build

View File

@ -7,7 +7,7 @@ use super::config::Config;
pub struct Context { pub struct Context {
pub registered: RwLock<Option<String>>, pub registered: RwLock<Option<String>>,
pub config: RwLock<Config>, pub config: RwLock<Config>,
pub sender: RwLock<Option<Arc<Sender<String>>>>, pub sender: RwLock<Option<Arc<Sender<(String, bool)>>>>,
pub messages: RwLock<Vec<String>>, pub messages: RwLock<Vec<String>>,
pub packet_size: AtomicUsize, pub packet_size: AtomicUsize,
pub name: RwLock<String> pub name: RwLock<String>

View File

@ -5,7 +5,7 @@ use std::thread;
use chrono::Local; use chrono::Local;
use gtk4 as gtk; use gtk4::{self as gtk, glib::timeout_add_once};
use gtk::prelude::*; use gtk::prelude::*;
use gtk::gdk::{Cursor, Display, Texture}; use gtk::gdk::{Cursor, Display, Texture};
@ -14,8 +14,6 @@ use gtk::gio::{self, ActionEntry, ApplicationFlags, MemoryInputStream, Menu};
use gtk::glib::clone; use gtk::glib::clone;
use gtk::glib::{ use gtk::glib::{
self, clone::Downgrade, self, clone::Downgrade,
idle_add_local,
idle_add_local_once,
timeout_add_local, timeout_add_local,
source::timeout_add_local_once, source::timeout_add_local_once,
ControlFlow ControlFlow
@ -39,8 +37,12 @@ thread_local!(
static GLOBAL: RefCell<Option<(UiModel, Receiver<String>)>> = RefCell::new(None); static GLOBAL: RefCell<Option<(UiModel, Receiver<String>)>> = RefCell::new(None);
); );
pub fn clear_chat_messages(ctx: Arc<Context>, message: String) {
let _ = ctx.sender.read().unwrap().clone().unwrap().send((message, true));
}
pub fn add_chat_message(ctx: Arc<Context>, message: String) { pub fn add_chat_message(ctx: Arc<Context>, message: String) {
let _ = ctx.sender.read().unwrap().clone().unwrap().send(message); let _ = ctx.sender.read().unwrap().clone().unwrap().send((message, false));
} }
fn load_pixbuf(data: &[u8]) -> Pixbuf { fn load_pixbuf(data: &[u8]) -> Pixbuf {
@ -504,7 +506,7 @@ fn build_ui(ctx: Arc<Context>, app: &Application) -> UiModel {
#[weak] ctx, #[weak] ctx,
move |_| { move |_| {
if text_entry.text().is_empty() { return; } if text_entry.text().is_empty() { return; }
idle_add_local_once(clone!( timeout_add_local_once(Duration::ZERO, clone!(
#[weak] text_entry, #[weak] text_entry,
move || { move || {
text_entry.set_text(""); text_entry.set_text("");
@ -523,7 +525,7 @@ fn build_ui(ctx: Arc<Context>, app: &Application) -> UiModel {
#[weak] ctx, #[weak] ctx,
move |_| { move |_| {
if text_entry.text().is_empty() { return; } if text_entry.text().is_empty() { return; }
idle_add_local_once(clone!( timeout_add_local_once(Duration::ZERO, clone!(
#[weak] text_entry, #[weak] text_entry,
move || { move || {
text_entry.set_text(""); text_entry.set_text("");
@ -543,14 +545,13 @@ fn build_ui(ctx: Arc<Context>, app: &Application) -> UiModel {
let scrolled_window_weak = Downgrade::downgrade(&chat_scrolled); let scrolled_window_weak = Downgrade::downgrade(&chat_scrolled);
idle_add_local({ timeout_add_local_once(Duration::ZERO, {
let scrolled_window_weak = scrolled_window_weak.clone(); let scrolled_window_weak = scrolled_window_weak.clone();
move || { move || {
if let Some(o) = scrolled_window_weak.upgrade() { if let Some(o) = scrolled_window_weak.upgrade() {
o.vadjustment().set_value(o.vadjustment().upper() - o.vadjustment().page_size()); o.vadjustment().set_value(o.vadjustment().upper() - o.vadjustment().page_size());
} }
ControlFlow::Break
} }
}); });
@ -570,11 +571,10 @@ fn build_ui(ctx: Arc<Context>, app: &Application) -> UiModel {
move |_| { move |_| {
let scrolled_window_weak = scrolled_window_weak.clone(); let scrolled_window_weak = scrolled_window_weak.clone();
idle_add_local(move || { timeout_add_local_once(Duration::ZERO, move || {
if let Some(o) = scrolled_window_weak.upgrade() { if let Some(o) = scrolled_window_weak.upgrade() {
o.vadjustment().set_value(o.vadjustment().upper() - o.vadjustment().page_size()); o.vadjustment().set_value(o.vadjustment().upper() - o.vadjustment().page_size());
} }
ControlFlow::Break
}); });
} }
}); });
@ -603,12 +603,17 @@ fn setup(ctx: Arc<Context>, ui: UiModel) {
thread::spawn({ thread::spawn({
let ctx = ctx.clone(); let ctx = ctx.clone();
move || { move || {
while let Ok(message) = receiver.recv() { while let Ok((message, clear)) = receiver.recv() {
let _ = tx.send(message.clone()); let _ = tx.send(message.clone());
let ctx = ctx.clone(); let ctx = ctx.clone();
glib::source::timeout_add_once(Duration::ZERO, move || { timeout_add_once(Duration::ZERO, move || {
GLOBAL.with(|global| { GLOBAL.with(|global| {
if let Some((ui, rx)) = &*global.borrow() { if let Some((ui, rx)) = &*global.borrow() {
if clear {
while let Some(row) = ui.chat_box.last_child() {
ui.chat_box.remove(&row);
}
}
let message: String = rx.recv().unwrap(); let message: String = rx.recv().unwrap();
on_add_message(ctx.clone(), &ui, message); on_add_message(ctx.clone(), &ui, message);
} }

View File

@ -9,7 +9,7 @@ use super::{
util::sanitize_text util::sanitize_text
}; };
use gui::add_chat_message; use gui::{add_chat_message, clear_chat_messages};
use lazy_static::lazy_static; use lazy_static::lazy_static;
use regex::Regex; use regex::Regex;
@ -166,6 +166,8 @@ pub fn print_message(ctx: Arc<Context>, message: String) -> Result<(), Box<dyn E
} }
pub fn recv_tick(ctx: Arc<Context>) -> Result<(), Box<dyn Error>> { pub fn recv_tick(ctx: Arc<Context>) -> Result<(), Box<dyn Error>> {
let last_size = ctx.packet_size();
match read_messages( match read_messages(
connect_rac!(ctx), connect_rac!(ctx),
ctx.config(|o| o.max_messages), ctx.config(|o| o.max_messages),
@ -176,13 +178,29 @@ pub fn recv_tick(ctx: Arc<Context>) -> Result<(), Box<dyn Error>> {
Ok(Some((messages, size))) => { Ok(Some((messages, size))) => {
if ctx.config(|o| o.chunked_enabled) { if ctx.config(|o| o.chunked_enabled) {
ctx.add_messages_packet(ctx.config(|o| o.max_messages), messages.clone(), size); ctx.add_messages_packet(ctx.config(|o| o.max_messages), messages.clone(), size);
for msg in messages { if last_size == 0 {
add_chat_message(ctx.clone(), msg.clone()); if messages.len() >= 1 {
clear_chat_messages(ctx.clone(), messages[0].clone());
if messages.len() >= 2 {
for msg in &messages[1..] {
add_chat_message(ctx.clone(), msg.clone());
}
}
}
} else {
for msg in messages {
add_chat_message(ctx.clone(), msg.clone());
}
} }
} else { } else {
ctx.put_messages_packet(ctx.config(|o| o.max_messages), messages.clone(), size); ctx.put_messages_packet(ctx.config(|o| o.max_messages), messages.clone(), size);
for msg in messages { if messages.len() >= 1 {
add_chat_message(ctx.clone(), msg.clone()); clear_chat_messages(ctx.clone(), messages[0].clone());
if messages.len() >= 2 {
for msg in &messages[1..] {
add_chat_message(ctx.clone(), msg.clone());
}
}
} }
} }
}, },