Start work on keyboard handling
This commit is contained in:
parent
37db3c1e01
commit
ad3c08e1cb
@ -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
22
kitty/keys.py
Normal 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)
|
||||
@ -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()
|
||||
|
||||
@ -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()
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user