From 469bcf37d7a5ce74464fad9c30580e1b3c617e68 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Wed, 17 Mar 2021 14:50:10 +0100 Subject: [PATCH 1/7] moved pynput threads to separate file --- pype/modules/idle_manager/idle_logic.py | 24 +++++++++++++++++++++++ pype/modules/idle_manager/idle_manager.py | 24 ----------------------- 2 files changed, 24 insertions(+), 24 deletions(-) create mode 100644 pype/modules/idle_manager/idle_logic.py diff --git a/pype/modules/idle_manager/idle_logic.py b/pype/modules/idle_manager/idle_logic.py new file mode 100644 index 0000000000..ab3f6790e6 --- /dev/null +++ b/pype/modules/idle_manager/idle_logic.py @@ -0,0 +1,24 @@ +from pynput import mouse, keyboard + + +class MouseThread(mouse.Listener): + """Listens user's mouse movement.""" + + def __init__(self, callback): + super(MouseThread, self).__init__(on_move=self.on_move) + self.callback = callback + + def on_move(self, posx, posy): + self.callback() + + +class KeyboardThread(keyboard.Listener): + """Listens user's keyboard input.""" + + def __init__(self, callback): + super(KeyboardThread, self).__init__(on_press=self.on_press) + + self.callback = callback + + def on_press(self, key): + self.callback() diff --git a/pype/modules/idle_manager/idle_manager.py b/pype/modules/idle_manager/idle_manager.py index fa6d70d229..3790d503ff 100644 --- a/pype/modules/idle_manager/idle_manager.py +++ b/pype/modules/idle_manager/idle_manager.py @@ -4,7 +4,6 @@ import threading from abc import ABCMeta, abstractmethod import six -from pynput import mouse, keyboard from pype.lib import PypeLogger from pype.modules import PypeModule, ITrayService @@ -162,26 +161,3 @@ class IdleManagerThread(threading.Thread): pass self.on_stop() - - -class MouseThread(mouse.Listener): - """Listens user's mouse movement.""" - - def __init__(self, callback): - super(MouseThread, self).__init__(on_move=self.on_move) - self.callback = callback - - def on_move(self, posx, posy): - self.callback() - - -class KeyboardThread(keyboard.Listener): - """Listens user's keyboard input.""" - - def __init__(self, callback): - super(KeyboardThread, self).__init__(on_press=self.on_press) - - self.callback = callback - - def on_press(self, key): - self.callback() From 6d09da37c07799c5bed7818bf8ee0668c5a535ad Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Wed, 17 Mar 2021 14:50:24 +0100 Subject: [PATCH 2/7] import pynput threads only when needed --- pype/modules/idle_manager/idle_manager.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/pype/modules/idle_manager/idle_manager.py b/pype/modules/idle_manager/idle_manager.py index 3790d503ff..81e03c96df 100644 --- a/pype/modules/idle_manager/idle_manager.py +++ b/pype/modules/idle_manager/idle_manager.py @@ -119,12 +119,18 @@ class IdleManagerThread(threading.Thread): self.log.info("IdleManagerThread has stopped") self.module.on_thread_stop() + def _create_threads(self): + from .idle_logic import MouseThread, KeyboardThread + + thread_mouse = MouseThread(self.reset_time) + thread_keyboard = KeyboardThread(self.reset_time) + return thread_mouse, thread_keyboard + def run(self): self.log.info("IdleManagerThread has started") self.is_running = True - thread_mouse = MouseThread(self.reset_time) + thread_mouse, thread_keyboard = self._create_threads() thread_mouse.start() - thread_keyboard = KeyboardThread(self.reset_time) thread_keyboard.start() try: while self.is_running: From 345e5971145a39b2b91cac1c5165361666ba3b03 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Wed, 17 Mar 2021 14:50:33 +0100 Subject: [PATCH 3/7] minor change --- pype/modules/idle_manager/idle_manager.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pype/modules/idle_manager/idle_manager.py b/pype/modules/idle_manager/idle_manager.py index 81e03c96df..25309e9443 100644 --- a/pype/modules/idle_manager/idle_manager.py +++ b/pype/modules/idle_manager/idle_manager.py @@ -98,7 +98,7 @@ class IdleManager(PypeModule, ITrayService): class IdleManagerThread(threading.Thread): def __init__(self, module, *args, **kwargs): super(IdleManagerThread, self).__init__(*args, **kwargs) - self.log = PypeLogger().get_logger(self.__class__.__name__) + self.log = PypeLogger.get_logger(self.__class__.__name__) self.module = module self.threads = [] self.is_running = False From d5a3e92f851e4ac19300dc1414b9922a18fe0707 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Wed, 17 Mar 2021 14:51:30 +0100 Subject: [PATCH 4/7] renamed file `idle_manager` to `idle_module` --- pype/modules/idle_manager/__init__.py | 2 +- pype/modules/idle_manager/{idle_manager.py => idle_module.py} | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename pype/modules/idle_manager/{idle_manager.py => idle_module.py} (100%) diff --git a/pype/modules/idle_manager/__init__.py b/pype/modules/idle_manager/__init__.py index 4bc33c87c1..651f360c50 100644 --- a/pype/modules/idle_manager/__init__.py +++ b/pype/modules/idle_manager/__init__.py @@ -1,4 +1,4 @@ -from .idle_manager import ( +from .idle_module import ( IdleManager, IIdleManager ) diff --git a/pype/modules/idle_manager/idle_manager.py b/pype/modules/idle_manager/idle_module.py similarity index 100% rename from pype/modules/idle_manager/idle_manager.py rename to pype/modules/idle_manager/idle_module.py From 6337354ca95df02ff6817de06ede0aff35bda19d Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Thu, 18 Mar 2021 18:11:34 +0100 Subject: [PATCH 5/7] always register lists of callbacks as time may override them --- pype/modules/timers_manager/timers_manager.py | 12 ++++++------ pype/modules/timers_manager/widget_user_idle.py | 11 ++++++----- 2 files changed, 12 insertions(+), 11 deletions(-) diff --git a/pype/modules/timers_manager/timers_manager.py b/pype/modules/timers_manager/timers_manager.py index 68890640b3..b83f51f0ba 100644 --- a/pype/modules/timers_manager/timers_manager.py +++ b/pype/modules/timers_manager/timers_manager.py @@ -1,4 +1,5 @@ import os +import collections from abc import ABCMeta, abstractmethod import six from .. import PypeModule, ITrayService, IIdleManager, IWebServerRoutes @@ -159,26 +160,25 @@ class TimersManager(PypeModule, ITrayService, IIdleManager, IWebServerRoutes): def callbacks_by_idle_time(self): """Implementation of IIdleManager interface.""" # Time when message is shown - callbacks = { - self.time_show_message: lambda: self.time_callback(0) - } + callbacks = collections.defaultdict(list) + callbacks[self.time_show_message].append(lambda: self.time_callback(0)) # Times when idle is between show widget and stop timers show_to_stop_range = range( self.time_show_message - 1, self.time_stop_timer ) for num in show_to_stop_range: - callbacks[num] = lambda: self.time_callback(1) + callbacks[num].append(lambda: self.time_callback(1)) # Times when widget is already shown and user restart idle shown_and_moved_range = range( self.time_stop_timer - self.time_show_message ) for num in shown_and_moved_range: - callbacks[num] = lambda: self.time_callback(1) + callbacks[num].append(lambda: self.time_callback(1)) # Time when timers are stopped - callbacks[self.time_stop_timer] = lambda: self.time_callback(2) + callbacks[self.time_stop_timer].append(lambda: self.time_callback(2)) return callbacks diff --git a/pype/modules/timers_manager/widget_user_idle.py b/pype/modules/timers_manager/widget_user_idle.py index 5e47cdaddf..cbdb7fd30a 100644 --- a/pype/modules/timers_manager/widget_user_idle.py +++ b/pype/modules/timers_manager/widget_user_idle.py @@ -163,8 +163,9 @@ class SignalHandler(QtCore.QObject): signal_change_label = QtCore.Signal() signal_stop_timers = QtCore.Signal() - def __init__(self, cls): - super().__init__() - self.signal_show_message.connect(cls.show_message) - self.signal_change_label.connect(cls.change_label) - self.signal_stop_timers.connect(cls.stop_timers) + def __init__(self, module): + super(SignalHandler, self).__init__() + self.module = module + self.signal_show_message.connect(module.show_message) + self.signal_change_label.connect(module.change_label) + self.signal_stop_timers.connect(module.stop_timers) From 4c28395143b6df3fed4e3379cd47109825010c8c Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Fri, 19 Mar 2021 15:00:41 +0100 Subject: [PATCH 6/7] renamed idle_logic to idle_threads --- pype/modules/idle_manager/{idle_logic.py => idle_threads.py} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename pype/modules/idle_manager/{idle_logic.py => idle_threads.py} (100%) diff --git a/pype/modules/idle_manager/idle_logic.py b/pype/modules/idle_manager/idle_threads.py similarity index 100% rename from pype/modules/idle_manager/idle_logic.py rename to pype/modules/idle_manager/idle_threads.py From 6908ae0e4e14720d736f8ce51e8eb20b33a239eb Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Fri, 19 Mar 2021 15:01:00 +0100 Subject: [PATCH 7/7] moved idle thread to threads file --- pype/modules/idle_manager/idle_module.py | 84 ++--------------------- pype/modules/idle_manager/idle_threads.py | 73 ++++++++++++++++++++ 2 files changed, 79 insertions(+), 78 deletions(-) diff --git a/pype/modules/idle_manager/idle_module.py b/pype/modules/idle_manager/idle_module.py index 25309e9443..979e1b92ea 100644 --- a/pype/modules/idle_manager/idle_module.py +++ b/pype/modules/idle_manager/idle_module.py @@ -1,11 +1,8 @@ -import time import collections -import threading from abc import ABCMeta, abstractmethod import six -from pype.lib import PypeLogger from pype.modules import PypeModule, ITrayService @@ -79,11 +76,16 @@ class IdleManager(PypeModule, ITrayService): if self.idle_thread and self.idle_thread.is_running: return self.idle_thread.idle_time + def _create_thread(self): + from .idle_threads import IdleManagerThread + + return IdleManagerThread(self) + def start_thread(self): if self.idle_thread: self.idle_thread.stop() self.idle_thread.join() - self.idle_thread = IdleManagerThread(self) + self.idle_thread = self._create_thread() self.idle_thread.start() def stop_thread(self): @@ -93,77 +95,3 @@ class IdleManager(PypeModule, ITrayService): def on_thread_stop(self): self.set_service_failed_icon() - - -class IdleManagerThread(threading.Thread): - def __init__(self, module, *args, **kwargs): - super(IdleManagerThread, self).__init__(*args, **kwargs) - self.log = PypeLogger.get_logger(self.__class__.__name__) - self.module = module - self.threads = [] - self.is_running = False - self.idle_time = 0 - - def stop(self): - self.is_running = False - - def reset_time(self): - self.idle_time = 0 - - @property - def time_callbacks(self): - return self.module.time_callbacks - - def on_stop(self): - self.is_running = False - self.log.info("IdleManagerThread has stopped") - self.module.on_thread_stop() - - def _create_threads(self): - from .idle_logic import MouseThread, KeyboardThread - - thread_mouse = MouseThread(self.reset_time) - thread_keyboard = KeyboardThread(self.reset_time) - return thread_mouse, thread_keyboard - - def run(self): - self.log.info("IdleManagerThread has started") - self.is_running = True - thread_mouse, thread_keyboard = self._create_threads() - thread_mouse.start() - thread_keyboard.start() - try: - while self.is_running: - if self.idle_time in self.time_callbacks: - for callback in self.time_callbacks[self.idle_time]: - thread = threading.Thread(target=callback) - thread.start() - self.threads.append(thread) - - for thread in tuple(self.threads): - if not thread.isAlive(): - thread.join() - self.threads.remove(thread) - - self.idle_time += 1 - time.sleep(1) - - except Exception: - self.log.warning( - 'Idle Manager service has failed', exc_info=True - ) - - # Threads don't have their attrs when Qt application already finished - try: - thread_mouse.stop() - thread_mouse.join() - except AttributeError: - pass - - try: - thread_keyboard.stop() - thread_keyboard.join() - except AttributeError: - pass - - self.on_stop() diff --git a/pype/modules/idle_manager/idle_threads.py b/pype/modules/idle_manager/idle_threads.py index ab3f6790e6..7cedf986e6 100644 --- a/pype/modules/idle_manager/idle_threads.py +++ b/pype/modules/idle_manager/idle_threads.py @@ -1,5 +1,10 @@ +import time +import threading + from pynput import mouse, keyboard +from pype.lib import PypeLogger + class MouseThread(mouse.Listener): """Listens user's mouse movement.""" @@ -22,3 +27,71 @@ class KeyboardThread(keyboard.Listener): def on_press(self, key): self.callback() + + +class IdleManagerThread(threading.Thread): + def __init__(self, module, *args, **kwargs): + super(IdleManagerThread, self).__init__(*args, **kwargs) + self.log = PypeLogger.get_logger(self.__class__.__name__) + self.module = module + self.threads = [] + self.is_running = False + self.idle_time = 0 + + def stop(self): + self.is_running = False + + def reset_time(self): + self.idle_time = 0 + + @property + def time_callbacks(self): + return self.module.time_callbacks + + def on_stop(self): + self.is_running = False + self.log.info("IdleManagerThread has stopped") + self.module.on_thread_stop() + + def run(self): + self.log.info("IdleManagerThread has started") + self.is_running = True + thread_mouse = MouseThread(self.reset_time) + thread_keyboard = KeyboardThread(self.reset_time) + thread_mouse.start() + thread_keyboard.start() + try: + while self.is_running: + if self.idle_time in self.time_callbacks: + for callback in self.time_callbacks[self.idle_time]: + thread = threading.Thread(target=callback) + thread.start() + self.threads.append(thread) + + for thread in tuple(self.threads): + if not thread.isAlive(): + thread.join() + self.threads.remove(thread) + + self.idle_time += 1 + time.sleep(1) + + except Exception: + self.log.warning( + 'Idle Manager service has failed', exc_info=True + ) + + # Threads don't have their attrs when Qt application already finished + try: + thread_mouse.stop() + thread_mouse.join() + except AttributeError: + pass + + try: + thread_keyboard.stop() + thread_keyboard.join() + except AttributeError: + pass + + self.on_stop()