mirror of
https://github.com/kovidgoyal/kitty
synced 2026-07-28 11:11:47 +02:00
Only retransmit placements when actually needed
This commit is contained in:
@@ -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 {
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
Reference in New Issue
Block a user