jw-python/tools/python/jwutils/Signals.py

37 lines
1,003 B
Python
Raw Permalink Normal View History

# -*- coding: utf-8 -*-
from typing import Dict, Callable
from abc import ABC, abstractmethod
_handled_signals: Dict[int, Callable] = {}
def _signal_handler(signal, frame):
if not signal in _handled_signals.keys():
return
for h in _handled_signals[signal]:
h.func(signal, *h.args)
class Signals:
class Handler:
def __init__(self, func, args):
self.func = func
self.args = args
def __init(self):
pass
@classmethod
@abstractmethod
def _add_handler(self, signal, handler):
raise Exception("_add_handler() is not reimplemented")
@classmethod
def add_handler(cls, signals, handler, *args):
for signal in signals:
h = Signals.Handler(handler, args)
if not signal in _handled_signals.keys():
_handled_signals[signal] = [h]
cls._add_signal_handler(signal, _signal_handler)
else:
_handled_signals[signal].add(h)