From ad3c08e1cbd71f9e3e0ca02eac9ea9888a8c808a Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Thu, 20 Oct 2016 07:35:17 +0530 Subject: [PATCH] Start work on keyboard handling --- kitty/boss.py | 3 ++- kitty/keys.py | 22 ++++++++++++++++++++++ kitty/screen.py | 2 +- kitty/term.py | 12 ++++++++++++ 4 files changed, 37 insertions(+), 2 deletions(-) create mode 100644 kitty/keys.py diff --git a/kitty/boss.py b/kitty/boss.py index d8c891e1c..4d0d756b0 100644 --- a/kitty/boss.py +++ b/kitty/boss.py @@ -30,6 +30,7 @@ class Boss(QObject): s.write_to_child.connect(self.write_to_child) self.term = TerminalWidget(opts, self.tracker, self.screen.linebuf, parent) self.term.relayout_lines.connect(self.relayout_lines) + self.term.send_data_to_child.connect(self.write_to_child) resize_pty(self.screen.columns, self.screen.lines) def apply_opts(self, opts): @@ -46,7 +47,7 @@ class Boss(QObject): def write_ready(self, write_fd): while self.write_buf: - n = os.write(write_fd, io.DEFAULT_BUFFER_SIZE) + n = os.write(write_fd, self.write_buf) if not n: return self.write_buf = self.write_buf[n:] diff --git a/kitty/keys.py b/kitty/keys.py new file mode 100644 index 000000000..45af41638 --- /dev/null +++ b/kitty/keys.py @@ -0,0 +1,22 @@ +#!/usr/bin/env python +# vim:fileencoding=utf-8 +# License: GPL v3 Copyright: 2016, Kovid Goyal + + +from PyQt5.QtCore import Qt + +CTRL_MASK = 0b10011111 + + +def key_event_to_data(ev, mods): + data = bytearray() + if mods & Qt.AltModifier: + data.append(27) + t = ev.text() + if t: + t = t.encode('utf-8') + if mods & Qt.ControlModifier and len(t) == 1 and 0 < t[0] & CTRL_MASK < 33: + data.append(t[0] & CTRL_MASK) + else: + data.extend(t) + return bytes(data) diff --git a/kitty/screen.py b/kitty/screen.py index 69b804254..6c2aaa00a 100644 --- a/kitty/screen.py +++ b/kitty/screen.py @@ -866,7 +866,7 @@ class Screen(QObject): elif attr in g.BG_ANSI: c.bg = (attr << 8) | 1 elif attr in g.DISPLAY: - attr, val = g.TEXT[attr] + attr, val = g.DISPLAY[attr] setattr(c, attr, val) elif not attr: c.reset_display_attrs() diff --git a/kitty/term.py b/kitty/term.py index 10d3aae96..ad0afdc83 100644 --- a/kitty/term.py +++ b/kitty/term.py @@ -13,6 +13,7 @@ from .data_types import Line, Cursor from .utils import set_current_font_metrics from .tracker import ChangeTracker from .screen import wrap_cursor_position +from .keys import key_event_to_data def ascii_width(fm: QFontMetrics) -> int: @@ -25,6 +26,7 @@ def ascii_width(fm: QFontMetrics) -> int: class TerminalWidget(QWidget): relayout_lines = pyqtSignal(object, object, object, object) + send_data_to_child = pyqtSignal(object) cells_per_line = 80 lines_per_screen = 24 @@ -166,3 +168,13 @@ class TerminalWidget(QWidget): painter.fillRect(r, bg) if text.rstrip(): painter.drawText(x, y + self.baseline_offset, text) + + def keyPressEvent(self, ev): + mods = ev.modifiers() + if mods & Qt.ControlModifier and mods & Qt.ShiftModifier: + ev.accept() + return # Terminal shortcuts + data = key_event_to_data(ev, mods) + if data: + self.send_data_to_child.emit(data) + ev.accept()