mirror of
https://github.com/wez/wezterm.git
synced 2024-11-25 21:07:39 +03:00
add Pane::get_metadata
The idea here is that different kinds of panes may want to expose additional metadata to lua scripts. It would be a bit weird to add a Pane method for each of those and plumb it all the way through the various APIs, so just allowing a pane impl to return a dynamic value (likely an Object) allows a bunch of flexibility. This commit exposes the clientpane is_tardy boolean and the time since the last data was recevied (since_last_response_ms) from the mux client pane implementation: these are used to show the tardiness indicator in the client pane. Exposing this data enables the user to add that info to their status bar if they wish.
This commit is contained in:
parent
8adc78b587
commit
14c613a064
1
Cargo.lock
generated
1
Cargo.lock
generated
@ -5420,6 +5420,7 @@ dependencies = [
|
||||
"uds_windows",
|
||||
"umask",
|
||||
"url",
|
||||
"wezterm-dynamic",
|
||||
"wezterm-ssh",
|
||||
"wezterm-term",
|
||||
"winapi",
|
||||
|
@ -14,6 +14,7 @@ use termwiz::hyperlink::Rule;
|
||||
use termwiz::input::KeyboardEncoding;
|
||||
use termwiz::surface::{Line, SequenceNo};
|
||||
use url::Url;
|
||||
use wezterm_dynamic::Value;
|
||||
use wezterm_term::color::ColorPalette;
|
||||
use wezterm_term::{
|
||||
Clipboard, DownloadHandler, KeyCode, KeyModifiers, MouseEvent, SemanticZone, StableRowIndex,
|
||||
@ -204,6 +205,11 @@ pub trait Pane: Downcast {
|
||||
|
||||
fn get_current_seqno(&self) -> SequenceNo;
|
||||
|
||||
/// Returns misc metadata that is pane-specific
|
||||
fn get_metadata(&self) -> Value {
|
||||
Value::Null
|
||||
}
|
||||
|
||||
/// Given a range of lines, return the subset of those lines that
|
||||
/// have changed since the supplied sequence no.
|
||||
fn get_changed_since(
|
||||
|
@ -37,6 +37,7 @@ textwrap = "0.15"
|
||||
thiserror = "1.0"
|
||||
umask = { path = "../umask" }
|
||||
url = "2"
|
||||
wezterm-dynamic = { path = "../wezterm-dynamic" }
|
||||
wezterm-ssh = { path = "../wezterm-ssh" }
|
||||
wezterm-term = { path = "../term", features=["use_serde"] }
|
||||
|
||||
|
@ -16,13 +16,14 @@ use mux::{Mux, MuxNotification};
|
||||
use rangeset::RangeSet;
|
||||
use ratelim::RateLimiter;
|
||||
use std::cell::{RefCell, RefMut};
|
||||
use std::collections::HashMap;
|
||||
use std::collections::{BTreeMap, HashMap};
|
||||
use std::ops::Range;
|
||||
use std::rc::Rc;
|
||||
use std::sync::Arc;
|
||||
use termwiz::input::KeyEvent;
|
||||
use termwiz::surface::SequenceNo;
|
||||
use url::Url;
|
||||
use wezterm_dynamic::Value;
|
||||
use wezterm_term::color::ColorPalette;
|
||||
use wezterm_term::{
|
||||
Alert, Clipboard, KeyCode, KeyModifiers, Line, MouseEvent, StableRowIndex, TerminalSize,
|
||||
@ -195,6 +196,23 @@ impl Pane for ClientPane {
|
||||
self.local_pane_id
|
||||
}
|
||||
|
||||
fn get_metadata(&self) -> Value {
|
||||
let renderable = self.renderable.borrow();
|
||||
let inner = renderable.inner.borrow();
|
||||
|
||||
let mut map: BTreeMap<Value, Value> = BTreeMap::new();
|
||||
map.insert(
|
||||
Value::String("is_tardy".to_string()),
|
||||
Value::Bool(inner.is_tardy()),
|
||||
);
|
||||
map.insert(
|
||||
Value::String("since_last_response_ms".to_string()),
|
||||
Value::U64(inner.last_recv_time.elapsed().as_millis() as u64),
|
||||
);
|
||||
|
||||
Value::Object(map.into())
|
||||
}
|
||||
|
||||
fn get_cursor_position(&self) -> StableCursorPosition {
|
||||
self.renderable.borrow().get_cursor_position()
|
||||
}
|
||||
|
@ -72,7 +72,7 @@ pub struct RenderableInner {
|
||||
fetch_limiter: RateLimiter,
|
||||
|
||||
last_send_time: Instant,
|
||||
last_recv_time: Instant,
|
||||
pub last_recv_time: Instant,
|
||||
last_late_dirty: Instant,
|
||||
last_input_rtt: u64,
|
||||
|
||||
|
@ -1,6 +1,7 @@
|
||||
//! PaneObject represents a Mux Pane instance in lua code
|
||||
use super::luaerr;
|
||||
use anyhow::anyhow;
|
||||
use luahelper::dynamic_to_lua_value;
|
||||
use mlua::{UserData, UserDataMethods};
|
||||
use mux::pane::{Pane, PaneId};
|
||||
use mux::Mux;
|
||||
@ -48,6 +49,10 @@ impl UserData for PaneObject {
|
||||
.get_current_working_dir()
|
||||
.map(|u| u.to_string()))
|
||||
});
|
||||
methods.add_method("get_metadata", |lua, this, _: ()| {
|
||||
let value = this.pane()?.get_metadata();
|
||||
dynamic_to_lua_value(lua, value)
|
||||
});
|
||||
methods.add_method("get_foreground_process_name", |_, this, _: ()| {
|
||||
Ok(this.pane()?.get_foreground_process_name())
|
||||
});
|
||||
|
Loading…
Reference in New Issue
Block a user