diff --git a/include/ghostty.h b/include/ghostty.h index ca70456d8..b4735fc40 100644 --- a/include/ghostty.h +++ b/include/ghostty.h @@ -512,6 +512,20 @@ typedef struct { ghostty_input_trigger_s trigger; } ghostty_action_key_sequence_s; +// apprt.action.SetBackground +typedef struct { + uint8_t r; + uint8_t g; + uint8_t b; +} ghostty_action_set_background_s; + +// apprt.action.SetForeground +typedef struct { + uint8_t r; + uint8_t g; + uint8_t b; +} ghostty_action_set_foreground_s; + // apprt.Action.Key typedef enum { GHOSTTY_ACTION_NEW_WINDOW, @@ -545,6 +559,8 @@ typedef enum { GHOSTTY_ACTION_QUIT_TIMER, GHOSTTY_ACTION_SECURE_INPUT, GHOSTTY_ACTION_KEY_SEQUENCE, + GHOSTTY_ACTION_SET_BACKGROUND, + GHOSTTY_ACTION_SET_FOREGROUND, } ghostty_action_tag_e; typedef union { @@ -567,6 +583,8 @@ typedef union { ghostty_action_quit_timer_e quit_timer; ghostty_action_secure_input_e secure_input; ghostty_action_key_sequence_s key_sequence; + ghostty_action_set_background_s set_background; + ghostty_action_set_foreground_s set_foreground; } ghostty_action_u; typedef struct { diff --git a/src/Surface.zig b/src/Surface.zig index 82d1240eb..b14ffe706 100644 --- a/src/Surface.zig +++ b/src/Surface.zig @@ -799,6 +799,22 @@ pub fn handleMessage(self: *Surface, msg: Message) !void { }, .unlocked); }, + .set_background => |color| { + try self.rt_app.performAction( + .{ .surface = self }, + .set_background, + .{ .r = color.r, .g = color.g, .b = color.b }, + ); + }, + + .set_foreground => |color| { + try self.rt_app.performAction( + .{ .surface = self }, + .set_background, + .{ .r = color.r, .g = color.g, .b = color.b }, + ); + }, + .set_mouse_shape => |shape| { log.debug("changing mouse shape: {}", .{shape}); try self.rt_app.performAction( diff --git a/src/apprt/action.zig b/src/apprt/action.zig index 2c37ca270..1fc79a3a5 100644 --- a/src/apprt/action.zig +++ b/src/apprt/action.zig @@ -186,6 +186,12 @@ pub const Action = union(Key) { /// key mode because other input may be ignored. key_sequence: KeySequence, + /// The terminal background color was changed. + set_background: SetBackground, + + /// The terminal foreground color was changed. + set_foreground: SetForeground, + /// Sync with: ghostty_action_tag_e pub const Key = enum(c_int) { new_window, @@ -219,6 +225,8 @@ pub const Action = union(Key) { quit_timer, secure_input, key_sequence, + set_background, + set_foreground, }; /// Sync with: ghostty_action_u @@ -448,3 +456,15 @@ pub const KeySequence = union(enum) { }; } }; + +pub const SetBackground = extern struct { + r: u8, + g: u8, + b: u8, +}; + +pub const SetForeground = extern struct { + r: u8, + g: u8, + b: u8, +}; diff --git a/src/apprt/glfw.zig b/src/apprt/glfw.zig index 1dde97c9c..f9651a934 100644 --- a/src/apprt/glfw.zig +++ b/src/apprt/glfw.zig @@ -223,6 +223,8 @@ pub const App = struct { .mouse_over_link, .cell_size, .renderer_health, + .set_foreground, + .set_background, => log.info("unimplemented action={}", .{action}), } } diff --git a/src/apprt/gtk/App.zig b/src/apprt/gtk/App.zig index af664d720..b444f9da8 100644 --- a/src/apprt/gtk/App.zig +++ b/src/apprt/gtk/App.zig @@ -485,6 +485,8 @@ pub fn performAction( .key_sequence, .render_inspector, .renderer_health, + .set_foreground, + .set_background, => log.warn("unimplemented action={}", .{action}), } } diff --git a/src/apprt/surface.zig b/src/apprt/surface.zig index daa2ad547..7de83a78b 100644 --- a/src/apprt/surface.zig +++ b/src/apprt/surface.zig @@ -70,6 +70,12 @@ pub const Message = union(enum) { /// unless the surface exits. password_input: bool, + /// The terminal background color was changed. + set_background: terminal.color.RGB, + + /// The terminal foreground color was changed. + set_foreground: terminal.color.RGB, + pub const ReportTitleStyle = enum { csi_21_t, diff --git a/src/termio/stream_handler.zig b/src/termio/stream_handler.zig index 90a33e8b7..e53544842 100644 --- a/src/termio/stream_handler.zig +++ b/src/termio/stream_handler.zig @@ -1215,12 +1215,14 @@ pub const StreamHandler = struct { _ = self.renderer_mailbox.push(.{ .foreground_color = color, }, .{ .forever = {} }); + self.surfaceMessageWriter(.{ .set_background = color }); }, .background => { self.background_color = color; _ = self.renderer_mailbox.push(.{ .background_color = color, }, .{ .forever = {} }); + self.surfaceMessageWriter(.{ .set_background = color }); }, .cursor => { self.cursor_color = color;