preventing duplicate macro runs

meta
sezanzeb 4 years ago
parent dc9f51c56c
commit 3c7084b82f

@ -79,7 +79,6 @@ class _Macro:
The preset object, needed for some config stuff
"""
self.tasks = []
self.handler = lambda *args: logger.error('No handler set')
self.code = code
self.mapping = mapping
@ -112,6 +111,10 @@ class _Macro:
handler : function
Will receive int code and value for an EV_KEY event to write
"""
if self.running:
logger.error('Tried to run already running macro "%s"', self.code)
return
self.running = True
for _, task in self.tasks:
coroutine = task(handler)

@ -403,6 +403,57 @@ class TestMacros(unittest.TestCase):
self.assertGreater(delta, 0.150)
self.assertLess(delta, 0.300)
def test_duplicate_run(self):
# it won't restart the macro, because that may screw up the
# internal state (in particular the _holding_lock).
# I actually don't know at all what kind of bugs that might produce,
# lets just avoid it. It might cause it to be held down forever.
a = system_mapping.get('a')
b = system_mapping.get('b')
c = system_mapping.get('c')
macro = parse('k(a).m(b, h()).k(c)', self.mapping)
asyncio.ensure_future(macro.run(self.handler))
self.assertFalse(macro.is_holding())
asyncio.ensure_future(macro.run(self.handler)) # ignored
self.assertFalse(macro.is_holding())
macro.press_key()
self.loop.run_until_complete(asyncio.sleep(0.2))
self.assertTrue(macro.is_holding())
asyncio.ensure_future(macro.run(self.handler)) # ignored
self.assertTrue(macro.is_holding())
macro.release_key()
self.loop.run_until_complete(asyncio.sleep(0.2))
self.assertFalse(macro.is_holding())
expected = [
(a, 1), (a, 0),
(b, 1), (b, 0),
(c, 1), (c, 0),
]
self.assertListEqual(self.result, expected)
"""not ignored, since previous run is over"""
asyncio.ensure_future(macro.run(self.handler))
macro.press_key()
self.loop.run_until_complete(asyncio.sleep(0.2))
self.assertTrue(macro.is_holding())
macro.release_key()
self.loop.run_until_complete(asyncio.sleep(0.2))
self.assertFalse(macro.is_holding())
expected = [
(a, 1), (a, 0),
(b, 1), (b, 0),
(c, 1), (c, 0),
] * 2
self.assertListEqual(self.result, expected)
if __name__ == '__main__':
unittest.main()

Loading…
Cancel
Save