Start work on unicode input kitten

This commit is contained in:
Kovid Goyal 2018-02-08 11:00:57 +05:30
parent bf5b0070c1
commit ef9a24932f
No known key found for this signature in database
GPG Key ID: 06BC317B515ACE7C
4 changed files with 46 additions and 9 deletions

View File

@ -137,7 +137,7 @@ class Loop:
self.iov_limit = os.sysconf('SC_IOV_MAX') - 1 self.iov_limit = os.sysconf('SC_IOV_MAX') - 1
except Exception: except Exception:
self.iov_limit = 255 self.iov_limit = 255
self.parse_input_from_terminal = partial(parse_input_from_terminal, self._on_text, self._on_dcs, self._on_csi, self.on_osc, self._on_pm, self._on_apc) self.parse_input_from_terminal = partial(parse_input_from_terminal, self._on_text, self._on_dcs, self._on_csi, self._on_osc, self._on_pm, self._on_apc)
self.ebs_pat = re.compile('([\177\r\x03\x04])') self.ebs_pat = re.compile('([\177\r\x03\x04])')
self.in_bracketed_paste = False self.in_bracketed_paste = False
self.sanitize_bracketed_paste = bool(sanitize_bracketed_paste) self.sanitize_bracketed_paste = bool(sanitize_bracketed_paste)
@ -202,6 +202,9 @@ class Loop:
def _on_pm(self, pm): def _on_pm(self, pm):
pass pass
def _on_osc(self, osc):
pass
def _on_apc(self, apc): def _on_apc(self, apc):
if apc.startswith('K'): if apc.startswith('K'):
try: try:
@ -272,6 +275,12 @@ class Loop:
def wakeup(self): def wakeup(self):
self._wakeup_write(b'1') self._wakeup_write(b'1')
def _modify_output_selector(self, waiting_for_write):
if waiting_for_write:
self.sel.register(self.output_fd, selectors.EVENT_WRITE)
else:
self.sel.unregister(self.output_fd)
def loop(self, handler): def loop(self, handler):
select = self.sel.select select = self.sel.select
tb = None tb = None
@ -288,10 +297,7 @@ class Loop:
break break
if has_data_to_write != waiting_for_write: if has_data_to_write != waiting_for_write:
waiting_for_write = has_data_to_write waiting_for_write = has_data_to_write
self.sel.modify( self._modify_output_selector(waiting_for_write)
self.output_fd, selectors.EVENT_WRITE
if waiting_for_write else 0, self._write_ready
)
events = select() events = select()
for key, mask in events: for key, mask in events:
try: try:
@ -316,10 +322,7 @@ class Loop:
break break
if has_data_to_write != waiting_for_write: if has_data_to_write != waiting_for_write:
waiting_for_write = has_data_to_write waiting_for_write = has_data_to_write
self.sel.modify( self._modify_output_selector(waiting_for_write)
self.output_fd, selectors.EVENT_WRITE
if waiting_for_write else 0, self._write_ready
)
events = select() events = select()
for key, mask in events: for key, mask in events:
key.data(handler) key.data(handler)

View File

@ -2,6 +2,8 @@
# vim:fileencoding=utf-8 # vim:fileencoding=utf-8
# License: GPL v3 Copyright: 2018, Kovid Goyal <kovid at kovidgoyal.net> # License: GPL v3 Copyright: 2018, Kovid Goyal <kovid at kovidgoyal.net>
from kitty.terminfo import string_capabilities
S7C1T = b'\033 F' S7C1T = b'\033 F'
SAVE_CURSOR = b'\0337' SAVE_CURSOR = b'\0337'
RESTORE_CURSOR = b'\0338' RESTORE_CURSOR = b'\0338'
@ -40,6 +42,10 @@ def reset_mode(which):
return '\033[{}{}l'.format(private, num).encode('ascii') return '\033[{}{}l'.format(private, num).encode('ascii')
def clear_screen():
return string_capabilities['clear'].replace(r'\E', '\033').encode('ascii')
def init_state(alternate_screen=True): def init_state(alternate_screen=True):
ans = ( ans = (
S7C1T + SAVE_CURSOR + SAVE_PRIVATE_MODE_VALUES + reset_mode('LNM') + S7C1T + SAVE_CURSOR + SAVE_PRIVATE_MODE_VALUES + reset_mode('LNM') +
@ -53,6 +59,7 @@ def init_state(alternate_screen=True):
) )
if alternate_screen: if alternate_screen:
ans += set_mode('ALTERNATE_SCREEN') ans += set_mode('ALTERNATE_SCREEN')
ans += clear_screen()
return ans return ans

View File

View File

@ -0,0 +1,27 @@
#!/usr/bin/env python
# vim:fileencoding=utf-8
# License: GPL v3 Copyright: 2018, Kovid Goyal <kovid at kovidgoyal.net>
import sys
from ..tui.handler import Handler
from ..tui.loop import Loop
class UnicodeInput(Handler):
def initialize(self, *args):
Handler.initialize(self, *args)
self.write('Testing 123...')
def on_interrupt(self):
self.quit_loop(1)
def on_eot(self):
self.quit_loop(1)
def main(args=sys.argv):
loop = Loop()
handler = UnicodeInput()
loop.loop(handler)