Skip to content

Commit e8798bb

Browse files
author
Tony Crisci
authored
Merge pull request #188 from pjeanjean/master
Add decorator syntax for event handlers
2 parents 1945dfc + 28c362b commit e8798bb

File tree

4 files changed

+79
-2
lines changed

4 files changed

+79
-2
lines changed

i3ipc/aio/connection.py

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -514,7 +514,17 @@ async def subscribe(self, events: Union[List[Event], List[str]], force: bool = F
514514

515515
await self._loop.sock_sendall(self._sub_socket, _pack(MessageType.SUBSCRIBE, payload))
516516

517-
def on(self, event: Union[Event, str], handler: Callable[['Connection', IpcBaseEvent], None]):
517+
def on(self, event: Union[Event, str], handler: Callable[['Connection', IpcBaseEvent], None] = None):
518+
def on_wrapped(handler):
519+
self._on(event, handler)
520+
return handler
521+
522+
if handler:
523+
return on_wrapped(handler)
524+
else:
525+
return on_wrapped
526+
527+
def _on(self, event: Union[Event, str], handler: Callable[['Connection', IpcBaseEvent], None]):
518528
"""Subscribe to the event and call the handler when it is emitted by
519529
the i3 ipc.
520530

i3ipc/connection.py

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -406,7 +406,17 @@ def off(self, handler: Callable[['Connection', IpcBaseEvent], None]):
406406
"""
407407
self._pubsub.unsubscribe(handler)
408408

409-
def on(self, event: Union[Event, str], handler: Callable[['Connection', IpcBaseEvent], None]):
409+
def on(self, event: Union[Event, str], handler: Callable[['Connection', IpcBaseEvent], None] = None):
410+
def on_wrapped(handler):
411+
self._on(event, handler)
412+
return handler
413+
414+
if handler:
415+
return on_wrapped(handler)
416+
else:
417+
return on_wrapped
418+
419+
def _on(self, event: Union[Event, str], handler: Callable[['Connection', IpcBaseEvent], None]):
410420
"""Subscribe to the event and call the handler when it is emitted by
411421
the i3 ipc.
412422

test/aio/test_window.py

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,35 @@ async def generate_events():
6565
for e in events:
6666
assert e.change == 'focus'
6767

68+
@pytest.mark.asyncio
69+
async def test_detailed_window_event_decorator(self, i3):
70+
events = []
71+
72+
async def generate_events():
73+
win1 = self.open_window()
74+
win2 = self.open_window()
75+
await i3.command(f'[id={win1}] kill; [id={win2}] kill')
76+
# TODO sync protocol
77+
await asyncio.sleep(0.01)
78+
i3.main_quit()
79+
80+
@i3.on(Event.WINDOW_NEW)
81+
@i3.on(Event.WINDOW_FOCUS)
82+
async def on_window(i3, e):
83+
nonlocal events
84+
events.append(e)
85+
86+
asyncio.ensure_future(generate_events())
87+
await i3.main()
88+
89+
assert len(events)
90+
for e in events:
91+
assert e.change in ['new', 'focus']
92+
assert len([e for e in events if e.change == 'new'])
93+
assert len([e for e in events if e.change == 'focus'])
94+
95+
i3.off(on_window)
96+
6897
@pytest.mark.asyncio
6998
async def test_marks(self, i3):
7099
await self.fresh_workspace()

test/test_window.py

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,34 @@ def on_window(i3, e):
6161
for e in events:
6262
assert e.change == 'focus'
6363

64+
def test_detailed_window_event_decorator(self, i3):
65+
events = []
66+
67+
def generate_events():
68+
win1 = self.open_window()
69+
win2 = self.open_window()
70+
i3.command(f'[id={win1}] kill; [id={win2}] kill')
71+
# TODO sync protocol
72+
time.sleep(0.01)
73+
i3.main_quit()
74+
75+
@i3.on(Event.WINDOW_NEW)
76+
@i3.on(Event.WINDOW_FOCUS)
77+
def on_window(i3, e):
78+
nonlocal events
79+
events.append(e)
80+
81+
Timer(0.01, generate_events).start()
82+
i3.main(timeout=2)
83+
84+
assert len(events)
85+
for e in events:
86+
assert e.change in ['new', 'focus']
87+
assert len([e for e in events if e.change == 'new'])
88+
assert len([e for e in events if e.change == 'focus'])
89+
90+
i3.off(on_window)
91+
6492
def test_resize(self, i3):
6593
self.fresh_workspace()
6694
self.open_window()

0 commit comments

Comments
 (0)