Skip to content

Commit 62ec922

Browse files
committed
Added sb_pushline4 screen callback, which adds an extra 'continuation' argument
1 parent c76de09 commit 62ec922

File tree

3 files changed

+38
-17
lines changed

3 files changed

+38
-17
lines changed

include/vterm.h

+4
Original file line numberDiff line numberDiff line change
@@ -545,13 +545,17 @@ typedef struct {
545545
int (*sb_pushline)(int cols, const VTermScreenCell *cells, void *user);
546546
int (*sb_popline)(int cols, VTermScreenCell *cells, void *user);
547547
int (*sb_clear)(void* user);
548+
/* ABI-compat this is only used if vterm_screen_callbacks_has_pushline4() is called */
549+
int (*sb_pushline4)(int cols, const VTermScreenCell *cells, bool continuation, void *user);
548550
} VTermScreenCallbacks;
549551

550552
VTermScreen *vterm_obtain_screen(VTerm *vt);
551553

552554
void vterm_screen_set_callbacks(VTermScreen *screen, const VTermScreenCallbacks *callbacks, void *user);
553555
void *vterm_screen_get_cbdata(VTermScreen *screen);
554556

557+
void vterm_screen_callbacks_has_pushline4(VTermScreen *screen);
558+
555559
void vterm_screen_set_unrecognised_fallbacks(VTermScreen *screen, const VTermStateFallbacks *fallbacks, void *user);
556560
void *vterm_screen_get_unrecognised_fbdata(VTermScreen *screen);
557561

src/screen.c

+24-8
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ struct VTermScreen
4848

4949
const VTermScreenCallbacks *callbacks;
5050
void *cbdata;
51+
bool callbacks_has_pushline4;
5152

5253
VTermDamageSize damage_merge;
5354
/* start_row == -1 => no damage */
@@ -205,25 +206,31 @@ static int putglyph(VTermGlyphInfo *info, VTermPos pos, void *user)
205206
return 1;
206207
}
207208

208-
static void sb_pushline_from_row(VTermScreen *screen, int row)
209+
static void sb_pushline_from_row(VTermScreen *screen, int row, bool continuation)
209210
{
210211
VTermPos pos = { .row = row };
211212
for(pos.col = 0; pos.col < screen->cols; pos.col++)
212213
vterm_screen_get_cell(screen, pos, screen->sb_buffer + pos.col);
213214

214-
(screen->callbacks->sb_pushline)(screen->cols, screen->sb_buffer, screen->cbdata);
215+
if(screen->callbacks_has_pushline4 && screen->callbacks->sb_pushline4)
216+
(screen->callbacks->sb_pushline4)(screen->cols, screen->sb_buffer, continuation, screen->cbdata);
217+
else
218+
(screen->callbacks->sb_pushline)(screen->cols, screen->sb_buffer, screen->cbdata);
215219
}
216220

217221
static int premove(VTermRect rect, void *user)
218222
{
219223
VTermScreen *screen = user;
220224

221-
if(screen->callbacks && screen->callbacks->sb_pushline &&
225+
if(((screen->callbacks && screen->callbacks->sb_pushline) ||
226+
(screen->callbacks_has_pushline4 && screen->callbacks && screen->callbacks->sb_pushline4)) &&
222227
rect.start_row == 0 && rect.start_col == 0 && // starts top-left corner
223228
rect.end_col == screen->cols && // full width
224229
screen->buffer == screen->buffers[BUFIDX_PRIMARY]) { // not altscreen
225-
for(int row = 0; row < rect.end_row; row++)
226-
sb_pushline_from_row(screen, row);
230+
for(int row = 0; row < rect.end_row; row++) {
231+
const VTermLineInfo *lineinfo = vterm_state_get_lineinfo(screen->state, row);
232+
sb_pushline_from_row(screen, row, lineinfo->continuation);
233+
}
227234
}
228235

229236
return 1;
@@ -674,9 +681,12 @@ static void resize_buffer(VTermScreen *screen, int bufidx, int new_rows, int new
674681

675682
if(old_row >= 0 && bufidx == BUFIDX_PRIMARY) {
676683
/* Push spare lines to scrollback buffer */
677-
if(screen->callbacks && screen->callbacks->sb_pushline)
678-
for(int row = 0; row <= old_row; row++)
679-
sb_pushline_from_row(screen, row);
684+
if((screen->callbacks && screen->callbacks->sb_pushline) ||
685+
(screen->callbacks_has_pushline4 && screen->callbacks && screen->callbacks->sb_pushline4))
686+
for(int row = 0; row <= old_row; row++) {
687+
const VTermLineInfo *lineinfo = old_lineinfo + row;
688+
sb_pushline_from_row(screen, row, lineinfo->continuation);
689+
}
680690
if(active)
681691
statefields->pos.row -= (old_row + 1);
682692
}
@@ -884,6 +894,7 @@ static VTermScreen *screen_new(VTerm *vt)
884894

885895
screen->callbacks = NULL;
886896
screen->cbdata = NULL;
897+
screen->callbacks_has_pushline4 = false;
887898

888899
screen->buffers[BUFIDX_PRIMARY] = alloc_buffer(screen, rows, cols);
889900

@@ -1070,6 +1081,11 @@ void *vterm_screen_get_cbdata(VTermScreen *screen)
10701081
return screen->cbdata;
10711082
}
10721083

1084+
void vterm_screen_callbacks_has_pushline4(VTermScreen *screen)
1085+
{
1086+
screen->callbacks_has_pushline4 = true;
1087+
}
1088+
10731089
void vterm_screen_set_unrecognised_fallbacks(VTermScreen *screen, const VTermStateFallbacks *fallbacks, void *user)
10741090
{
10751091
vterm_state_set_unrecognised_fallbacks(screen->state, fallbacks, user);

t/harness.c

+10-9
Original file line numberDiff line numberDiff line change
@@ -582,7 +582,7 @@ static int screen_damage(VTermRect rect, void *user)
582582
}
583583

584584
static int want_screen_scrollback = 0;
585-
static int screen_sb_pushline(int cols, const VTermScreenCell *cells, void *user)
585+
static int screen_sb_pushline4(int cols, const VTermScreenCell *cells, bool continuation, void *user)
586586
{
587587
if(!want_screen_scrollback)
588588
return 1;
@@ -591,7 +591,7 @@ static int screen_sb_pushline(int cols, const VTermScreenCell *cells, void *user
591591
while(eol && !cells[eol-1].chars[0])
592592
eol--;
593593

594-
printf("sb_pushline %d =", cols);
594+
printf("sb_pushline %d%s =", cols, continuation ? " cont" : "");
595595
for(int c = 0; c < eol; c++)
596596
printf(" %02X", cells[c].chars[0]);
597597
printf("\n");
@@ -628,13 +628,13 @@ static int screen_sb_clear(void *user)
628628
}
629629

630630
VTermScreenCallbacks screen_cbs = {
631-
.damage = screen_damage,
632-
.moverect = moverect,
633-
.movecursor = movecursor,
634-
.settermprop = settermprop,
635-
.sb_pushline = screen_sb_pushline,
636-
.sb_popline = screen_sb_popline,
637-
.sb_clear = screen_sb_clear,
631+
.damage = screen_damage,
632+
.moverect = moverect,
633+
.movecursor = movecursor,
634+
.settermprop = settermprop,
635+
.sb_popline = screen_sb_popline,
636+
.sb_clear = screen_sb_clear,
637+
.sb_pushline4 = screen_sb_pushline4,
638638
};
639639

640640
int main(int argc, char **argv)
@@ -725,6 +725,7 @@ int main(int argc, char **argv)
725725
if(!screen)
726726
screen = vterm_obtain_screen(vt);
727727
vterm_screen_set_callbacks(screen, &screen_cbs, NULL);
728+
vterm_screen_callbacks_has_pushline4(screen);
728729

729730
int i = 10;
730731
int sense = 1;

0 commit comments

Comments
 (0)