Move implementation of screen_line() into C

This commit is contained in:
Kovid Goyal 2017-09-09 13:20:15 +05:30
parent 4ae3abb3cb
commit b8c34c3ee2
No known key found for this signature in database
GPG Key ID: 06BC317B515ACE7C
2 changed files with 21 additions and 7 deletions

View File

@ -301,13 +301,7 @@ class CharGrid:
def screen_line(self, y): def screen_line(self, y):
' Return the Line object corresponding to the yth line on the rendered screen ' ' Return the Line object corresponding to the yth line on the rendered screen '
if y >= 0 and y < self.screen.lines: return self.screen.visual_line(y, self.scrolled_by)
if self.scrolled_by:
if y < self.scrolled_by:
return self.screen.historybuf.line(self.scrolled_by - 1 - y)
return self.screen.line(y - self.scrolled_by)
else:
return self.screen.line(y)
def multi_click(self, count, x, y): def multi_click(self, count, x, y):
x, y = self.cell_for_pos(x, y) x, y = self.cell_for_pos(x, y)

View File

@ -1078,6 +1078,25 @@ line(Screen *self, PyObject *val) {
return (PyObject*) self->linebuf->line; return (PyObject*) self->linebuf->line;
} }
static PyObject*
visual_line(Screen *self, PyObject *args) {
// The line corresponding to the yth visual line, taking into account scrolling
unsigned int y, scrolled_by;
if (!PyArg_ParseTuple(args, "II", &y, &scrolled_by)) return NULL;
if (y >= self->lines) { Py_RETURN_NONE; }
if (scrolled_by) {
if (y < scrolled_by) {
historybuf_init_line(self->historybuf, scrolled_by - 1 - y, self->historybuf->line);
Py_INCREF(self->historybuf->line);
return (PyObject*) self->historybuf->line;
}
y -= scrolled_by;
}
linebuf_init_line(self->linebuf, y);
Py_INCREF(self->linebuf->line);
return (PyObject*) self->linebuf->line;
}
static PyObject* static PyObject*
draw(Screen *self, PyObject *src) { draw(Screen *self, PyObject *src) {
if (!PyUnicode_Check(src)) { PyErr_SetString(PyExc_TypeError, "A unicode string is required"); return NULL; } if (!PyUnicode_Check(src)) { PyErr_SetString(PyExc_TypeError, "A unicode string is required"); return NULL; }
@ -1271,6 +1290,7 @@ COUNT_WRAP(cursor_forward)
static PyMethodDef methods[] = { static PyMethodDef methods[] = {
MND(line, METH_O) MND(line, METH_O)
MND(visual_line, METH_VARARGS)
MND(draw, METH_O) MND(draw, METH_O)
MND(cursor_position, METH_VARARGS) MND(cursor_position, METH_VARARGS)
MND(set_mode, METH_VARARGS) MND(set_mode, METH_VARARGS)