浏览代码

Make use of "spawners" instead of hardcoding the chatwindow

Yentl Van Tendeloo 7 年之前
父节点
当前提交
2f1b7d1baf
共有 7 个文件被更改,包括 203 次插入122 次删除
  1. 1 1
      chatwindow.py
  2. 52 17
      classes/main_app.xml
  3. 1 2
      classes/window/activity.xml
  4. 1 1
      classes/window/process_enact.xml
  5. 141 98
      frontend.py
  6. 2 0
      run_chatwindow.py
  7. 5 3
      runner.py

+ 1 - 1
chatwindow.py

@@ -1,7 +1,7 @@
 """
 Generated by Statechart compiler by Glenn De Jonghe, Joeri Exelmans, Simon Van Mierlo, and Yentl Van Tendeloo (for the inspiration)
 
-Date:   Wed Nov 15 08:57:11 2017
+Date:   Wed Nov 15 09:41:32 2017
 
 Model author: Yentl Van Tendeloo
 Model name:   ChatWindow- Tkinter Version 

+ 52 - 17
classes/main_app.xml

@@ -11,6 +11,7 @@
         <parameter name="model"/>
         <parameter name="limited_mode"/>
         <parameter name="taskname"/>
+        <parameter name="spawn"/>
         <body>
             self.nr_of_windows = 0
             self.root = root
@@ -27,6 +28,7 @@
             data['mv_address'] = location
             data['timeout'] = 20.0
             data['taskname'] = taskname
+            data['spawn'] = spawn
         </body>
     </constructor>
     <scxml initial="parallel">
@@ -175,30 +177,63 @@
                             </state>
                         </state>
 
-                        <state id="execute_SC" initial="spawn_chatwindow">
-                            <onentry>
-                                <raise event="create_instance" scope="cd">
-                                    <parameter expr="'windows'"/>
-                                    <parameter expr="'ChatWindow'"/>
-                                </raise>
-                            </onentry>
+                        <state id="execute_SC" initial="spawn">
+                            <state id="spawn">
+                                <transition target="../wait_subprocess">
+                                    <parameter name="result"/>
+                                    <script>
+                                        self.subprocess = subprocess.Popen(data['spawn'], stdin=subprocess.PIPE, stdout=subprocess.PIPE)
+
+                                        # If you are using Windows, then this ugly code is for you!
+                                        # Windows does not allow asynchronous reading of stdin and stdout, so we have to mess around with threads.
+                                        # Interestingly, threads don't work well with SCCD, so this is a gamble.
+                                        # On UNIX systems, a simple "select" statement would have sufficed in the SCCD condition, but Windows doesn't like elegant solutions...
+                                        def enqueue_output(out, queue):
+                                            for line in iter(out.readline, b''):
+                                                queue.append(line)
+                                            out.close()
+
+                                        self.output_queue = []
+                                        p = threading.Thread(target=enqueue_output, arguments=[self.subprocess.stdout, self.output_queue])
+                                        p.daemon = True
+                                        p.start()
+                                    </script>
+                                </transition>
+                            </state>
 
-                            <state id="spawn_chatwindow">
-                                <transition event="instance_created" target=".">
-                                    <parameter name="assoc_name"/>
-                                    <raise event="start_instance" scope="cd">
-                                        <parameter expr="assoc_name"/>
-                                    </raise>
-                                    <raise event="assoc_name" scope="narrow" target="assoc_name">
-                                        <parameter expr="assoc_name"/>
+                            <state id="wait_subprocess">
+                                <transition event="mv_data_output" target=".">
+                                    <parameter name="value"/>
+                                    <script>
+                                        # Send data to the spawned subprocess
+                                        self.subprocess.stdin.write(value)
+                                    </script>
+                                </transition>
+
+                                <transition cond="self.output_queue" target=".">
+                                    <raise event="mv_data_input">
+                                        <parameter expr="self.output_queue.pop(0)"/>
+                                        <parameter expr="None"/>
                                     </raise>
                                 </transition>
 
-                                <transition event="delete_me" target="../../../../stopped">
+                                <transition event="mv_response" target="../stopping">
+                                    <script>
+                                        self.subprocess.terminate()
+                                    </script>
+                                </transition>
+
+                                <transition cond="self.subprocess.poll() is not None" target="../stopping">
                                     <script>
-                                        sys.exit(0)
+                                        print("Finished execution of activity!")
                                     </script>
                                 </transition>
+
+                                <transition after="0.5" target="."/>
+                            </state>
+
+                            <state id="stopping">
+                                <transition after="2.0" target="../../../../stopped"/>
                             </state>
                         </state>
                     </state>

+ 1 - 2
classes/window/activity.xml

@@ -253,7 +253,7 @@
                         <transition event="mv_response" target="../processing">
                             <parameter name="taskname"/>
                             <script>
-                                subprocess.Popen([sys.executable, sys.argv[0], "--address", data['mv_address'], "--username", data['username'], "--password", data['password'], "--taskname", taskname])
+                                self.subprocess = subprocess.Popen([sys.executable, sys.argv[0], "--address", data['mv_address'], "--username", data['username'], "--password", data['password'], "--taskname", taskname, "--spawn", "run_chatwindow.py"])
                             </script>
                         </transition>
                     </state>
@@ -273,7 +273,6 @@
                                 <script>
                                     tag, model = self.exec_output_signature.popitem()
                                     metamodel = self.output_signature[tag]
-                                    print("Setting context for " + str((model, metamodel)))
                                 </script>
                                 <raise event="mv_request" scope="broad">
                                     <parameter expr="'alter_context'"/>

+ 1 - 1
classes/window/process_enact.xml

@@ -231,7 +231,7 @@
                             <parameter name="result"/>
                             <script>
                                 taskname, operation = result
-                                subprocess.Popen([sys.executable, sys.argv[0], "--address", data['mv_address'], "--username", data['username'], "--password", data['password'], "--taskname", taskname])
+                                subprocess.Popen([sys.executable, sys.argv[0], "--address", data['mv_address'], "--username", data['username'], "--password", data['password'], "--taskname", taskname, "--spawn", "run_chatwindow.py"])
                             </script>
                         </transition>
                     </state>

+ 141 - 98
frontend.py

@@ -1,7 +1,7 @@
 """
 Generated by Statechart compiler by Glenn De Jonghe, Joeri Exelmans, Simon Van Mierlo, and Yentl Van Tendeloo (for the inspiration)
 
-Date:   Tue Nov 14 15:32:55 2017
+Date:   Wed Nov 15 10:17:38 2017
 
 Model author: Yentl Van Tendeloo
 Model name:   Modelverse Visual Editor - Tkinter Version 
@@ -25,7 +25,7 @@ global current_metamodel
 # package "Modelverse Visual Editor - Tkinter Version "
 
 class MainApp(RuntimeClassBase):
-    def __init__(self, controller, root, location, username, password, model, limited_mode, taskname):
+    def __init__(self, controller, root, location, username, password, model, limited_mode, taskname, spawn):
         RuntimeClassBase.__init__(self, controller)
         
         self.semantics.big_step_maximality = StatechartSemantics.TakeMany
@@ -38,9 +38,9 @@ class MainApp(RuntimeClassBase):
         self.build_statechart_structure()
         
         # call user defined constructor
-        MainApp.user_defined_constructor(self, root, location, username, password, model, limited_mode, taskname)
+        MainApp.user_defined_constructor(self, root, location, username, password, model, limited_mode, taskname, spawn)
     
-    def user_defined_constructor(self, root, location, username, password, model, limited_mode, taskname):
+    def user_defined_constructor(self, root, location, username, password, model, limited_mode, taskname, spawn):
         self.nr_of_windows = 0
         self.root = root
         
@@ -56,6 +56,7 @@ class MainApp(RuntimeClassBase):
         data['mv_address'] = location
         data['timeout'] = 20.0
         data['taskname'] = taskname
+        data['spawn'] = spawn
     
     def user_defined_destructor(self):
         pass
@@ -120,62 +121,71 @@ class MainApp(RuntimeClassBase):
         
         # state /parallel/behaviour/init_modelverse/conversing/execute_SC
         self.states["/parallel/behaviour/init_modelverse/conversing/execute_SC"] = State(15, "/parallel/behaviour/init_modelverse/conversing/execute_SC", self)
-        self.states["/parallel/behaviour/init_modelverse/conversing/execute_SC"].setEnter(self._parallel_behaviour_init_modelverse_conversing_execute_SC_enter)
         
-        # state /parallel/behaviour/init_modelverse/conversing/execute_SC/spawn_chatwindow
-        self.states["/parallel/behaviour/init_modelverse/conversing/execute_SC/spawn_chatwindow"] = State(16, "/parallel/behaviour/init_modelverse/conversing/execute_SC/spawn_chatwindow", self)
+        # state /parallel/behaviour/init_modelverse/conversing/execute_SC/spawn
+        self.states["/parallel/behaviour/init_modelverse/conversing/execute_SC/spawn"] = State(16, "/parallel/behaviour/init_modelverse/conversing/execute_SC/spawn", self)
+        
+        # state /parallel/behaviour/init_modelverse/conversing/execute_SC/wait_subprocess
+        self.states["/parallel/behaviour/init_modelverse/conversing/execute_SC/wait_subprocess"] = State(17, "/parallel/behaviour/init_modelverse/conversing/execute_SC/wait_subprocess", self)
+        self.states["/parallel/behaviour/init_modelverse/conversing/execute_SC/wait_subprocess"].setEnter(self._parallel_behaviour_init_modelverse_conversing_execute_SC_wait_subprocess_enter)
+        self.states["/parallel/behaviour/init_modelverse/conversing/execute_SC/wait_subprocess"].setExit(self._parallel_behaviour_init_modelverse_conversing_execute_SC_wait_subprocess_exit)
+        
+        # state /parallel/behaviour/init_modelverse/conversing/execute_SC/stopping
+        self.states["/parallel/behaviour/init_modelverse/conversing/execute_SC/stopping"] = State(18, "/parallel/behaviour/init_modelverse/conversing/execute_SC/stopping", self)
+        self.states["/parallel/behaviour/init_modelverse/conversing/execute_SC/stopping"].setEnter(self._parallel_behaviour_init_modelverse_conversing_execute_SC_stopping_enter)
+        self.states["/parallel/behaviour/init_modelverse/conversing/execute_SC/stopping"].setExit(self._parallel_behaviour_init_modelverse_conversing_execute_SC_stopping_exit)
         
         # state /parallel/behaviour/init_modelverse/logging_in_modelverse
-        self.states["/parallel/behaviour/init_modelverse/logging_in_modelverse"] = State(17, "/parallel/behaviour/init_modelverse/logging_in_modelverse", self)
+        self.states["/parallel/behaviour/init_modelverse/logging_in_modelverse"] = State(19, "/parallel/behaviour/init_modelverse/logging_in_modelverse", self)
         
         # state /parallel/behaviour/init_modelverse/logging_in_modelverse/prompt_username
-        self.states["/parallel/behaviour/init_modelverse/logging_in_modelverse/prompt_username"] = State(18, "/parallel/behaviour/init_modelverse/logging_in_modelverse/prompt_username", self)
+        self.states["/parallel/behaviour/init_modelverse/logging_in_modelverse/prompt_username"] = State(20, "/parallel/behaviour/init_modelverse/logging_in_modelverse/prompt_username", self)
         self.states["/parallel/behaviour/init_modelverse/logging_in_modelverse/prompt_username"].setEnter(self._parallel_behaviour_init_modelverse_logging_in_modelverse_prompt_username_enter)
         
         # state /parallel/behaviour/init_modelverse/logging_in_modelverse/wait_for_credentials
-        self.states["/parallel/behaviour/init_modelverse/logging_in_modelverse/wait_for_credentials"] = State(19, "/parallel/behaviour/init_modelverse/logging_in_modelverse/wait_for_credentials", self)
+        self.states["/parallel/behaviour/init_modelverse/logging_in_modelverse/wait_for_credentials"] = State(21, "/parallel/behaviour/init_modelverse/logging_in_modelverse/wait_for_credentials", self)
         self.states["/parallel/behaviour/init_modelverse/logging_in_modelverse/wait_for_credentials"].setExit(self._parallel_behaviour_init_modelverse_logging_in_modelverse_wait_for_credentials_exit)
         
         # state /parallel/behaviour/init_modelverse/logging_in_modelverse/wait_for_credentials/responsive
-        self.states["/parallel/behaviour/init_modelverse/logging_in_modelverse/wait_for_credentials/responsive"] = State(20, "/parallel/behaviour/init_modelverse/logging_in_modelverse/wait_for_credentials/responsive", self)
+        self.states["/parallel/behaviour/init_modelverse/logging_in_modelverse/wait_for_credentials/responsive"] = State(22, "/parallel/behaviour/init_modelverse/logging_in_modelverse/wait_for_credentials/responsive", self)
         
         # state /parallel/behaviour/init_modelverse/logging_in_modelverse/login
-        self.states["/parallel/behaviour/init_modelverse/logging_in_modelverse/login"] = State(21, "/parallel/behaviour/init_modelverse/logging_in_modelverse/login", self)
+        self.states["/parallel/behaviour/init_modelverse/logging_in_modelverse/login"] = State(23, "/parallel/behaviour/init_modelverse/logging_in_modelverse/login", self)
         self.states["/parallel/behaviour/init_modelverse/logging_in_modelverse/login"].setEnter(self._parallel_behaviour_init_modelverse_logging_in_modelverse_login_enter)
         
         # state /parallel/behaviour/init_modelverse/logging_in_modelverse/register_SCD
-        self.states["/parallel/behaviour/init_modelverse/logging_in_modelverse/register_SCD"] = State(22, "/parallel/behaviour/init_modelverse/logging_in_modelverse/register_SCD", self)
+        self.states["/parallel/behaviour/init_modelverse/logging_in_modelverse/register_SCD"] = State(24, "/parallel/behaviour/init_modelverse/logging_in_modelverse/register_SCD", self)
         self.states["/parallel/behaviour/init_modelverse/logging_in_modelverse/register_SCD"].setEnter(self._parallel_behaviour_init_modelverse_logging_in_modelverse_register_SCD_enter)
         
         # state /parallel/behaviour/init_modelverse/logging_in_modelverse/register_conf_bottom
-        self.states["/parallel/behaviour/init_modelverse/logging_in_modelverse/register_conf_bottom"] = State(23, "/parallel/behaviour/init_modelverse/logging_in_modelverse/register_conf_bottom", self)
+        self.states["/parallel/behaviour/init_modelverse/logging_in_modelverse/register_conf_bottom"] = State(25, "/parallel/behaviour/init_modelverse/logging_in_modelverse/register_conf_bottom", self)
         self.states["/parallel/behaviour/init_modelverse/logging_in_modelverse/register_conf_bottom"].setEnter(self._parallel_behaviour_init_modelverse_logging_in_modelverse_register_conf_bottom_enter)
         
         # state /parallel/behaviour/init_modelverse/wait_close_splash
-        self.states["/parallel/behaviour/init_modelverse/wait_close_splash"] = State(24, "/parallel/behaviour/init_modelverse/wait_close_splash", self)
+        self.states["/parallel/behaviour/init_modelverse/wait_close_splash"] = State(26, "/parallel/behaviour/init_modelverse/wait_close_splash", self)
         self.states["/parallel/behaviour/init_modelverse/wait_close_splash"].setEnter(self._parallel_behaviour_init_modelverse_wait_close_splash_enter)
         self.states["/parallel/behaviour/init_modelverse/wait_close_splash"].setExit(self._parallel_behaviour_init_modelverse_wait_close_splash_exit)
         
         # state /parallel/behaviour/init_modelverse/closing_splash
-        self.states["/parallel/behaviour/init_modelverse/closing_splash"] = State(25, "/parallel/behaviour/init_modelverse/closing_splash", self)
+        self.states["/parallel/behaviour/init_modelverse/closing_splash"] = State(27, "/parallel/behaviour/init_modelverse/closing_splash", self)
         self.states["/parallel/behaviour/init_modelverse/closing_splash"].setEnter(self._parallel_behaviour_init_modelverse_closing_splash_enter)
         
         # state /parallel/behaviour/init_main_window
-        self.states["/parallel/behaviour/init_main_window"] = State(26, "/parallel/behaviour/init_main_window", self)
+        self.states["/parallel/behaviour/init_main_window"] = State(28, "/parallel/behaviour/init_main_window", self)
         self.states["/parallel/behaviour/init_main_window"].setEnter(self._parallel_behaviour_init_main_window_enter)
         
         # state /parallel/behaviour/main_behaviour
-        self.states["/parallel/behaviour/main_behaviour"] = State(27, "/parallel/behaviour/main_behaviour", self)
+        self.states["/parallel/behaviour/main_behaviour"] = State(29, "/parallel/behaviour/main_behaviour", self)
         
         # state /parallel/behaviour/stopped
-        self.states["/parallel/behaviour/stopped"] = State(28, "/parallel/behaviour/stopped", self)
+        self.states["/parallel/behaviour/stopped"] = State(30, "/parallel/behaviour/stopped", self)
         self.states["/parallel/behaviour/stopped"].setEnter(self._parallel_behaviour_stopped_enter)
         
         # state /parallel/forward_requests
-        self.states["/parallel/forward_requests"] = State(29, "/parallel/forward_requests", self)
+        self.states["/parallel/forward_requests"] = State(31, "/parallel/forward_requests", self)
         
         # state /parallel/forward_requests/forward
-        self.states["/parallel/forward_requests/forward"] = State(30, "/parallel/forward_requests/forward", self)
+        self.states["/parallel/forward_requests/forward"] = State(32, "/parallel/forward_requests/forward", self)
         
         # add children
         self.states[""].addChild(self.states["/parallel"])
@@ -200,7 +210,9 @@ class MainApp(RuntimeClassBase):
         self.states["/parallel/behaviour/init_modelverse/conversing/execute_OP"].addChild(self.states["/parallel/behaviour/init_modelverse/conversing/execute_OP/wait_model"])
         self.states["/parallel/behaviour/init_modelverse/conversing/execute_OP"].addChild(self.states["/parallel/behaviour/init_modelverse/conversing/execute_OP/wait_subprocess"])
         self.states["/parallel/behaviour/init_modelverse/conversing/execute_OP"].addChild(self.states["/parallel/behaviour/init_modelverse/conversing/execute_OP/stopping"])
-        self.states["/parallel/behaviour/init_modelverse/conversing/execute_SC"].addChild(self.states["/parallel/behaviour/init_modelverse/conversing/execute_SC/spawn_chatwindow"])
+        self.states["/parallel/behaviour/init_modelverse/conversing/execute_SC"].addChild(self.states["/parallel/behaviour/init_modelverse/conversing/execute_SC/spawn"])
+        self.states["/parallel/behaviour/init_modelverse/conversing/execute_SC"].addChild(self.states["/parallel/behaviour/init_modelverse/conversing/execute_SC/wait_subprocess"])
+        self.states["/parallel/behaviour/init_modelverse/conversing/execute_SC"].addChild(self.states["/parallel/behaviour/init_modelverse/conversing/execute_SC/stopping"])
         self.states["/parallel/behaviour/init_modelverse/logging_in_modelverse"].addChild(self.states["/parallel/behaviour/init_modelverse/logging_in_modelverse/prompt_username"])
         self.states["/parallel/behaviour/init_modelverse/logging_in_modelverse"].addChild(self.states["/parallel/behaviour/init_modelverse/logging_in_modelverse/wait_for_credentials"])
         self.states["/parallel/behaviour/init_modelverse/logging_in_modelverse"].addChild(self.states["/parallel/behaviour/init_modelverse/logging_in_modelverse/login"])
@@ -214,7 +226,7 @@ class MainApp(RuntimeClassBase):
         self.states["/parallel/behaviour/init_modelverse"].default_state = self.states["/parallel/behaviour/init_modelverse/splash"]
         self.states["/parallel/behaviour/init_modelverse/conversing"].default_state = self.states["/parallel/behaviour/init_modelverse/conversing/remove_splash"]
         self.states["/parallel/behaviour/init_modelverse/conversing/execute_OP"].default_state = self.states["/parallel/behaviour/init_modelverse/conversing/execute_OP/wait_model"]
-        self.states["/parallel/behaviour/init_modelverse/conversing/execute_SC"].default_state = self.states["/parallel/behaviour/init_modelverse/conversing/execute_SC/spawn_chatwindow"]
+        self.states["/parallel/behaviour/init_modelverse/conversing/execute_SC"].default_state = self.states["/parallel/behaviour/init_modelverse/conversing/execute_SC/spawn"]
         self.states["/parallel/behaviour/init_modelverse/logging_in_modelverse"].default_state = self.states["/parallel/behaviour/init_modelverse/logging_in_modelverse/prompt_username"]
         self.states["/parallel/behaviour/init_modelverse/logging_in_modelverse/wait_for_credentials"].default_state = self.states["/parallel/behaviour/init_modelverse/logging_in_modelverse/wait_for_credentials/responsive"]
         self.states["/parallel/forward_requests"].default_state = self.states["/parallel/forward_requests/forward"]
@@ -244,7 +256,6 @@ class MainApp(RuntimeClassBase):
         _parallel_behaviour_init_modelverse_initializing_modelverse_0.setGuard(self._parallel_behaviour_init_modelverse_initializing_modelverse_0_guard)
         self.states["/parallel/behaviour/init_modelverse/initializing_modelverse"].addTransition(_parallel_behaviour_init_modelverse_initializing_modelverse_0)
         _parallel_behaviour_init_modelverse_initializing_modelverse_1 = Transition(self, self.states["/parallel/behaviour/init_modelverse/initializing_modelverse"], [self.states["/parallel/behaviour/init_modelverse/conversing"]])
-        _parallel_behaviour_init_modelverse_initializing_modelverse_1.setAction(self._parallel_behaviour_init_modelverse_initializing_modelverse_1_exec)
         _parallel_behaviour_init_modelverse_initializing_modelverse_1.setTrigger(Event("mv_response", None))
         _parallel_behaviour_init_modelverse_initializing_modelverse_1.setGuard(self._parallel_behaviour_init_modelverse_initializing_modelverse_1_guard)
         self.states["/parallel/behaviour/init_modelverse/initializing_modelverse"].addTransition(_parallel_behaviour_init_modelverse_initializing_modelverse_1)
@@ -286,15 +297,39 @@ class MainApp(RuntimeClassBase):
         _parallel_behaviour_init_modelverse_conversing_execute_OP_stopping_0.setTrigger(Event("_1after"))
         self.states["/parallel/behaviour/init_modelverse/conversing/execute_OP/stopping"].addTransition(_parallel_behaviour_init_modelverse_conversing_execute_OP_stopping_0)
         
-        # transition /parallel/behaviour/init_modelverse/conversing/execute_SC/spawn_chatwindow
-        _parallel_behaviour_init_modelverse_conversing_execute_SC_spawn_chatwindow_0 = Transition(self, self.states["/parallel/behaviour/init_modelverse/conversing/execute_SC/spawn_chatwindow"], [self.states["/parallel/behaviour/init_modelverse/conversing/execute_SC/spawn_chatwindow"]])
-        _parallel_behaviour_init_modelverse_conversing_execute_SC_spawn_chatwindow_0.setAction(self._parallel_behaviour_init_modelverse_conversing_execute_SC_spawn_chatwindow_0_exec)
-        _parallel_behaviour_init_modelverse_conversing_execute_SC_spawn_chatwindow_0.setTrigger(Event("instance_created", None))
-        self.states["/parallel/behaviour/init_modelverse/conversing/execute_SC/spawn_chatwindow"].addTransition(_parallel_behaviour_init_modelverse_conversing_execute_SC_spawn_chatwindow_0)
-        _parallel_behaviour_init_modelverse_conversing_execute_SC_spawn_chatwindow_1 = Transition(self, self.states["/parallel/behaviour/init_modelverse/conversing/execute_SC/spawn_chatwindow"], [self.states["/parallel/behaviour/stopped"]])
-        _parallel_behaviour_init_modelverse_conversing_execute_SC_spawn_chatwindow_1.setAction(self._parallel_behaviour_init_modelverse_conversing_execute_SC_spawn_chatwindow_1_exec)
-        _parallel_behaviour_init_modelverse_conversing_execute_SC_spawn_chatwindow_1.setTrigger(Event("delete_me", None))
-        self.states["/parallel/behaviour/init_modelverse/conversing/execute_SC/spawn_chatwindow"].addTransition(_parallel_behaviour_init_modelverse_conversing_execute_SC_spawn_chatwindow_1)
+        # transition /parallel/behaviour/init_modelverse/conversing/execute_SC/spawn
+        _parallel_behaviour_init_modelverse_conversing_execute_SC_spawn_0 = Transition(self, self.states["/parallel/behaviour/init_modelverse/conversing/execute_SC/spawn"], [self.states["/parallel/behaviour/init_modelverse/conversing/execute_SC/wait_subprocess"]])
+        _parallel_behaviour_init_modelverse_conversing_execute_SC_spawn_0.setAction(self._parallel_behaviour_init_modelverse_conversing_execute_SC_spawn_0_exec)
+        _parallel_behaviour_init_modelverse_conversing_execute_SC_spawn_0.setTrigger(None)
+        self.states["/parallel/behaviour/init_modelverse/conversing/execute_SC/spawn"].addTransition(_parallel_behaviour_init_modelverse_conversing_execute_SC_spawn_0)
+        
+        # transition /parallel/behaviour/init_modelverse/conversing/execute_SC/wait_subprocess
+        _parallel_behaviour_init_modelverse_conversing_execute_SC_wait_subprocess_0 = Transition(self, self.states["/parallel/behaviour/init_modelverse/conversing/execute_SC/wait_subprocess"], [self.states["/parallel/behaviour/init_modelverse/conversing/execute_SC/wait_subprocess"]])
+        _parallel_behaviour_init_modelverse_conversing_execute_SC_wait_subprocess_0.setAction(self._parallel_behaviour_init_modelverse_conversing_execute_SC_wait_subprocess_0_exec)
+        _parallel_behaviour_init_modelverse_conversing_execute_SC_wait_subprocess_0.setTrigger(Event("mv_data_output", None))
+        self.states["/parallel/behaviour/init_modelverse/conversing/execute_SC/wait_subprocess"].addTransition(_parallel_behaviour_init_modelverse_conversing_execute_SC_wait_subprocess_0)
+        _parallel_behaviour_init_modelverse_conversing_execute_SC_wait_subprocess_1 = Transition(self, self.states["/parallel/behaviour/init_modelverse/conversing/execute_SC/wait_subprocess"], [self.states["/parallel/behaviour/init_modelverse/conversing/execute_SC/wait_subprocess"]])
+        _parallel_behaviour_init_modelverse_conversing_execute_SC_wait_subprocess_1.setAction(self._parallel_behaviour_init_modelverse_conversing_execute_SC_wait_subprocess_1_exec)
+        _parallel_behaviour_init_modelverse_conversing_execute_SC_wait_subprocess_1.setTrigger(None)
+        _parallel_behaviour_init_modelverse_conversing_execute_SC_wait_subprocess_1.setGuard(self._parallel_behaviour_init_modelverse_conversing_execute_SC_wait_subprocess_1_guard)
+        self.states["/parallel/behaviour/init_modelverse/conversing/execute_SC/wait_subprocess"].addTransition(_parallel_behaviour_init_modelverse_conversing_execute_SC_wait_subprocess_1)
+        _parallel_behaviour_init_modelverse_conversing_execute_SC_wait_subprocess_2 = Transition(self, self.states["/parallel/behaviour/init_modelverse/conversing/execute_SC/wait_subprocess"], [self.states["/parallel/behaviour/init_modelverse/conversing/execute_SC/stopping"]])
+        _parallel_behaviour_init_modelverse_conversing_execute_SC_wait_subprocess_2.setAction(self._parallel_behaviour_init_modelverse_conversing_execute_SC_wait_subprocess_2_exec)
+        _parallel_behaviour_init_modelverse_conversing_execute_SC_wait_subprocess_2.setTrigger(Event("mv_response", None))
+        self.states["/parallel/behaviour/init_modelverse/conversing/execute_SC/wait_subprocess"].addTransition(_parallel_behaviour_init_modelverse_conversing_execute_SC_wait_subprocess_2)
+        _parallel_behaviour_init_modelverse_conversing_execute_SC_wait_subprocess_3 = Transition(self, self.states["/parallel/behaviour/init_modelverse/conversing/execute_SC/wait_subprocess"], [self.states["/parallel/behaviour/init_modelverse/conversing/execute_SC/stopping"]])
+        _parallel_behaviour_init_modelverse_conversing_execute_SC_wait_subprocess_3.setAction(self._parallel_behaviour_init_modelverse_conversing_execute_SC_wait_subprocess_3_exec)
+        _parallel_behaviour_init_modelverse_conversing_execute_SC_wait_subprocess_3.setTrigger(None)
+        _parallel_behaviour_init_modelverse_conversing_execute_SC_wait_subprocess_3.setGuard(self._parallel_behaviour_init_modelverse_conversing_execute_SC_wait_subprocess_3_guard)
+        self.states["/parallel/behaviour/init_modelverse/conversing/execute_SC/wait_subprocess"].addTransition(_parallel_behaviour_init_modelverse_conversing_execute_SC_wait_subprocess_3)
+        _parallel_behaviour_init_modelverse_conversing_execute_SC_wait_subprocess_4 = Transition(self, self.states["/parallel/behaviour/init_modelverse/conversing/execute_SC/wait_subprocess"], [self.states["/parallel/behaviour/init_modelverse/conversing/execute_SC/wait_subprocess"]])
+        _parallel_behaviour_init_modelverse_conversing_execute_SC_wait_subprocess_4.setTrigger(Event("_2after"))
+        self.states["/parallel/behaviour/init_modelverse/conversing/execute_SC/wait_subprocess"].addTransition(_parallel_behaviour_init_modelverse_conversing_execute_SC_wait_subprocess_4)
+        
+        # transition /parallel/behaviour/init_modelverse/conversing/execute_SC/stopping
+        _parallel_behaviour_init_modelverse_conversing_execute_SC_stopping_0 = Transition(self, self.states["/parallel/behaviour/init_modelverse/conversing/execute_SC/stopping"], [self.states["/parallel/behaviour/stopped"]])
+        _parallel_behaviour_init_modelverse_conversing_execute_SC_stopping_0.setTrigger(Event("_3after"))
+        self.states["/parallel/behaviour/init_modelverse/conversing/execute_SC/stopping"].addTransition(_parallel_behaviour_init_modelverse_conversing_execute_SC_stopping_0)
         
         # transition /parallel/behaviour/init_modelverse/logging_in_modelverse/prompt_username
         _parallel_behaviour_init_modelverse_logging_in_modelverse_prompt_username_0 = Transition(self, self.states["/parallel/behaviour/init_modelverse/logging_in_modelverse/prompt_username"], [self.states["/parallel/behaviour/init_modelverse/logging_in_modelverse/wait_for_credentials"]])
@@ -338,7 +373,7 @@ class MainApp(RuntimeClassBase):
         
         # transition /parallel/behaviour/init_modelverse/wait_close_splash
         _parallel_behaviour_init_modelverse_wait_close_splash_0 = Transition(self, self.states["/parallel/behaviour/init_modelverse/wait_close_splash"], [self.states["/parallel/behaviour/init_modelverse/closing_splash"]])
-        _parallel_behaviour_init_modelverse_wait_close_splash_0.setTrigger(Event("_2after"))
+        _parallel_behaviour_init_modelverse_wait_close_splash_0.setTrigger(Event("_4after"))
         self.states["/parallel/behaviour/init_modelverse/wait_close_splash"].addTransition(_parallel_behaviour_init_modelverse_wait_close_splash_0)
         
         # transition /parallel/behaviour/init_modelverse/closing_splash
@@ -384,9 +419,6 @@ class MainApp(RuntimeClassBase):
         _parallel_forward_requests_forward_5.setTrigger(Event("data_output", None))
         self.states["/parallel/forward_requests/forward"].addTransition(_parallel_forward_requests_forward_5)
     
-    def _parallel_behaviour_init_modelverse_conversing_execute_SC_enter(self):
-        self.big_step.outputEventOM(Event("create_instance", None, [self, 'windows', 'ChatWindow']))
-    
     def _parallel_behaviour_init_modelverse_logging_in_modelverse_wait_for_credentials_exit(self):
         self.big_step.outputEventOM(Event("delete_instance", None, [self, self.prompt_window]))
     
@@ -419,6 +451,18 @@ class MainApp(RuntimeClassBase):
     def _parallel_behaviour_init_modelverse_conversing_execute_OP_stopping_exit(self):
         self.removeTimer(1)
     
+    def _parallel_behaviour_init_modelverse_conversing_execute_SC_wait_subprocess_enter(self):
+        self.addTimer(2, 0.5)
+    
+    def _parallel_behaviour_init_modelverse_conversing_execute_SC_wait_subprocess_exit(self):
+        self.removeTimer(2)
+    
+    def _parallel_behaviour_init_modelverse_conversing_execute_SC_stopping_enter(self):
+        self.addTimer(3, 2.0)
+    
+    def _parallel_behaviour_init_modelverse_conversing_execute_SC_stopping_exit(self):
+        self.removeTimer(3)
+    
     def _parallel_behaviour_init_modelverse_logging_in_modelverse_prompt_username_enter(self):
         self.big_step.outputEventOM(Event("create_instance", None, [self, 'windows', 'PromptWindow', {'username': data['username'], 'password': data['password']}, {'password': {'show': '*'}}]))
     
@@ -433,10 +477,10 @@ class MainApp(RuntimeClassBase):
         self.raiseInternalEvent(Event("mv_request", None, ['alter_context', ['formalisms/Bottom', 'formalisms/SimpleClassDiagrams']]))
     
     def _parallel_behaviour_init_modelverse_wait_close_splash_enter(self):
-        self.addTimer(2, 0.0)
+        self.addTimer(4, 0.0)
     
     def _parallel_behaviour_init_modelverse_wait_close_splash_exit(self):
-        self.removeTimer(2)
+        self.removeTimer(4)
     
     def _parallel_behaviour_init_modelverse_closing_splash_enter(self):
         self.big_step.outputEventOM(Event("narrow_cast", None, [self, self.splash_window, Event("close", None, [])]))
@@ -466,9 +510,6 @@ class MainApp(RuntimeClassBase):
     def _parallel_behaviour_init_modelverse_initializing_modelverse_0_guard(self, parameters):
         return data['taskname'] is None
     
-    def _parallel_behaviour_init_modelverse_initializing_modelverse_1_exec(self, parameters):
-        self.big_step.outputEventOM(Event("narrow_cast", None, [self, self.splash_window, Event("update_status", None, [40, 'Waiting for Modelverse initialization... OK'])]))
-    
     def _parallel_behaviour_init_modelverse_initializing_modelverse_1_guard(self, parameters):
         return data['taskname'] is not None
     
@@ -494,13 +535,42 @@ class MainApp(RuntimeClassBase):
     def _parallel_behaviour_init_modelverse_conversing_execute_OP_wait_subprocess_0_guard(self, parameters):
         return self.subprocess.poll() is not None
     
-    def _parallel_behaviour_init_modelverse_conversing_execute_SC_spawn_chatwindow_0_exec(self, parameters):
-        assoc_name = parameters[0]
-        self.big_step.outputEventOM(Event("start_instance", None, [self, assoc_name]))
-        self.big_step.outputEventOM(Event("narrow_cast", None, [self, assoc_name, Event("assoc_name", None, [assoc_name])]))
+    def _parallel_behaviour_init_modelverse_conversing_execute_SC_spawn_0_exec(self, parameters):
+        self.subprocess = subprocess.Popen(data['spawn'], stdin=subprocess.PIPE, stdout=subprocess.PIPE)
+        
+        # If you are using Windows, then this ugly code is for you!
+        # Windows does not allow asynchronous reading of stdin and stdout, so we have to mess around with threads.
+        # Interestingly, threads don't work well with SCCD, so this is a gamble.
+        # On UNIX systems, a simple "select" statement would have sufficed in the SCCD condition, but Windows doesn't like elegant solutions...
+        def enqueue_output(out, queue):
+            for line in iter(out.readline, b''):
+                queue.append(line)
+            out.close()
+        
+        self.output_queue = []
+        p = threading.Thread(target=enqueue_output, arguments=[self.subprocess.stdout, self.output_queue])
+        p.daemon = True
+        p.start()
+    
+    def _parallel_behaviour_init_modelverse_conversing_execute_SC_wait_subprocess_0_exec(self, parameters):
+        value = parameters[0]
+        # Send data to the spawned subprocess
+        self.subprocess.stdin.write(value)
     
-    def _parallel_behaviour_init_modelverse_conversing_execute_SC_spawn_chatwindow_1_exec(self, parameters):
-        sys.exit(0)
+    def _parallel_behaviour_init_modelverse_conversing_execute_SC_wait_subprocess_1_exec(self, parameters):
+        self.raiseInternalEvent(Event("mv_data_input", None, [self.output_queue.pop(0), None]))
+    
+    def _parallel_behaviour_init_modelverse_conversing_execute_SC_wait_subprocess_1_guard(self, parameters):
+        return self.output_queue
+    
+    def _parallel_behaviour_init_modelverse_conversing_execute_SC_wait_subprocess_2_exec(self, parameters):
+        self.subprocess.terminate()
+    
+    def _parallel_behaviour_init_modelverse_conversing_execute_SC_wait_subprocess_3_exec(self, parameters):
+        print("Finished execution of activity!")
+    
+    def _parallel_behaviour_init_modelverse_conversing_execute_SC_wait_subprocess_3_guard(self, parameters):
+        return self.subprocess.poll() is not None
     
     def _parallel_behaviour_init_modelverse_logging_in_modelverse_prompt_username_0_exec(self, parameters):
         association_name = parameters[0]
@@ -8064,7 +8134,6 @@ class ActivityExecutor(RuntimeClassBase, tk.Toplevel, SCCDWidget):
     def _all_all_execute_alter_context_result_add_enter(self):
         tag, model = self.exec_output_signature.popitem()
         metamodel = self.output_signature[tag]
-        print("Setting context for " + str((model, metamodel)))
         self.big_step.outputEventOM(Event("broad_cast", None, [self, Event("mv_request", None, ['alter_context', [model, metamodel]])]))
     
     def _all_all_browse_activity_create_browser_enter(self):
@@ -8195,7 +8264,7 @@ class ActivityExecutor(RuntimeClassBase, tk.Toplevel, SCCDWidget):
     
     def _all_all_execute_execute_0_exec(self, parameters):
         taskname = parameters[0]
-        subprocess.Popen([sys.executable, sys.argv[0], "--address", data['mv_address'], "--username", data['username'], "--password", data['password'], "--taskname", taskname])
+        self.subprocess = subprocess.Popen([sys.executable, sys.argv[0], "--address", data['mv_address'], "--username", data['username'], "--password", data['password'], "--taskname", taskname, "--spawn", "run_chatwindow.py"])
     
     def _all_all_execute_alter_context_result_check_next_0_guard(self, parameters):
         return self.exec_output_signature
@@ -8932,7 +9001,7 @@ class ProcessEnactor(RuntimeClassBase, tk.Toplevel, SCCDWidget):
     def _all_all_execute_in_context_1_exec(self, parameters):
         result = parameters[0]
         taskname, operation = result
-        subprocess.Popen([sys.executable, sys.argv[0], "--address", data['mv_address'], "--username", data['username'], "--password", data['password'], "--taskname", taskname])
+        subprocess.Popen([sys.executable, sys.argv[0], "--address", data['mv_address'], "--username", data['username'], "--password", data['password'], "--taskname", taskname, "--spawn", "run_chatwindow.py"])
     
     def _all_all_execute_in_context_1_guard(self, parameters):
         result = parameters[0]
@@ -10203,7 +10272,6 @@ class ChatWindow(RuntimeClassBase, tk.Toplevel, SCCDWidget):
         tk.Toplevel.__init__(self)
         SCCDWidget.__init__(self)
         self.input_value = ""
-        print("Start up chatwindow!")
     
     def user_defined_destructor(self):
         self.destroy()
@@ -10220,54 +10288,50 @@ class ChatWindow(RuntimeClassBase, tk.Toplevel, SCCDWidget):
         # state <root>
         self.states[""] = State(0, "", self)
         
-        # state /get_assoc_name
-        self.states["/get_assoc_name"] = State(1, "/get_assoc_name", self)
-        
         # state /init
-        self.states["/init"] = State(2, "/init", self)
+        self.states["/init"] = State(1, "/init", self)
         
         # state /init/init_entry_log
-        self.states["/init/init_entry_log"] = State(3, "/init/init_entry_log", self)
+        self.states["/init/init_entry_log"] = State(2, "/init/init_entry_log", self)
         
         # state /init/init_entry_log/create
-        self.states["/init/init_entry_log/create"] = State(4, "/init/init_entry_log/create", self)
+        self.states["/init/init_entry_log/create"] = State(3, "/init/init_entry_log/create", self)
         self.states["/init/init_entry_log/create"].setEnter(self._init_init_entry_log_create_enter)
         
         # state /init/init_entry_log/wait_for_packing
-        self.states["/init/init_entry_log/wait_for_packing"] = State(5, "/init/init_entry_log/wait_for_packing", self)
+        self.states["/init/init_entry_log/wait_for_packing"] = State(4, "/init/init_entry_log/wait_for_packing", self)
         
         # state /init/init_entry_input
-        self.states["/init/init_entry_input"] = State(6, "/init/init_entry_input", self)
+        self.states["/init/init_entry_input"] = State(5, "/init/init_entry_input", self)
         
         # state /init/init_entry_input/create
-        self.states["/init/init_entry_input/create"] = State(7, "/init/init_entry_input/create", self)
+        self.states["/init/init_entry_input/create"] = State(6, "/init/init_entry_input/create", self)
         self.states["/init/init_entry_input/create"].setEnter(self._init_init_entry_input_create_enter)
         
         # state /init/init_entry_input/wait_for_packing
-        self.states["/init/init_entry_input/wait_for_packing"] = State(8, "/init/init_entry_input/wait_for_packing", self)
+        self.states["/init/init_entry_input/wait_for_packing"] = State(7, "/init/init_entry_input/wait_for_packing", self)
         
         # state /init/init_button_send
-        self.states["/init/init_button_send"] = State(9, "/init/init_button_send", self)
+        self.states["/init/init_button_send"] = State(8, "/init/init_button_send", self)
         
         # state /init/init_button_send/create
-        self.states["/init/init_button_send/create"] = State(10, "/init/init_button_send/create", self)
+        self.states["/init/init_button_send/create"] = State(9, "/init/init_button_send/create", self)
         self.states["/init/init_button_send/create"].setEnter(self._init_init_button_send_create_enter)
         
         # state /init/init_button_send/wait_for_packing
-        self.states["/init/init_button_send/wait_for_packing"] = State(11, "/init/init_button_send/wait_for_packing", self)
+        self.states["/init/init_button_send/wait_for_packing"] = State(10, "/init/init_button_send/wait_for_packing", self)
         
         # state /root
-        self.states["/root"] = State(12, "/root", self)
+        self.states["/root"] = State(11, "/root", self)
         
         # state /closing
-        self.states["/closing"] = State(13, "/closing", self)
+        self.states["/closing"] = State(12, "/closing", self)
         self.states["/closing"].setEnter(self._closing_enter)
         
         # state /close
-        self.states["/close"] = State(14, "/close", self)
+        self.states["/close"] = State(13, "/close", self)
         
         # add children
-        self.states[""].addChild(self.states["/get_assoc_name"])
         self.states[""].addChild(self.states["/init"])
         self.states[""].addChild(self.states["/root"])
         self.states[""].addChild(self.states["/closing"])
@@ -10282,18 +10346,12 @@ class ChatWindow(RuntimeClassBase, tk.Toplevel, SCCDWidget):
         self.states["/init/init_button_send"].addChild(self.states["/init/init_button_send/create"])
         self.states["/init/init_button_send"].addChild(self.states["/init/init_button_send/wait_for_packing"])
         self.states[""].fixTree()
-        self.states[""].default_state = self.states["/get_assoc_name"]
+        self.states[""].default_state = self.states["/init"]
         self.states["/init"].default_state = self.states["/init/init_entry_log"]
         self.states["/init/init_entry_log"].default_state = self.states["/init/init_entry_log/create"]
         self.states["/init/init_entry_input"].default_state = self.states["/init/init_entry_input/create"]
         self.states["/init/init_button_send"].default_state = self.states["/init/init_button_send/create"]
         
-        # transition /get_assoc_name
-        _get_assoc_name_0 = Transition(self, self.states["/get_assoc_name"], [self.states["/init"]])
-        _get_assoc_name_0.setAction(self._get_assoc_name_0_exec)
-        _get_assoc_name_0.setTrigger(Event("assoc_name", None))
-        self.states["/get_assoc_name"].addTransition(_get_assoc_name_0)
-        
         # transition /init/init_entry_log/create
         _init_init_entry_log_create_0 = Transition(self, self.states["/init/init_entry_log/create"], [self.states["/init/init_entry_log/wait_for_packing"]])
         _init_init_entry_log_create_0.setAction(self._init_init_entry_log_create_0_exec)
@@ -10338,7 +10396,7 @@ class ChatWindow(RuntimeClassBase, tk.Toplevel, SCCDWidget):
         self.states["/root"].addTransition(_root_0)
         _root_1 = Transition(self, self.states["/root"], [self.states["/root"]])
         _root_1.setAction(self._root_1_exec)
-        _root_1.setTrigger(Event("mv_data_output", None))
+        _root_1.setTrigger(Event("stdin_input", "stdin_port"))
         self.states["/root"].addTransition(_root_1)
         _root_2 = Transition(self, self.states["/root"], [self.states["/root"]])
         _root_2.setAction(self._root_2_exec)
@@ -10346,15 +10404,11 @@ class ChatWindow(RuntimeClassBase, tk.Toplevel, SCCDWidget):
         _root_2.setGuard(self._root_2_guard)
         self.states["/root"].addTransition(_root_2)
         _root_3 = Transition(self, self.states["/root"], [self.states["/closing"]])
-        _root_3.setTrigger(Event("mv_response", None))
+        _root_3.setTrigger(Event("close_window", None))
         self.states["/root"].addTransition(_root_3)
-        _root_4 = Transition(self, self.states["/root"], [self.states["/closing"]])
-        _root_4.setTrigger(Event("close_window", None))
-        self.states["/root"].addTransition(_root_4)
         
         # transition /closing
         _closing_0 = Transition(self, self.states["/closing"], [self.states["/close"]])
-        _closing_0.setAction(self._closing_0_exec)
         _closing_0.setTrigger(Event("instance_deleted", None))
         self.states["/closing"].addTransition(_closing_0)
     
@@ -10371,10 +10425,6 @@ class ChatWindow(RuntimeClassBase, tk.Toplevel, SCCDWidget):
         self.big_step.outputEventOM(Event("delete_instance", None, [self, 'buttons']))
         self.big_step.outputEventOM(Event("delete_instance", None, [self, 'entries']))
     
-    def _get_assoc_name_0_exec(self, parameters):
-        assoc_name = parameters[0]
-        self.assoc_name = assoc_name
-    
     def _init_init_entry_log_create_0_exec(self, parameters):
         association_name = parameters[0]
         self.big_step.outputEventOM(Event("start_instance", None, [self, association_name]))
@@ -10404,8 +10454,7 @@ class ChatWindow(RuntimeClassBase, tk.Toplevel, SCCDWidget):
     
     def _root_0_exec(self, parameters):
         event_name = parameters[0]
-        self.big_step.outputEventOM(Event("broad_cast", None, [self, Event("mv_data_input", None, [self.input_value, None])]))
-        print("Sent data")
+        self.big_step.outputEvent(Event("stdout_output", "stdout_port", [self.input_value]))
         self.big_step.outputEventOM(Event("narrow_cast", None, [self, self.entry_input, Event("change_value", None, [''])]))
         self.big_step.outputEventOM(Event("narrow_cast", None, [self, self.entry_log, Event("append_value", None, ['< ' + self.input_value + '\n'])]))
     
@@ -10427,12 +10476,9 @@ class ChatWindow(RuntimeClassBase, tk.Toplevel, SCCDWidget):
         value = parameters[1]
         return name == 'input_value'
     
-    def _closing_0_exec(self, parameters):
-        self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'parent', Event("delete_me", None, [self.assoc_name])]))
-    
     def initializeStatechart(self):
         # enter default state
-        self.default_targets = self.states["/get_assoc_name"].getEffectiveTargetStates()
+        self.default_targets = self.states["/init"].getEffectiveTargetStates()
         RuntimeClassBase.initializeStatechart(self)
 
 class Toolbar(RuntimeClassBase, tk.Frame, SCCDWidget):
@@ -11440,7 +11486,6 @@ class Text(RuntimeClassBase):
     
     def _main_ready_0_exec(self, parameters):
         new_value = parameters[0]
-        print("Appending value")
         self.entry.config(state=tk.NORMAL)
         self.entry.insert(tk.END, new_value)
         self.entry.config(state=tk.DISABLED)
@@ -11548,7 +11593,6 @@ class Entry(RuntimeClassBase):
         tagorid = parameters[0]
         new_value = parameters[1]
         self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'parent', Event("changed_entry", None, [self.name, new_value])]))
-        print("Got entry change Tk event!")
     
     def _main_ready_0_guard(self, parameters):
         tagorid = parameters[0]
@@ -11565,7 +11609,6 @@ class Entry(RuntimeClassBase):
     
     def _main_ready_3_exec(self, parameters):
         new_value = parameters[0]
-        print("CHANGE VALUE IN ENTRY")
         self.strvar.set(new_value)
     
     def _main_ready_4_exec(self, parameters):
@@ -13558,7 +13601,7 @@ class ObjectManager(ObjectManagerBase):
     
     def instantiate(self, class_name, construct_params):
         if class_name == "MainApp":
-            instance = MainApp(self.controller, construct_params[0], construct_params[1], construct_params[2], construct_params[3], construct_params[4], construct_params[5], construct_params[6])
+            instance = MainApp(self.controller, construct_params[0], construct_params[1], construct_params[2], construct_params[3], construct_params[4], construct_params[5], construct_params[6], construct_params[7])
             instance.associations = {}
             instance.associations["modelverse"] = Association("Modelverse", 1, 1)
             instance.associations["windows"] = Association("Window", 0, -1)
@@ -13725,11 +13768,11 @@ class ObjectManager(ObjectManagerBase):
         return instance
 
 class Controller(EventLoopControllerBase):
-    def __init__(self, root, location, username, password, model, limited_mode, taskname, event_loop_callbacks, finished_callback = None, behind_schedule_callback = None):
+    def __init__(self, root, location, username, password, model, limited_mode, taskname, spawn, event_loop_callbacks, finished_callback = None, behind_schedule_callback = None):
         if finished_callback == None: finished_callback = None
         if behind_schedule_callback == None: behind_schedule_callback = None
         EventLoopControllerBase.__init__(self, ObjectManager(self), event_loop_callbacks, finished_callback, behind_schedule_callback)
         self.addInputPort("input")
         self.addInputPort("socket_in")
         self.addOutputPort("socket_out")
-        self.object_manager.createInstance("MainApp", [root, location, username, password, model, limited_mode, taskname])
+        self.object_manager.createInstance("MainApp", [root, location, username, password, model, limited_mode, taskname, spawn])

+ 2 - 0
run_chatwindow.py

@@ -1,3 +1,5 @@
+#!/bin/env python2
+
 import Tkinter as tk
 import chatwindow
 from sccd.runtime.statecharts_core import Event

+ 5 - 3
runner.py

@@ -11,10 +11,11 @@ class Root(tk.Tk, SCCDWidget):
         tk.Tk.__init__(self)
         SCCDWidget.__init__(self)
 
-def run_GUI(location, username, password, model, limited_mode, taskname):
+def run_GUI(location, username, password, model, limited_mode, taskname, spawn):
+    print("Running GUI with " + str(locals()))
     root = Root()
     root.withdraw()
-    controller = frontend.Controller(root, location, username, password, model, limited_mode, taskname, TkEventLoop(root))
+    controller = frontend.Controller(root, location, username, password, model, limited_mode, taskname, spawn, TkEventLoop(root))
     socket2event.boot_translation_service(controller)
 
     SCCDWidget.controller = controller
@@ -29,7 +30,8 @@ if __name__ == '__main__':
     parser.add_argument("--model", default=None, type=str)
     parser.add_argument("--limited", action="store_true")
     parser.add_argument("--taskname", default=None, type=str)
+    parser.add_argument("--spawn", default=None, type=str)
 
     args = parser.parse_args()
 
-    run_GUI(args.address, args.username, args.password, args.model, args.limited, args.taskname)
+    run_GUI(args.address, args.username, args.password, args.model, args.limited, args.taskname, args.spawn)