inspector: show modes

This commit is contained in:
Mitchell Hashimoto
2023-10-22 09:14:53 -07:00
parent c8b9bea1e1
commit 880d7869a9
3 changed files with 55 additions and 8 deletions

View File

@ -3,8 +3,10 @@
//! debugging issues in Ghostty itself. //! debugging issues in Ghostty itself.
const Inspector = @This(); const Inspector = @This();
const std = @import("std");
const cimgui = @import("cimgui"); const cimgui = @import("cimgui");
const Surface = @import("Surface.zig"); const Surface = @import("Surface.zig");
const terminal = @import("terminal/main.zig");
/// The window names. These are used with docking so we need to have access. /// The window names. These are used with docking so we need to have access.
const window_modes = "Modes"; const window_modes = "Modes";
@ -71,9 +73,15 @@ pub fn render(self: *Inspector) void {
null, null,
); );
// We want the modes window to have the initial focus // Render all of our data. We hold the mutex for this duration. This is
self.renderModesWindow(); // expensive but this is an initial implementation until it doesn't work
self.renderSizeWindow(); // anymore.
{
self.surface.renderer_state.mutex.lock();
defer self.surface.renderer_state.mutex.unlock();
self.renderModesWindow();
self.renderSizeWindow();
}
// Flip this boolean to true whenever you want to see the ImGui demo // Flip this boolean to true whenever you want to see the ImGui demo
// window which can help you figure out how to use various ImGui widgets. // window which can help you figure out how to use various ImGui widgets.
@ -136,6 +144,48 @@ fn renderModesWindow(self: *Inspector) void {
&self.show_modes_window, &self.show_modes_window,
cimgui.c.ImGuiWindowFlags_NoFocusOnAppearing, cimgui.c.ImGuiWindowFlags_NoFocusOnAppearing,
)) return; )) return;
_ = cimgui.c.igBeginTable(
"table_modes",
3,
cimgui.c.ImGuiTableFlags_SizingFixedFit |
cimgui.c.ImGuiTableFlags_RowBg,
.{ .x = 0, .y = 0 },
0,
);
defer cimgui.c.igEndTable();
{
_ = cimgui.c.igTableSetupColumn("", cimgui.c.ImGuiTableColumnFlags_NoResize, 0, 0);
_ = cimgui.c.igTableSetupColumn("Number", cimgui.c.ImGuiTableColumnFlags_PreferSortAscending, 0, 0);
_ = cimgui.c.igTableSetupColumn("Name", cimgui.c.ImGuiTableColumnFlags_WidthStretch, 0, 0);
cimgui.c.igTableHeadersRow();
}
const t = self.surface.renderer_state.terminal;
inline for (@typeInfo(terminal.Mode).Enum.fields) |field| {
const tag: terminal.modes.ModeTag = @bitCast(@as(terminal.modes.ModeTag.Backing, field.value));
cimgui.c.igTableNextRow(cimgui.c.ImGuiTableRowFlags_None, 0);
{
_ = cimgui.c.igTableSetColumnIndex(0);
var value: bool = t.modes.get(@field(terminal.Mode, field.name));
_ = cimgui.c.igCheckbox("", &value);
}
{
_ = cimgui.c.igTableSetColumnIndex(1);
cimgui.c.igText(
"%s%d",
if (tag.ansi) "?" else "",
@as(u32, @intCast(tag.value)),
);
}
{
_ = cimgui.c.igTableSetColumnIndex(2);
const name = std.fmt.comptimePrint("{s}", .{field.name});
cimgui.c.igText("%s", name.ptr);
}
}
} }
fn renderSizeWindow(self: *Inspector) void { fn renderSizeWindow(self: *Inspector) void {

View File

@ -175,9 +175,6 @@ const Window = struct {
const self: *Window = @ptrCast(@alignCast(ud orelse return)); const self: *Window = @ptrCast(@alignCast(ud orelse return));
const surface = &self.inspector.surface.core_surface; const surface = &self.inspector.surface.core_surface;
const inspector = surface.inspector orelse return; const inspector = surface.inspector orelse return;
surface.renderer_state.mutex.lock();
defer surface.renderer_state.mutex.unlock();
inspector.render(); inspector.render();
} }

View File

@ -120,8 +120,8 @@ pub const Mode = mode_enum: {
/// The tag type for our enum is a u16 but we use a packed struct /// The tag type for our enum is a u16 but we use a packed struct
/// in order to pack the ansi bit into the tag. /// in order to pack the ansi bit into the tag.
const ModeTag = packed struct(u16) { pub const ModeTag = packed struct(u16) {
const Backing = @typeInfo(@This()).Struct.backing_integer.?; pub const Backing = @typeInfo(@This()).Struct.backing_integer.?;
value: u15, value: u15,
ansi: bool = false, ansi: bool = false,