Skip to content

Commit

Permalink
Added proper synchronization. Fixed libinput.
Browse files Browse the repository at this point in the history
Fixed circular import.
  • Loading branch information
Patrick Lenihan committed Feb 9, 2025
1 parent d1785ba commit 512f2af
Show file tree
Hide file tree
Showing 8 changed files with 401 additions and 295 deletions.
4 changes: 4 additions & 0 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,10 @@ ifeq ($(USE_EVDEV),true)
POETRY_EXTRAS := $(POETRY_EXTRAS) use_evdev
endif

# ifeq ($(USE_LIBINPUT),true)
# POETRY_EXTRAS := $(POETRY_EXTRAS) use_libinput
# endif

build:
poetry install --extras "$(POETRY_EXTRAS)"

Expand Down
88 changes: 30 additions & 58 deletions aw_watcher_afk/listeners.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,99 +15,71 @@
NOTE: Logging usage should be commented out before committed, for performance reasons.
"""

from abc import ABCMeta, abstractmethod
import logging
import os
import platform

class BaseEventFactory(metaclass=ABCMeta):
from .listeners_base import main_test

@abstractmethod
def next_event(self):
"""Returns an event and prepares the internal state so that it can start to build a new event"""
raise NotImplementedError

@abstractmethod
def start(self):
"""Starts monitoring events in the background"""
raise NotImplementedError

@abstractmethod
def has_new_event(self) -> bool:
"""Has new event data"""
raise NotImplementedError

class MergedListenerHelper(BaseEventFactory):

"""Merging events from keyboard and mouse instances that are started separately"""

keyboard: BaseEventFactory
mouse: BaseEventFactory

def __init__(self, keyboard, mouse) -> None:
self.keyboard = keyboard
self.mouse = mouse

def start(self):
self.mouse.start()
self.keyboard.start()

def next_event(self):
data = dict(**self.keyboard.next_event(), **self.mouse.next_event())
# self.logger.debug(f"Event: {data}")
return data

def has_new_event(self):
return self.keyboard.has_new_event() or self.mouse.has_new_event()
logger = logging.getLogger(__name__)
# logger.setLevel(logging.DEBUG)

system = platform.system()

def use_evdev():
"""Use evdev backend"""
return system == "Linux" and os.getenv("USE_EVDEV") == "true"

def use_libinput():
"""Use libinput backend"""
return system == "Linux" and os.getenv("USE_LIBINPUT") == "true"

def KeyboardListener():

"""Returns keyboard listener using backends: evdev, libinput and pynput"""

if use_evdev():
# noreorder
from .listeners_evdev import KeyboardListener
elif use_libinput():
from .listeners_libinput import KeyboardListener
# elif use_libinput():
# # noreorder
# from .listeners_libinput import KeyboardListener
else:
from .listeners_pynput import KeyboardListener

return KeyboardListener()

def MouseListener():

"""Returns mouse listener using backends: evdev, libinput, pynput"""

if use_evdev():
from .listeners_evdev import MouseListener
elif use_libinput():
from .listeners_libinput import MouseListener
# noreorder
from .listeners_evdev import MouseListener # fmt: skip
# elif use_libinput():
# # noreorder
# from .listeners_libinput import MouseListener
else:
from .listeners_pynput import MouseListener
# noreorder
from .listeners_pynput import MouseListener # fmt: skip

return MouseListener()

def MergedListener():

"""Returns mouse and keyboard listener using backends: evdev, libinput, pynput"""

if use_evdev():
# noreorder
from .listeners_evdev import MergedListener
elif use_libinput():
from .listeners_libinput import MergedListener
# elif use_libinput():
# # noreorder
# from .listeners_libinput import MergedListener
else:
from .listeners_pynput import MergedListener
# noreorder
from .listeners_pynput import MergedListener # fmt: skip

return MergedListener()

def main_test_helper(listener):

listener.start()

while True:

if listener.has_new_event():
print(listener.next_event())

if __name__ == "__main__":
main_test_helper(MergedListener())
main_test(MergedListener())
48 changes: 48 additions & 0 deletions aw_watcher_afk/listeners_base.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
"""
Listeners for aggregated keyboard and mouse events.
This is used for AFK detection on Linux, as well as used in aw-watcher-input to track input activity in general.
NOTE: Logging usage should be commented out before committed, for performance reasons.
"""


"""
Listeners for aggregated keyboard and mouse events.
This is used for AFK detection on Linux, as well as used in aw-watcher-input to track input activity in general.
NOTE: Logging usage should be commented out before committed, for performance reasons.
"""

import logging
from abc import ABCMeta, abstractmethod

logger = logging.getLogger(__name__)
# logger.setLevel(logging.DEBUG)

class BaseEventFactory(metaclass=ABCMeta):

@abstractmethod
def next_event(self):
"""Returns new event data"""
raise NotImplementedError

@abstractmethod
def start(self):
"""Starts monitoring events in the background"""
raise NotImplementedError

@abstractmethod
def has_new_event(self) -> bool:
"""Has new event data"""
raise NotImplementedError

def main_test(listener):

listener.start()

while True:

if listener.has_new_event():
print(listener.next_event())
Loading

0 comments on commit 512f2af

Please sign in to comment.