Skip to content

Commit

Permalink
Implement injected flag for Xorg
Browse files Browse the repository at this point in the history
  • Loading branch information
moses-palmer committed Mar 3, 2025
1 parent 609dfe4 commit 149c965
Show file tree
Hide file tree
Showing 3 changed files with 19 additions and 11 deletions.
9 changes: 7 additions & 2 deletions lib/pynput/_util/xorg.py
Original file line number Diff line number Diff line change
Expand Up @@ -467,7 +467,10 @@ def _handler(self, events):
while data and len(data):
event, data = self._EVENT_PARSER.parse_binary_value(
data, self._display_record.display, None, None)
self._handle_message(self._display_stop, event)

injected = event.send_event
self._handle(self._display_stop, event, injected)
self._handle_message(self._display_stop, event, injected)

def _initialize(self, display):
"""Initialises this listener.
Expand All @@ -479,7 +482,7 @@ def _initialize(self, display):
"""
pass

def _handle_message(self, display, event):
def _handle_message(self, display, event, injected):
"""The device specific callback handler.
This method calls the appropriate callback registered when this
Expand All @@ -488,5 +491,7 @@ def _handle_message(self, display, event):
:param display: The display being used.
:param event: The event.
:param bool injected: Whether the event was injected.
"""
pass
8 changes: 4 additions & 4 deletions lib/pynput/keyboard/_xorg.py
Original file line number Diff line number Diff line change
Expand Up @@ -566,7 +566,7 @@ def _initialize(self, display):
self._keyboard_mapping = display.get_keyboard_mapping(
min_keycode, keycode_count)

def _handle_message(self, display, event):
def _handle_message(self, display, event, injected):
# Convert the event to a KeyCode; this may fail, and in that case we
# pass None
try:
Expand All @@ -575,10 +575,10 @@ def _handle_message(self, display, event):
key = None

if event.type == Xlib.X.KeyPress:
self.on_press(key)
self.on_press(key, injected)

elif event.type == Xlib.X.KeyRelease:
self.on_release(key)
self.on_release(key, injected)

def _suppress_start(self, display):
display.screen().root.grab_keyboard(
Expand All @@ -596,7 +596,7 @@ def _on_fake_event(self, key, is_press):
:param bool is_press: Whether this is a press event.
"""
(self.on_press if is_press else self.on_release)(
self._SPECIAL_KEYS.get(key.vk, key))
self._SPECIAL_KEYS.get(key.vk, key), True)

def _keycode_to_keysym(self, display, keycode, index):
"""Converts a keycode and shift state index to a keysym.
Expand Down
13 changes: 8 additions & 5 deletions lib/pynput/mouse/_xorg.py
Original file line number Diff line number Diff line change
Expand Up @@ -134,7 +134,7 @@ class Listener(ListenerMixin, _base.Listener):
def __init__(self, *args, **kwargs):
super(Listener, self).__init__(*args, **kwargs)

def _handle_message(self, dummy_display, event):
def _handle_message(self, dummy_display, event, injected):
px = event.root_x
py = event.root_y

Expand All @@ -143,17 +143,20 @@ def _handle_message(self, dummy_display, event):
# button codes
scroll = self._SCROLL_BUTTONS.get(event.detail, None)
if scroll:
self.on_scroll(px, py, *scroll)
self.on_scroll(
px, py, scroll[0], scroll[1], injected)
else:
self.on_click(px, py, self._button(event.detail), True)
self.on_click(
px, py, self._button(event.detail), True, injected)

elif event.type == Xlib.X.ButtonRelease:
# Send an event only if this was not a scroll event
if event.detail not in self._SCROLL_BUTTONS:
self.on_click(px, py, self._button(event.detail), False)
self.on_click(
px, py, self._button(event.detail), False, injected)

else:
self.on_move(px, py)
self.on_move(px, py, injected)


def _suppress_start(self, display):
Expand Down

0 comments on commit 149c965

Please sign in to comment.