mirror of
https://github.com/wez/wezterm.git
synced 2024-12-24 22:01:47 +03:00
refactor: move gui socket list from update module to discovery module
This commit is contained in:
parent
213507c923
commit
eddf1c031a
@ -1,5 +1,7 @@
|
|||||||
|
use crate::UnixStream;
|
||||||
use anyhow::Context;
|
use anyhow::Context;
|
||||||
use std::path::{Path, PathBuf};
|
use std::path::{Path, PathBuf};
|
||||||
|
use std::time::{Duration, SystemTime};
|
||||||
|
|
||||||
/// There's a lot more code in this windows module than I thought I would need
|
/// There's a lot more code in this windows module than I thought I would need
|
||||||
/// to write. Ostensibly, we could get away with making a symlink by taking
|
/// to write. Ostensibly, we could get away with making a symlink by taking
|
||||||
@ -312,3 +314,52 @@ pub fn publish_gui_sock_path(path: &Path, class_name: &str) -> anyhow::Result<Na
|
|||||||
pub fn resolve_gui_sock_path(class_name: &str) -> anyhow::Result<PathBuf> {
|
pub fn resolve_gui_sock_path(class_name: &str) -> anyhow::Result<PathBuf> {
|
||||||
NameHolder::resolve(class_name)
|
NameHolder::resolve(class_name)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// This function returns a list of the gui-sock- paths in
|
||||||
|
/// the runtime dir. These represent the locally running
|
||||||
|
/// instances of wezterm-gui.
|
||||||
|
/// The list is pruned of any entries that are not live
|
||||||
|
/// and then sorted with the eldest instance first.
|
||||||
|
pub fn discover_gui_socks() -> Vec<PathBuf> {
|
||||||
|
let mut socks = vec![];
|
||||||
|
|
||||||
|
#[derive(Debug)]
|
||||||
|
struct Entry {
|
||||||
|
path: PathBuf,
|
||||||
|
age: Duration,
|
||||||
|
}
|
||||||
|
|
||||||
|
fn meta_age(t: std::io::Result<SystemTime>) -> Duration {
|
||||||
|
t.ok()
|
||||||
|
.and_then(|t| SystemTime::now().duration_since(t).ok())
|
||||||
|
.unwrap_or(Duration::from_millis(300))
|
||||||
|
}
|
||||||
|
|
||||||
|
if let Ok(dir) = std::fs::read_dir(&*config::RUNTIME_DIR) {
|
||||||
|
for entry in dir {
|
||||||
|
if let Ok(entry) = entry {
|
||||||
|
if let Some(name) = entry.file_name().to_str() {
|
||||||
|
if name.starts_with("gui-sock-") {
|
||||||
|
let path = entry.path();
|
||||||
|
if let Ok(meta) = entry.metadata() {
|
||||||
|
let age = meta_age(meta.created());
|
||||||
|
if is_sock_dead(&path) && age > Duration::from_secs(1) {
|
||||||
|
let _ = std::fs::remove_file(&path);
|
||||||
|
} else {
|
||||||
|
socks.push(Entry { path, age });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
socks.sort_by(|a, b| a.age.cmp(&b.age).reverse());
|
||||||
|
log::trace!("{:?}", socks);
|
||||||
|
socks.into_iter().map(|e| e.path).collect()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn is_sock_dead(sock: &std::path::Path) -> bool {
|
||||||
|
UnixStream::connect(sock).is_err()
|
||||||
|
}
|
||||||
|
@ -10,20 +10,15 @@ use regex::Regex;
|
|||||||
use serde::*;
|
use serde::*;
|
||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
use std::convert::TryFrom;
|
use std::convert::TryFrom;
|
||||||
#[cfg(unix)]
|
|
||||||
use std::os::unix::net::UnixStream;
|
|
||||||
use std::path::PathBuf;
|
|
||||||
use std::sync::atomic::{AtomicBool, Ordering};
|
use std::sync::atomic::{AtomicBool, Ordering};
|
||||||
use std::sync::{Arc, Mutex};
|
use std::sync::{Arc, Mutex};
|
||||||
use std::time::{Duration, SystemTime};
|
use std::time::Duration;
|
||||||
use termwiz::cell::{AttributeChange, Hyperlink, Underline};
|
use termwiz::cell::{AttributeChange, Hyperlink, Underline};
|
||||||
use termwiz::color::AnsiColor;
|
use termwiz::color::AnsiColor;
|
||||||
use termwiz::escape::csi::{Cursor, Sgr};
|
use termwiz::escape::csi::{Cursor, Sgr};
|
||||||
use termwiz::escape::osc::{ITermDimension, ITermFileData, ITermProprietary};
|
use termwiz::escape::osc::{ITermDimension, ITermFileData, ITermProprietary};
|
||||||
use termwiz::escape::{OneBased, OperatingSystemCommand, CSI};
|
use termwiz::escape::{OneBased, OperatingSystemCommand, CSI};
|
||||||
use termwiz::surface::{Change, CursorVisibility};
|
use termwiz::surface::{Change, CursorVisibility};
|
||||||
#[cfg(windows)]
|
|
||||||
use uds_windows::UnixStream;
|
|
||||||
use wezterm_toast_notification::*;
|
use wezterm_toast_notification::*;
|
||||||
|
|
||||||
#[derive(Debug, Serialize, Deserialize, Clone)]
|
#[derive(Debug, Serialize, Deserialize, Clone)]
|
||||||
@ -342,56 +337,7 @@ fn schedule_set_banner_from_release_info(latest: &Release) {
|
|||||||
.detach();
|
.detach();
|
||||||
}
|
}
|
||||||
|
|
||||||
/// This function returns a list of the gui-sock- paths in
|
|
||||||
/// the runtime dir. These represent the locally running
|
|
||||||
/// instances of wezterm-gui.
|
|
||||||
/// The list is pruned of any entries that are not live
|
|
||||||
/// and then sorted with the eldest instance first.
|
|
||||||
fn discover_gui_socks() -> Vec<PathBuf> {
|
|
||||||
let mut socks = vec![];
|
|
||||||
|
|
||||||
#[derive(Debug)]
|
|
||||||
struct Entry {
|
|
||||||
path: PathBuf,
|
|
||||||
age: Duration,
|
|
||||||
}
|
|
||||||
|
|
||||||
fn meta_age(t: std::io::Result<SystemTime>) -> Duration {
|
|
||||||
t.ok()
|
|
||||||
.and_then(|t| SystemTime::now().duration_since(t).ok())
|
|
||||||
.unwrap_or(Duration::from_millis(300))
|
|
||||||
}
|
|
||||||
|
|
||||||
if let Ok(dir) = std::fs::read_dir(&*config::RUNTIME_DIR) {
|
|
||||||
for entry in dir {
|
|
||||||
if let Ok(entry) = entry {
|
|
||||||
if let Some(name) = entry.file_name().to_str() {
|
|
||||||
if name.starts_with("gui-sock-") {
|
|
||||||
let path = entry.path();
|
|
||||||
if let Ok(meta) = entry.metadata() {
|
|
||||||
let age = meta_age(meta.created());
|
|
||||||
if is_sock_dead(&path) && age > Duration::from_secs(1) {
|
|
||||||
let _ = std::fs::remove_file(&path);
|
|
||||||
} else {
|
|
||||||
socks.push(Entry { path, age });
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
socks.sort_by(|a, b| a.age.cmp(&b.age).reverse());
|
|
||||||
log::trace!("{:?}", socks);
|
|
||||||
socks.into_iter().map(|e| e.path).collect()
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Returns true if the provided socket path is dead.
|
/// Returns true if the provided socket path is dead.
|
||||||
fn is_sock_dead(sock: &std::path::Path) -> bool {
|
|
||||||
UnixStream::connect(sock).is_err()
|
|
||||||
}
|
|
||||||
|
|
||||||
fn update_checker() {
|
fn update_checker() {
|
||||||
// Compute how long we should sleep for;
|
// Compute how long we should sleep for;
|
||||||
// if we've never checked, give it a few seconds after the first
|
// if we've never checked, give it a few seconds after the first
|
||||||
@ -440,7 +386,7 @@ fn update_checker() {
|
|||||||
// window: the one of us that sorts first in the list will
|
// window: the one of us that sorts first in the list will
|
||||||
// own doing that, so that if there are a dozen gui processes
|
// own doing that, so that if there are a dozen gui processes
|
||||||
// running, we don't spam the user with a lot of notifications.
|
// running, we don't spam the user with a lot of notifications.
|
||||||
let socks = discover_gui_socks();
|
let socks = wezterm_client::discovery::discover_gui_socks();
|
||||||
|
|
||||||
if force_ui || socks.is_empty() || socks[0] == my_sock {
|
if force_ui || socks.is_empty() || socks[0] == my_sock {
|
||||||
persistent_toast_notification_with_click_to_open_url(
|
persistent_toast_notification_with_click_to_open_url(
|
||||||
|
Loading…
Reference in New Issue
Block a user