From f25b2d241fa36f5f08db0334519c391318da1150 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Wed, 30 Nov 2016 08:03:29 +0530 Subject: [PATCH] Support for turning off auto-repeat --- kitty/data-types.h | 2 +- kitty/modes.h | 5 +++++ kitty/screen.c | 8 ++++++-- kitty/tabs.py | 11 ++++++----- 4 files changed, 18 insertions(+), 8 deletions(-) diff --git a/kitty/data-types.h b/kitty/data-types.h index 7510091bb..26ac576bb 100644 --- a/kitty/data-types.h +++ b/kitty/data-types.h @@ -226,7 +226,7 @@ PyTypeObject ChangeTracker_Type; typedef struct { - bool mLNM, mIRM, mDECTCEM, mDECSCNM, mDECOM, mDECAWM, mDECCOLM, + bool mLNM, mIRM, mDECTCEM, mDECSCNM, mDECOM, mDECAWM, mDECCOLM, mDECARM, mBRACKETED_PASTE, mFOCUS_TRACKING, mMOUSE_BUTTON_TRACKING, mMOUSE_MOTION_TRACKING, mMOUSE_SGR_MODE, mMOUSE_MOVE_TRACKING; } ScreenModes; diff --git a/kitty/modes.h b/kitty/modes.h index 5d0f62cb3..b1554879c 100644 --- a/kitty/modes.h +++ b/kitty/modes.h @@ -30,10 +30,15 @@ // on the screen. #define DECCOLM (3 << 5) +// Scroll speed +#define DECSCLM (4 << 5) // *Screen Mode*: toggles screen-wide reverse-video mode. #define DECSCNM (5 << 5) +// Auto-repeat of keys +#define DECARM (8 << 5) + /* *Origin Mode*: allows cursor addressing relative to a user-defined origin. This mode resets when the terminal is powered up or reset. It does not affect the erase in display (ED) function. diff --git a/kitty/screen.c b/kitty/screen.c index 6dba16a5e..49a0da4b7 100644 --- a/kitty/screen.c +++ b/kitty/screen.c @@ -11,7 +11,7 @@ #include "tracker.h" #include "modes.h" -static const ScreenModes empty_modes = {0, .mDECAWM=true, .mDECTCEM=true}; +static const ScreenModes empty_modes = {0, .mDECAWM=true, .mDECTCEM=true, .mDECARM=true}; // Constructor/destructor {{{ @@ -305,6 +305,7 @@ set_mode_from_const(Screen *self, unsigned int mode, bool val) { switch(mode) { SIMPLE_MODE(LNM) SIMPLE_MODE(IRM) + SIMPLE_MODE(DECARM) SIMPLE_MODE(BRACKETED_PASTE) SIMPLE_MODE(MOUSE_BUTTON_TRACKING) SIMPLE_MODE(MOUSE_MOVE_TRACKING) @@ -313,7 +314,8 @@ set_mode_from_const(Screen *self, unsigned int mode, bool val) { SIMPLE_MODE(FOCUS_TRACKING) case DECCKM: - break; // we ignore this mode + case DECSCLM: + break; // we ignore these modes case DECTCEM: self->modes.mDECTCEM = val; if ((val && self->cursor->hidden) || (!val && !self->cursor->hidden)) { @@ -918,6 +920,7 @@ MODE_GETTER(mouse_button_tracking_enabled, MOUSE_BUTTON_TRACKING) MODE_GETTER(mouse_motion_tracking_enabled, MOUSE_MOTION_TRACKING) MODE_GETTER(mouse_move_tracking_enabled, MOUSE_MOVE_TRACKING) MODE_GETTER(mouse_in_sgr_mode, MOUSE_SGR_MODE) +MODE_GETTER(auto_repeat_enabled, DECARM) static PyObject* @@ -1086,6 +1089,7 @@ static PyMethodDef methods[] = { MND(set_scroll_cell_data, METH_VARARGS) MND(apply_selection, METH_VARARGS) MND(in_bracketed_paste_mode, METH_NOARGS) + MND(auto_repeat_enabled, METH_NOARGS) MND(focus_tracking_enabled, METH_NOARGS) MND(mouse_button_tracking_enabled, METH_NOARGS) MND(mouse_motion_tracking_enabled, METH_NOARGS) diff --git a/kitty/tabs.py b/kitty/tabs.py index aa542ea25..7fabdbe95 100644 --- a/kitty/tabs.py +++ b/kitty/tabs.py @@ -274,11 +274,12 @@ class TabManager(Thread): if not passthrough: return if window: - if window.char_grid.scrolled_by and key not in MODIFIER_KEYS: - window.scroll_end() - data = interpret_key_event(key, scancode, mods) - if data: - window.write_to_child(data) + if window.screen.auto_repeat_enabled() or action == GLFW_PRESS: + if window.char_grid.scrolled_by and key not in MODIFIER_KEYS: + window.scroll_end() + data = interpret_key_event(key, scancode, mods) + if data: + window.write_to_child(data) def on_focus(self, window, focused): w = self.active_window