Start work on keyboard handling

This commit is contained in:
Kovid Goyal 2016-10-20 07:35:17 +05:30
parent 37db3c1e01
commit ad3c08e1cb
4 changed files with 37 additions and 2 deletions

View File

@ -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:]

22
kitty/keys.py Normal file
View File

@ -0,0 +1,22 @@
#!/usr/bin/env python
# vim:fileencoding=utf-8
# License: GPL v3 Copyright: 2016, Kovid Goyal <kovid at kovidgoyal.net>
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)

View File

@ -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()

View File

@ -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()