Merge pull request #2771 from ghostty-org/push-quwzwysosskr

mode 2031 should send updates on any color palette change
This commit is contained in:
Mitchell Hashimoto
2024-11-23 09:53:53 -08:00
committed by GitHub
3 changed files with 46 additions and 26 deletions

View File

@ -837,21 +837,28 @@ pub fn handleMessage(self: *Surface, msg: Message) !void {
}, .unlocked); }, .unlocked);
}, },
.color_change => |change| try self.rt_app.performAction( .color_change => |change| {
.{ .surface = self }, // On any color change, we have to report for mode 2031
.color_change, // if it is enabled.
.{ self.reportColorScheme(false);
.kind = switch (change.kind) {
.background => .background, // Notify our apprt
.foreground => .foreground, try self.rt_app.performAction(
.cursor => .cursor, .{ .surface = self },
.palette => |v| @enumFromInt(v), .color_change,
.{
.kind = switch (change.kind) {
.background => .background,
.foreground => .foreground,
.cursor => .cursor,
.palette => |v| @enumFromInt(v),
},
.r = change.color.r,
.g = change.color.g,
.b = change.color.b,
}, },
.r = change.color.r, );
.g = change.color.g, },
.b = change.color.b,
},
),
.set_mouse_shape => |shape| { .set_mouse_shape => |shape| {
log.debug("changing mouse shape: {}", .{shape}); log.debug("changing mouse shape: {}", .{shape});
@ -915,7 +922,7 @@ pub fn handleMessage(self: *Surface, msg: Message) !void {
.renderer_health => |health| self.updateRendererHealth(health), .renderer_health => |health| self.updateRendererHealth(health),
.report_color_scheme => try self.reportColorScheme(), .report_color_scheme => |force| self.reportColorScheme(force),
.present_surface => try self.presentSurface(), .present_surface => try self.presentSurface(),
@ -952,8 +959,18 @@ fn passwordInput(self: *Surface, v: bool) !void {
try self.queueRender(); try self.queueRender();
} }
/// Sends a DSR response for the current color scheme to the pty. /// Sends a DSR response for the current color scheme to the pty. If
fn reportColorScheme(self: *Surface) !void { /// force is false then we only send the response if the terminal mode
/// 2031 is enabled.
fn reportColorScheme(self: *Surface, force: bool) void {
if (!force) {
self.renderer_state.mutex.lock();
defer self.renderer_state.mutex.unlock();
if (!self.renderer_state.terminal.modes.get(.report_color_scheme)) {
return;
}
}
const output = switch (self.config_conditional_state.theme) { const output = switch (self.config_conditional_state.theme) {
.light => "\x1B[?997;2n", .light => "\x1B[?997;2n",
.dark => "\x1B[?997;1n", .dark => "\x1B[?997;1n",
@ -3660,12 +3677,7 @@ pub fn colorSchemeCallback(self: *Surface, scheme: apprt.ColorScheme) !void {
self.notifyConfigConditionalState(); self.notifyConfigConditionalState();
// If mode 2031 is on, then we report the change live. // If mode 2031 is on, then we report the change live.
const report = report: { self.reportColorScheme(false);
self.renderer_state.mutex.lock();
defer self.renderer_state.mutex.unlock();
break :report self.renderer_state.terminal.modes.get(.report_color_scheme);
};
if (report) try self.reportColorScheme();
} }
pub fn posToViewport(self: Surface, xpos: f64, ypos: f64) terminal.point.Coordinate { pub fn posToViewport(self: Surface, xpos: f64, ypos: f64) terminal.point.Coordinate {

View File

@ -58,8 +58,10 @@ pub const Message = union(enum) {
/// Health status change for the renderer. /// Health status change for the renderer.
renderer_health: renderer.Health, renderer_health: renderer.Health,
/// Report the color scheme /// Report the color scheme. The bool parameter is whether to force or not.
report_color_scheme: void, /// If force is true, the color scheme should be reported even if mode
/// 2031 is not set.
report_color_scheme: bool,
/// Tell the surface to present itself to the user. This may require raising /// Tell the surface to present itself to the user. This may require raising
/// a window and switching tabs. /// a window and switching tabs.

View File

@ -126,6 +126,9 @@ pub const StreamHandler = struct {
if (self.default_cursor) self.setCursorStyle(.default) catch |err| { if (self.default_cursor) self.setCursorStyle(.default) catch |err| {
log.warn("failed to set default cursor style: {}", .{err}); log.warn("failed to set default cursor style: {}", .{err});
}; };
// The config could have changed any of our colors so update mode 2031
self.surfaceMessageWriter(.{ .report_color_scheme = false });
} }
inline fn surfaceMessageWriter( inline fn surfaceMessageWriter(
@ -767,7 +770,7 @@ pub const StreamHandler = struct {
self.messageWriter(msg); self.messageWriter(msg);
}, },
.color_scheme => self.surfaceMessageWriter(.{ .report_color_scheme = {} }), .color_scheme => self.surfaceMessageWriter(.{ .report_color_scheme = true }),
} }
} }
@ -892,6 +895,9 @@ pub const StreamHandler = struct {
) !void { ) !void {
self.terminal.fullReset(); self.terminal.fullReset();
try self.setMouseShape(.text); try self.setMouseShape(.text);
// Reset resets our palette so we report it for mode 2031.
self.surfaceMessageWriter(.{ .report_color_scheme = false });
} }
pub fn queryKittyKeyboard(self: *StreamHandler) !void { pub fn queryKittyKeyboard(self: *StreamHandler) !void {