From c8b236f092da856511e41ffbc677b6938e780805 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= Date: Wed, 28 Jul 2021 23:19:20 +0400 Subject: [PATCH] Add a VTE example MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Marc-André Lureau --- Cargo.toml | 2 ++ qemu-vte/Cargo.toml | 16 ++++++++++++ qemu-vte/src/main.rs | 58 ++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 76 insertions(+) create mode 100644 qemu-vte/Cargo.toml create mode 100644 qemu-vte/src/main.rs diff --git a/Cargo.toml b/Cargo.toml index 62ff9a3..3f942b6 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -4,6 +4,7 @@ members = [ "qemu-display-listener", "qemu-rdw", "qemu-vnc", + "qemu-vte", "xtask", ] @@ -21,3 +22,4 @@ rdw = { path = '/home/elmarco/src/rdw/rdw' } gdk4-wayland = { path = '/home/elmarco/src/gtk4-rs/gdk4-wayland' } gdk4-x11 = { path = '/home/elmarco/src/gtk4-rs/gdk4-x11' } gtk4 = { path = '/home/elmarco/src/gtk4-rs/gtk4' } +gtk4-sys = { path = '/home/elmarco/src/gtk4-rs/gtk4/sys' } diff --git a/qemu-vte/Cargo.toml b/qemu-vte/Cargo.toml new file mode 100644 index 0000000..f352a22 --- /dev/null +++ b/qemu-vte/Cargo.toml @@ -0,0 +1,16 @@ +[package] +name = "qemu-vte" +version = "0.1.0" +edition = "2018" + +[dependencies] +log = "0.4" +pretty_env_logger = "0.4" +once_cell = "1.5" +zbus = { version = "2.0.0-beta" } +qemu-display-listener = { path = "../qemu-display-listener", features = ["glib"] } +futures = "0.3.13" + +[dependencies.vte] +package = "vte4" +git = "https://gitlab.gnome.org/malureau/vte4-rs" diff --git a/qemu-vte/src/main.rs b/qemu-vte/src/main.rs new file mode 100644 index 0000000..1b64326 --- /dev/null +++ b/qemu-vte/src/main.rs @@ -0,0 +1,58 @@ +use glib::{clone, MainContext}; +use qemu_display_listener::Chardev; +use std::os::unix::io::AsRawFd; +use std::os::unix::net::UnixStream; +use vte::prelude::*; +use vte::{glib, gtk, gio}; +use zbus::azync::Connection; +use futures::prelude::*; + +fn main() { + pretty_env_logger::init(); + + let app = gtk::Application::new(Some("org.qemu.vte-example"), Default::default()); + app.connect_activate(move |app| { + let window = gtk::ApplicationWindow::new(app); + + window.set_title(Some("D-Bus serial example")); + window.set_default_size(350, 70); + + let term = vte::Terminal::new(); + + window.set_child(Some(&term)); + + MainContext::default().spawn_local(clone!(@strong window => async move { + let conn = Connection::new_session().await + .expect("Failed to connect to DBus") + .into(); + + if let Ok(c) = Chardev::new(&conn, "serial").await { + let (p0, p1) = UnixStream::pair().unwrap(); + if c.proxy.register(p1.as_raw_fd().into()).await.is_ok() { + log::info!("ok"); + let istream = unsafe { gio::UnixInputStream::take_fd(p0) } + .dynamic_cast::() + .unwrap(); + let mut read = istream.into_async_read().unwrap(); + loop { + let mut buffer = [0u8; 8192]; + match read.read(&mut buffer[..]).await { + Ok(0) => break, + Ok(len) => { + term.feed(&buffer[..len]); + } + Err(e) => { + log::warn!("{}", e); + break; + } + } + } + } + } + })); + + window.show(); + }); + + app.run(); +}