Skip to content

Commit 597c2e4

Browse files
committedJan 8, 2016
gui/applets: startup and embedding working
1 parent e106ee3 commit 597c2e4

File tree

2 files changed

+42
-6
lines changed

2 files changed

+42
-6
lines changed
 

Diff for: ‎artiq/frontend/artiq_gui.py

+1
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,7 @@ def main():
112112
smgr.register(d_datasets)
113113

114114
appletmgr = applets.AppletManager(dock_area)
115+
atexit_register_coroutine(appletmgr.stop)
115116
smgr.register(appletmgr)
116117

117118
if os.name != "nt":

Diff for: ‎artiq/gui/applets.py

+41-6
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
import logging
2+
import asyncio
3+
import shlex
24

35
from quamash import QtCore, QtGui, QtWidgets
46
from pyqtgraph import dockarea
@@ -8,23 +10,50 @@
810

911

1012
class AppletDock(dockarea.Dock):
11-
def __init__(self, token, name):
13+
def __init__(self, token, name, command):
1214
dockarea.Dock.__init__(self, "applet" + str(token),
1315
label="Applet: " + name,
1416
closable=True)
1517
self.setMinimumSize(QtCore.QSize(500, 400))
18+
self.token = token
19+
self.applet_name = name
20+
self.command = command
21+
22+
async def start(self):
23+
command = self.command.format(embed_token=self.token)
24+
logger.debug("starting command %s for %s", command, self.applet_name)
25+
try:
26+
self.process = await asyncio.create_subprocess_exec(
27+
*shlex.split(command))
28+
except FileNotFoundError:
29+
logger.warning("Applet %s failed to start", self.applet_name)
30+
else:
31+
logger.warning("Applet %s exited", self.applet_name)
1632

1733
def capture(self, win_id):
34+
logger.debug("capturing window 0x%x for %s", win_id, self.applet_name)
1835
self.captured_window = QtGui.QWindow.fromWinId(win_id)
19-
self.captured_widget = QtWidgets.QWidget.createWindowContainer(captured_window)
20-
self.addWidget(captured_widget)
36+
self.captured_widget = QtWidgets.QWidget.createWindowContainer(
37+
self.captured_window)
38+
self.addWidget(self.captured_widget)
2139

22-
def terminate(self):
40+
async def terminate(self):
2341
if hasattr(self, "captured_window"):
2442
self.captured_window.close()
2543
self.captured_widget.deleteLater()
2644
del self.captured_window
2745
del self.captured_widget
46+
if hasattr(self, "process"):
47+
try:
48+
await asyncio.wait_for(self.process.wait(), 2.0)
49+
except:
50+
logger.warning("Applet %s failed to exit, killing",
51+
self.applet_name)
52+
try:
53+
self.process.kill()
54+
except ProcessLookupError:
55+
pass
56+
await self.process.wait()
2857

2958

3059
class AppletsDock(dockarea.Dock):
@@ -116,18 +145,24 @@ def embed(self, token, win_id):
116145
logger.warning("Ignored incorrect embed token %d for winid 0x%x",
117146
token, win_id)
118147
return
148+
self.applet_docks[token].capture(win_id)
119149

120150
def create(self, name, command):
121151
token = next(iter(set(range(len(self.applet_docks) + 1))
122-
- self.applet_docks.keys()))
123-
dock = AppletDock(token, name)
152+
- self.applet_docks.keys()))
153+
dock = AppletDock(token, name, command)
124154
self.applet_docks[token] = dock
125155
self.dock_area.floatDock(dock)
156+
asyncio.ensure_future(dock.start())
126157
return token
127158

128159
def delete(self, token):
129160
del self.applet_docks[token]
130161

162+
async def stop(self):
163+
for dock in self.applet_docks.values():
164+
await dock.terminate()
165+
131166
def save_state(self):
132167
return dict()
133168

0 commit comments

Comments
 (0)
Please sign in to comment.