mirror of
https://github.com/MeexReay/bRAC.git
synced 2025-05-06 13:38:04 +03:00
some chunked reading fixes
This commit is contained in:
parent
c3fd29812f
commit
8f539713f6
4
Makefile
4
Makefile
@ -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
|
@ -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>
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
@ -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,15 +178,31 @@ 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);
|
||||||
|
if last_size == 0 {
|
||||||
|
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 {
|
for msg in messages {
|
||||||
add_chat_message(ctx.clone(), msg.clone());
|
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 {
|
||||||
|
clear_chat_messages(ctx.clone(), messages[0].clone());
|
||||||
|
if messages.len() >= 2 {
|
||||||
|
for msg in &messages[1..] {
|
||||||
add_chat_message(ctx.clone(), msg.clone());
|
add_chat_message(ctx.clone(), msg.clone());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
},
|
},
|
||||||
Err(e) => {
|
Err(e) => {
|
||||||
let msg = format!("Read messages error: {}", e.to_string()).to_string();
|
let msg = format!("Read messages error: {}", e.to_string()).to_string();
|
||||||
|
Loading…
Reference in New Issue
Block a user