mirror of
https://github.com/ghostty-org/ghostty.git
synced 2025-07-14 15:56:13 +03:00
Merge pull request #1199 from mitchellh/termio-surface-dl
termio/exec: avoid potential deadlock with surface message
This commit is contained in:
@ -1695,6 +1695,19 @@ const StreamHandler = struct {
|
|||||||
try self.ev.queueRender();
|
try self.ev.queueRender();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
inline fn surfaceMessageWriter(
|
||||||
|
self: *StreamHandler,
|
||||||
|
msg: apprt.surface.Message,
|
||||||
|
) void {
|
||||||
|
// See messageWriter which has similar logic and explains why
|
||||||
|
// we may have to do this.
|
||||||
|
if (self.ev.surface_mailbox.push(msg, .{ .instant = {} }) == 0) {
|
||||||
|
self.ev.renderer_state.mutex.unlock();
|
||||||
|
defer self.ev.renderer_state.mutex.lock();
|
||||||
|
_ = self.ev.surface_mailbox.push(msg, .{ .forever = {} });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
inline fn messageWriter(self: *StreamHandler, msg: termio.Message) void {
|
inline fn messageWriter(self: *StreamHandler, msg: termio.Message) void {
|
||||||
// Try to write to the mailbox with an instant timeout. This is the
|
// Try to write to the mailbox with an instant timeout. This is the
|
||||||
// fast path because we can queue without a lock.
|
// fast path because we can queue without a lock.
|
||||||
@ -2487,10 +2500,7 @@ const StreamHandler = struct {
|
|||||||
|
|
||||||
// Mark that we've seen a title
|
// Mark that we've seen a title
|
||||||
self.ev.seen_title = true;
|
self.ev.seen_title = true;
|
||||||
|
self.surfaceMessageWriter(.{ .set_title = buf });
|
||||||
_ = self.ev.surface_mailbox.push(.{
|
|
||||||
.set_title = buf,
|
|
||||||
}, .{ .forever = {} });
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn setMouseShape(
|
pub fn setMouseShape(
|
||||||
@ -2502,9 +2512,7 @@ const StreamHandler = struct {
|
|||||||
if (self.terminal.mouse_shape == shape) return;
|
if (self.terminal.mouse_shape == shape) return;
|
||||||
|
|
||||||
self.terminal.mouse_shape = shape;
|
self.terminal.mouse_shape = shape;
|
||||||
_ = self.ev.surface_mailbox.push(.{
|
self.surfaceMessageWriter(.{ .set_mouse_shape = shape });
|
||||||
.set_mouse_shape = shape,
|
|
||||||
}, .{ .forever = {} });
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn clipboardContents(self: *StreamHandler, kind: u8, data: []const u8) !void {
|
pub fn clipboardContents(self: *StreamHandler, kind: u8, data: []const u8) !void {
|
||||||
@ -2521,14 +2529,12 @@ const StreamHandler = struct {
|
|||||||
|
|
||||||
// Get clipboard contents
|
// Get clipboard contents
|
||||||
if (data.len == 1 and data[0] == '?') {
|
if (data.len == 1 and data[0] == '?') {
|
||||||
_ = self.ev.surface_mailbox.push(.{
|
self.surfaceMessageWriter(.{ .clipboard_read = clipboard_type });
|
||||||
.clipboard_read = clipboard_type,
|
|
||||||
}, .{ .forever = {} });
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Write clipboard contents
|
// Write clipboard contents
|
||||||
_ = self.ev.surface_mailbox.push(.{
|
self.surfaceMessageWriter(.{
|
||||||
.clipboard_write = .{
|
.clipboard_write = .{
|
||||||
.req = try apprt.surface.Message.WriteReq.init(
|
.req = try apprt.surface.Message.WriteReq.init(
|
||||||
self.alloc,
|
self.alloc,
|
||||||
@ -2536,7 +2542,7 @@ const StreamHandler = struct {
|
|||||||
),
|
),
|
||||||
.clipboard_type = clipboard_type,
|
.clipboard_type = clipboard_type,
|
||||||
},
|
},
|
||||||
}, .{ .forever = {} });
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn promptStart(self: *StreamHandler, aid: ?[]const u8, redraw: bool) !void {
|
pub fn promptStart(self: *StreamHandler, aid: ?[]const u8, redraw: bool) !void {
|
||||||
@ -2808,6 +2814,6 @@ const StreamHandler = struct {
|
|||||||
@memcpy(message.desktop_notification.body[0..body_len], body[0..body_len]);
|
@memcpy(message.desktop_notification.body[0..body_len], body[0..body_len]);
|
||||||
message.desktop_notification.body[body_len] = 0;
|
message.desktop_notification.body[body_len] = 0;
|
||||||
|
|
||||||
_ = self.ev.surface_mailbox.push(message, .{ .forever = {} });
|
self.surfaceMessageWriter(message);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
Reference in New Issue
Block a user