Skip to content

Commit

Permalink
Allow using dump_lines_with_attrs on either screen
Browse files Browse the repository at this point in the history
  • Loading branch information
kovidgoyal committed Oct 19, 2024
1 parent 56c7555 commit 661d8bc
Show file tree
Hide file tree
Showing 3 changed files with 40 additions and 36 deletions.
2 changes: 1 addition & 1 deletion kitty/fast_data_types.pyi
Original file line number Diff line number Diff line change
Expand Up @@ -1226,7 +1226,7 @@ class Screen:
def draw(self, text: str) -> None:
pass

def dump_lines_with_attrs(self, acc: Callable[[str], None]) -> None:
def dump_lines_with_attrs(self, acc: Callable[[str], None], which_screen: int = -1) -> None:
pass

def apply_sgr(self, text: str) -> None:
Expand Down
68 changes: 35 additions & 33 deletions kitty/screen.c
Original file line number Diff line number Diff line change
Expand Up @@ -4701,40 +4701,42 @@ scroll_prompt_to_bottom(Screen *self, PyObject *args UNUSED) {
Py_RETURN_NONE;
}

static void
dump_line_with_attrs(Screen *self, int y, PyObject *accum) {
Line *line = range_line_(self, y);
RAII_PyObject(u, PyUnicode_FromFormat("\x1b[31m%d: \x1b[39m", y++));
if (!u) return;
RAII_PyObject(r1, PyObject_CallOneArg(accum, u));
if (!r1) return;
#define call_string(s) { RAII_PyObject(ret, PyObject_CallFunction(accum, "s", s)); if (!ret) return; }
switch (line->attrs.prompt_kind) {
case UNKNOWN_PROMPT_KIND: break;
case PROMPT_START: call_string("\x1b[32mprompt \x1b[39m"); break;
case SECONDARY_PROMPT: call_string("\x1b[32msecondary_prompt \x1b[39m"); break;
case OUTPUT_START: call_string("\x1b[33moutput \x1b[39m"); break;
}
if (line->attrs.is_continued) call_string("continued ");
if (line->attrs.has_dirty_text) call_string("dirty ");
call_string("\n");
RAII_PyObject(t, line_as_unicode(line, false)); if (!t) return;
RAII_PyObject(r2, PyObject_CallOneArg(accum, t)); if (!r2) return;
call_string("\n");
#undef call_string
}

static PyObject*
dump_lines_with_attrs(Screen *self, PyObject *accum) {
int y = (self->linebuf == self->main_linebuf) ? -self->historybuf->count : 0;
PyObject *t;
while (y < (int)self->lines) {
Line *line = range_line_(self, y);
t = PyUnicode_FromFormat("\x1b[31m%d: \x1b[39m", y++);
if (t) {
PyObject_CallFunctionObjArgs(accum, t, NULL);
Py_DECREF(t);
}
switch (line->attrs.prompt_kind) {
case UNKNOWN_PROMPT_KIND:
break;
case PROMPT_START:
PyObject_CallFunction(accum, "s", "\x1b[32mprompt \x1b[39m");
break;
case SECONDARY_PROMPT:
PyObject_CallFunction(accum, "s", "\x1b[32msecondary_prompt \x1b[39m");
break;
case OUTPUT_START:
PyObject_CallFunction(accum, "s", "\x1b[33moutput \x1b[39m");
break;
}
if (line->attrs.is_continued) PyObject_CallFunction(accum, "s", "continued ");
if (line->attrs.has_dirty_text) PyObject_CallFunction(accum, "s", "dirty ");
PyObject_CallFunction(accum, "s", "\n");
t = line_as_unicode(line, false);
if (t) {
PyObject_CallFunctionObjArgs(accum, t, NULL);
Py_DECREF(t);
}
PyObject_CallFunction(accum, "s", "\n");
dump_lines_with_attrs(Screen *self, PyObject *args) {
PyObject *accum; int which_screen = -1;
if (!PyArg_ParseTuple(args, "O|i", &accum, &which_screen)) return NULL;
LineBuf *orig = self->linebuf;
switch(which_screen) {
case 0: self->linebuf = self->main_linebuf; break;
case 1: self->linebuf = self->alt_linebuf; break;
}
int y = (self->linebuf == self->main_linebuf) ? -self->historybuf->count : 0;
while (y < (int)self->lines && !PyErr_Occurred()) dump_line_with_attrs(self, y++, accum);
self->linebuf = orig;
if (PyErr_Occurred()) return NULL;
Py_RETURN_NONE;
}

Expand Down Expand Up @@ -4790,7 +4792,7 @@ static PyMethodDef methods[] = {
METHODB(test_parse_written_data, METH_VARARGS),
MND(line_edge_colors, METH_NOARGS)
MND(line, METH_O)
MND(dump_lines_with_attrs, METH_O)
MND(dump_lines_with_attrs, METH_VARARGS)
MND(cursor_at_prompt, METH_NOARGS)
MND(visual_line, METH_VARARGS)
MND(current_url_text, METH_NOARGS)
Expand Down
6 changes: 4 additions & 2 deletions kitty/window.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
Any,
Callable,
Deque,
Literal,
NamedTuple,
Optional,
Union,
Expand Down Expand Up @@ -1005,9 +1006,10 @@ def send_key_sequence(self, *keys: KeyEvent, synthesize_release_events: bool = T
self.write_to_child(enc)

@ac('debug', 'Show a dump of the current lines in the scrollback + screen with their line attributes')
def dump_lines_with_attrs(self) -> None:
def dump_lines_with_attrs(self, which_screen: Literal['main', 'alternate', 'current'] = 'current') -> None:
strings: list[str] = []
self.screen.dump_lines_with_attrs(strings.append)
ws = 0 if which_screen == 'main' else (1 if which_screen == 'alternate' else -1)
self.screen.dump_lines_with_attrs(strings.append, ws)
text = ''.join(strings)
get_boss().display_scrollback(self, text, title='Dump of lines', report_cursor=False)

Expand Down

0 comments on commit 661d8bc

Please sign in to comment.