···36363737 tty: ?Tty,
38383939+ /// the screen we write to
3940 screen: Screen,
4040- // The last screen we drew. We keep this so we can efficiently update on
4141- // the next render
4141+ /// The last screen we drew. We keep this so we can efficiently update on
4242+ /// the next render
4243 screen_last: InternalScreen = undefined,
43444545+ /// alt_screen state. We track so we can exit on deinit
4446 alt_screen: bool,
4747+4848+ /// if we should redraw the entire screen on the next render
4949+ refresh: bool = false,
45504651 // statistics
4752 renders: usize = 0,
···161166 var tty = self.tty orelse return;
162167163168 const colorterm = std.os.getenv("COLORTERM") orelse "";
164164- if (std.mem.eql(u8, colorterm, "truecolor" or
165165- std.mem.eql(u8, colorterm, "24bit")))
169169+ if (std.mem.eql(u8, colorterm, "truecolor") or
170170+ std.mem.eql(u8, colorterm, "24bit"))
166171 {
167172 // TODO: Notify rgb support
168173 }
169174170170- const writer = tty.buffered_writer.writer();
171171- _ = try writer.write(ctlseqs.decrqm_focus);
172172- _ = try writer.write(ctlseqs.decrqm_sync);
173173- _ = try writer.write(ctlseqs.decrqm_unicode);
174174- _ = try writer.write(ctlseqs.decrqm_color_theme);
175175- _ = try writer.write(ctlseqs.xtversion);
176176- _ = try writer.write(ctlseqs.csi_u_query);
177177- _ = try writer.write(ctlseqs.kitty_graphics_query);
178178- _ = try writer.write(ctlseqs.sixel_geometry_query);
175175+ // TODO: decide if we actually want to query for focus and sync. It
176176+ // doesn't hurt to blindly use them
177177+ // _ = try tty.write(ctlseqs.decrqm_focus);
178178+ // _ = try tty.write(ctlseqs.decrqm_sync);
179179+ _ = try tty.write(ctlseqs.decrqm_unicode);
180180+ _ = try tty.write(ctlseqs.decrqm_color_theme);
181181+ // TODO: XTVERSION has a DCS response. uncomment when we can parse
182182+ // that
183183+ // _ = try tty.write(ctlseqs.xtversion);
184184+ _ = try tty.write(ctlseqs.csi_u_query);
185185+ // TODO: KITTY_GRAPHICS has an APC response. uncomment when we can
186186+ // parse that
187187+ // that
188188+ // _ = try tty.write(ctlseqs.kitty_graphics_query);
189189+ _ = try tty.write(ctlseqs.sixel_geometry_query);
179190180191 // TODO: XTGETTCAP queries ("RGB", "Smulx")
181192182182- _ = try writer.write(ctlseqs.primary_device_attrs);
183183- try writer.flush();
193193+ _ = try tty.write(ctlseqs.primary_device_attrs);
194194+ try tty.flush();
195195+ }
196196+197197+ // the next render call will refresh the entire screen
198198+ pub fn queueRefresh(self: *Self) void {
199199+ self.refresh = true;
184200 }
185201186202 /// draws the screen to the terminal
···192208 self.render_dur += std.time.microTimestamp() - timer_start;
193209 }
194210211211+ defer self.refresh = false;
195212 defer tty.flush() catch {};
213213+214214+ // Set up sync before we write anything
215215+ // TODO: optimize sync so we only sync _when we have changes_. This
216216+ // requires a smarter buffered writer, we'll probably have to write
217217+ // our own
218218+ _ = try tty.write(ctlseqs.sync_set);
219219+ defer _ = tty.write(ctlseqs.sync_reset) catch {};
196220197221 // Send the cursor to 0,0
198222 // TODO: this needs to move after we optimize writes. We only do
···218242 }
219243 // If cell is the same as our last frame, we don't need to do
220244 // anything
221221- if (self.screen_last.buf[i].eql(cell)) {
245245+ if (!self.refresh and self.screen_last.buf[i].eql(cell)) {
222246 reposition = true;
223247 // Close any osc8 sequence we might be in before
224248 // repositioning