You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

143 lines
4.9 KiB

#!/usr/bin/env python3
# MIT License
#
# Copyright (c) 2021 Eugenio Parodi <ceccopierangiolieugenio AT googlemail DOT com>
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in all
# copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
# SOFTWARE.
import os
import signal
import time
import threading, queue
import TermTk.libbpytop as lbt
from TermTk.TTkCore.log import TTkLog
from TermTk.TTkCore.cfg import *
from TermTk.TTkCore.canvas import *
from TermTk.TTkWidgets.layout import *
from TermTk.TTkWidgets.widget import *
class TTk(TTkWidget):
running: bool = False
events = None
key_events = None
mouse_events = None
screen_events = None
MOUSE_EVENT = 0x01
KEY_EVENT = 0x02
SCREEN_EVENT = 0x04
QUIT_EVENT = 0x08
TIME_EVENT = 0x10
def __init__(self, *args, **kwargs):
TTkWidget.__init__(self, *args, **kwargs)
self.events = queue.Queue()
self.key_events = queue.Queue()
self.mouse_events = queue.Queue()
self.screen_events = queue.Queue()
TTkHelper.registerRootCanvas(self._canvas)
def mainloop(self):
TTkLog.debug("Starting Main Loop...")
# Register events
try:
signal.signal(signal.SIGTSTP, self._SIGSTOP) # Ctrl-Z
signal.signal(signal.SIGCONT, self._SIGCONT) # Resume
signal.signal(signal.SIGINT, self._SIGINT) # Ctrl-C
except Exception as e:
TTkLog.error(f"{e}")
exit(1)
else:
TTkLog.debug("Signal Event Registered")
lbt.Term.registerResizeCb(self._win_resize_cb)
threading.Thread(target=self._input_thread, daemon=True).start()
# threading.Timer(30.0, hello)
self.running = True
lbt.Term.init()
while self.running:
# Main Loop
evt = self.events.get()
if evt is TTk.MOUSE_EVENT:
mevt = self.mouse_events.get()
TTkLog.info(f"Mouse Event: {mevt}")
elif evt is TTk.KEY_EVENT:
kevt = self.key_events.get()
TTkLog.info(f"Key Event: {kevt}")
pass
elif evt is TTk.TIME_EVENT:
pass
elif evt is TTk.SCREEN_EVENT:
self.setGeometry(0,0,TTkGlbl.term_w,TTkGlbl.term_h)
TTkLog.info(f"Resize: w:{TTkGlbl.term_w}, h:{TTkGlbl.term_h}")
elif evt is TTk.QUIT_EVENT:
TTkLog.debug(f"Quit.")
break
else:
TTkLog.error(f"Unhandled Event {evt}")
break
TTkHelper.paintAll()
lbt.Term.exit()
pass
def _win_resize_cb(self, width, height):
TTkGlbl.term_w = int(width)
TTkGlbl.term_h = int(height)
self.events.put(TTk.SCREEN_EVENT)
def _input_thread(self):
def _inputCallback(kevt=None, mevt=None):
if kevt is not None:
self.key_events.put(kevt)
self.events.put(TTk.KEY_EVENT)
if mevt is not None:
self.mouse_events.put(mevt)
self.events.put(TTk.MOUSE_EVENT)
return self.running
# Start input key loop
lbt.Input.get_key(_inputCallback)
def _canvas_thread(self):
pass
def quit(self):
self.events.put(TTk.QUIT_EVENT)
self.running = False
def _SIGSTOP(self, signum, frame):
"""Reset terminal settings and stop background input read before putting to sleep"""
TTkLog.debug("Captured SIGSTOP <CTRL-z>")
lbt.Term.stop()
# TODO: stop the threads
os.kill(os.getpid(), signal.SIGSTOP)
def _SIGCONT(self, signum, frame):
"""Set terminal settings and restart background input read"""
TTkLog.debug("Captured SIGCONT 'fg/bg'")
lbt.Term.cont()
# TODO: Restart threads
# TODO: Redraw the screen
def _SIGINT(self, signum, frame):
TTkLog.debug("Captured SIGINT <CTRL-C>")
self.quit()