From 3c73da224aea0751a894474d9e42e552cf7db87a Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Sun, 13 Nov 2016 14:16:56 +0530 Subject: [PATCH] Ignore errors when creating savepoints as the overhead fo tracking them was too high --- kitty/data-types.h | 6 +++--- kitty/screen.c | 41 ++++++++++++++++++----------------------- 2 files changed, 21 insertions(+), 26 deletions(-) diff --git a/kitty/data-types.h b/kitty/data-types.h index 7ac3944bb..2ec3bf5d4 100644 --- a/kitty/data-types.h +++ b/kitty/data-types.h @@ -279,8 +279,8 @@ void cursor_reset(Cursor*); void linebuf_set_attribute(LineBuf *, unsigned int , unsigned int ); Cursor* cursor_copy(Cursor*); void linebuf_clear(LineBuf *); -bool screen_restore_cursor(Screen *); -bool screen_save_cursor(Screen *); +void screen_restore_cursor(Screen *); +void screen_save_cursor(Screen *); void screen_cursor_position(Screen*, unsigned int, unsigned int); void screen_erase_in_display(Screen *, unsigned int, bool); void screen_draw(Screen *screen, uint8_t *buf, unsigned int buflen); @@ -293,7 +293,7 @@ void linebuf_clear_line(LineBuf *self, index_type y); void screen_ensure_bounds(Screen *self, bool use_margins); void line_clear_text(Line *self, unsigned int at, unsigned int num, int ch); void line_apply_cursor(Line *self, Cursor *cursor, unsigned int at, unsigned int num, bool clear_char); -bool screen_toggle_screen_buffer(Screen *self); +void screen_toggle_screen_buffer(Screen *self); void screen_normal_keypad_mode(Screen *self); void screen_alternate_keypad_mode(Screen *self); void screen_change_default_color(Screen *self, unsigned int which, uint32_t col); diff --git a/kitty/screen.c b/kitty/screen.c index d6f99da43..3bf0994c4 100644 --- a/kitty/screen.c +++ b/kitty/screen.c @@ -45,8 +45,8 @@ new(PyTypeObject *type, PyObject *args, PyObject UNUSED *kwds) { return (PyObject*) self; } -bool screen_reset(Screen *self) { - if (self->linebuf == self->alt_linebuf) {if (!screen_toggle_screen_buffer(self)) return false; } +void screen_reset(Screen *self) { + if (self->linebuf == self->alt_linebuf) screen_toggle_screen_buffer(self); linebuf_clear(self->linebuf); self->current_charset = 2; self->g0_charset = translation_table('B'); @@ -63,7 +63,6 @@ bool screen_reset(Screen *self) { screen_change_default_color(self, FG, 0); screen_change_default_color(self, BG, 0); tracker_update_screen(self->change_tracker); - return true; } @@ -185,8 +184,8 @@ void screen_shift_in(Screen UNUSED *self, uint8_t UNUSED ch) { // TODO: Implement this } -bool screen_toggle_screen_buffer(Screen *self) { - if (!screen_save_cursor(self)) return false; +void screen_toggle_screen_buffer(Screen *self) { + screen_save_cursor(self); if (self->linebuf == self->main_linebuf) { self->linebuf = self->alt_linebuf; self->savepoints = self->alt_savepoints; @@ -196,7 +195,6 @@ bool screen_toggle_screen_buffer(Screen *self) { } screen_restore_cursor(self); tracker_update_screen(self->change_tracker); - return true; } // Graphics {{{ @@ -238,7 +236,7 @@ static inline void set_mode_from_const(Screen *self, int mode, bool val) { } } -bool screen_set_mode(Screen *self, int mode) { +void screen_set_mode(Screen *self, int mode) { if (mode == DECCOLM) { // When DECCOLM mode is set, the screen is erased and the cursor // moves to the home position. @@ -263,10 +261,9 @@ bool screen_set_mode(Screen *self, int mode) { } if (mode == ALTERNATE_SCREEN && self->linebuf == self->main_linebuf) { - if (!screen_toggle_screen_buffer(self)) return false; + screen_toggle_screen_buffer(self); } set_mode_from_const(self, mode, true); - return true; } static PyObject* @@ -285,7 +282,7 @@ enable_focus_tracking(Screen *self) { return ans; } -bool screen_reset_mode(Screen *self, int mode) { +void screen_reset_mode(Screen *self, int mode) { if (mode == DECCOLM) { // When DECCOLM mode is set, the screen is erased and the cursor // moves to the home position. @@ -310,11 +307,10 @@ bool screen_reset_mode(Screen *self, int mode) { } if (mode == ALTERNATE_SCREEN && self->linebuf != self->main_linebuf) { - if (!screen_toggle_screen_buffer(self)) return false; + screen_toggle_screen_buffer(self); } set_mode_from_const(self, mode, false); - return true; } // }}} @@ -381,23 +377,23 @@ void screen_linefeed(Screen *self, uint8_t UNUSED ch) { screen_ensure_bounds(self, false); } -bool screen_save_cursor(Screen *self) { +void screen_save_cursor(Screen *self) { + // We fail silently on out of memory errors Savepoint *sp = alloc_savepoint(); - if (sp == NULL) return false; + if (sp == NULL) { PyErr_Clear(); return; } sp->cursor = cursor_copy(self->cursor); - if (sp->cursor == NULL) { Py_CLEAR(sp); return NULL; } + if (sp->cursor == NULL) { Py_CLEAR(sp); PyErr_Clear(); return; } sp->g0_charset = self->g0_charset; sp->g1_charset = self->g1_charset; sp->current_charset = self->current_charset; sp->mDECOM = self->modes.mDECOM; sp->mDECAWM = self->modes.mDECAWM; sp->utf8_state = self->utf8_state; - bool ret = PyList_Append(self->savepoints, (PyObject*)sp) == 0; + PyList_Append(self->savepoints, (PyObject*)sp); // We ignore failures Py_CLEAR(sp); - return ret; } -bool screen_restore_cursor(Screen *self) { +void screen_restore_cursor(Screen *self) { Py_ssize_t sz = PyList_GET_SIZE(self->savepoints); if (sz > 0) { Savepoint *sp = (Savepoint*)PyList_GET_ITEM(self->savepoints, sz - 1); @@ -411,9 +407,8 @@ bool screen_restore_cursor(Screen *self) { } else { screen_cursor_position(self, 1, 1); tracker_cursor_changed(self->change_tracker); - if (!screen_reset_mode(self, DECOM)) return false; + screen_reset_mode(self, DECOM); } - return true; } void screen_ensure_bounds(Screen *self, bool use_margins/*=false*/) { @@ -547,7 +542,7 @@ draw(Screen *self, PyObject *args) { static PyObject* reset(Screen *self) { #define reset_doc "" - if(!screen_reset(self)) return NULL; + screen_reset(self); Py_RETURN_NONE; } @@ -558,7 +553,7 @@ reset_mode(Screen *self, PyObject *args) { unsigned int mode; if (!PyArg_ParseTuple(args, "I|p", &mode, &private)) return NULL; if (private) mode <<= 5; - if (!screen_reset_mode(self, mode)) return NULL; + screen_reset_mode(self, mode); Py_RETURN_NONE; } @@ -569,7 +564,7 @@ set_mode(Screen *self, PyObject *args) { unsigned int mode; if (!PyArg_ParseTuple(args, "I|p", &mode, &private)) return NULL; if (private) mode <<= 5; - if (!screen_set_mode(self, mode)) return NULL; + screen_set_mode(self, mode); Py_RETURN_NONE; }