aboutsummaryrefslogtreecommitdiff
path: root/src/server/headless.rs
diff options
context:
space:
mode:
authorCan Celik <ogulcancelik@gmail.com>2026-09-02 22:45:51 +0300
committerGitHub <noreply@github.com>2026-09-02 22:45:51 +0300
commite22cba35ef7b405758097a5f9436aae8fb4caaf0 (patch)
treea25cf28ad45a3b34c4dc25d54e3095f6c8be2b3a /src/server/headless.rs
parent5a2dee700eeeea68267a4d16777307632f77172f (diff)
fix: keep direct graphics bound to its client (#3549)
Diffstat (limited to 'src/server/headless.rs')
-rw-r--r--src/server/headless.rs57
1 files changed, 48 insertions, 9 deletions
diff --git a/src/server/headless.rs b/src/server/headless.rs
index 1efa2d1a..04a1b17b 100644
--- a/src/server/headless.rs
+++ b/src/server/headless.rs
@@ -933,16 +933,54 @@ impl HeadlessServer {
.count()
}
- fn direct_graphics_available(&self) -> bool {
- self.app_client_count() == 1
- && self.foreground_client_id.is_some_and(|id| {
- self.clients.get(&id).is_some_and(|client| {
- client.is_shell_client()
- && client.writer.is_some()
- && client.direct_graphics
- && client.pixel_mouse
- })
+ fn client_supports_direct_graphics(&self, client_id: u64) -> bool {
+ self.clients.get(&client_id).is_some_and(|client| {
+ client.is_shell_client()
+ && client.writer.is_some()
+ && client.direct_graphics
+ && client.pixel_mouse
+ })
+ }
+
+ fn existing_direct_graphics_client(&self) -> Option<u64> {
+ self.app
+ .pane_graphics
+ .slots
+ .values()
+ .filter_map(crate::app::pane_graphics::Slot::direct_client)
+ .filter_map(|client_id| {
+ let client = self.clients.get(&client_id)?;
+ self.client_supports_direct_graphics(client_id)
+ .then_some((client.last_activity, client_id))
})
+ .max()
+ .map(|(_, client_id)| client_id)
+ }
+
+ fn direct_graphics_client(&self) -> Option<u64> {
+ self.existing_direct_graphics_client().or_else(|| {
+ self.foreground_client_id
+ .filter(|client_id| self.client_supports_direct_graphics(*client_id))
+ })
+ }
+
+ fn direct_graphics_client_for_key(&self, key: &crate::app::pane_graphics::Key) -> Option<u64> {
+ match self
+ .app
+ .pane_graphics
+ .slots
+ .get(key)
+ .and_then(crate::app::pane_graphics::Slot::direct_client)
+ {
+ Some(client_id) => self
+ .client_supports_direct_graphics(client_id)
+ .then_some(client_id),
+ None => self.direct_graphics_client(),
+ }
+ }
+
+ fn direct_graphics_available(&self) -> bool {
+ self.direct_graphics_client().is_some()
}
fn has_app_client(&self) -> bool {
@@ -987,6 +1025,7 @@ impl HeadlessServer {
self.send_shell_focus_target(target, crate::ghostty::FocusEvent::Lost);
}
}
+ self.app.direct_graphics_available = self.direct_graphics_available();
if was_foreground {
self.promote_latest_remaining_client()
} else {