Only retransmit placements when actually needed

This commit is contained in:
Kovid Goyal
2025-10-09 10:12:32 +05:30
parent 9be66bfe4a
commit a2255e979f
2 changed files with 39 additions and 19 deletions

View File

@@ -18,6 +18,15 @@ import (
var _ = fmt.Print var _ = fmt.Print
type placement struct {
gc *graphics.GraphicsCommand
x, y, x_offset int
}
func (p placement) equal(o placement) bool {
return p.x == o.x && p.x_offset == o.x_offset && p.y == o.y
}
type GraphicsHandler struct { type GraphicsHandler struct {
running_in_tmux bool running_in_tmux bool
image_id_counter, detection_file_id uint32 image_id_counter, detection_file_id uint32
@@ -28,8 +37,8 @@ type GraphicsHandler struct {
width, height int width, height int
image_width, image_height int image_width, image_height int
} }
image_transmitted uint32 image_transmitted uint32
has_placements bool current_placement, last_transmitted_placement placement
} }
func (self *GraphicsHandler) Cleanup() { func (self *GraphicsHandler) Cleanup() {
@@ -86,11 +95,21 @@ func (self *GraphicsHandler) Finalize(lp *loop.Loop) {
} }
func (self *GraphicsHandler) ClearPlacements(lp *loop.Loop) { func (self *GraphicsHandler) ClearPlacements(lp *loop.Loop) {
if self.image_transmitted > 0 && self.has_placements { self.current_placement.gc = nil
}
func (self *GraphicsHandler) ApplyPlacements(lp *loop.Loop) {
if self.current_placement.gc == nil {
g := self.new_graphics_command() g := self.new_graphics_command()
g.SetAction(graphics.GRT_action_delete).SetDelete(graphics.GRT_delete_by_id).SetImageId(self.image_transmitted) g.SetAction(graphics.GRT_action_delete).SetDelete(graphics.GRT_delete_by_id).SetImageId(self.image_transmitted)
_ = g.WriteWithPayloadToLoop(lp, nil) _ = g.WriteWithPayloadToLoop(lp, nil)
self.has_placements = false self.last_transmitted_placement.gc = nil
} else {
if self.last_transmitted_placement.gc == nil || !self.current_placement.equal(self.last_transmitted_placement) {
lp.MoveCursorTo(self.current_placement.x, self.current_placement.y)
_ = self.current_placement.gc.WriteWithPayloadToLoop(lp, nil)
self.last_transmitted_placement = self.current_placement
}
} }
} }
@@ -222,17 +241,17 @@ func (self *GraphicsHandler) transmit(lp *loop.Loop, img *images.ImageData, m *i
} }
func (self *GraphicsHandler) place_image(lp *loop.Loop, x, y, px_width int, sz ScreenSize) { func (self *GraphicsHandler) place_image(x, y, px_width int, sz ScreenSize) {
self.has_placements = true
gc := self.new_graphics_command() gc := self.new_graphics_command()
gc.SetAction(graphics.GRT_action_display).SetImageId(self.image_transmitted).SetPlacementId(1).SetCursorMovement(graphics.GRT_cursor_static) gc.SetAction(graphics.GRT_action_display).SetImageId(self.image_transmitted).SetPlacementId(1).SetCursorMovement(graphics.GRT_cursor_static)
if extra := px_width - self.last_rendered_image.image_width; extra > 1 { if extra := px_width - self.last_rendered_image.image_width; extra > 1 {
extra /= 2 extra /= 2
x += extra / sz.cell_width x += extra / sz.cell_width
gc.SetXOffset(uint64(extra % sz.cell_width)) self.current_placement.x_offset = extra % sz.cell_width
gc.SetXOffset(uint64(self.current_placement.x_offset))
} }
lp.MoveCursorTo(x, y) self.current_placement.x, self.current_placement.y = x, y
_ = gc.WriteWithPayloadToLoop(lp, nil) self.current_placement.gc = gc
} }
func (self *GraphicsHandler) RenderImagePreview(h *Handler, p *ImagePreview, x, y, width, height int) { func (self *GraphicsHandler) RenderImagePreview(h *Handler, p *ImagePreview, x, y, width, height int) {
@@ -245,7 +264,7 @@ func (self *GraphicsHandler) RenderImagePreview(h *Handler, p *ImagePreview, x,
if err != nil { if err != nil {
NewErrorPreview(fmt.Errorf("Failed to render image: %w", err)).Render(h, x, y, width, height) NewErrorPreview(fmt.Errorf("Failed to render image: %w", err)).Render(h, x, y, width, height)
} else if self.image_transmitted > 0 { } else if self.image_transmitted > 0 {
self.place_image(h.lp, x, y, px_width, sz) self.place_image(x, y, px_width, sz)
} }
}() }()
if self.last_rendered_image.p == p && self.last_rendered_image.width == width && self.last_rendered_image.height == height { if self.last_rendered_image.p == p && self.last_rendered_image.width == width && self.last_rendered_image.height == height {

View File

@@ -238,6 +238,16 @@ func (h *Handler) draw_screen() (err error) {
defer func() { defer func() {
h.state.mouse_state.UpdateHoveredIds() h.state.mouse_state.UpdateHoveredIds()
h.state.mouse_state.ApplyHoverStyles(h.lp) h.state.mouse_state.ApplyHoverStyles(h.lp)
h.graphics_handler.ApplyPlacements(h.lp)
if h.state.screen == NORMAL { // so that the cursor ends up in the right place
h.lp.MoveCursorTo(1, 1)
if h.state.DisplayTitle() {
h.lp.Println(h.state.WindowTitle())
h.draw_search_bar(1)
} else {
h.draw_search_bar(0)
}
}
h.lp.EndAtomicUpdate() h.lp.EndAtomicUpdate()
}() }()
h.lp.ClearScreenButNotGraphics() h.lp.ClearScreenButNotGraphics()
@@ -247,15 +257,6 @@ func (h *Handler) draw_screen() (err error) {
case NORMAL: case NORMAL:
matches, is_complete := h.get_results() matches, is_complete := h.get_results()
h.lp.SetWindowTitle(h.state.WindowTitle()) h.lp.SetWindowTitle(h.state.WindowTitle())
defer func() { // so that the cursor ends up in the right place
h.lp.MoveCursorTo(1, 1)
if h.state.DisplayTitle() {
h.lp.Println(h.state.WindowTitle())
h.draw_search_bar(1)
} else {
h.draw_search_bar(0)
}
}()
y := SEARCH_BAR_HEIGHT + utils.IfElse(h.state.DisplayTitle(), 1, 0) y := SEARCH_BAR_HEIGHT + utils.IfElse(h.state.DisplayTitle(), 1, 0)
footer_height, err := h.draw_footer() footer_height, err := h.draw_footer()
if err != nil { if err != nil {