x11/wezterm: enable toast notifications

(cherry picked from commit a15225b444)
This commit is contained in:
Jan Beich 2021-08-23 05:59:33 +00:00
parent e18e42ea18
commit 262d20cfc2
3 changed files with 268 additions and 7 deletions

View File

@ -1,6 +1,6 @@
PORTNAME= wezterm
DISTVERSION= 20210502-154244-3f7122cb
PORTREVISION= 2
PORTREVISION= 3
CATEGORIES= x11
MAINTAINER= jbeich@FreeBSD.org
@ -246,7 +246,6 @@ CARGO_CRATES= ab_glyph_rasterizer-0.1.4 \
nanorand-0.5.2 \
nb-connect-1.2.0 \
net2-0.2.37 \
nix-0.17.0 \
nix-0.18.0 \
nix-0.19.1 \
nix-0.20.0 \
@ -431,7 +430,6 @@ CARGO_CRATES= ab_glyph_rasterizer-0.1.4 \
vcpkg-0.2.12 \
vec_map-0.8.2 \
version_check-0.9.3 \
void-1.0.2 \
vswhom-0.1.0 \
vswhom-sys-0.1.0 \
waker-fn-1.1.0 \

View File

@ -413,8 +413,6 @@ SHA256 (rust/crates/nb-connect-1.2.0.crate) = b1bb540dc6ef51cfe1916ec038ce7a620d
SIZE (rust/crates/nb-connect-1.2.0.crate) = 8126
SHA256 (rust/crates/net2-0.2.37.crate) = 391630d12b68002ae1e25e8f974306474966550ad82dac6886fb8910c19568ae
SIZE (rust/crates/net2-0.2.37.crate) = 21311
SHA256 (rust/crates/nix-0.17.0.crate) = 50e4785f2c3b7589a0d0c1dd60285e1188adac4006e8abd6dd578e1567027363
SIZE (rust/crates/nix-0.17.0.crate) = 195654
SHA256 (rust/crates/nix-0.18.0.crate) = 83450fe6a6142ddd95fb064b746083fc4ef1705fe81f64a64e1d4b39f54a1055
SIZE (rust/crates/nix-0.18.0.crate) = 209962
SHA256 (rust/crates/nix-0.19.1.crate) = b2ccba0cfe4fdf15982d1674c69b1fd80bad427d293849982668dfe454bd61f2
@ -783,8 +781,6 @@ SHA256 (rust/crates/vec_map-0.8.2.crate) = f1bddf1187be692e79c5ffeab891132dfb0f2
SIZE (rust/crates/vec_map-0.8.2.crate) = 14466
SHA256 (rust/crates/version_check-0.9.3.crate) = 5fecdca9a5291cc2b8dcf7dc02453fee791a280f3743cb0905f8822ae463b3fe
SIZE (rust/crates/version_check-0.9.3.crate) = 12547
SHA256 (rust/crates/void-1.0.2.crate) = 6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d
SIZE (rust/crates/void-1.0.2.crate) = 2356
SHA256 (rust/crates/vswhom-0.1.0.crate) = be979b7f07507105799e854203b470ff7c78a1639e330a58f183b5fea574608b
SIZE (rust/crates/vswhom-0.1.0.crate) = 9420
SHA256 (rust/crates/vswhom-sys-0.1.0.crate) = fc2f5402d3d0e79a069714f7b48e3ecc60be7775a2c049cb839457457a239532

View File

@ -0,0 +1,267 @@
https://gitlab.freedesktop.org/dbus/zbus/-/commit/01d8f0ec41d3
https://gitlab.freedesktop.org/dbus/zbus/-/commit/807909a6c7bf
https://gitlab.freedesktop.org/dbus/zbus/-/commit/e3e2f7ddfd6e
https://gitlab.freedesktop.org/dbus/zbus/-/commit/35d1b8778754
https://github.com/wez/wezterm/pull/829
--- cargo-crates/zbus-1.9.1/Cargo.toml.orig 1970-01-01 00:00:00 UTC
+++ cargo-crates/zbus-1.9.1/Cargo.toml
@@ -48,7 +48,7 @@ version = "0.3.8"
version = "1.0.2"
[dependencies.nix]
-version = "^0.17"
+version = "0.20.0"
[dependencies.once_cell]
version = "1.4.0"
--- cargo-crates/zbus-1.9.1/src/address.rs.orig 1970-01-01 00:00:00 UTC
+++ cargo-crates/zbus-1.9.1/src/address.rs
@@ -55,8 +55,9 @@ impl Address {
match env::var("DBUS_SESSION_BUS_ADDRESS") {
Ok(val) => Self::from_str(&val),
_ => {
- let uid = Uid::current();
- let path = format!("unix:path=/run/user/{}/bus", uid);
+ let runtime_dir = env::var("XDG_RUNTIME_DIR")
+ .unwrap_or_else(|_| format!("/run/user/{}", Uid::current()));
+ let path = format!("unix:path={}/bus", runtime_dir);
Self::from_str(&path)
}
--- cargo-crates/zbus-1.9.1/src/azync/connection.rs.orig 1970-01-01 00:00:00 UTC
+++ cargo-crates/zbus-1.9.1/src/azync/connection.rs
@@ -177,13 +177,29 @@ where
/// Upon successful return, the connection is fully established and negotiated: D-Bus messages
/// can be sent and received.
pub async fn new_server(stream: S, guid: &Guid) -> Result<Self> {
- use nix::sys::socket::{getsockopt, sockopt::PeerCredentials};
+ #[cfg(any(target_os = "android", target_os = "linux"))]
+ let client_uid = {
+ use nix::sys::socket::{getsockopt, sockopt::PeerCredentials};
- // FIXME: Could and should this be async?
- let creds = getsockopt(stream.as_raw_fd(), PeerCredentials)
- .map_err(|e| Error::Handshake(format!("Failed to get peer credentials: {}", e)))?;
+ let creds = getsockopt(stream.as_raw_fd(), PeerCredentials)
+ .map_err(|e| Error::Handshake(format!("Failed to get peer credentials: {}", e)))?;
- let auth = Authenticated::server(Async::new(stream)?, guid.clone(), creds.uid()).await?;
+ creds.uid()
+ };
+ #[cfg(any(
+ target_os = "macos",
+ target_os = "ios",
+ target_os = "freebsd",
+ target_os = "dragonfly",
+ target_os = "openbsd",
+ target_os = "netbsd"
+ ))]
+ let client_uid = nix::unistd::getpeereid(stream.as_raw_fd())
+ .map_err(|e| Error::Handshake(format!("Failed to get peer credentials: {}", e)))?
+ .0
+ .into();
+
+ let auth = Authenticated::server(Async::new(stream)?, guid.clone(), client_uid).await?;
Ok(Self::new_authenticated(auth))
}
--- cargo-crates/zbus-1.9.1/src/connection.rs.orig 1970-01-01 00:00:00 UTC
+++ cargo-crates/zbus-1.9.1/src/connection.rs
@@ -160,12 +160,29 @@ impl Connection {
/// Upon successful return, the connection is fully established and negotiated: D-Bus messages
/// can be sent and received.
pub fn new_unix_server(stream: UnixStream, guid: &Guid) -> Result<Self> {
- use nix::sys::socket::{getsockopt, sockopt::PeerCredentials};
+ #[cfg(any(target_os = "android", target_os = "linux"))]
+ let client_uid = {
+ use nix::sys::socket::{getsockopt, sockopt::PeerCredentials};
- let creds = getsockopt(stream.as_raw_fd(), PeerCredentials)
- .map_err(|e| Error::Handshake(format!("Failed to get peer credentials: {}", e)))?;
+ let creds = getsockopt(stream.as_raw_fd(), PeerCredentials)
+ .map_err(|e| Error::Handshake(format!("Failed to get peer credentials: {}", e)))?;
- let handshake = ServerHandshake::new(stream, guid.clone(), creds.uid());
+ creds.uid()
+ };
+ #[cfg(any(
+ target_os = "macos",
+ target_os = "ios",
+ target_os = "freebsd",
+ target_os = "dragonfly",
+ target_os = "openbsd",
+ target_os = "netbsd"
+ ))]
+ let client_uid = nix::unistd::getpeereid(stream.as_raw_fd())
+ .map_err(|e| Error::Handshake(format!("Failed to get peer credentials: {}", e)))?
+ .0
+ .into();
+
+ let handshake = ServerHandshake::new(stream, guid.clone(), client_uid);
handshake
.blocking_finish()
.map(Connection::new_authenticated_unix)
--- cargo-crates/zbus-1.9.1/src/handshake.rs.orig 1970-01-01 00:00:00 UTC
+++ cargo-crates/zbus-1.9.1/src/handshake.rs
@@ -124,7 +124,7 @@ impl<S: Socket> ClientHandshake<S> {
fn flush_buffer(&mut self) -> Result<()> {
while !self.buffer.is_empty() {
- let written = self.socket.sendmsg(&self.buffer, &[])?;
+ let written = self.socket.sendmsg(&self.buffer, &[], false)?;
self.buffer.drain(..written);
}
Ok(())
@@ -182,6 +182,15 @@ impl<S: Socket> Handshake<S> for ClientHandshake<S> {
self.step = ClientHandshakeStep::SendingOauth;
}
ClientHandshakeStep::SendingOauth => {
+ #[cfg(any(target_os = "freebsd", target_os = "dragonfly"))]
+ {
+ let zero = self.buffer.drain(..1).next().unwrap();
+ if self.socket.sendmsg(&[zero], &[], true)? != 1 {
+ return Err(Error::Handshake(
+ "Could not send zero byte with credentials".to_string(),
+ ));
+ }
+ }
self.flush_buffer()?;
self.step = ClientHandshakeStep::WaitOauth;
}
@@ -385,7 +394,7 @@ impl<S: Socket> ServerHandshake<S> {
fn flush_buffer(&mut self) -> Result<()> {
while !self.buffer.is_empty() {
- let written = self.socket.sendmsg(&self.buffer, &[])?;
+ let written = self.socket.sendmsg(&self.buffer, &[], false)?;
self.buffer.drain(..written);
}
Ok(())
--- cargo-crates/zbus-1.9.1/src/raw/connection.rs.orig 1970-01-01 00:00:00 UTC
+++ cargo-crates/zbus-1.9.1/src/raw/connection.rs
@@ -47,7 +47,7 @@ impl<S: Socket> Connection<S> {
// VecDeque should never return an empty front buffer if the VecDeque
// itself is not empty
debug_assert!(!front.is_empty());
- let written = self.socket.sendmsg(front, &[])?;
+ let written = self.socket.sendmsg(front, &[], false)?;
self.raw_out_buffer.drain(..written);
}
@@ -55,14 +55,14 @@ impl<S: Socket> Connection<S> {
while let Some(msg) = self.msg_out_buffer.front() {
let mut data = msg.as_bytes();
let fds = msg.fds();
- let written = self.socket.sendmsg(data, &fds)?;
+ let written = self.socket.sendmsg(data, &fds, false)?;
// at least some part of the message has been sent, see if we can/need to send more
// now the message must be removed from msg_out_buffer and any leftover bytes
// must be stored into raw_out_buffer
let msg = self.msg_out_buffer.pop_front().unwrap();
data = &msg.as_bytes()[written..];
while !data.is_empty() {
- match self.socket.sendmsg(data, &[]) {
+ match self.socket.sendmsg(data, &[], false) {
Ok(n) => data = &data[n..],
Err(e) => {
// an error occured, we cannot send more, store the remaining into
--- cargo-crates/zbus-1.9.1/src/raw/socket.rs.orig 1970-01-01 00:00:00 UTC
+++ cargo-crates/zbus-1.9.1/src/raw/socket.rs
@@ -47,7 +47,7 @@ pub trait Socket {
///
/// If the underlying transport does not support transmitting file descriptors, this
/// will return `Err(ErrorKind::InvalidInput)`.
- fn sendmsg(&mut self, buffer: &[u8], fds: &[RawFd]) -> io::Result<usize>;
+ fn sendmsg(&mut self, buffer: &[u8], fds: &[RawFd], creds: bool) -> io::Result<usize>;
/// Close the socket.
///
@@ -74,6 +74,10 @@ impl Socket for UnixStream {
Ok(msg) => {
let mut fds = vec![];
for cmsg in msg.cmsgs() {
+ #[cfg(any(target_os = "freebsd", target_os = "dragonfly"))]
+ if let ControlMessageOwned::ScmCreds(_) = cmsg {
+ continue;
+ }
if let ControlMessageOwned::ScmRights(fd) = cmsg {
fds.extend(fd.iter().map(|&f| unsafe { OwnedFd::from_raw_fd(f) }));
} else {
@@ -90,12 +94,23 @@ impl Socket for UnixStream {
}
}
- fn sendmsg(&mut self, buffer: &[u8], fds: &[RawFd]) -> io::Result<usize> {
- let cmsg = if !fds.is_empty() {
+ fn sendmsg(&mut self, buffer: &[u8], fds: &[RawFd], creds: bool) -> io::Result<usize> {
+ let mut cmsg = if !fds.is_empty() {
vec![ControlMessage::ScmRights(fds)]
} else {
vec![]
};
+ #[cfg(any(target_os = "android", target_os = "linux"))]
+ let unix_creds;
+ if creds {
+ #[cfg(any(target_os = "android", target_os = "linux"))]
+ {
+ unix_creds = Some(nix::sys::socket::UnixCredentials::new());
+ cmsg.push(ControlMessage::ScmCredentials(unix_creds.as_ref().unwrap()));
+ }
+ #[cfg(any(target_os = "freebsd", target_os = "dragonfly"))]
+ cmsg.push(ControlMessage::ScmCreds);
+ }
let iov = [IoVec::from_slice(buffer)];
match sendmsg(self.as_raw_fd(), &iov, &cmsg, MsgFlags::empty(), None) {
// can it really happen?
@@ -124,8 +139,8 @@ where
self.get_mut().recvmsg(buffer)
}
- fn sendmsg(&mut self, buffer: &[u8], fds: &[RawFd]) -> io::Result<usize> {
- self.get_mut().sendmsg(buffer, fds)
+ fn sendmsg(&mut self, buffer: &[u8], fds: &[RawFd], creds: bool) -> io::Result<usize> {
+ self.get_mut().sendmsg(buffer, fds, creds)
}
fn close(&self) -> io::Result<()> {
--- wezterm-toast-notification/Cargo.toml.orig 2021-05-02 22:42:44 UTC
+++ wezterm-toast-notification/Cargo.toml
@@ -11,7 +11,7 @@ build = "build.rs"
open = "1.4"
log = "0.4"
-[target.'cfg(all(not(windows), not(target_os="macos"), not(target_os="freebsd")))'.dependencies]
+[target.'cfg(all(not(windows), not(target_os="macos")))'.dependencies]
serde = {version="1.0", features = ["derive"]}
zbus = "1.8"
zvariant = "2.0"
--- wezterm-toast-notification/src/dbus.rs.orig 2021-05-02 22:42:44 UTC
+++ wezterm-toast-notification/src/dbus.rs
@@ -1,4 +1,4 @@
-#![cfg(all(not(target_os = "macos"), not(windows), not(target_os = "freebsd")))]
+#![cfg(all(not(target_os = "macos"), not(windows)))]
//! See <https://developer.gnome.org/notification-spec/>
use crate::ToastNotification;
--- wezterm-toast-notification/src/lib.rs.orig 2021-05-02 22:42:44 UTC
+++ wezterm-toast-notification/src/lib.rs
@@ -18,7 +18,7 @@ impl ToastNotification {
#[cfg(windows)]
use crate::windows as backend;
-#[cfg(all(not(target_os = "macos"), not(windows), not(target_os = "freebsd")))]
+#[cfg(all(not(target_os = "macos"), not(windows)))]
use dbus as backend;
#[cfg(target_os = "macos")]
use macos as backend;
@@ -31,9 +31,6 @@ mod nop {
Ok(())
}
}
-
-#[cfg(target_os = "freebsd")]
-use nop as backend;
pub fn show(notif: ToastNotification) {
if let Err(err) = backend::show_notif(notif) {