boon

unix terminal framework
git clone https://git.ce9e.org/boon.git

commit
01623df24d7847d03707f474a8d883857c439fe1
parent
26fa20d509cb49c85c731f2ca1b36f71293ccd96
Author
Tobias Bengfort <tobias.bengfort@posteo.de>
Date
2020-09-05 15:09
use selector instead of select

> high-level and efficient I/O multiplexing [which uses] the most
> efficient implementation [epoll] available on the current platform

Diffstat

M boon.py 22 ++++++++++++----------

1 files changed, 12 insertions, 10 deletions


diff --git a/boon.py b/boon.py

@@ -1,6 +1,6 @@
    1     1 import os
    2     2 import curses
    3    -1 import select
   -1     3 import selectors
    4     4 import shutil
    5     5 import signal
    6     6 import sys
@@ -112,22 +112,24 @@ class App:
  112   112 	def on_resize(self, *args):
  113   113 		os.write(self.resize_out, b'.')
  114   114 
   -1   115 	def select(self, *fileobjs):
   -1   116 		with selectors.DefaultSelector() as sel:
   -1   117 			for fileobj in fileobjs:
   -1   118 				sel.register(fileobj, selectors.EVENT_READ)
   -1   119 			while self.running:
   -1   120 				for key, mask in sel.select():
   -1   121 					yield key.fileobj
   -1   122 
  115   123 	def run(self):
  116   124 		self.running = True
  117   125 		with fullscreen():
  118   126 			self.on_resize()
  119    -1 			while self.running:
  120    -1 				try:
  121    -1 					r, _w, _e = select.select(
  122    -1 						[sys.stdin, self.resize_in], [], [], self.timeout
  123    -1 					)
  124    -1 				except select.error:
  125    -1 					continue
  126    -1 				if self.resize_in in r:
   -1   127 			for fileobj in self.select(sys.stdin, self.resize_in):
   -1   128 				if fileobj is self.resize_in:
  127   129 					os.read(self.resize_in, 8)
  128   130 					self.cols, self.rows = shutil.get_terminal_size()
  129   131 					self.update(force=True)
  130    -1 				if sys.stdin in r:
   -1   132 				elif fileobj is sys.stdin:
  131   133 					self.on_key(getch())
  132   134 					self.update()
  133   135