Skip to content

Commit

Permalink
regression: handle change type correctly
Browse files Browse the repository at this point in the history
fixes #126
  • Loading branch information
Tony Crisci committed Sep 1, 2019
1 parent 674e33c commit acb1eb5
Show file tree
Hide file tree
Showing 4 changed files with 118 additions and 32 deletions.
6 changes: 4 additions & 2 deletions i3ipc/aio/connection.py
Original file line number Diff line number Diff line change
Expand Up @@ -476,10 +476,12 @@ def on(self, event: Union[Event, str], handler: Callable[['Connection', IpcBaseE
event = event.replace('-', '_')

if event.count('::') > 0:
[event, __] = event.split('::')
[base_event, __] = event.split('::')
else:
base_event = event

self._pubsub.subscribe(event, handler)
asyncio.ensure_future(self.subscribe([event]))
asyncio.ensure_future(self.subscribe([base_event]))

def off(self, handler: Callable[['Connection', IpcBaseEvent], None]):
"""Unsubscribe the handler from being called on ipc events.
Expand Down
22 changes: 12 additions & 10 deletions i3ipc/connection.py
Original file line number Diff line number Diff line change
Expand Up @@ -373,7 +373,9 @@ def on(self, event: Union[Event, str], handler: Callable[['Connection', IpcBaseE
event = event.replace('-', '_')

if event.count('::') > 0:
[event, __] = event.split('::')
[base_event, __] = event.split('::')
else:
base_event = event

# special case: ipc-shutdown is not in the protocol
if event == 'ipc_shutdown':
Expand All @@ -382,23 +384,23 @@ def on(self, event: Union[Event, str], handler: Callable[['Connection', IpcBaseE
return

event_type = 0
if event == "workspace":
if base_event == 'workspace':
event_type = EventType.WORKSPACE
elif event == "output":
elif base_event == 'output':
event_type = EventType.OUTPUT
elif event == "mode":
elif base_event == 'mode':
event_type = EventType.MODE
elif event == "window":
elif base_event == 'window':
event_type = EventType.WINDOW
elif event == "barconfig_update":
elif base_event == 'barconfig_update':
event_type = EventType.BARCONFIG_UPDATE
elif event == "binding":
elif base_event == 'binding':
event_type = EventType.BINDING
elif event == "shutdown":
elif base_event == 'shutdown':
event_type = EventType.SHUTDOWN
elif event == "tick":
elif base_event == 'tick':
event_type = EventType.TICK
elif event == "input":
elif base_event == 'input':
event_type = EventType.INPUT

if not event_type:
Expand Down
64 changes: 54 additions & 10 deletions test/aio/test_window.py
Original file line number Diff line number Diff line change
@@ -1,27 +1,71 @@
from .ipctest import IpcTest
from i3ipc import Event

import pytest
from i3ipc import Event
import asyncio


class TestWindow(IpcTest):
event = None

def on_window(self, i3, e):
TestWindow.event = e
i3.main_quit()

'''
@pytest.mark.asyncio
async def test_window_event(self, i3):
await self.fresh_workspace()
event = None
def on_window(i3, e):
nonlocal event
event = e
i3.main_quit()
await i3.subscribe([Event.WINDOW])
i3.on(Event.WINDOW, self.on_window)
i3.on(Event.WINDOW, on_window)
self.open_window()
await i3.main()
assert TestWindow.event
assert event
i3.off(on_window)
'''

@pytest.mark.asyncio
async def test_detailed_window_event(self, i3):
events = []

def on_window(i3, e):
events.append(e)

async def generate_events():
win1 = self.open_window()
win2 = self.open_window()
await i3.command(f'[id={win1}] kill; [id={win2}] kill')
# TODO sync protocol
await asyncio.sleep(0.01)
i3.main_quit()

await i3.subscribe([Event.WINDOW])

i3.on(Event.WINDOW_NEW, on_window)

asyncio.ensure_future(generate_events())
await i3.main()
i3.off(on_window)

assert len(events)
for e in events:
assert e.change == 'new'

events.clear()

i3.on(Event.WINDOW_FOCUS, on_window)

asyncio.ensure_future(generate_events())
await i3.main()
i3.off(on_window)

assert len(events)
for e in events:
assert e.change == 'focus'

@pytest.mark.asyncio
async def test_marks(self, i3):
Expand Down
58 changes: 48 additions & 10 deletions test/test_window.py
Original file line number Diff line number Diff line change
@@ -1,24 +1,62 @@
from i3ipc import Event

import time
from ipctest import IpcTest
from threading import Timer


class TestWindow(IpcTest):
event = None
def test_window_event(self, i3):
event = None

def on_window(self, i3, e):
TestWindow.event = e
i3.main_quit()
def on_window(i3, e):
nonlocal event
event = e
i3.main_quit()

def test_window_event(self, i3):
self.fresh_workspace()
i3.get_workspaces()
i3.on('window', self.on_window)
Timer(0.1, self.open_window).start()
i3.on('window', on_window)
Timer(0.001, self.open_window).start()
i3.main(timeout=2)
assert self.event is not None

assert event is not None
i3.off(on_window)

def test_marks(self, i3):
self.fresh_workspace()
self.open_window()
i3.command('mark foo')
assert 'foo' in i3.get_tree().find_focused().marks

def test_detailed_window_event(self, i3):
events = []

def generate_events():
win1 = self.open_window()
win2 = self.open_window()
i3.command(f'[id={win1}] kill; [id={win2}] kill')
# TODO sync protocol
time.sleep(0.01)
i3.main_quit()

def on_window(i3, e):
nonlocal events
events.append(e)

i3.on(Event.WINDOW_NEW, on_window)
Timer(0.001, generate_events).start()
i3.main(timeout=2)

assert len(events)
for e in events:
assert e.change == 'new'

events.clear()
i3.off(on_window)

i3.on(Event.WINDOW_FOCUS, on_window)
Timer(0.001, generate_events).start()
i3.main(timeout=2)

assert len(events)
for e in events:
assert e.change == 'focus'

0 comments on commit acb1eb5

Please sign in to comment.